![]() |
4-Gewinnt
Hallo
Ich möchte das Spiel 4-Gewinnt programmieren, aber ich habe einfach keine Ahnung wie ich den Algorithmus schreiben soll, der erkennt, wann sich 4 Felder einer Farbe waagerecht, senkrecht oder diagonal hintereinander befinden und dann das Spiel beendet. Vielleicht kann mir da einer mal nen Tipp geben, der schon so nen Algorithmus programmiert hat. Vielen Dank schon im Vorraus. |
Ich hab so was zwar noch nicht gemacht, aber ich denke, du müsstest einfach die ganzen Felder durchnummerieren. Wenn sich der Inhalt eines Feldes ändern (also wenn ein Stein eingeworfen wird), müsstest du schrittweise in alle Richtungen überprüfen, ob die Farbe des nächsten Steins auch die Farbe des aktuellen Feldes hat. Wenn das der Fall ist, kannst du das nächst eüberprüfen und wenn das wieder mit dem aktuellen übereinstimmt, das nächste. Falls nicht, müsstest du das ganze dann in die andere Richtung machen.
Hoffe dasdas irgendwer verstanden hat :wink: Man liest sich, Stanlay |
Danke,
ich werd das mal ausprobieren. |
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo Hummer,
der folgene Code realisiert einen 4-Gewinnt Algorithmus
Delphi-Quellcode:
TRelCoords = Array[0..7] of TPoint;
Delphi-Quellcode:
FRelCoords : TRelCoords;
Delphi-Quellcode:
procedure TForm4Wins.FormCreate(Sender: TObject);
begin FStones:=TStones.Create; FRelCoords[0]:=Point(-1,-1); // LO FRelCoords[1]:=Point(0,-1); // O FRelCoords[2]:=Point(1,-1); // RO FRelCoords[3]:=Point(1,0); // R FRelCoords[4]:=Point(1,1); // RU FRelCoords[5]:=Point(0,1); // U FRelCoords[6]:=Point(-1,1); // LU FRelCoords[7]:=Point(-1,0); // L end;
Delphi-Quellcode:
Raster ist eine Spielfeldrasterkomponente die ich mir mal gebastelt habe. (Siehe Anhang)
function TForm4Wins.SearchForWin(Color : TColor) : Boolean;
var X : Integer; Y : Integer; iCnt : Integer; Cell : TAGRasterCell; begin For Y:=0 to Raster.Grid.RowCount-1 do // Durchlaufe alle Spalten begin For X:=0 to Raster.Grid.RowCount-1 do // Durchlaufe alle Zeile begin For iCnt:=0 to 7 do // Iteriere über TRelCoords begin FStoneCounter:=0; Cell:=Raster.Grid.Cells[X,Y]; // hole die Zelle // Die Cell.Data Eigenschaft zeigt auf den Spielstein // Solange die Zelle nicht Nil und die Data Eigenschaft auf einen // Spielstein zeigt durchlaufe die While-Schleife While (Cell<>Nil) and (Cell.Data<>Nil) do begin If TStone(Cell.Data).Color=Color then // Het der Spielstein die passende Farbe Inc(FStoneCounter) // Ja -> Zähler um eins erhöhen else Break; // Nein -> Schleife abbrechen If FStoneCounter=4 then begin Result:=True; Exit; end; // If FStoneCounter=4 then // Hole jetzt die nächte Zelle // Jede Zelle der Raster-Komponente hat in den Eigenschaften X und Y // ihre Koordinaten gespeichert. Um an die nächste Zelle zu kommen // werden jetzt die relativen Koordinaten aus FRelCoords zu den // Zellkoordinaten addiert. Dadurch erhält man eine Nachbarzelle Cell:=Raster.Grid.Cells[Cell.X+FRelCoords[iCnt].X,Cell.Y+FRelCoords[iCnt].Y]; end; // While Cell<>Nil do end; // For iCnt:=0 to 7 do end; // For X:=0 to Raster.Grid.RowCount-1 do end; // For Y:=0 to Raster.Grid.RowCount-1 do end; Die Sourcen und die Komponente sind im Anhang enthalten. Für die Komponente gibt es keine Dokumentation. Nur ein Tip: Die Komponente hat die Eigenschaft SelectionMode. Wenn diese True ist, kann man durch drücken der linken Maustaste und ziehen der Maus Zellen selektieren. Mit Event OnSelection werden die selektierten Zellen im Parameter Selection übergeben. Nur Zellen, die vollständig erfasst wurden sind in Selection enthalten. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:59 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz