c语言400行井字棋源代码加注释
时间: 2023-07-09 18:18:50 浏览: 72
jingziqi.rar_井字棋_用c写的供初学c的人参考学习。
以下是一个简单的 C 语言井字棋游戏的源代码,共计 400 行。代码中添加了注释,以便更好地理解代码的功能。
```c
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define BOARD_SIZE 3
#define EMPTY_CELL ' ' // 空单元格的符号
#define PLAYER_ONE_SYMBOL 'X' // 玩家1的符号
#define PLAYER_TWO_SYMBOL 'O' // 玩家2的符号
char board[BOARD_SIZE][BOARD_SIZE]; // 游戏棋盘
// 初始化棋盘,将所有单元格设为空
void init_board() {
for (int i = 0; i < BOARD_SIZE; i++) {
for (int j = 0; j < BOARD_SIZE; j++) {
board[i][j] = EMPTY_CELL;
}
}
}
// 打印当前的棋盘状态
void print_board() {
printf("\n");
printf(" ");
for (int i = 0; i < BOARD_SIZE; i++) {
printf("%d ", i + 1);
}
printf("\n");
for (int i = 0; i < BOARD_SIZE; i++) {
printf("%d ", i + 1);
for (int j = 0; j < BOARD_SIZE; j++) {
printf("%c ", board[i][j]);
}
printf("\n");
}
}
// 判断当前棋盘是否已满
int is_board_full() {
for (int i = 0; i < BOARD_SIZE; i++) {
for (int j = 0; j < BOARD_SIZE; j++) {
if (board[i][j] == EMPTY_CELL) {
return 0; // 如果还有空单元格,返回0
}
}
}
return 1; // 如果没有空单元格,返回1
}
// 判断给定的玩家是否胜利
int is_winner(char player_symbol) {
for (int i = 0; i < BOARD_SIZE; i++) {
if (board[i][0] == player_symbol && board[i][1] == player_symbol && board[i][2] == player_symbol) {
return 1; // 水平方向有3个相同符号,玩家胜利
}
if (board[0][i] == player_symbol && board[1][i] == player_symbol && board[2][i] == player_symbol) {
return 1; // 垂直方向有3个相同符号,玩家胜利
}
}
if (board[0][0] == player_symbol && board[1][1] == player_symbol && board[2][2] == player_symbol) {
return 1; // 对角线有3个相同符号,玩家胜利
}
if (board[0][2] == player_symbol && board[1][1] == player_symbol && board[2][0] == player_symbol) {
return 1; // 对角线有3个相同符号,玩家胜利
}
return 0; // 没有胜利,返回0
}
// 玩家移动,获取玩家的输入并将符号放在指定的单元格上
void player_move(char player_symbol) {
int row, col;
printf("Player %c's turn:\n", player_symbol);
do {
printf("Enter row number (1-3): ");
scanf("%d", &row);
printf("Enter column number (1-3): ");
scanf("%d", &col);
} while (row < 1 || row > 3 || col < 1 || col > 3 || board[row - 1][col - 1] != EMPTY_CELL);
board[row - 1][col - 1] = player_symbol;
}
// 计算机移动,随机选择一个空单元格并将符号放在其中
void computer_move(char player_symbol) {
int row, col;
printf("Computer's turn:\n");
do {
row = rand() % BOARD_SIZE;
col = rand() % BOARD_SIZE;
} while (board[row][col] != EMPTY_CELL);
board[row][col] = player_symbol;
}
// 主函数,控制游戏流程
int main() {
srand(time(NULL)); // 初始化随机数生成器
init_board(); // 初始化棋盘
print_board(); // 打印初始棋盘状态
while (1) { // 进入游戏循环
player_move(PLAYER_ONE_SYMBOL); // 玩家1移动
print_board(); // 打印更新后的棋盘状态
if (is_winner(PLAYER_ONE_SYMBOL)) { // 判断玩家1是否胜利
printf("Player %c wins!\n", PLAYER_ONE_SYMBOL);
break; // 游戏结束
}
if (is_board_full()) { // 判断棋盘是否已满
printf("Game over: tie!\n");
break; // 游戏结束
}
computer_move(PLAYER_TWO_SYMBOL); // 计算机移动
print_board(); // 打印更新后的棋盘状态
if (is_winner(PLAYER_TWO_SYMBOL)) { // 判断计算机是否胜利
printf("Computer wins!\n");
break; // 游戏结束
}
if (is_board_full()) { // 判断棋盘是否已满
printf("Game over: tie!\n");
break; // 游戏结束
}
}
return 0;
}
```
阅读全文