AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi If-Verschachtelung in VierGewinnt - komisches Ergebnis
Thema durchsuchen
Ansicht
Themen-Optionen

If-Verschachtelung in VierGewinnt - komisches Ergebnis

Ein Thema von Radon · begonnen am 29. Mai 2006 · letzter Beitrag vom 30. Mai 2006
Antwort Antwort
Benutzerbild von Radon
Radon

Registriert seit: 15. Mai 2006
29 Beiträge
 
#1

If-Verschachtelung in VierGewinnt - komisches Ergebnis

  Alt 29. Mai 2006, 19:04
Hallo!

Ich bin dabei ein VierGewinnt zu programmieren, Delphi ist ziemliches Neuland für mich.

Ich hänge bei der Gewinnprüfung. Diese habe ich mal konzipiert und theoretisch dürfte sie (wenn ich keinen Denkfehler gemacht habe) auch funktionieren. Tut sie aber nicht. Nun glaube ich, dass es an Fehlern in der If-then-else Verschachtelung liegt.

Hier mal der Code:

Delphi-Quellcode:
//======================================================
// Gewinnüberprüfung
//======================================================

procedure TVierGewinnt.GewinnPruefung(GSpalte, GZeile: Integer);

var
  x, y, durchlauf: Integer;
  gewonnen: boolean;
begin
  for durchlauf := 0 to 3 do
  begin
    x := 0;
    y := 0;
    case durchlauf of
      0: begin
          x := 1;
          y := 0;
          end;
      1: begin
          x := 0;
          y := 1;
          end;
      2: begin
          x := 1;
          y := -1;
          end;
      3: begin
          x := -1;
          y := -1;
          end;
    end;

  if Feld[GSpalte + 1 * x, GZeile + 1 * y] = Spieler then
    if Feld[GSpalte + 2 * x, GZeile + 2 * y] = Spieler then
      if Feld[GSpalte + 3 * x, GZeile + 3 * y] = Spieler then
        begin
        gewonnen := true;
        end
      else
        if Feld[GSpalte - 1 * x, GZeile - 1 * y] = Spieler then
          begin
          gewonnen := true;
          end

    else
      if Feld[GSpalte - 1 * x, GZeile - 1 * y] = Spieler then
        if Feld[GSpalte - 2 * x, GZeile - 2 * y] = Spieler then
          begin
          gewonnen := true;
          end


  else
    if Feld[GSpalte - 1 * x, GZeile - 1 * y] = Spieler then
      if Feld[GSpalte - 2 * x, GZeile - 2 * y] = Spieler then
        if Feld[GSpalte - 3 * x, GZeile - 3 * y] = Spieler then
          begin
          gewonnen := true;
          end;


  if gewonnen = true then
  begin
    ShowMessage('Spieler '+IntToStr(Spieler)+' hat gewonnen!');
// FreeAndNil(PaintBox1);
    FreeAndNil(VierGewinnt);
    gewonnen := false;
  end;


end;
end;

//======================================================
//======================================================
Ich weiß nicht genau ob ihr da meine Gedankengänge nachvollziehen könnt, das Prog hab ich nochmal im Anhang. Jedenfalls glaube ich, dass eben hier irgendwo der wurm drin ist, eine Abfrage in die Falsche geht und dadurch irgendwas schiefgelaufen ist. Merkmal ist, dass nur die vertikale gewinnprüfung funktioniert.
Angehängte Dateien
Dateityp: rar vier_gewinnt_211.rar (175,6 KB, 8x aufgerufen)
  Mit Zitat antworten Zitat
Benutzerbild von glkgereon
glkgereon

Registriert seit: 16. Mär 2004
2.287 Beiträge
 
#2

Re: If-Verschachtelung in VierGewinnt - komisches Ergebnis

  Alt 29. Mai 2006, 19:19
Ja, daran liegt es wohl...

hab mir den qt selber nicht angeschaut...aber nach deinen einrückungen zu urteilen sollte es wohl so sein:

Delphi-Quellcode:
  if Feld[GSpalte + 1 * x, GZeile + 1 * y] = Spieler then
    begin
    if Feld[GSpalte + 2 * x, GZeile + 2 * y] = Spieler then
      begin
      if Feld[GSpalte + 3 * x, GZeile + 3 * y] = Spieler then
        gewonnen := true
      else
        if Feld[GSpalte - 1 * x, GZeile - 1 * y] = Spieler then
          gewonnen := true;
      end
    else
      begin
      if Feld[GSpalte - 1 * x, GZeile - 1 * y] = Spieler then
        if Feld[GSpalte - 2 * x, GZeile - 2 * y] = Spieler then
          gewonnen := true;
      end;
    end
  else
    begin
    if Feld[GSpalte - 1 * x, GZeile - 1 * y] = Spieler then
      if Feld[GSpalte - 2 * x, GZeile - 2 * y] = Spieler then
        if Feld[GSpalte - 3 * x, GZeile - 3 * y] = Spieler then
          gewonnen := true;
    end;
