2016-05-30 64 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的两个玩家记录,玩家符号是勾号或交叉,索引参数是屏幕上转换为二维数组索引的箱号。请有人帮助这个。这是一个只有一个检查,我可以稍后添加到它。

+0

您认为“继续”应该做什么? –

+0

嘿,继续用于跳过循环的其余部分。我正在继续使用,因为如果玩家1获胜,则不需要再次检查玩家2的胜利。你能帮我解决这个问题,谢谢。会真的很感激它。 – Sam

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

试试看是否有效。

+0

谢谢你,试试吧,让你知道。 – Sam