1 #include <stdio.h>
2 /*
3 项目:五子棋赢棋判断
4 思路:1.横向扫描判断是否有连续5颗相连的棋子
5 2.纵向扫描判断是否有连续5颗相连的棋子
6 3.扫描主对角线判断是否有连续5颗相连的棋子
7 4.斜线扫描主对角线上半面是否有连续5颗相连的棋子
8 5.斜线扫描主对角线下半面是否有连续5颗相连的棋子
9 6.扫描次对角线判断是否有连续5颗相连的棋子
10 7.斜线扫描次对角线上半面是否有连续5颗相连的棋子
11 8.斜线扫描次对角线下半面是否有连续5颗相连的棋子
12
13 9.1代表黑棋。2代表白棋。其他数字0代表未走棋
14 */
15 #define M 10 //定义棋盘上下边界,上边界0 下边界10
16 #define N 10 //定义棋盘左右边界,左边界0 右边界10
17
18 int main(void)
19 {
20 int i,j,k,q;
21 // k = q = 0;
22 //初始化二维数组
23 int arr[M][N] = {
24 {0,1,1,0,1,1,0,0,2,0},
25 {0,2,1,0,0,2,0,0,0,0},
26 {0,0,2,0,2,0,1,0,0,0},
27 {0,0,0,2,1,1,0,0,0,0},
28 {0,0,2,0,2,1,0,0,0,0},
29 {0,2,0,1,0,2,0,1,0,0},
30 {0,0,1,0,0,0,0,0,0,0},
31 {0,0,0,0,0,0,0,1,0,0},
32 {0,0,0,0,0,0,0,1,0,0},
33 {0,0,0,0,0,0,0,1,0,0}
34 };
35 //1.横向扫描判断是否有连续5颗相连的棋子
36 for(k = 0,q = 0,i = 0;i<M;i++)
37 {
38 for(j = 0;j<N;j++)
39 {
40 if(arr[i][j] == 1)
41 k++;
42 else
43 k = 0;
44 if(arr[i][j] == 2)
45 q++;
46 else
47 q = 0;
48 if(k>=5)
49 {
50 printf("黑棋胜利\n");
51 return 0;
52 }
53 if(q>=5)
54 {
55 printf("白棋胜利\n");
56 return 0;
57 }
58 }
59
60
61 }
62 //2.纵向扫描判断是否有连续5颗相连的棋子
63 for(j = 0;j<N;j++)
64 {
65 k = q = 0;
66 for(i = 0;i<M;i++)
67 {
68 if(arr[i][j] == 1)
69 k++;
70 else
71 k = 0;
72 if(arr[i][j] == 2)
73 q++;
74 else
75 q = 0;
76 if(k>=5)
77 {
78 printf("黑棋胜利\n");
79 return 0;
80 }
81 if(q>=5)
82 {
83 printf("白棋胜利\n");
84 return 0;
85 }
86 }
87
88 }
89 //3.扫描主对角线判断是否有连续5颗相连的棋子
90 for(k = q = 0,i = 0;i<M;i++)
91 {
92 if(arr[i][i] == 1)
93 k++;
94 else
95 k = 0;
96 if(arr[i][i] == 2)
97 q++;
98 else
99 q = 0;
100 if(k>=5)
101 {
102 printf("黑棋胜利\n");
103 return 0;
104 }
105 if(q>=5)
106 {
107 printf("白棋胜利\n");
108 return 0;
109 }
110 }
111 //4.斜线扫描主对角线上半面是否有连续5颗相连的棋子
112
113 for(j = 1;j<N;j++)
114 {
115 k = q = 0;
116 for(i = 0;i<M-j;i++)
117 {
118 if(arr[i][i+j] == 1)
119 k++;
120 else
121 k = 0;
122 if(arr[i][i+j] == 2)
123 q++;
124 else
125 q = 0;
126 if(k>=5)
127 {
128 printf("黑棋胜利\n");
129 return 0;
130 }
131 if(q>=5)
132 {
133 printf("白棋胜利\n");
134 return 0;
135 }
136 }
137 }
138 //5.斜线扫描主对角线下半面是否有连续5颗相连的棋子
139 for(i = 1;i<M;i++)
140 {
141 k = q = 0;
142 for(j = 0;j<N-i;j++)
143 {
144 if(arr[j+i][j] == 1)
145 k++;
146 else
147 k = 0;
148 if(arr[j+i][j] == 2)
149 q++;
150 else
151 q = 0;
152
153 if(k>=5)
154 {
155 printf("黑棋胜利\n");
156 return 0;
157 }
158 if(q>=5)
159 {
160 printf("白棋胜利\n");
161 return 0;
162 }
163 }
164
165 }
166 //6.扫描次对角线判断是否有连续5颗相连的棋子
167 for(k = q = 0,i = 0;i<M;i++)
168 {
169 if(arr[i][9-i] == 1)
170 k++;
171 else
172 k = 0;
173 if(arr[i][9-i] == 2)
174 q++;
175 else
176 q = 0;
177 if(k>=5)
178 {
179 printf("黑棋胜利\n");
180 return 0;
181 }
182 if(q>=5)
183 {
184 printf("白棋胜利\n");
185 return 0;
186 }
187 }
188
189 //7.斜线扫描次对角线上半面是否有连续5颗相连的棋子
190 for(j = N-2;j>=0;j--)
191 {
192 k = q = 0;
193 for(i = 0;i<M-(N-j-1);i++)
194 {
195 if(arr[i][j-i] == 1)
196 k++;
197 else
198 k = 0;
199 if(arr[i][j-i] == 2)
200 q++;
201 else
202 q = 0;
203
204 if(k>=5)
205 {
206 printf("黑棋胜利\n");
207 return 0;
208 }
209 if(q>=5)
210 {
211 printf("白棋胜利\n");
212 return 0;
213 }
214 }
215
216 }
217 //8.斜线扫描次对角线下半面是否有连续5颗相连的棋子
218
219 for(i = 1;i<M;i++)
220 {
221 k = q = 0;
222 for(j = N-1;j>=i;j--)
223 {
224 if(arr[N-j+i-1][j] == 1)
225 k++;
226 else
227 k = 0;
228 if(arr[N-j+i-1][j] == 2)
229 q++;
230 else
231 q = 0;
232
233 if(k>=5)
234 {
235 printf("黑棋胜利\n");
236 return 0;
237 }
238 if(q>=5)
239 {
240 printf("白棋胜利\n");
241 return 0;
242 }
243 }
244
245 }
246
247 return 0;
248 }