2016-05-30 28 views
0
function CheckWinner(const track:MarkArray ;const index:Integer; p1:Player; p2:Player):String; 
var 

i,N:Integer; //Creating index to traverse the 2D array 
row,col: Integer; //creating variables to fix rows and columns 
temp : String; 

begin 

row:=(index-1) DIV 3; //fix row to check 
col:=(index-1) MOD 3;  //fix column to check 
N:=3; 
temp:='YES'; 
for i:=0 to N-1 do 
begin 
    //check for player 1 
    if(NOT(track[row][i]=p1.sign)) then 
    begin 
     temp:='NO'; 
     WriteLn('P1',temp); 
    end; 
    if((i=(N-1)) AND NOT(temp='NO') AND (track[row][i]=p1.sign)) then 
    begin 
     temp:='P1'; 
     WriteLn('P1 won'); 
     continue; 
    end; 

    ///player 2 check for rows 
    if(NOT(track[row][i]=p2.sign)) then 
    begin 
     temp:='NO'; 
     WriteLn('P2',temp); 
     continue; 
    end; 
    if((i=N-1) AND NOT(temp='NO') AND (track[row][i]=p2.sign)) then 
    begin 
     temp:='P2'; 
     WriteLn('P2 won'); 
    end; 
end; 

Hey Ich schreibe Code für TicTacToe in Pascal und steckte bei Check-Gewinner-Funktion fest.Tic Tac Toe checkgewinner gratis pascal

Das Problem ist dieser Code immer überprüfen Sie den letzten Index der Zeile für das Zeichen und sagt nur für Spieler 1, das Hauptproblem ist mit Schecks und ich kann nicht mehr an Schecks denken. Bitte helfen.

Die Funktion wird zwei Spieler-Datensätze für Spieler 1 und Spieler 2 übergeben, Spieler-Zeichen ist Tick oder Kreuz und Index-Parameter ist die Box-Nummer auf dem Bildschirm in einen 2D-Array-Index konvertiert. Bitte helfen Sie jemand dabei. Dies ist eine Zeile nur überprüfen, die ich später hinzufügen kann.

+0

Was denkst du soll das 'Continue' machen? –

+0

Hey, continue wird verwendet, um den Rest der Schleife zu überspringen. Ich benutze weiter, denn wenn Spieler 1 gewinnt, musst du nicht mehr nach Spieler 2 suchen. Können Sie mir bitte mit diesem Problem helfen? Ich werde es wirklich zu schätzen wissen. – Sam

+0

Wenn einer der Spieler gewinnt, können Sie die Überprüfung stoppen und aus der Schleife ausbrechen. –

Antwort

2

Ich denke, Sie versuchen, zu viel in dieser einen Funktion zu tun. Teilen Sie die einzelnen Aufgaben in kleineren Funktionen auf und es wird viel lesbarer und einfacher.

Ich würde so etwas tun:

type 
    TSign = (empty, nought, cross); 

    TMarkArray = array[0..2, 0..2] of TSign; 

    TPlayer = record 
    sign: TSign; 
    // other fields you may need 
    end; 

function CheckSign(const track: TMarkArray; sign: TSign; p1, p2, p3: Integer): Boolean; 
begin 
    Result := (track[p1 div 3, p1 mod 3] = sign) and 
       (track[p2 div 3, p2 mod 3] = sign) and 
       (track[p3 div 3, p3 mod 3] = sign); 
end; 

function CheckPlayer(const track: TMarkArray; sign: TSign): Boolean; 
begin 
    Result := CheckSign(track, sign, 0, 1, 2) or // top row 
      CheckSign(track, sign, 3, 4, 5) or // middle row 
      CheckSign(track, sign, 6, 7, 8) or // bottom row 
      CheckSign(track, sign, 0, 3, 6) or // left column 
      CheckSign(track, sign, 1, 4, 7) or // middle column 
      CheckSign(track, sign, 2, 5, 8) or // right column 
      CheckSign(track, sign, 0, 4, 8) or // top-left - bottom right 
      CheckSign(track, sign, 2, 4, 6); // top right - bottom left 
end; 

function CheckWinner(const track: TMarkArray; p1, p2: TPlayer): string; 
begin 
    if CheckPlayer(track, p1.sign) then 
    Result := 'P1' 
    else if CheckPlayer(track, p2.sign) then 
    Result := 'P2' 
    else 
    Result := 'NO'; 
end; 

Ich weiß nicht, wie Sie Ihre Typen definiert sind, aber ich habe sie so einfach wie möglich für dieses Stück Code und hat eine T vor zu benennen sie als Typen.

Sie könnten Zeilen und Spalten in einer Schleife überprüfen und springen, wenn Sie einen Gewinner gefunden haben, aber für ein kleines Spielfeld wie dieses, mit nur 8 möglichen Gewinnreihen, habe ich die Schleifen weggelassen. Sie würden CheckPlayer nur komplizieren. Für größere Spielfelder können Loops sinnvoll sein.

Versuchen Sie, wenn das funktioniert.

+0

Danke, werde es versuchen und dich wissen lassen. – Sam