我是靠谱客的博主 风中小鸽子,这篇文章主要介绍C++实现简单五子棋游戏,现在分享给大家,希望可以做个参考。

五子棋是世界智力运动会竞技项目之一,是一种两人对弈的纯策略型棋类游戏,是世界智力运动会竞技项目之一,通常双方分别使用黑白两色的棋子,下在棋盘直线与横线的交叉点上,先形成5子连线者获胜。

规则

(1)对局双方各执一色棋子。
(2)空棋盘开局。
(3)黑先、白后,交替下子,每次只能下一子。
(4)棋子下在棋盘的空白点上,棋子下定后,不得向其它点移动,不得从棋盘上拿掉或拿起另落别处。
(5)黑方的第一枚棋子可下在棋盘任意交叉点上。
(6)轮流下子是双方的权利,但允许任何一方放弃下子权(即:PASS权)

五子棋对局,执行黑方指定开局、三手可交换、五手两打的规定。整个对局过程中黑方有禁手,白方无禁手。黑方禁手有三三禁手、四四禁手和长连禁手三种。

实现方案

通过缩小棋盘来抑制五子棋先行的优势,在这里使用15路棋盘。

(1)提供3个选择模式

(2)输入坐标(注意横纵坐标之间需要空格)

(3)输入非法坐标

(4)判断输赢

  • 判断行是否满足条件
  • 判断列是否满足条件
  • 判断主对角线是否满足条件
  • 判断副对角线是否满足条件

之后可选择yes再来一局,也可以选择no退出游戏。

源代码如下:

