C语言tic-tac-toe行列简化

tic-tac-toe程序设计
如何对行与列进行双层循环来合并


#include<stdio.h>
int main(){
    int size = 3;
    int board[size][size];
    int i,j;
    int ret = -1;// -1表示无人赢  1表示x赢  0表示y赢
    int x,y;
    for ( i = 0; i < size; i++)
    {
        for ( j = 0; j < size; j++)
        {
            scanf("%d ",&board[i][j]); //用户输入1或O
        }
    }
    for ( i = 0; i < size && ret == -1; i++)//行
    {
        x = 0;
        y = 0;
        for ( j = 0; j < size; j++)
        {
            if (board[i][j]==1)
            {
                x += 1;
            } else 
            {
                y += 1;
            }
            
        }
    }
    for ( j = 0; j < size && ret == -1; j++)//列
    {
        x = 0;
        y = 0;
        for ( i = 0; i < size; i++)
        {
            if (board[i][j]==1)
            {
                x += 1;
            } else 
            {
                y += 1;
            }
            
        }
        if (x == size)
        {
            ret = 1;
        } else if (y == size)
        {
            ret = 0;
        }
        
    }
    for ( i = 0; i < size && ret == -1; i++)//从左至右对角线
    {
        x = 0;
        y = 0;
        for ( i = 0; i < size; i++)
        {
            if (board[i][i]==1)
            {
                x+=1;
            } else 
            {
                y+=1;
            }
             
        }
        if (x == size)
        {
            ret = 1;
        } else if (y == size)
        {
            ret = 0;
        }
    }
     for ( i = 0; i < size && ret == -1; i++)//从右至左对角线
    {
        x = 0;
        y = 0;
        for ( i = 0; i < size; i++)
        {
            if (board[i][size-i-1]==1)
            {
                x+=1;
            } else 
            {
                y+=1;
            }
             
        }
        if (x == size)
        {
            ret = 1;
        } else if (y == size)
        {
            ret = 0;
        }
        
    }
    if (ret == 1)
    {
        printf("x获胜\n");
    } 
    else if (ret == 0)
    {
        printf("y获胜\n");
    }
    else
    {
        printf("无人获胜\n");
    }
    


}
for ( i = 0; i < size; i++)
    {
        for ( j = 0; j < size; j++)
        {
            scanf("%d ",&board[i][j]); //用户输入1或O
        }
    }
