Pascal Tic Tac Toe check优胜者免费帕斯卡

Pascal Tic Tac Toe check优胜者免费帕斯卡,pascal,freepascal,tic-tac-toe,Pascal,Freepascal,Tic Tac Toe,嘿,我正在用pascal为Tictatcoe编写代码,并停留在check winner函数上 问题是这段代码总是检查行的最后一个索引中的符号,并且只告诉玩家1,主要的问题是检查,我想不出还有什么检查了。 请帮忙 该函数正在传递两个播放器记录,分别为播放器1和播放器2,播放器符号为勾号或叉号,索引参数为屏幕上转换为2D数组索引的框号。请有人帮忙。这是我以后可以添加到其中的一行检查。我认为您在这一功能中做的太多了。将单个任务拆分为更小的函数,这样会变得更可读、更简单 我会这样做: function

嘿,我正在用pascal为Tictatcoe编写代码,并停留在check winner函数上

问题是这段代码总是检查行的最后一个索引中的符号,并且只告诉玩家1,主要的问题是检查,我想不出还有什么检查了。 请帮忙


该函数正在传递两个播放器记录,分别为播放器1和播放器2,播放器符号为勾号或叉号,索引参数为屏幕上转换为2D数组索引的框号。请有人帮忙。这是我以后可以添加到其中的一行检查。

我认为您在这一功能中做的太多了。将单个任务拆分为更小的函数,这样会变得更可读、更简单

我会这样做:

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;
我不知道您的类型是如何定义的,但我对这段代码使它们尽可能简单,并在前面添加了一个t以将它们指定为类型

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


如果可行的话,试试看。

我认为您在这一功能中做得太多了。将单个任务拆分为更小的函数,这样会变得更可读、更简单

我会这样做:

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;
我不知道您的类型是如何定义的,但我对这段代码使它们尽可能简单,并在前面添加了一个t以将它们指定为类型

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


如果可行,试试。

你认为
Continue
应该做什么?嘿,Continue用于跳过循环的其余部分。我使用continue是因为如果玩家1赢了,你不需要再检查玩家2赢了。你能帮我解决这个问题吗?谢谢。非常感谢。如果其中一名玩家赢了,你可以停止检查并跳出循环。你认为
Continue
应该做什么?嘿,Continue用来跳过循环的其余部分。我使用continue是因为如果玩家1赢了,你不需要再检查玩家2赢了。你能帮我解决这个问题吗?谢谢。我会非常感激的。如果其中一个玩家赢了,你可以停止检查并打破循环。谢谢,我会尝试让你知道的。谢谢,我会尝试让你知道的。