C语言实现简易三子棋游戏
一、需求分析
- 能够绘制出游戏棋盘。
- 能够让玩家先手。
- 能够根据玩家落子的位置更新棋盘并判断胜负。
- 能够实现电脑自动下子并判断胜负。
- 运行结束后能统计结果并提供重新开始游戏的选项。
二、实现步骤
- 定义3 * 3的二维数组,用于表示棋盘。
- 实现绘制游戏棋盘的函数。
- 实现获取玩家输入坐标的函数。
- 实现判断坐标是否合法的函数。
- 实现在棋盘上绘制棋子的函数。
- 实现判断胜利的函数。
- 实现电脑自动下子的函数。
- 实现统计结果的函数。
- 实现整个游戏的主函数。
2.1 绘制游戏棋盘
可以使用嵌套循环遍历整个棋盘数组,使用 printf 函数绘制出游戏棋盘。
示例代码:
void draw_board() {
for (int i = 0; i < ROW; i++) {
for (int j = 0; j < COL; j++) {
printf(" %c ", board[i][j]);
if (j != COL - 1) {
printf("|");
}
}
printf("\n");
if (i != ROW - 1) {
printf("-----------\n");
}
}
}
2.2 获取玩家输入坐标
可以使用 scanf 函数获取玩家输入的坐标,需要注意行号和列号要减一才能对应到棋盘数组中的下标。
示例代码:
void player_move() {
int row, col;
printf("请您输入下棋的坐标,格式如:1,1\n");
scanf("%d,%d", &row, &col);
row -= 1;
col -= 1;
if (!is_valid_move(row, col)) {
printf("输入的坐标不合法,请重新输入\n");
player_move();
} else {
place_piece(row, col, 1);
}
}
2.3 判断坐标是否合法
需要判断坐标是否越界和该位置是否被占据。
示例代码:
bool is_valid_move(int row, int col) {
if (row < 0 || row >= ROW || col < 0 || col >= COL) {
return false;
} else if (board[row][col] != '-') {
return false;
} else {
return true;
}
}
2.4 在棋盘上绘制棋子
根据下棋方的不同在棋盘上绘制不同的棋子。可以使用三目运算符简化代码。
示例代码:
void place_piece(int row, int col, int player) {
board[row][col] = player == 1 ? 'X' : 'O';
draw_board();
}
2.5 判断胜利
需要判断每一行、列和对角线是否三个连续的棋子由同一方下出。
示例代码:
bool has_won(int player) {
// 判断所有行
for (int i = 0; i < ROW; i++) {
if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][0] == (player == 1 ? 'X' : 'O')) {
return true;
}
}
// 判断所有列
for (int i = 0; i < COL; i++) {
if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[0][i] == (player == 1 ? 'X' : 'O')) {
return true;
}
}
// 判断对角线
if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[0][0] == (player == 1 ? 'X' : 'O')) {
return true;
}
if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[0][2] == (player == 1 ? 'X' : 'O')) {
return true;
}
// 如果没有胜利,则返回false
return false;
}
2.6 电脑自动下子
可以根据随机数生成电脑下棋的位置,需要判断该位置是否合法。
示例代码:
void computer_move() {
int row, col;
srand(time(NULL));
do {
row = rand() % ROW;
col = rand() % COL;
} while (!is_valid_move(row, col));
place_piece(row, col, -1);
}
2.7 统计结果
需要记录玩家和电脑的得分并显示在屏幕上,可以使用全局变量实现。
示例代码:
int player_score = 0;
int computer_score = 0;
void show_score() {
printf("玩家得分:%d\n", player_score);
printf("电脑得分:%d\n", computer_score);
}
void update_score(int winner) {
if (winner == 1) {
player_score += 1;
} else if (winner == -1) {
computer_score += 1;
}
show_score();
}
2.8 整个游戏的主函数
需要在主函数中循环执行玩家和电脑的下棋操作,直到有一方胜利或者棋盘放满。
示例代码:
int main() {
init_board();
draw_board();
while (!is_full()) {
player_move();
if (has_won(1)) {
printf("恭喜,您获得了胜利!\n");
update_score(1);
break;
}
if (is_full()) {
printf("平局!\n");
break;
}
computer_move();
if (has_won(-1)) {
printf("很遗憾,您输掉了!\n");
update_score(-1);
break;
}
}
return 0;
}
三、示例说明
示例1: 玩家胜利
- | - | -
-----------
- | - | -
-----------
- | - | -
请您输入下棋的坐标,格式如:1,1
1,1
X | - | -
-----------
- | - | -
-----------
- | - | -
请您输入下棋的坐标,格式如:1,1
2,2
X | - | -
-----------
- | O | -
-----------
- | - | -
请您输入下棋的坐标,格式如:1,1
1,2
X | X | -
-----------
- | O | -
-----------
- | - | -
请您输入下棋的坐标,格式如:1,1
3,1
X | X | -
-----------
- | O | -
-----------
O | - | -
请您输入下棋的坐标,格式如:1,1
3,2
X | X | -
-----------
- | O | -
-----------
O | X | -
恭喜,您获得了胜利!
玩家得分:1
电脑得分:0
示例2: 平局
- | - | -
-----------
- | - | -
-----------
- | - | -
请您输入下棋的坐标,格式如:1,1
1,1
X | - | -
-----------
- | - | -
-----------
- | - | -
请您输入下棋的坐标,格式如:1,1
2,2
X | - | -
-----------
- | O | -
-----------
- | - | -
请您输入下棋的坐标,格式如:1,1
3,3
X | - | -
-----------
- | O | -
-----------
- | - | X
请您输入下棋的坐标,格式如:1,1
2,1
X | - | -
-----------
O | O | -
-----------
- | - | X
请您输入下棋的坐标,格式如:1,1
3,1
X | - | -
-----------
O | O | X
-----------
- | - | X
请您输入下棋的坐标,格式如:1,1
1,2
X | O | -
-----------
O | O | X
-----------
- | - | X
请您输入下棋的坐标,格式如:1,1
2,3
X | O | X
-----------
O | O | X
-----------
- | - | X
平局!
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C语言实现简易三子棋游戏 - Python技术站