2016-05-30 10 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; 

ちょっと、私はパスカルでTicTacToeのコードを書いています。チックタックトゥチェック勝者フリーパスカル

問題は、このコードは常に、行の最後のインデックスをチェックして、プレーヤー1のみに通知しています。主な問題はチェックであり、私はもうチェックできません。 助けてください。

この関数は、プレーヤー1とプレーヤー2の2つのプレーヤーレコードに渡されています。プレーヤー記号はティックまたはクロスで、インデックスパラメーターは2D配列インデックスに変換された画面のボックス番号です。誰かがthis.Thisと私は後でそれに追加することができます行のみのチェックです助けてください。

+0

「続行」は何をすべきだと思いますか? –

+0

ループの残りの部分をスキップするには、continueを使用します。プレイヤー1が勝利すれば、プレイヤー2の勝利をもうチェックする必要はありません。この問題のおかげで私を助けてください。それは本当に感謝します。 – Sam

+0

プレイヤーが勝利した場合、チェックを止めてループから抜け出すことができます。 –

答えて

2

私はあなたがその1つの機能であまりにも多くをやろうとしていると思います。より小さな機能で単一のタスクを分割すれば、より多くの読み込みが可能になり、より簡単になります。私はあなたのタイプが定義されているかわからないが、私は、コードのこの作品のために可能な限り彼らは同じくらい簡単作られ、指定する前にTを追加

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; 

私はこのような何かをするだろうそれらをタイプとして扱います。

勝者が見つかった場合は、ループ内の行と列をチェックできますが、このような小さなプレイフィールドでは、勝者が8つしかない可能性があります。彼らは、CheckPlayerだけを複雑にするでしょう。より大きなプレイフィールドでは、ループが意味をなさないかもしれません。

これが機能するか試してみてください。

+0

ありがとう、試してみよう。 – Sam

関連する問題