Tic Tac Toe 检查获胜者免费帕斯卡

Tic Tac Toe check winner free pascal

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;

嘿,我正在用 Pascal 为 TicTacToe 编写代码,但卡在了检查赢家功能上。

问题是这段代码总是检查标志行的最后一个索引,并且只告诉玩家 1,主要问题是检查,我想不出任何检查了。 请帮忙。

该函数正在为玩家 1 和玩家 2 传递两个玩家记录,玩家符号是刻度或十字,索引参数是屏幕上转换为二维数组索引的框数。请有人帮忙 this.This 是一行只检查我可以稍后添加到它。

我认为您在那个功能上尝试做的太多了。将单个任务拆分成更小的函数,它会变得更易读,也更简单。

我会这样做:

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;

我不知道你的类型是怎么定义的,但是我把这段代码尽量简单化了,并且在前面加了一个T来表示类型。

您可以在循环中检查行和列,如果找到赢家就跳出,但对于像这样的小游戏场,只有 8 个可能的赢家系列,我省略了循环。它们只会使 CheckPlayer 复杂化。对于较大的运动场,循环可能有意义。

尝试一下是否有效。