复制代码
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
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
#define _CRT_SECURE_NO_WARNINGS 1 #include <iostream> #include <stdio.h> #include <stdlib.h> #include <time.h> #include <string.h> using namespace std; const int N = 15; //15*15的棋盘 const char ChessBoard = ' '; //棋盘标志 const char flag1 = 'o'; //玩家1或电脑标志 const char flag2 = 'x'; //玩家2标志 typedef struct Position{ //坐标 int row; //行 int col; //列 }Position; class GoBang{ //五子棋类 public: GoBang(){ InitChessBoard(); //初始化棋盘 } void Play(){ //下棋 Position Play1; //玩家1或电脑 Position Play2; //玩家2 while (1){ int mode = ChoiceMode(); while (1){ if (mode == 1){ //电脑VS玩家 ComputerChess(Play1, flag1); //电脑走 if (GetVictory(Play1, 0, flag1)){ //0代表电脑,为真则表示电脑获胜 break; } PlayChess(Play2, 2, flag2); //玩家2走 if (GetVictory(Play2, 2, flag2)){ //2代表玩家2 break; } } else{ //玩家1VS玩家2 PlayChess(Play1, 1, flag1); //玩家1走 if (GetVictory(Play1, 1, flag1)){ //玩家1赢 break; } PlayChess(Play2, 2, flag2); //玩家2走 if (GetVictory(Play2, 2, flag2)){ //玩家2赢 break; } } } cout << "======再来一局=======" << endl; cout << "yes or no :"; char s[] = "yes"; cin >> s; if (strcmp(s, "no") == 0){ break; } } } protected: void InitChessBoard(){ //初始化棋盘 for (int i = 0; i < N + 1; ++i){ for (int j = 0; j < N + 1; ++j){ _ChessBoard[i][j] = ChessBoard; } } } int ChoiceMode(){ //选择模式 system("cls"); //系统调用,清屏 InitChessBoard(); //重新初始化棋盘 cout << "*************************************************" << endl; cout << "******************0、退出************************" << endl; cout << "******************1、电脑VS玩家******************" << endl; cout << "******************2、玩家VS玩家******************" << endl; cout << "*************************************************" << endl; while (1){ int i = 0; cout << "请选择模式:"; cin >> i; if (i == 0){ //退出 exit(1); } if (i == 1 || i == 2){ return i; } else{ cout << "非法输入,请重新输入!" << endl; } } } void PrintChessBoard(){ //打印棋盘 printf(" 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15n"); printf(" |---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|n"); for (int i = 1; i < N + 1; ++i) { printf("%2d ", i); printf("| %c | %c | %c | %c | %c | %c | %c | %c | %c | %c | %c | %c | %c | %c | %c |n", _ChessBoard[i][1], _ChessBoard[i][2], _ChessBoard[i][3], _ChessBoard[i][4], _ChessBoard[i][5], _ChessBoard[i][6], _ChessBoard[i][7], _ChessBoard[i][8], _ChessBoard[i][9], _ChessBoard[i][10], _ChessBoard[i][11], _ChessBoard[i][12], _ChessBoard[i][13], _ChessBoard[i][14], _ChessBoard[i][15]); printf(" |---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|n"); } cout << endl; } void ComputerChess(Position& pos, char flag){ //电脑走 //PrintChessBoard(); //打印棋盘 int x = 0; int y = 0; while (1){ //循环查找空位置 x = (rand() % N) + 1; //产生从1~N的随机数 srand((unsigned int)time(NULL)); y = (rand() % N) + 1; //产生从1~N的随机数 srand((unsigned int)time(NULL)); if (_ChessBoard[x][y] == ChessBoard){ //如果这个位置为空(没有棋子),跳出循环,下棋 break; } } pos.row = x; pos.col = y; _ChessBoard[pos.row][pos.col] = flag; } void PlayChess(Position& pos, int player, char flag){ PrintChessBoard(); //打印棋盘 while (1){ printf("请玩家%d输入坐标:", player); cin >> pos.row >> pos.col; if (JudgeValue(pos) == 1){ //判断坐标是否合法 break; } cout << "坐标不合法,请重新输入:" << endl; } _ChessBoard[pos.row][pos.col] = flag; } int JudgeValue(const Position& pos){ //判断坐标的合法性 //1.在棋盘上 if (pos.row > 0 && pos.row <= N && pos.col > 0 && pos.col <= N){ //2.所在位置为空(没有棋子) if (_ChessBoard[pos.row][pos.col] == ChessBoard){ return 1; //合法 } } return 0; //非法 } int JudgeVictory(Position pos, char flag){ //判断是否有玩家获胜(底层判断) int begin = 0; int end = 0; //1.判断行是否满足条件 (pos.col - 4) > 0 ? begin = (pos.col - 4) : begin = 1; (pos.col + 4) > N ? end = N : end = (pos.col + 4); for (int i = pos.row, j = begin; j + 4 <= end; ++j){ if (_ChessBoard[i][j] == flag && _ChessBoard[i][j + 1] == flag && _ChessBoard[i][j + 2] == flag && _ChessBoard[i][j + 3] == flag && _ChessBoard[i][j + 4] == flag) return 1; } //2.判断列是否满足条件 (pos.row - 4) > 0 ? begin = (pos.row - 4) : begin = 1; (pos.row + 4) > N ? end = N : end = (pos.row + 4); for (int j = pos.col, i = begin ; i + 4 <= end; ++i){ if (_ChessBoard[i][j] == flag && _ChessBoard[i + 1][j] == flag && _ChessBoard[i + 2][j] == flag && _ChessBoard[i + 3][j] == flag && _ChessBoard[i + 4][j] == flag) return 1; } //3.判断主对角线是否满足条件 int len = 0; //相对长度 int start = 0; int finish = 0; pos.row > pos.col ? len = pos.col - 1 : len = pos.row - 1; if (len > 4){ len = 4; } begin = pos.row - len; //横坐标起始位置 start = pos.col - len; //纵坐标起始位置 pos.row > pos.col ? len = N - pos.row : len = N - pos.col; if (len > 4){ len = 4; } end = pos.row + len; //横坐标结束位置 finish = pos.col + len; //纵坐标结束位置 for (int i = begin, j = start; (i + 4 <= end) && (j + 4 <= finish); ++i, ++j){ if (_ChessBoard[i][j] == flag && _ChessBoard[i + 1][j + 1] == flag && _ChessBoard[i + 2][j + 2] == flag && _ChessBoard[i + 3][j + 3] == flag && _ChessBoard[i + 4][j + 4] == flag) return 1; } //4.判断副对角线是否满足条件 (pos.row - 1) > (N - pos.col) ? len = N - pos.col : len = pos.row - 1; if (len > 4){ len = 4; } begin = pos.row - len; //横坐标起始位置 start = pos.col + len; //纵坐标起始位置 (N - pos.row) > (pos.col - 1) ? len = pos.col - 1 : len = N - pos.row; if (len > 4){ len = 4; } end = pos.row + len; //横坐标结束位置 finish = pos.col - len; //纵坐标结束位置 for (int i = begin, j = start; (i + 4 <= end) && (j - 4 >= finish); ++i, --j){ if (_ChessBoard[i][j] == flag && _ChessBoard[i + 1][j - 1] == flag && _ChessBoard[i + 2][j - 2] == flag && _ChessBoard[i + 3][j - 3] == flag && _ChessBoard[i + 4][j - 4] == flag) return 1; } //该位置并未下棋 for (int x = 1; x < N + 1; ++x){ for (int y = 1; y < N + 1; ++y){ if (_ChessBoard[x][y] == ChessBoard){ return 0; //未下棋 } } } return -1; //和局 } bool GetVictory(Position& pos, int player, char flag){ //判断具体哪位玩家赢 if (JudgeVictory(pos, flag) != 0){ //判断有无人获胜 if (JudgeVictory(pos, flag) == 1){ //判断是否有人获胜,1表示获胜 PrintChessBoard(); //打印棋盘 if (player == 0){ cout << "电脑获胜!" << endl; } else{ printf("恭喜玩家%d获胜!n", player); } } else{ printf("和局!n"); } return true; //有人获胜 } return false; //没人获胜 } private: char _ChessBoard[N + 1][N + 1]; //棋盘 }; int main(){ GoBang g; g.Play(); system("pause"); return 0; }

更多有趣的经典小游戏实现专题,分享给大家:

C++经典小游戏汇总

python经典小游戏汇总

python俄罗斯方块游戏集合

JavaScript经典游戏 玩不停

javascript经典小游戏汇总

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持靠谱客。

最后

以上就是风中小鸽子最近收集整理的关于C++实现简单五子棋游戏的全部内容,更多相关C++实现简单五子棋游戏内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(119)

评论列表共有 0 条评论

立即
投稿
返回
顶部