可以写
for ( i = 0; i < size * size; i++)
{
scanf("%d",&board[i/size][i%size]);  //注意%d后面别加空格
}
别的类似

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 这篇文章讲的很详细,请看:C编程练习:tic-tac-toe游戏
  • 除此之外, 这篇博客: 第六周数组与函数编程练习/课堂作业 高精度小数+ tic-tac-toe 游戏——“三子棋”(井字棋)《 程序设计入门——C语言》第七期 浙江大学 翁恺中的 二、课堂示例: 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:

    tic-tac-toe 游戏——“三子棋”(井字棋)
        要求:读入一个3*3的矩阵,矩阵中的数字为1表示该位置上有一个“×”,
                    为0表示该位置上有一个“O”;
        程序判断这个矩阵中是否有获胜的一方,输出表示获胜一方的字符“×”或“O”,
        或输出无人获胜。

    #include<iostream>
    using namespace std;
    
    int main(){
    	/*tic-tac-toe 游戏
    	相当于五子棋变成“三子棋”(井字棋)
    	要求:读入一个3*3的矩阵,矩阵中的数字为1表示该位置上有一个“×”,
    				为0表示该位置上有一个“O”;
    	程序判断这个矩阵中是否有获胜的一方,输出表示获胜一方的字符“×”或“O”,
    	或输出无人获胜。
    	*/
    	const int size = 3;
    	int board[size][size];
    	int i, j;
    	int row_numfX, row_numf0;
    	int col_numfX, col_numf0;
    	int result = -1;		//	-1 :没人赢,1:X赢,0:O赢
    	
    	//读入矩阵
    	for (i = 0; i < size; i++) {
    		for (j = 0; j < size; j++) {
    			scanf("%d", &board[i][j]);
    		}
    	}
    
    	//检查行、列
    	for (i = 0; i < size && result == -1; i++) {
    		row_numf0 = row_numfX = 0;
    		col_numfX = col_numf0 = 0;
    		for (j = 0; j < size; j++) {
    			//检查行
                if (board[i][j] == 1) {
    				row_numfX++;
    			}
    			else {
    				row_numf0++;
    			}
    			//检查列 
                if (board[j][i] == 1) {
    				col_numfX++;
    			}
    			else {
    				col_numf0++;
    			}
    		}
    		if (row_numf0 == size || col_numf0==size) {
    			result = 0;
    		}
    		else if (row_numfX == size || col_numfX == size) {
    			result = 1;
    		}
    	}
    
    	//检查正对角线
    	row_numf0 = row_numfX = 0;
    	for (i = 0; i < size; i++) {
    		if (board[i][i] == 1) {
    			row_numfX++;
    		}
    		else {
    			row_numf0++;
    		}
    	}
    	if (row_numf0 == size) {
    		result = 0;
    	}
    	else if (row_numfX == size) {
    		result = 1;
    	}
    
    	//检查反对角线
    	row_numf0 = row_numfX = 0;
    	for (i = 0; i < size; i++) {
    		if (board[i][size - i - 1] == 1) {
    			row_numfX++;
    		}
    		else {
    			row_numf0++;
    		}
    	}
    	if (row_numf0 == size) {
    		result = 0;
    	}
    	else if (row_numfX == size) {
    		result = 1;
    	}
    
    	{		//打印矩阵,方便查看,调试用,可去掉
    		for (i = 0; i < size; i++) {
    			for (j = 0; j < size; j++) {
    				printf("%d\t", board[i][j]);
    			}
    			printf("\n");
    		}
    	}
    
    	printf("游戏结果:%d赢了。\n", result);
    	system("pause");
    	return 0;
    }

     

  • 以下回答来自chatgpt:

    问题中的参考资料已经给出了一个实现tic-tac-toe游戏的C语言程序。该程序通过双层循环来检查行和列,同时还检查了对角线。下面是参考资料中给出的代码:

    #include <stdio.h>
    
    int main()
    {
        const int SIZE = 3;
        int board[SIZE][SIZE];
        int i, j;
        int numX1, numX2;
        int numO1, numO2;
        int result = -1;     //-1:没人赢, 1:X赢, 0:O赢
    
        //读入矩阵
        printf("请输入井字棋结果,格式如下:\n1 0 1\n0 1 0\n0 1 0\n");
        for ( i=0; i<SIZE; i++ ) {
            for( j=0; j<SIZE; j++ ) {
                scanf("%d", &board[i][j]);
            }
        }
    
        //检查行和列
        for ( i=0; i<SIZE && result==-1; i++ ) {
            numX1 = numX2 = 0;
            numO1 = numO2 = 0;
            for(j=0; j<SIZE; j++){
                if ( board[i][j] == 1 ) {
                    numX1 ++;
                } else {
                    numO1 ++;
                }
                if ( board[j][i] == 1 ) {
                    numX2 ++;
                } else {
                    numO2 ++;
                }
            }
            if ( numX1==SIZE || numX2==SIZE ) {
                result = 1;
            }else if ( numO1==SIZE || numO2==SIZE ) {
                result = 0;
            }
        }
    
        //检查对角线
        numX1 = numX2 = 0;
        numO1 = numO2 = 0;
        for ( i=0; i<SIZE; i++ ){
            if( board[i][i] == 1 ) {
                numX1 ++;
            } else {
                numO1 ++;
            }
            if( board[i][SIZE-i-1] == 1 ) {
                numX2 ++;
            } else {
                numO2 ++;
            }
            if ( numX1==SIZE || numX2==SIZE ) {
                result = 1;
            }else if ( numO1==SIZE || numO2==SIZE )  {
                result = 0;
            }
        }
    
        //输出结果 
        if( result == -1){
            printf("无人获胜\n");
        } else if ( result == 1) {
            printf("X获胜\n");
        } else {
            printf("O获胜\n");
        }
    
        return 0;
    }
    

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^