C语言井字棋输入改造:将行列输入改为1-9数字输入
解决方案:将井字棋输入改为1-9数字对应位置
核心修改点
- 数字转行列逻辑:无需复杂的switch case,用简单数学计算即可完成转换:
对于输入的数字num(1-9),先减1得到0-8的索引,然后:int index = num - 1; int row = index / 3; int col = index % 3; - 输入流程调整:替换原来的行列输入,改为读取单个数字,并验证其范围是否在1-9内
- 用户提示优化:增加位置对应说明,让玩家清晰了解数字对应的棋盘位置
修改后的完整代码
#include <stdio.h> #include <stdlib.h> #include <time.h> // 初始化空棋盘 void initializeBoard(char board[3][3]) { for(int i=0; i<3;i++){ for(int j=0; j < 3;j++){ board[i][j]= ' '; } } } // 打印棋盘 void printBoard(char board[3][3]){ printf("\n"); printf(" %c | %c | %c \n",board[0][0],board[0][1],board[0][2]); printf("---|---|---\n"); printf(" %c | %c | %c \n",board[1][0],board[1][1],board[1][2]); printf("---|---|---\n"); printf(" %c | %c | %c \n",board[2][0],board[2][1],board[2][2]); printf("\n"); } // 检查玩家是否获胜 int checkWin(char board[3][3], char player) { // 检查行、列、对角线 for(int i = 0; i<3;i++){ if(board[i][0]==player && board[i][1]==player && board[i][2]==player) { return 1; // 玩家获胜 } if (board[0][i]==player && board[1][i] == player && board[2][i] == player) { return 1; // 玩家获胜 } } if (board[0][0]==player && board[1][1] == player && board[2][2] == player) { return 1; // 玩家获胜 } if (board[0][2]==player && board[1][1] == player && board[2][0] == player) { return 1; // 玩家获胜 } return 0; // 无胜者 } // 检查棋盘是否已满(平局) int isBoardFull(char board[3][3]) { for (int i=0; i<3;i++) { for (int j= 0; j<3;j++) { if (board[i][j] == ' ') { return 0; // 棋盘未满 } } } return 1; // 棋盘已满 } // 电脑随机落子 void computerMove(char board[3][3],char computer) { int row, col; do{ row =rand() % 3; // 生成0-2的随机行 col =rand() % 3; // 生成0-2的随机列 } while (board[row][col] !=' ');// 直到找到空位置 board[row][col]=computer; printf("电脑的落子:\n"); printBoard(board); } int main() { char board[3][3]; char playerName[10]; char player = 'X'; char computer = 'O'; // 初始化随机数生成器 srand(time(NULL)); // 初始化棋盘 initializeBoard(board); // 获取玩家姓名 printf("请输入你的名字: "); fflush(stdout); scanf("%s", playerName); printf(" %s,你将和电脑对战井字棋,祝你好运!\n", playerName); // 打印位置对应说明 printf("位置对应关系:\n 1 | 2 | 3 \n---|---|---\n 4 | 5 | 6 \n---|---|---\n 7 | 8 | 9 \n"); // 游戏主循环 while (1) { int num, row, col; // 打印当前棋盘 printf("%s的回合:\n", playerName); printBoard(board); // 获取玩家输入的数字 printf("请输入1-9之间的数字选择落子位置: "); scanf("%d", &num); // 验证输入范围并转换为行列 if (num >=1 && num <=9) { int index = num -1; row = index /3; col = index %3; // 检查位置是否为空 if (board[row][col] == ' ') { board[row][col] = player; // 检查玩家是否获胜 if (checkWin(board, player)) { printf("恭喜你,%s!你赢了!\n", playerName); break; } // 检查是否平局 if (isBoardFull(board)) { printf("平局!\n"); break; } // 电脑落子 computerMove(board, computer); // 检查电脑是否获胜 if (checkWin(board, computer)) { printf("电脑赢了!%s,下次加油!\n", playerName); break; } // 检查是否平局 if (isBoardFull(board)) { printf("平局!\n"); break; } } else { printf("该位置已被占用,请重新选择!\n"); } } else { printf("输入无效,请输入1-9之间的数字!\n"); } } return 0; }
说明
- 用数学计算替代switch case,代码更简洁且易于维护
- 增加了位置对应提示,玩家能直观理解每个数字对应的棋盘位置
- 保留了原代码的所有核心功能(胜负判断、电脑随机落子、平局检测),仅修改了输入逻辑
内容的提问来源于stack exchange,提问作者saber
相关产品推荐
相关产品推荐

