服务器之家

服务器之家 > 正文

适合初学者练习的C语言实现三子棋小游戏

时间:2022-01-25 14:39     来源/作者:小明bite

用简单的C语言来实现小时候玩的三子棋游戏,下面是人机对战,当然这个代码的电脑对手是人工智障而不是人工智能

 一、写代码前明确下棋时的步骤与顺序

  • 1.创建一个3*3的棋盘.
  • 2.将上面创建的棋盘中每个格初始化成' '状态.
  • 3.打印出初始化完成的棋盘
  • 4.玩家落子
  • 5.电脑落子
  • 6.判断胜负

写代码之前梳理好大概的思路,先写出初步的主函数

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
int main() {
 char winner = ' ';
 //1.创建一个棋盘,并初始化.
 char board[MAX_ROW][MAX_COL] = { 0 };
 //2.init函数将棋盘每个格子初始化成' '.
 init(board);
 while (1) {
  //3.打印棋盘
  printBoard(board);
  //4.玩家落子
  playerMove(board);
  //5.判断胜负
  winner = checkWinner(board);
  if (winner != ' ') {
   //胜负已分
   break;
  }
  //6.电脑落子
  computerMove(board);
  //7.判断胜负
  winner = checkWinner(board);
  if (winner != ' ') {
   //胜负已分
   break;
  }
 }

在创建棋盘是char board[][]的[]中不要写3,写3在后面看代码时不能明确分清3代表什么

因此建议定义宏

?
1
2
#define MAX_ROW  3
#define MAX_COL  3

这样可以清楚的看出[]中的内容代表什么,提高可读性.

 二 根据初步的主函数完成想要的代码

1.写一个函数来初始化棋盘

?
1
2
3
4
5
6
7
8
9
10
11
//将棋盘初始化成' '
void init(char board[MAX_ROW][MAX_COL]) {
 for (int row = 0; row < MAX_ROW; row++) {
  for(int col = 0; col < MAX_COL; col++) {
   board[row][col] = ' ';
  }
 }
 //设计随机种子
 srand((unsigned int) time(0));
}

2.打印棋盘

?
1
2
3
4
5
6
7
8
9
10
11
12
void printBoard(char board[MAX_ROW][MAX_COL]) {
 system("cls");
 for (int row = 0; row < MAX_ROW; row++) {
  printf("+---+---+---+\n");
  for (int col = 0; col < MAX_COL; col++) {
   printf("| %c ", board[row][col]);
  }
  printf("|");
  printf("\n");
 }
 printf("+---+---+---+\n");
}

system("cls")是让每次打印棋盘前清除之前的棋盘这样能让界面清晰一些

(使用的是简单的C来完成程序所以打印的棋盘也比较简陋)

3.玩家落子

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
void playerMove(char board[MAX_ROW][MAX_COL]) {
 printf("请玩家落子!");
 while (1) {
  printf("请输入落子的位置(row col):");
  int row = 0;
  int col = 0;
  scanf("%d %d", &row, &col);
  //输入后验证输入内容是否合法.
  if (row < 0 || row >= MAX_ROW || col < 0 || col >= MAX_COL) {
   printf("输入有误.请重新输入!\n");
   continue;
  }
  if (board[row][col] != ' ') {
   printf("当前位置已有棋子,请重新输入!\n");
   continue;
  }
  board[row][col] = 'x';
  break;
 }
}

以输入坐标的方式来实现落子,并且要检测玩家落子是否合理,以免输入无效的坐标.

4.电脑落子

?
1
2
3
4
5
6
7
8
9
10
11
12
void computerMove(char board[MAX_ROW][MAX_COL]) {
 printf("轮到电脑落子");
 while (1) {
  int row = rand() % MAX_ROW;
  int col = rand() % MAX_COL;
  if (board[row][col] != ' ') {
   continue;
  }
  board[row][col] = 'o';
  break;
 }
}

电脑落子采用随机数的方式来进行落子,因此需要设置随机种子,将它写在初始化棋盘函数内,每次初始化一次进行一次随机种子的设置

由于是随机落子因此实现的不是人工智能而是人工智障.

5.判断胜负

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
int checkWinner(char board[MAX_ROW][MAX_COL]) {
 //检查所有行
 for (int row = 0; row < MAX_ROW; row++) {
  if (board[row][0] != ' ' && board[row][0] == board[row][1] && board[row][0] == board[row][2]) {
   return board[row][0];
  }
 }
 //检查所有列
 for (int col = 0; col < MAX_COL; col++) {
  if (board[0][col] != ' ' && board[0][col] == board[1][col] && board[0][col] == board[2][col]) {
   return board[0][col];
  }
 }
 //检查对角线
 if (board[0][0] == board[1][1] && board[0][0] == board[2][2] && board[0][0] != ' ') {
  return board[0][0];
 }
 if (board[0][2] == board[1][1] && board[0][2] == board[2][0] && board[0][2] != ' ') {
  return board[0][2];
 }
 if (isFull(board)) {
  return 'q';
 }
 return ' ';
}

检查每行 每列  对角线是否有三个相同的棋子从而判断胜负.

?
1
2
3
4
5
6
7
8
9
10
11
12
int isFull(char board[MAX_ROW][MAX_COL]) {
 for (int row = 0; row < MAX_ROW; row++) {
  for (int col = 0; col < MAX_COL; col++) {
   if (board[row][col] == ' ') {
    //棋盘没满
    return 0;
   }
  }
 }
 return 1;
}

检查棋盘有没有下满(可能出现和棋)

 这就实现一个简单的三子棋游戏

在主函数中玩家落子后应也判断一次胜负,以免出现玩家胜利电脑再落子的情况.

三、三子棋实现代码

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<time.h>
 
#define MAX_ROW  3
#define MAX_COL  3
 
//将棋盘初始化成' '
void init(char board[MAX_ROW][MAX_COL]) {
 for (int row = 0; row < MAX_ROW; row++) {
  for(int col = 0; col < MAX_COL; col++) {
   board[row][col] = ' ';
  }
 }
 //设计随机种子
 srand((unsigned int) time(0));
}
void printBoard(char board[MAX_ROW][MAX_COL]) {
 system("cls");
 for (int row = 0; row < MAX_ROW; row++) {
  printf("+---+---+---+\n");
  for (int col = 0; col < MAX_COL; col++) {
   printf("| %c ", board[row][col]);
  }
  printf("|");
  printf("\n");
 }
 printf("+---+---+---+\n");
}
void playerMove(char board[MAX_ROW][MAX_COL]) {
 printf("请玩家落子!");
 while (1) {
  printf("请输入落子的位置(row col):");
  int row = 0;
  int col = 0;
  scanf("%d %d", &row, &col);
  //输入后验证输入内容是否合法.
  if (row < 0 || row >= MAX_ROW || col < 0 || col >= MAX_COL) {
   printf("输入有误.请重新输入!\n");
   continue;
  }
  if (board[row][col] != ' ') {
   printf("当前位置已有棋子,请重新输入!\n");
   continue;
  }
  board[row][col] = 'x';
  break;
 }
}
void computerMove(char board[MAX_ROW][MAX_COL]) {
 printf("轮到电脑落子");
 while (1) {
  int row = rand() % MAX_ROW;
  int col = rand() % MAX_COL;
  if (board[row][col] != ' ') {
   continue;
  }
  board[row][col] = 'o';
  break;
 }
}
int isFull(char board[MAX_ROW][MAX_COL]) {
 for (int row = 0; row < MAX_ROW; row++) {
  for (int col = 0; col < MAX_COL; col++) {
   if (board[row][col] == ' ') {
    //棋盘没满
    return 0;
   }
  }
 }
 return 1;
}
int checkWinner(char board[MAX_ROW][MAX_COL]) {
 //检查所有行
 for (int row = 0; row < MAX_ROW; row++) {
  if (board[row][0] != ' ' && board[row][0] == board[row][1] && board[row][0] == board[row][2]) {
   return board[row][0];
  }
 }
 //检查所有列
 for (int col = 0; col < MAX_COL; col++) {
  if (board[0][col] != ' ' && board[0][col] == board[1][col] && board[0][col] == board[2][col]) {
   return board[0][col];
  }
 }
 //检查对角线
 if (board[0][0] == board[1][1] && board[0][0] == board[2][2] && board[0][0] != ' ') {
  return board[0][0];
 }
 if (board[0][2] == board[1][1] && board[0][2] == board[2][0] && board[0][2] != ' ') {
  return board[0][2];
 }
 if (isFull(board)) {
  return 'q';
 }
 return ' ';
}
int main() {
 char winner = ' ';
 //1.创建一个棋盘,并初始化.
 char board[MAX_ROW][MAX_COL] = { 0 };
 //2.init函数将棋盘每个格子初始化成' '.
 init(board);
 while (1) {
  //3.打印棋盘
  printBoard(board);
  //4.玩家落子
  playerMove(board);
  //5.判断胜负
  winner = checkWinner(board);
  if (winner != ' ') {
   //胜负已分
   break;
  }
  //6.电脑落子
  computerMove(board);
  //7.判断胜负
  winner = checkWinner(board);
  if (winner != ' ') {
   //胜负已分
   break;
  }
 }
 if (winner == 'x') {
  printf("恭喜你,你赢了!\n");
 }else if(winner=='o') {
  printf("你真菜连人工智障都玩不过\n");
 }else {
  printf("你和人工智障五五开\n");
 }
 return 0;
}

运行界面如下:

适合初学者练习的C语言实现三子棋小游戏

到此这篇关于初学者练习--C语言写三子棋小游戏的文章就介绍到这了,更多相关C语言写三子棋小游戏内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/m0_62031099/article/details/120792262

相关文章

热门资讯

蜘蛛侠3英雄无归3正片免费播放 蜘蛛侠3在线观看免费高清完整
蜘蛛侠3英雄无归3正片免费播放 蜘蛛侠3在线观看免费高清完整 2021-08-24
yue是什么意思 网络流行语yue了是什么梗
yue是什么意思 网络流行语yue了是什么梗 2020-10-11
背刺什么意思 网络词语背刺是什么梗
背刺什么意思 网络词语背刺是什么梗 2020-05-22
2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全
2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全 2019-12-26
2021年耽改剧名单 2021要播出的59部耽改剧列表
2021年耽改剧名单 2021要播出的59部耽改剧列表 2021-03-05
返回顶部