三子棋游戏简介
这是一个简单的三子棋小游戏,估计大家小时候都玩儿过,只要能连成三个,无论是行,列还是对角线,就可以胜利了。是不是很简单呢,那我们来尝试一下用C语言来写一个简单的三子棋游戏。
一、分析及实现
1.棋盘
想要玩游戏,那首先应该有一个棋盘吧。因为我们玩儿的是三子棋,所以来说一个3X3的棋盘应该可以满足要求。这里使用了一个三行三列的二维数组来模拟三子棋的棋盘。
有了棋盘之后在开始游戏之前先把棋盘初始化一下,这样看起来更方便。
1
2
3
4
5
6
7
8
9
10
11
12
13//初始化棋盘 void InitBoard(char board[][COL], int row, int col) { int i = 0; for (i = 0; i < ROW; i++) { int j = 0; for (j = 0; j < COL; j++) { board[i][j] = ' '; } } }
之后呢,再来打印看看,要优化一下再打印出来
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16//打印棋盘 void DisplayBoard(char board[ROW][COL], int row, int col) { int i = 0; for (i = 0; i < row; i++) { printf("+---+---+---+n"); int j = 0; for (j = 0; j < col; j++) { printf("| %c ", board[i][j]); } printf("|n"); } printf("+---+---+---+n"); }
这是我设计的一个简单的小棋盘
棋盘的风格和样式可以根据自己的喜好更改。
好了,现在我们有了棋盘,有了打印出来的样子,那接下来就应该向棋盘上落子了!
2.落子
下棋呢可以是两个人下,当然也可以自己和电脑下棋,这里我选择和电脑对弈,这样就需要两个功能了,一个是玩家下棋,一个就是电脑下棋了。
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//玩家下棋 void Player_move(char board[ROW][COL], int row, int col) { int x = 0; int y = 0; while (1) { printf("玩家下棋:->"); scanf("%d %d", &x, &y); if (x > 0 && x <= row && y > 0 && y <= col) { if (board[x - 1][y - 1] == ' ') { board[x - 1][y - 1] = 'O'; break; } else { printf("坐标已被占用!n"); } } else { printf("坐标非法,请重新输入!n"); } } }
为了将玩家和电脑区分开,需要使用两个不一样的符号来代表玩家的落子和电脑的落子 玩家----O,电脑----X
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15//电脑下棋 void Computer_move(char board[ROW][COL], int row, int col) { printf("电脑下棋:n"); while (1) { int x = rand() % ROW; int y = rand() % COL; if (board[x][y] == ' ') { board[x][y] = 'X'; break; } } }
玩家的落子可以通过输入坐标,而电脑呢,我们让他随机选择合理的坐标范围进行落子。
那随着玩家和电脑相继落子,我们就需要判断谁获胜了,或者平局的情况。
3.判断输赢
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//判断输赢 char Is_win(char board[ROW][COL], int row, int col) { //判断行列 int i = 0; for (i = 0; i < ROW; i++) { if (board[i][0] == board[i][1] && board[i][1] == board[i][2]) { return board[i][0]; } if (board[0][i] == board[1][i] && board[1][i] == board[2][i]) { return board[0][i]; } } //判断对角线 if ((board[0][0] == board[1][1] && board[1][1] == board[2][2]) || (board[0][2] == board[1][1] && board[1][1] == board[2][0])) { return board[1][1]; } if (Is_full(board, row, col)) { return 'D'; //平局 } return 'C'; //Continue表示继续 }
如果棋盘满了,还没有分出胜负的话就是平局的情况。
为了判断棋盘是否满了,我们也需要相应的功能来简化我们的代码。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15//判断棋盘是否满了 int Is_full(char board[ROW][COL], int row, int col) { int i = 0; for (i = 0; i < ROW; i++) { int j = 0; for (j = 0; j < COL; j++) { if (board[i][j] == ' ') return 0; } } return 1; }
二、程序演示
三、完整代码
以下是完整代码,有需要的可以查看,我用了三个文件来存储,两个.c文件用来书写主要代码,一个.h文件用来存储预处理指令和宏定义
1.main.c
1
2
3
4
5
6
7
8
9
10#define _CRT_SECURE_NO_WARNINGS 1 #include"game.h" int main() { test(); return 0; }
2.game.c
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
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187#define _CRT_SECURE_NO_WARNINGS 1 #include"game.h" void menu() { printf("**********************************n"); printf("********** 1.play ************n"); printf("********** 0.exit ************n"); printf("**********************************n"); } void game() { char board[ROW][COL] = {0}; InitBoard(board, ROW, COL); DisplayBoard(board, ROW, COL); char ret = 0; while (1) { Player_move(board, ROW, COL); DisplayBoard(board, ROW, COL); ret = Is_win(board, ROW, COL); if (ret == 'O') { printf("玩家赢!n"); break; } if (ret == 'D') { printf("平局n"); break; } Computer_move(board, ROW, COL); DisplayBoard(board, ROW, COL); ret = Is_win(board, ROW, COL); if (ret == 'X') { printf("电脑赢!n"); break; } } } void test() { srand((unsigned int)time(NULL)); int input = 0; do { menu(); printf("请选择:->"); scanf("%d", &input); switch (input) { case 1: game(); break; case 0: printf("退出游戏!n"); break; default: printf("输入错误,请重新输入!n"); break; } } while (input); } //初始化棋盘 void InitBoard(char board[][COL], int row, int col) { int i = 0; for (i = 0; i < ROW; i++) { int j = 0; for (j = 0; j < COL; j++) { board[i][j] = ' '; } } } //打印棋盘 void DisplayBoard(char board[ROW][COL], int row, int col) { int i = 0; for (i = 0; i < row; i++) { printf("+---+---+---+n"); int j = 0; for (j = 0; j < col; j++) { printf("| %c ", board[i][j]); } printf("|n"); } printf("+---+---+---+n"); } //玩家下棋 void Player_move(char board[ROW][COL], int row, int col) { int x = 0; int y = 0; while (1) { printf("玩家下棋:->"); scanf("%d %d", &x, &y); if (x > 0 && x <= row && y > 0 && y <= col) { if (board[x - 1][y - 1] == ' ') { board[x - 1][y - 1] = 'O'; break; } else { printf("坐标已被占用!n"); } } else { printf("坐标非法,请重新输入!n"); } } } //电脑下棋 void Computer_move(char board[ROW][COL], int row, int col) { printf("电脑下棋:n"); while (1) { int x = rand() % ROW; int y = rand() % COL; if (board[x][y] == ' ') { board[x][y] = 'X'; break; } } } //判断棋盘是否满了 int Is_full(char board[ROW][COL], int row, int col) { int i = 0; for (i = 0; i < ROW; i++) { int j = 0; for (j = 0; j < COL; j++) { if (board[i][j] == ' ') return 0; } } return 1; } //判断输赢 char Is_win(char board[ROW][COL], int row, int col) { //判断行列 int i = 0; for (i = 0; i < ROW; i++) { if (board[i][0] == board[i][1] && board[i][1] == board[i][2]) { return board[i][0]; } if (board[0][i] == board[1][i] && board[1][i] == board[2][i]) { return board[0][i]; } } //判断对角线 if ((board[0][0] == board[1][1] && board[1][1] == board[2][2]) || (board[0][2] == board[1][1] && board[1][1] == board[2][0])) { return board[1][1]; } if (Is_full(board, row, col)) { return 'D'; //平局 } return 'C'; //Continue表示继续 }
3.game.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17#define _CRT_SECURE_NO_WARNINGS 1 #define ROW 3 #define COL 3 #include<stdio.h> #include<math.h> #include<time.h> void test(); void menu(); void InitBoard(char board[ROW][COL], int, int); void DisplayBoard(char board[ROW][COL], int, int); void Player_move(char board[ROW][COL], int, int); void Computer_move(char board[ROW][COL], int, int); char Is_win(char board[ROW][COL], int, int);
总结
以上就是一个完整的三子棋小游戏的C语言实现版本,谢谢观看!
以上就是详解用C语言实现三子棋游戏流程的详细内容,更多关于C语言 三子棋的资料请关注靠谱客其它相关文章!
最后
以上就是微笑高山最近收集整理的关于详解用C语言实现三子棋游戏流程的全部内容,更多相关详解用C语言实现三子棋游戏流程内容请搜索靠谱客的其他文章。
发表评论 取消回复