»Unlösbare Probleme sind in der Regel schwierig...«
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#3

Re: If-Verschachtelung in VierGewinnt - komisches Ergebnis

  Alt 29. Mai 2006, 19:26
Wenn ein Spieler einen Stein wirft, muss man 7 verschiedene Richtungen
überprüfen. Die 8. Richtung wird nicht benötigt, da nach oben kein Stein liegen kann.
Also würde ich ein Array mit 8 Einträgen machen und für 7 Richtungen die Anzahl der
zusammenhängenen Steine zählen.
Immer zwei Richtungen gehören zusammen (nach links<=>nach rechts, nach linksoben<=>rechtsunten).
Am Ende bleiben also nur noch 4 Richtungen übrig.
Delphi-Quellcode:
TRichtung =(up, upright, right, downright, down, downleft, left, upleft); // die 8 Richtungen;
var
   anzahl[up..upleft]: integer;

// die gewinnbedingungen
// hier gewinnt die 3, da der Stein bei GZeile, Gspalte noch dazugerechnet werden muss
if (anzahl[up]+anzahl[down] >= 3) or
   (anzahl[upright]+anzahl[downleft] >= 3) or
   ....
   gewonnen := True;
Andreas
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#4

Re: If-Verschachtelung in VierGewinnt - komisches Ergebnis

  Alt 29. Mai 2006, 19:42
7 Richtungen? Nö. Sind nur 4: 2x diagonal, waagerecht und senkrecht. Schließlich kann ich auch einen Stein in die Mitte einer 4er-Reihe legen.
Also:
Delphi-Quellcode:
Function CountPieces (x0,y0, dx,dy : Integer; aPlayer : TPlayer; Const aBoard : TBoard) : Integer;
  Function _Count (dx,dy : Integer) : Integer;
  Var
    x,y : Integer;

  Begin
    x := x0;
    y := y0;
    while (x in [0..7]) and (y in [0..7]) and (aBoard[y,x] = aPlayer) do begin
      x := x + dx;
      y := y + dy;
      inc (Result);
    End;
 End;
      
Begin
  Result := _Count (dx,dx) + _Count (-dx,-dy) - 1;
End;

Function IsWin (x0,y0 : Integer; aPlayer : TPlayer; Const aBoard : TBoard) : Boolean;
Begin
  Result := (CountPieces (x0,y0,-1,-1) > 3)
         or (CountPieces (x0,y0,-1,+1) > 3)
         or (CountPieces (x0,y0, 0,-1) > 3)
         or (CountPieces (x0,y0,-1, 0) > 3)
End;
Ich zähle also die Anzahl aufeinanderfolgender Steine gleicher Farbe erst in die eine, und dann in die umgekehrte Richtung. Ein Stein (nämlich er auf der Position (x0,y0)) wird immer mitgezählt, also ziehe ich von der Summe noch eins ab.

Ungetestet, sollter aber funktionieren. Die dauernde Prüfung, ob die Laufvariablen überhaupt noch im Feld sind, kann man sich ersparen, wenn man das TBoard als Array [-1..8,-1..8] Of TPlayer deklariert. Steine werden natürlich nur im Bereich 0..7 gelegt. der Rand wird mit '0' belegt.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Benutzerbild von Radon
Radon

Registriert seit: 15. Mai 2006
29 Beiträge
 
#5

Re: If-Verschachtelung in VierGewinnt - komisches Ergebnis

  Alt 29. Mai 2006, 19:51
uiii... hey danke für die Vorschläge

aber ich wollte das Programm mal komplett alleine schreiben. Die meisten vorschläge hören sich zwar gut an, verstehen tu ich sie aber nicht wirklich.

jedenfalls wollte ich nur dass meine Lösung fehlerfrei ist. Wenn meine funktioniert, werde ich versuchen sie schrittweise zu optimieren, auch mit hilfe eurer vorschläge.

@ glkgereon: das sieht schonmal brauchbar aus. werds gleich mal probieren.
  Mit Zitat antworten Zitat
oldmax

Registriert seit: 27. Apr 2006
Ort: Gieboldehausen
167 Beiträge
 
#6

Re: If-Verschachtelung in VierGewinnt - komisches Ergebnis

  Alt 30. Mai 2006, 09:39
Hi
Wenn du deine If- Anweisungen verstehen willst, dann setze hinter jede If - Then ein Begin und begrenz mit end.
Also
If Irgendwas then
begin
if dasnächste then
begin
if weiteres then
begin
............
end;
end;
end;

oder natürlich auch
end else
begin
....
end;
Es mag bei deinen If- Verschachtelungen etwas aufwendig sein, aber solche geschachtelten Dinger sind die reinsten Holpersteine. Bei einer aufwendigen schreibweise ist zumeist ein Singlestep möglich und die Kontrolle, wo's Programm hinläuft.
und nun viel Spaß
Gruß oldmax
Noch ist mein Rechner mir zu Diensten.... ansonsten habe ich die Macht ihn zu vernichten !
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:22 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz