数据结构五子棋

数据结构五子棋

(然而就用了二维数组,没有啥数据结构)
主要功能就是两方下子,加了下子边界判断,以及重复落子判断(说白了就是15X15棋盘,下子坐标只能是0-14.然后已经有子了的点再放就会提示错误)
然后当一方五子连珠就会结束游戏,不然就会一直循环下去(懒得写满盘判出了,加个二维数组全遍历函数就可以,如果整个数组放满了就跳出程序。。懒得写了。)
上源码:亲测可直接运行,如果发现bug请留言

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
#include<iostream>
#include<stdio.h>
#include<malloc.h>
#include<string.h>
#define STACK_SIZE 130 //题目给出长度最长胃128
using namespace std;
char Checkerboard[15][15];

void init(){ //初始化棋盘
int i,j;
printf("************五子棋游戏****************\n");
for(i=0;i<15;i++){
for(j=0;j<15;j++){
Checkerboard[i][j] = '_';
printf("%c ",Checkerboard[i][j]);
}
printf("\n");
}
}
void menu(){ //每次下子后更新棋盘
system("cls");
int i,j;
printf("************五子棋游戏****************\n");
for(i=0;i<15;i++){
for(j=0;j<15;j++){
printf("%c ",Checkerboard[i][j]);
}
printf("\n");
}
}
bool Decide(int x,int y,char flag){ //四向遍历检测是否胜利
int i=1;
if(x-1>0&&y-1>0&&Checkerboard[x-1][y-1]==flag){//左上
i++;
if(x-2>0&&y-2>0&&Checkerboard[x-2][y-2]==flag){
i++;
if(x-3>0&&y-3>0&&Checkerboard[x-3][y-3]==flag){
i++;
if(x-4>0&&y-4>0&&Checkerboard[x-4][y-4]==flag){
i++;
return true;
}
}
}
}
if(x+1<15&&y+1<15&&Checkerboard[x+1][y+1]==flag){//右下
i++;
if(i>4){
return true;
}
if(x+2<15&&y+2<15&&Checkerboard[x+2][y+2]==flag){
i++;
if(i>4){
return true;
}
if(x+3<15&&y+3<15&&Checkerboard[x+3][y+3]==flag){
i++;
if(i>4)
return true;
if(x+4<15&&y+4<15&&Checkerboard[x+4][y+4]==flag){
return true;
}
}
}
}
i=1;
if(y-1>0&&Checkerboard[x][y-1]==flag){//左
i++;
if(y-2>0&&Checkerboard[x][y-2]==flag){
i++;
if(y-3>0&&Checkerboard[x][y-3]==flag){
i++;
if(y-4>0&&Checkerboard[x][y-4]==flag){
i++;
return true;
}
}
}
}
if(y+1<15&&Checkerboard[x][y+1]==flag){//右
i++;
if(i>4){
return true;
}
if(y+2<15&&Checkerboard[x][y+2]==flag){
i++;
if(i>4){
return true;
}
if(y+3<15&&Checkerboard[x][y+3]==flag){
i++;
if(i>4)
return true;
if(y+4<15&&Checkerboard[x][y+4]==flag){
return true;
}
}
}
}
i=1;
if(x+1<15&&y-1>0&&Checkerboard[x+1][y-1]==flag){//左下
i++;
if(x+2<15&&y-2>0&&Checkerboard[x+2][y-2]==flag){
i++;
if(x+3<15&&y-3>0&&Checkerboard[x+3][y-3]==flag){
i++;
if(x+4<15&&y-4>0&&Checkerboard[x+4][y-4]==flag){
i++;
return true;
}
}
}
}
if(x-1>0&&y+1<15&&Checkerboard[x-1][y+1]==flag){//右上
i++;
if(i>4){
return true;
}
if(x-2>0&&y+2<15&&Checkerboard[x-2][y+2]==flag){
i++;
if(i>4){
return true;
}
if(x-3>0&&y+3<15&&Checkerboard[x-3][y+3]==flag){
i++;
if(i>4)
return true;
if(x-4>0&&y+4<15&&Checkerboard[x-4][y+4]==flag){
return true;
}
}
}
}
i=1;
if(x+1<15&&Checkerboard[x+1][y]==flag){//下
i++;
if(x+2<15&&Checkerboard[x+2][y]==flag){
i++;
if(x+3<15&&Checkerboard[x+3][y]==flag){
i++;
if(x+4<15&&Checkerboard[x+4][y]==flag){
i++;
return true;
}
}
}
}
if(x-1>0&&Checkerboard[x-1][y]==flag){//上
i++;
if(i>4){
return true;
}
if(x-2>0&&Checkerboard[x-2][y]==flag){
i++;
if(i>4){
return true;
}
if(x-3>0&&Checkerboard[x-3][y]==flag){
i++;
if(i>4)
return true;
if(x-4>0&&Checkerboard[x-4][y]==flag){
return true;
}
}
}
}
return false;
}
int main(){
char flag = '*'; //落子方记录
int x,y; //x为行 y为列
init();
while(true){ //循环下子,除非有一方胜利才退出。应该还要加个棋盘满了也退出的。懒得写了
printf("请%c方下子:",flag);
scanf("%d %d",&x,&y);//输入下子坐标
if(x>15||x<0||y>15||y<0){
printf("落子点非法。请重新输入");
continue;
}
if(Checkerboard[x][y]=='#'||Checkerboard[x][y]=='*'){
printf("该点已存在子,请重新输入");
continue;
}
Checkerboard[x][y]=flag;
menu();
if(Decide(x,y,flag)){
printf("%c方胜利",flag);
break;
}
flag=='*'?flag='#':flag='*';
}
return 0;
}


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!