Hallo Madeleine, meine Check Funktion sieht jetzt folgendermaßen aus:
Delphi-Quellcode:
function CheckWinner(
const Player,X,Y: integer): boolean;
var
i,j,count,code: integer;
begin
result := true;
code := 0;
count := 0;
//waagerecht
for i := X-3
to X+3
do
begin
if i
in [0..pred(w)]
then
if field[i,Y] = Player
then inc(count)
else count := 0;
if count = 4
then
begin
code := 1;
break
end
end;
count := 0;
//senkrecht
if code=0
then
for i := Y-3
to Y+3
do
begin
if i
in [0..pred(h)]
then
if field[X,i] = Player
then inc(count)
else count := 0;
if count = 4
then
begin
code := 2;
break
end
end;
count := 0;
j := Y-3;
if code = 0
then
//diagonal
for i := X-3
to X+3
do
begin
if (i
in [0..pred(w)])
and (j
in [0..pred(h)])
then
if field[i,j] = Player
then inc(count)
else count := 0;
if count = 4
then
begin
code := 3;
break
end;
inc(j)
end;
count := 0;
j := Y+3;
if code = 0
then
//diagonal
for i := X-3
to X+3
do
begin
if (i
in [0..pred(w)])
and (j
in [0..pred(h)])
then
if field[i,j] = Player
then inc(count)
else count := 0;
if count = 4
then
begin
code := 4;
break
end;
dec(j)
end;
case code
of
1:
begin
Caption := '
Spieler '+IntToStr(Player)+'
hat gewonnen (-)';
DrawGrid.Enabled := false
end;
2:
begin
Caption := '
Spieler '+IntToStr(Player)+'
hat gewonnen (|)';
DrawGrid.Enabled := false
end;
3:
begin
Caption := '
Spieler '+IntToStr(Player)+'
hat gewonnen (\)';
DrawGrid.Enabled := false
end;
4:
begin
Caption := '
Spieler '+IntToStr(Player)+'
hat gewonnen (/)';
DrawGrid.Enabled := false
end;
else result := false
end
end;
So wie ich das sehe sind so alle Möglichkeiten abgedeckt. Gleichzeitig übernimmt sie noch die Textausgabe wenn jemand gewonnen hat. Dazu hab ich noch ein paar kleinere Änderungen an den vorherigen Procedures vorgenommen:
1. Die Initialisierungsprozedur prüft jetzt auch ob die Werte größer als 4 sind:
Delphi-Quellcode:
try
begin
w := StrToInt(EditW.Text);
h := StrToInt(EditH.Text);
//Höhe und Breite (w und h) auslesen
if (w<4)
or (h<4)
then
raise Exception.Create('
Zu kleine Werte');
DrawGrid.ColCount := w;
DrawGrid.RowCount := h+1;
//Höhe und Breite auf das Grid anwenden
SetLength(field,w);
//Array auf die richtige Größe bringen
for i := 0
to High(field)
do
begin
SetLength(field[i],h);
for j := 0
to h-1
do field[i,j] := 0;
//alle Felder auf 0,
//nötig wenn mehrmals gespielt wird
end;
DrawGrid.Enabled := true;
DrawGrid.Repaint;
//neu zeichnen,
//auch nötig wenn mehrmals gespielt wird
Caption := '
Spieler 1: blau; Spieler 2 : gelb';
//Caption ändern
Player := 1
//blau fängt an
end
except on E:
Exception do //im Fehlerfall: zurück das Kommando
begin
ShowMessage(E.
Message);
EditW.SetFocus;
exit
end
end;
2. Es wird ausgegeben wer dran ist (Im OnMouseDown, da ist auch die Check Funktion untergebracht)
Delphi-Quellcode:
begin
...
field[aCol,i] := Player;
//Zelle mit Spieler besetzen
DrawGrid.Repaint;
//und neu zeichnen
if CheckWinner(Player,aCol,i)
then exit;
if Player = 2
then
begin
dec(Player);
Caption := '
Spieler 1 (blau) ist an der Reihe'
end
else
begin
inc(Player);
Caption := '
Spieler 2 (gelb) ist an der Reihe'
end
end;
Ich hoffe ich hab jetzt nichts vergessen, alles zusammen häng ich nochmal als Anlage dran. Nicht falsch verstehen, deine Funktion tuts natürlich auch, und durch selbst machen lernt man natürlich am besten, aber du kannst dir diese ja auch mal angucken und sehen ob du síe verstehst und möglicherweise Teile davon bei dir einbauen.
Gruß, Sebastian