Tic Tac Toe检查获胜者免费pascal

时间:2016-05-30 14:26:16

标签: pascal freepascal tic-tac-toe

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传递两个玩家记录,玩家符号为勾选或交叉,索引参数是屏幕上转换为2D数组索引的框号。请有人帮忙解决这个问题。这只是一行检查,我可以稍后再添加。

1 个答案:

答案 0 :(得分:2)

我认为你试图在那个功能中做太多。在较小的函数中将单个任务拆分,它将变得更易读,更简单。

我会做这样的事情:

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复杂化。对于较大的比赛场地,循环可能是有意义的。

尝试是否有效。