Thema: Delphi wiedermal Stringgrid....

Einzelnen Beitrag anzeigen

Sebastian Nintemann
(Gast)

n/a Beiträge
 
#19
  Alt 2. Jan 2003, 21:34
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
Angehängte Dateien
Dateityp: txt gameU_170.txt (6,2 KB, 8x aufgerufen)
  Mit Zitat antworten Zitat