用C语言实现井字棋游戏代码
1. 程序框架
首先,我们需要理解井字棋游戏的规则,然后设计程序框架。井字棋通常是由两个玩家交替下棋,棋盘为 3x3 的矩阵,玩家通过落子来使自己的棋子连成一条直线。因此,我们需要至少维护以下信息:
- 棋盘状态,即每个位置的落子情况;
- 游戏进程状态,即当前轮到哪个玩家下棋,或者游戏是否结束。
接下来,我们可以设计井字棋程序的结构体,在结构体中包含以上信息,并为结构体提供相关的操作函数。接下来的编程过程将重点围绕这些函数进行。
示例代码:
// 定义井字棋游戏结构体
typedef struct {
char board[3][3]; // 棋盘状态
char player; // 当前下棋的玩家,'X' 或 'O'
int gameover; // 游戏是否结束的标志
} TicTacToe;
// 初始化游戏
void TicTacToe_init(TicTacToe* game) {
memset(game->board, ' ', sizeof(game->board));
game->player = 'X';
game->gameover = 0;
}
// 判断当前局面是否合法
int TicTacToe_valid(TicTacToe* game, int x, int y) {
return (x >= 0 && x < 3 && y >= 0 && y < 3 && game->board[x][y] == ' ');
}
// 下棋
void TicTacToe_move(TicTacToe* game, int x, int y) {
if (game->gameover || !TicTacToe_valid(game, x, y)) {
return;
}
game->board[x][y] = game->player;
game->player = (game->player == 'X') ? 'O' : 'X';
// 判断是否获胜或平局
if ((game->board[0][0] != ' ' && game->board[0][0] == game->board[0][1] && game->board[0][1] == game->board[0][2]) ||
(game->board[1][0] != ' ' && game->board[1][0] == game->board[1][1] && game->board[1][1] == game->board[1][2]) ||
(game->board[2][0] != ' ' && game->board[2][0] == game->board[2][1] && game->board[2][1] == game->board[2][2]) ||
(game->board[0][0] != ' ' && game->board[0][0] == game->board[1][0] && game->board[1][0] == game->board[2][0]) ||
(game->board[0][1] != ' ' && game->board[0][1] == game->board[1][1] && game->board[1][1] == game->board[2][1]) ||
(game->board[0][2] != ' ' && game->board[0][2] == game->board[1][2] && game->board[1][2] == game->board[2][2]) ||
(game->board[0][0] != ' ' && game->board[0][0] == game->board[1][1] && game->board[1][1] == game->board[2][2]) ||
(game->board[0][2] != ' ' && game->board[0][2] == game->board[1][1] && game->board[1][1] == game->board[2][0])) {
game->gameover = 1;
} else if (game->board[0][0] != ' ' && game->board[0][1] != ' ' && game->board[0][2] != ' ' &&
game->board[1][0] != ' ' && game->board[1][1] != ' ' && game->board[1][2] != ' ' &&
game->board[2][0] != ' ' && game->board[2][1] != ' ' && game->board[2][2] != ' ') {
game->gameover = 1;
}
}
// 打印棋盘
void TicTacToe_print(TicTacToe* game) {
printf(" %c | %c | %c \n", game->board[0][0], game->board[0][1], game->board[0][2]);
printf("---+---+---\n");
printf(" %c | %c | %c \n", game->board[1][0], game->board[1][1], game->board[1][2]);
printf("---+---+---\n");
printf(" %c | %c | %c \n", game->board[2][0], game->board[2][1], game->board[2][2]);
}
// 主函数,用于演示井字棋的玩法
int main() {
TicTacToe game;
TicTacToe_init(&game);
TicTacToe_print(&game);
while (!game.gameover) {
printf("当前玩家:%c,请输入你要落子的坐标(x, y):", game.player);
int x, y;
scanf("%d %d", &x, &y);
TicTacToe_move(&game, x, y);
TicTacToe_print(&game);
}
if (game.player == 'X') {
printf("O 获胜!\n");
} else if (game.player == 'O') {
printf("X 获胜!\n");
} else {
printf("平局!\n");
}
return 0;
}
2. 示例说明
下面是两个示例,分别演示了井字棋的基本玩法和异常情况的处理:
示例 1:基本玩法
TicTacToe game;
TicTacToe_init(&game);
TicTacToe_print(&game);
while (!game.gameover) {
printf("当前玩家:%c,请输入你要落子的坐标(x, y):", game.player);
int x, y;
scanf("%d %d", &x, &y);
TicTacToe_move(&game, x, y);
TicTacToe_print(&game);
}
if (game.player == 'X') {
printf("O 获胜!\n");
} else if (game.player == 'O') {
printf("X 获胜!\n");
} else {
printf("平局!\n");
}
这个示例演示了井字棋的基本玩法,玩家轮流下棋,直到出现获胜或平局的情况。TicTacToe_print
函数用于打印当前棋盘状态,TicTacToe_move
函数用于执行玩家的落子操作,game.gameover
表示游戏是否结束,game.player
表示当前玩家。
示例 2:异常情况的处理
TicTacToe game;
TicTacToe_init(&game);
TicTacToe_print(&game);
TicTacToe_move(&game, 1, 1);
TicTacToe_move(&game, 1, 1);
TicTacToe_print(&game);
这个示例演示了异常情况的处理,当玩家落子的位置已经有了棋子或者越界时,该步操作应被忽略。TicTacToe_valid
函数用于判断当前位置是否合法,TicTacToe_move
函数在判断合法性之后执行落子操作,如果该操作非法(如第二次落在了已有的棋子上),则不会发生任何改变。在这个示例中,我们首先在中心位置落了一枚棋,然后再次在同一个位置落子。执行完第二次操作之后,棋盘状态会保持不变,玩家仍然是 'O'(第一次落子的玩家),而不是 'X',游戏也没有结束。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:用C语言实现井字棋游戏代码 - Python技术站