我在C上创建一个在终端上运行的连接4游戏,我在检查区域遇到困难,我会发布下面的功能代码,但是这足以检查所有可能性游戏?
int checkResult()
{
int i,j,k,count;
for(i=0;i<sizeWidth;i++)
{
for(j=0;j<sizeHeight-3;j++)
{
//checks horizontal win
if(board[i][j] != 0 && board[i][j]==board[i][j+1] && board[i][j]==board[i][j+2] && board[i][j]==board[i][j+3])
return 1;
//checks vertical win
if(board[i][j] != 0 && board[i][j]==board[i+1][j] && board[i][j]==board[i+2][j] && board[i][j]==board[i+3][j])
return 1;
//checks diagonal win
count = 0;
for(k=1;k<4;k++)
{
if(board[i][j] == board[i+k][j+k] && board[i][j]!=0)
count++;
else
count = 0;
if(count == 3)
return 1;
}
}
}
return 0;
}
答案 0 :(得分:1)
这还不够,因为如果4个点处于最大高度,您将无法检测到它。
另外,它可能是seg-fault(如果i=sizeWidth-1
,board[i+1][j]
未定义)
在你的代码中,你忘记了一些垂直的可能性,而你只是看着一个对角线方向。
你可以做什么,以确保你没有忘记任何事情,正在做多个步骤:检测垂直,水平,然后对角线。在我看来,一次做所有事情都比较复杂。你可以有这样的东西
for(i=0;i<sizeWidth;i++)
{
for(j=0;j<sizeHeight-3;j++)
{
//checks horizontal win
if(board[i][j] != 0 && board[i][j]==board[i][j+1] && board[i][j]==board[i][j+2] && board[i][j]==board[i][j+3])
return 1;
}
}
for(i=0;i<sizeWidth-3;i++)
{
for(j=0;j<sizeHeight;j++)
{
//checks vertical win
if(board[i][j] != 0 && board[i][j]==board[i+1][j] && board[i][j]==board[i+2][j] && board[i][j]==board[i+3][j])
return 1;
}
}
// Check for both diagonals ...
return 0;
在那里,您可以确定每个解决方案都在查看。
答案 1 :(得分:0)
int checkResult()
{
int i,j,k,count;
//checks horizontal win
for(i=0;i<sizeWidth;i++)
for(j=0;j<sizeHeight-3;j++)
if(board[i][j] != 0 && board[i][j]==board[i][j+1] && board[i][j]==board[i][j+2] && board[i][j]==board[i][j+3])
printf("\n1");
//return 1;
//checks vertical win
for(i=0;i<sizeWidth-3;i++)
for(j=0;j<sizeHeight;j++)
if(board[i][j] != 0 && board[i][j]==board[i+1][j] && board[i][j]==board[i+2][j] && board[i][j]==board[i+3][j])
printf("\n2");
//return 2;
//checks rigth diagonal win
for(i=0;i<sizeWidth-3;i++)
for(j=0;j<sizeHeight-3;j++)
if(board[i][j] != 0 && board[i][j]==board[i+1][j+1] && board[i][j]==board[i+2][j+2] && board[i][j]==board[i+3][j+3])
printf("\n3");
//checks left diagonal win
for(i=0;i<sizeWidth-3;i++)
for(j=0;j<sizeHeight-3;j++)
if(board[i][j] != 0 && board[i][j]==board[i+1][j-1] && board[i][j]==board[i+2][j-2] && board[i][j]==board[i+3][j-3])
printf("\n4");
return 0;
}
到目前为止,它通过了我的所有测试:)感谢帮助人员!
答案 2 :(得分:0)
不要左对角线检查,我试试这段代码:
//checks left diagonal win
for(i=0;i<sizeWidth-3;i++)
for(j=3;j<sizeHeight;j++)
if(board[i][j] != 0 && board[i][j]==board[i+1][j-1] && board[i][j]==board[i+2][j-2] && board[i][j]==board[i+3][j-3])
printf("\n4");
因为变量j是递减的,所以你必须将j被理论化为3并在条件中删除sizeHeight-3。