So nun bin ich schon ein ganzes Stück weiter. Mein Programm hat erfolgreich compiliert, jedoch tut es nicht das was es soll und ich weiß nicht warum.
Sobald ich den Modus mit den Bildern auswähle erscheint das drawgrid mit den entsprechenden Voreinstellungen. Wenn ich drauf Klicke passiert garnichts
Die Bilder werden aber scheinbar im Hintergrund geladen, daran kann es nicht liegen.
Ich hoffe ihr könnt mir nochmals helfen.
Code: Alles auswählen
unit Unit1;
{$mode objfpc}{$H+}
interface
uses
Windows, Messages,Classes, Variants,SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,
Grids, ExtCtrls, Buttons, Menus;
type
{ TForm1 }
TForm1 = class(TForm)
btn_zahlenmodus: TButton;
Btn_Bildermodus: TButton;
DrawGrid: TDrawGrid;
Edit1: TEdit;
edt_zaehler: TEdit;
Label1: TLabel;
Label2: TLabel;
MainMenu1: TMainMenu;
itemNewGame: TMenuItem;
MenuItem_neuesspiel: TMenuItem;
MenuItem_Hilfe: TMenuItem;
MenuItem3_platzhalter: TMenuItem;
MenuItem_schliesen: TMenuItem;
StringGrid1: TStringGrid;
procedure Btn_BildermodusClick(Sender: TObject);
procedure btn_zahlenmodusClick(Sender: TObject);
procedure Edit1Change(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure itemNewGameClick(Sender: TObject);
procedure MenuItem_HilfeClick(Sender: TObject);
procedure MenuItem_neuesspielClick(Sender: TObject);
procedure MenuItem_schliesenClick(Sender: TObject);
procedure StringGrid1Click(Sender: TObject);
procedure DrawGridDrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
procedure DrawGridSelectCell(Sender: TObject; ACol, ARow: Integer;
var CanSelect: Boolean);
private
{ private declarations }
public
{ public declarations }
end;
type
TCellMode = (ALREADY_MATCHED, CELL_VISIBLE, CELL_INVISIBLE);
const
MAX_IMAGES = 10;
var
Form1: TForm1;
Spielfeld:array of integer; //Spielfeld
Gleich:array of boolean; //Wenn Gleich, dann beim zeichnen des Feldes diese Karten aufdecken
position1,position2:integer; //Positionen zum Mausklick1 und Mausklick2
zaehler : integer; // zählvariable der benötigten Züge
Kartenpaare:integer;
sl : TstringList; // Stringlist für highscore
Images : array [0..MAX_IMAGES-1] of TImage;
RandomPermutationArray : array [0..19] of integer;
PartnerOf : array [0..19] of integer;
ImageOfCell : array [0..19] of integer;
ModeOfCell : array [0..19] of TCellMode;
FirstCell, SecondCell : integer;
NumberOfVisibleCells : integer;
ImagePaths : array [0..MAX_IMAGES-1] of string
= ('img0.bmp', 'img1.bmp', 'img2.bmp', 'img3.bmp', 'img4.bmp', 'img5.bmp',
'img6.bmp', 'img7.bmp', 'img8.bmp', 'img9.bmp');
implementation
{$R *.lfm}
{ TForm1 }
procedure RedrawCell (index : integer);
var
Col, Row : integer;
begin
Row := index div 5;
Col := index mod 5;
Form1.DrawGridDrawCell(Form1, Col, Row, Form1.DrawGrid.CellRect(Col,Row), [])
end;
procedure LoadImages;
var
i : integer;
begin
for i := 0 to MAX_IMAGES-1 do
begin
Images[i] := TImage.Create(nil);
Images[i].Picture.LoadFromFile(ExtractFileDir('project1.exe')+ImagePaths[i])
end
end;
function LinearIndexOf (Row, Column : integer) : integer;
begin
Result := 5 * Row + Column
end;
procedure RandomizeThePermutationArray;
var
i, RandomPosition, Temp : integer;
begin
for i := 0 to 18 do
begin
RandomPosition := i + Random(19 - i) + 1;
Temp := RandomPermutationArray[i];
RandomPermutationArray[i] := RandomPermutationArray[RandomPosition];
RandomPermutationArray[RandomPosition] := Temp
end;
end;
procedure AssignPartnerships;
var
i : integer;
begin
for i := 0 to 19 do
if i mod 2 = 0 then
PartnerOf[RandomPermutationArray[i]] := RandomPermutationArray[i + 1]
else
PartnerOf[RandomPermutationArray[i]] := RandomPermutationArray[i - 1]
end;
procedure AssignImagesToCells;
var
i : integer;
begin
for i := 0 to 19 do
ImageOfCell[RandomPermutationArray[i]] := i div 2
end;
procedure InitializeCellModes;
var
i : integer;
begin
for i := 0 to 19 do
ModeOfCell[i] := CELL_INVISIBLE
end;
procedure TForm1.itemNewGameClick(Sender: TObject);
var
i : integer;
begin
RandomizeThePermutationArray;
AssignPartnerships;
AssignImagesToCells;
InitializeCellModes;
NumberOfVisibleCells := 0;
for i := 0 to 19 do
RedrawCell(i);
end;
procedure TForm1.DrawGridDrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState);
var
index : integer;
begin
index := LinearIndexOf(ARow, ACol);
if ModeOfCell[index] = CELL_INVISIBLE then
begin
DrawGrid.Canvas.Brush.Color := clBlack;
DrawGrid.Canvas.FillRect(Rect)
end
else if ModeOfCell[index] = ALREADY_MATCHED then
begin
DrawGrid.Canvas.Brush.Color := clWhite;
DrawGrid.Canvas.FillRect(Rect)
end
else begin
DrawGrid.Canvas.StretchDraw(Rect, Images[ImageOfCell[index]].Picture.Graphic);
end
end;
procedure TForm1.DrawGridSelectCell(Sender: TObject; ACol, ARow: Integer; var CanSelect: Boolean);
var
index : integer;
begin
index := LinearIndexOf(ARow, ACol);
if ModeOfCell[index] = ALREADY_MATCHED then
exit;
if NumberOfVisibleCells = 0 then
begin
FirstCell := index;
ModeOfCell[FirstCell] := CELL_VISIBLE;
RedrawCell(FirstCell);
inc(NumberOfVisibleCells)
end
else if (NumberOfVisibleCells = 1) and (FirstCell <> index) then
begin
SecondCell := index;
ModeOfCell[SecondCell] := CELL_VISIBLE;
RedrawCell(SecondCell);
if PartnerOf[SecondCell] = FirstCell then
begin
Sleep(100);
ModeOfCell[FirstCell] := ALREADY_MATCHED;
RedrawCell(FirstCell);
ModeOfCell[SecondCell] := ALREADY_MATCHED;
RedrawCell(SecondCell);
NumberOfVisibleCells := 0
end
else
inc(NumberOfVisibleCells)
end
else begin
if (FirstCell <> index) and (SecondCell <> index) then
begin
ModeOfCell[index] := CELL_VISIBLE;
RedrawCell(index);
end;
if FirstCell <> index then
begin
ModeOfCell[FirstCell] := CELL_INVISIBLE;
RedrawCell(FirstCell);
end;
if SecondCell <> index then
begin
ModeOfCell[SecondCell] := CELL_INVISIBLE;
RedrawCell(SecondCell);
end;
FirstCell := index;
NumberOfVisibleCells := 1
end
end;
procedure modiwahl_aus;
begin
form1.label1.Visible:=true;
form1.edit1.Visible:=true;
form1.label2.Visible:=true;
form1.edt_zaehler.Visible:=true;
form1.stringgrid1.Visible:=true;
Form1.btn_zahlenmodus.visible:=false;
Form1.Btn_Bildermodus.visible:=false;
end;
procedure modiwahl_an;
begin
form1.label1.Visible:=false;
form1.edit1.Visible:=false;
form1.label2.Visible:=false;
form1.edt_zaehler.Visible:=false;
form1.DrawGrid.visible:=false;
form1.stringgrid1.Visible:=false;
Form1.btn_zahlenmodus.visible:=true;
Form1.Btn_Bildermodus.visible:=true;
end;
procedure zeichnefeld;
var
zeilen,spalten,i,j,pos:integer;
begin
Form1.Caption:= 'Memory v 1.0';
zeilen:=trunc(sqrt(high(spielfeld))); //im Idealfall ein quadratisches Feld -> Wurzel aus Karten ziehen
spalten:=zeilen;
if spalten*zeilen<=high(spielfeld) then inc(Spalten); //Falls keine quadratische Form, muss zusätzlich eine Spalte eingefügt werden
if spalten*zeilen<=high(spielfeld) then inc(Zeilen); //Falls Spielfeld noch nicht reicht, muss zusätzlich eine Zeile eingefügt werden
Form1.Stringgrid1.RowCount:=Zeilen;
Form1.Stringgrid1.ColCount:=Spalten;
// for i:=0 to Form1.Stringgrid1.RowCount-1 do
// for j:=0 to Form1.Stringgrid1.ColCount-1 do
// if i*Form1.Stringgrid1.ColCount+j<=high(Spielfeld) then Form1.Stringgrid1.Cells[j,i]:=inttostr(Spielfeld[i*Form1.Stringgrid1.ColCount+j]);
for i:=0 to Zeilen-1 do
for j:=0 to Spalten-1 do begin
pos:=i*Spalten+j;
if pos<=high(spielfeld) then
if Gleich[pos] then Form1.Stringgrid1.Cells[j,i]:=inttostr(spielfeld[pos])
else Form1.Stringgrid1.Cells[j,i]:='O';
if position1=pos then Form1.Stringgrid1.Cells[j,i]:=inttostr(spielfeld[pos]);
if position2=pos then Form1.Stringgrid1.Cells[j,i]:=inttostr(spielfeld[pos]);
end;
end;
procedure vergibKarten;
var
i,j:integer;
begin
for i:=0 to high(Spielfeld) do Spielfeld[i]:=-1; //Erstmal alle Felder auf "neutral" stellen
for i:=0 to high(spielfeld) do begin //Jetzt per Zufall jeweils zwei Karten (in diesem Fall Zahlen) im Spielfeld verstecken
j:=random(high(Spielfeld)+1);
while Spielfeld[j]>-1 do if j>=high(Spielfeld) then j:=0
else inc(j);
Spielfeld[j]:=i div 2 + 1; //Ab der 1 beginnen, immer paarweise Karten per Zufall vergeben!
end;
for i:=0 to high(Spielfeld) do Gleich[i]:=false; //bisher gleicht kein Feld dem andern
Position1:=-1; //keine Position vergeben
Position2:=-1;
end;
procedure TForm1.Edit1Change(Sender: TObject);
var
i:integer;
begin
TryStrToInt(edit1.Text,i);
if i<2 then i:=2;
Setlength(Spielfeld,i*2);
Setlength(Gleich,i*2);
kartenpaare:=i;
VergibKarten;
Zeichnefeld;
form1.edt_zaehler.text:=inttostr(0);
end;
procedure TForm1.Btn_BildermodusClick(Sender: TObject);
begin
form1.label1.Visible:=false;
form1.edit1.Visible:=false;
form1.label2.Visible:=false;
form1.edt_zaehler.Visible:=false;
form1.drawgrid.Visible:=true;
Form1.btn_zahlenmodus.visible:=false;
Form1.Btn_Bildermodus.visible:=false;
end;
procedure TForm1.btn_zahlenmodusClick(Sender: TObject); // Modiauswahl zu Beginn
begin
modiwahl_aus;
end;
procedure TForm1.FormCreate(Sender: TObject);
var
i : integer;
begin
LoadImages;
for i := 0 to 19 do
RandomPermutationArray[i] := i;
Randomize;
itemNewGame.Click ;
// Randomize;
edit1.Text:='8';
Setlength(Spielfeld,16);
Setlength(Gleich,16);
VergibKarten;
Zeichnefeld;
zaehler:=0;
end;
procedure TForm1.MenuItem_HilfeClick(Sender: TObject);
begin
showmessage('Dies ist ein klassisches Memory-Spiel.'+
'Der Spieler klickt nacheinander zwei verdeckte Felder an, die darunter versteckten Zahlen erscheinen. Ziel ist es Kartenpaare zu finden.'+
'Dabei soll der Spieler möglichst wenig Züge hierfür benötigen. Die benötigten Züge werden rechts oben angezeigt.');
end;
procedure TForm1.MenuItem_neuesspielClick(Sender: TObject);
begin
modiwahl_an;
end;
procedure TForm1.MenuItem_schliesenClick(Sender: TObject);
begin
application.terminate;
end;
procedure highscore;
begin
sl:=TstringList.Create;
try
if FileExists((ExtractFileDir('project1.exe')
+'Kartenpaare'+inttostr(kartenpaare)+'.txt'))then begin
sl.LoadFromFile(ExtractFileDir('project1.exe')
+'Kartenpaare'+inttostr(kartenpaare)+'.txt'); end
else begin
sl.savetofile(ExtractFileDir('project1.exe')
+'Kartenpaare'+inttostr(kartenpaare)+'.txt');
end;
sl.Add(Form1.edt_zaehler.text +' benötigte Züge..........'+datetostr(now)+','+timetostr(now));
sl.Sorted:=true;
application.MessageBox(PChar(sl.Text),'Highscoreliste',0);
sl.savetofile(ExtractFileDir('project1.exe')
+'Kartenpaare'+inttostr(kartenpaare)+'.txt');
finally
sl.free;
end;
end;
procedure TForm1.StringGrid1Click(Sender: TObject);
var
pos,i:integer;
begin
pos:=Stringgrid1.Row*Form1.Stringgrid1.ColCount+Stringgrid1.Col;
if pos>high(Spielfeld) then pos:=-1; //Geht nicht zu nehmen, da Position größer als Spielfeld!
if pos=position1 then pos:=-1; //Geht nicht zu nehmen, da schon geklickt!
if pos=position2 then pos:=-1; //Geht nicht zu nehmen, da schon geklickt!
if pos>-1 then if Gleich[Pos] then Pos:=-1; //Geht nicht zu nehmen, da bereits aufgedeckt!
if Pos>-1 then begin
// Form1.Caption:='Pos['+inttostr(pos)+'] - Wert['+inttostr(Spielfeld[pos])+']';
if position1=-1 then Position1:=Pos
else begin
Position2:=Pos;
zaehler:=zaehler+1;
edt_zaehler.text:=inttostr(zaehler);
if Spielfeld[Position2]=Spielfeld[Position1] then begin
Gleich[Position1]:=true;
Gleich[Position2]:=true;
i:=0;
while (i<high(Gleich)) and (Gleich[i]) do inc(i);
if i=high(Gleich) then begin
for i:=0 to 5 do begin
Form1.Caption:='! ! ! Gewonnen ! ! !';
Form1.Refresh;
sleep(50);
Form1.Caption:=' ! ! Gewonnen ! ! ';
Form1.Refresh;
sleep(50);
end;
highscore;
Form1.Caption:=' ! ! Neuer Versuch ! ! ';
Form1.Edit1Change(nil);
edt_zaehler.text:=inttostr(0);
zaehler:=0;
modiwahl_an;
end;
end else begin
Zeichnefeld;
Stringgrid1.Refresh;
sleep(500);
end;
Position1:=-1;
Position2:=-1;
end;
end else Form1.Caption:='Pos['+inttostr(pos)+'] - geht nicht';
Zeichnefeld;
end;
end.