如何解决C语言井字棋游戏中数组无法重置的问题?
井字棋游戏数组重置失败问题解决
你的核心问题在于reset函数的逻辑错误——你把数组元素设为了ASCII值为0的空字符,而不是恢复成初始的'1'到'9'字符,导致重新游戏时棋盘显示异常,看起来像是没重置。另外你的checkWin函数里的平局判断条件完全无效,这也会影响游戏流程。
问题1:reset函数错误
原reset函数把space[i][j]设为0,对应不可见的空字符,而初始棋盘是数字字符'1'-'9',正确的重置应该恢复这些字符。修正后的reset函数:
void reset(){ int num = 1; for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { space[i][j] = '0' + num; // 把数字转换成对应ASCII字符 num++; } } }
问题2:checkWin函数平局判断完全无效
原代码里的平局判断条件space[0][0] != space[0][0] && ...永远为假,因为一个值不可能不等于自身。正确的平局判断应该检查所有格子都已被占据(即不是初始的数字字符):
int checkWin(){ // 保留原有胜负判断逻辑 if (space[0][0] == space[0][1] && space[0][1] == space[0][2]) return 1; else if (space[1][0] == space[1][1] && space[1][1] == space[1][2]) return 1; else if (space[2][0] == space[2][1] && space[2][1] == space[2][2]) return 1; else if (space[0][0] == space[1][0] && space[1][0] == space[2][0]) return 1; else if (space[0][1] == space[1][1] && space[1][1] == space[2][1]) return 1; else if (space[0][2] == space[1][2] && space[1][2] == space[2][2]) return 1; else if (space[0][0] == space[1][1] && space[1][1] == space[2][2]) return 1; else if (space[0][2] == space[1][1] && space[1][1] == space[2][0]) return 1; // 修正平局判断:检查所有格子都不是数字字符 else if ( (space[0][0] < '1' || space[0][0] > '9') && (space[0][1] < '1' || space[0][1] > '9') && (space[0][2] < '1' || space[0][2] > '9') && (space[1][0] < '1' || space[1][0] > '9') && (space[1][1] < '1' || space[1][1] > '9') && (space[1][2] < '1' || space[1][2] > '9') && (space[2][0] < '1' || space[2][0] > '9') && (space[2][1] < '1' || space[2][1] > '9') && (space[2][2] < '1' || space[2][2] > '9') ) return 0; else return -1; }
额外小问题:main函数循环条件
原main函数的while(choice != 0)逻辑不合理,因为菜单里没有0选项,改成while(1)让菜单循环一直运行,直到用户选择退出:
int main(){ int choice = -1; do{ printf("\n\n\n\n\n\n\n\t\t\t ================\n"); printf("\t\t\t Tic Tac Toe\n"); printf("\t\t\t ================\n"); printf("\t\t -----------Menu-----------\n\n"); printf("\t\t 1. Play\n"); printf("\t\t 2. Exit\n"); scanf("%d", &choice); switch(choice){ case 1: game(); break; case 2: printf("Goodbye!!"); exit(0); break; default: printf(".......Wrong Key !.......Try Again!......"); break; } }while(1); // 无限循环,直到用户选择退出 }
完整修正后代码
#include <stdio.h> #include <conio.h> #include <stdlib.h> char space[3][3] = { {'1','2','3'}, {'4','5','6'}, {'7','8','9'} }; void board(); int checkWin(); int game(); void reset(); int main(){ int choice = -1; do{ printf("\n\n\n\n\n\n\n\t\t\t ================\n"); printf("\t\t\t Tic Tac Toe\n"); printf("\t\t\t ================\n"); printf("\t\t -----------Menu-----------\n\n"); printf("\t\t 1. Play\n"); printf("\t\t 2. Exit\n"); scanf("%d", &choice); switch(choice){ case 1: game(); break; case 2: printf("Goodbye!!"); exit(0); break; default: printf(".......Wrong Key !.......Try Again!......"); break; } }while(1); } int game(){ int player = 1, i, choice; char mark; do { system("cls"); board(); player = (player % 2) ? 1 : 2; printf("Player %d, enter a number: ", player); scanf("%d", &choice); mark = (player == 1) ? 'X' : 'O'; if (choice == 1) space[0][0] = mark; else if (choice == 2) space[0][1] = mark; else if (choice == 3) space[0][2] = mark; else if (choice == 4) space[1][0] = mark; else if (choice == 5) space[1][1] = mark; else if (choice == 6) space[1][2] = mark; else if (choice == 7) space[2][0] = mark; else if (choice == 8) space[2][1] = mark; else if (choice == 9) space[2][2] = mark; else { printf("Invalid move "); player--; getch(); } i = checkWin(); player++; }while (i == -1); board(); reset(); if (i == 1) printf("==>\aPlayer %d win \n\n", --player); else printf("==>\aGame draw\n\n"); getch(); return 0; } int checkWin(){ if (space[0][0] == space[0][1] && space[0][1] == space[0][2]) return 1; else if (space[1][0] == space[1][1] && space[1][1] == space[1][2]) return 1; else if (space[2][0] == space[2][1] && space[2][1] == space[2][2]) return 1; else if (space[0][0] == space[1][0] && space[1][0] == space[2][0]) return 1; else if (space[0][1] == space[1][1] && space[1][1] == space[2][1]) return 1; else if (space[0][2] == space[1][2] && space[1][2] == space[2][2]) return 1; else if (space[0][0] == space[1][1] && space[1][1] == space[2][2]) return 1; else if (space[0][2] == space[1][1] && space[1][1] == space[2][0]) return 1; // 修正平局判断 else if ( (space[0][0] < '1' || space[0][0] > '9') && (space[0][1] < '1' || space[0][1] > '9') && (space[0][2] < '1' || space[0][2] > '9') && (space[1][0] < '1' || space[1][0] > '9') && (space[1][1] < '1' || space[1][1] > '9') && (space[1][2] < '1' || space[1][2] > '9') && (space[2][0] < '1' || space[2][0] > '9') && (space[2][1] < '1' || space[2][1] > '9') && (space[2][2] < '1' || space[2][2] > '9') ) return 0; else return -1; } void reset(){ int num = 1; for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { space[i][j] = '0' + num; num++; } } } void board(){ system("cls"); printf("\n\n\tTic Tac Toe\n\n"); printf("Player 1 (X) - Player 2 (O)\n\n\n"); printf(" | | \n"); printf(" %c | %c | %c \n", space[0][0], space[0][1], space[0][2]); printf("_____|_____|_____\n"); printf(" | | \n"); printf(" %c | %c | %c \n", space[1][0], space[1][1], space[1][2]); printf("_____|_____|_____\n"); printf(" | | \n"); printf(" %c | %c | %c \n", space[2][0], space[2][1], space[2][2]); printf(" | | \n\n"); }
内容的提问来源于stack exchange,提问作者newbie programmerzzz
相关产品推荐
相关产品推荐

