C语言-五子棋

  1 #include <stdio.h>
  2 #include <stdlib.h>
  3 #include <windows.h>
  4 
  5 #define N 19
  6 int pieces[N][N]= {0}; //五子棋盘19*19
  7 int flag=1;  //状态,0-无子;1-A子;2-B子
  8 
  9 void DrawPanel()//棋盘模块
 10 {
 11     int count=1;
 12     int i,j;
 13     system("CLS");
 14     for(i=0; i<=N; i++) //列坐标
 15     {
 16         if(i==0)
 17         {
 18             printf(" ");
 19         }
 20         else
 21         {
 22             printf("%4d",count);
 23             count++;
 24         }
 25     }
 26     printf("
");
 27     count=1;
 28     for(i=0; i<N; i++)
 29     {
 30         for(j=-1; j<N; j++)
 31         {
 32             if(j==-1)//若是第一列,则输出字符
 33             {
 34                 printf("%2d",count);
 35                 count++;
 36             }
 37             else
 38             {
 39                 if(pieces[i][j]==0)
 40                 {
 41                     printf("   .");
 42                 }
 43                 else if(pieces[i][j]==1)
 44                 {
 45                     printf("");
 46                 }
 47                 else if(pieces[i][j]==2)
 48                 {
 49                     printf("");
 50                 }
 51             }
 52         }
 53         printf("
");
 54     }
 55 
 56 }
 57 
 58 int ZouQiHang() //下棋模块1
 59 {
 60     int x;
 61     if(flag==1)
 62     {
 63         printf("	玩家A●");
 64     }
 65     else
 66     {
 67         printf("	玩家B○");
 68     }
 69     printf("	请输入要走棋子的行数!
");
 70     printf("	x=");
 71     scanf("%d",&x);
 72     while(x>N-1||x<1)
 73     {
 74         printf("	error!
");
 75         if(flag==1)
 76         {
 77             printf("	玩家A●");
 78         }
 79         else
 80         {
 81             printf("	玩家B○");
 82         }
 83         printf("	请输入要走棋子的行数!
");
 84         printf("	x=");
 85         scanf("%d",&x);
 86     }
 87     return x;
 88 }
 89 
 90 int ZouQiLie()//下棋模块2
 91 {
 92     int y;
 93     if(flag==1)
 94     {
 95         printf("	玩家A●");
 96     }
 97     else
 98     {
 99         printf("	玩家B○");
100     }
101     printf("	请输入要走棋子的列数!
");
102     printf("	y=");
103     scanf("%d",&y);
104     while(y>N-1||y<1)
105     {
106         printf("	error!
");
107         if(flag==1)
108         {
109             printf("	玩家A●");
110         }
111         else
112         {
113             printf("	玩家B○");
114         }
115         printf("	请输入要走棋子的列数!
");
116         printf("	y=");
117         scanf("%d",&y);
118     }
119     return y;
120 }
121 
122 int Check(int x,int y)//判断输赢模块
123 {
124     //行检查
125     int count=1;
126     int i=x,j=y;
127     j++;
128     while(j<N&&count<5)//自此向右
129     {
130         if(pieces[i][j]==pieces[x][y])
131         {
132             count++;
133         }
134         else
135         {
136             break;
137         }
138         j++;
139     }
140     j=y;
141     j--;
142     while(j>=0&&count<5)//自此向左
143     {
144         if(pieces[i][j]==pieces[x][y])
145         {
146             count++;
147         }
148         else
149         {
150             break;
151         }
152         j--;
153     }
154     if(count==5)//存在5子连成连续一条线
155     {
156         return pieces[x][y];
157     }
158 
159     //列检查
160     i=x;
161     j=y;
162     count=1;
163     i=i+1;
164     while(i<N&&count<5)//自此向下
165     {
166         if(pieces[i][j]==pieces[x][y])
167         {
168             count++;
169         }
170         else
171         {
172             break;
173         }
174         i++;
175     }
176     i=x-1;
177     while(i>=0&&count<5)//自此向上
178     {
179         if(pieces[i][j]==pieces[x][y])
180         {
181             count++;
182         }
183         else
184         {
185             break;
186         }
187         i--;
188     }
189     if(count==5)
190     {
191         return pieces[x][y];
192     }
193 
194     //左斜行
195     i=x;
196     j=y;
197     count=1;
198 
199     i=i-1;
200     j=j-1;
201     while(i>=0&&j>=0&&count<5)//自此左斜向上
202     {
203         if(pieces[i][j]==pieces[x][y])
204         {
205             count++;
206         }
207         else
208         {
209             break;
210         }
211         i--;
212         j--;
213     }
214 
215     i=x+1;
216     j=y+1;
217     while(i<N&&j<N&&count<5)//自此左斜向下
218     {
219         if(pieces[i][j]==pieces[x][y])
220         {
221             count++;
222         }
223         else
224         {
225             break;
226         }
227         i++;
228         j++;
229     }
230     if(count==5)
231     {
232         return pieces[x][y];
233     }
234 
235     //右斜行
236     i=x;
237     j=y;
238     count=1;
239     i=i-1;
240     j=j+1;
241     while(i>=0&&j<N&&count<5)//自此右斜向上
242     {
243         if(pieces[i][j]==pieces[x][y])
244         {
245             count++;
246         }
247         else
248         {
249             break;
250         }
251         i--;
252         j++;
253     }
254 
255     i=x+1;
256     j=y-1;
257     while(i<N&&j>=0&&count<5)////自此右斜向下
258     {
259         if(pieces[i][j]==pieces[x][y])
260         {
261             count++;
262         }
263         else
264         {
265             break;
266         }
267         i++;
268         j--;
269     }
270     if(count==5)
271     {
272         return pieces[x][y];
273     }
274     return 0;
275 }
276 
277 void HeQi()//信息模块1
278 {
279     Sleep(5000);
280     system("CLS");
281     printf("	**********************************************************
");
282     printf("	*                                                        *
");
283     printf("	*                                                        *
");
284     printf("	*                                                        *
");
285     printf("	*                   和棋!                               *
");
286     printf("	*                                                        *
");
287     printf("	*                                                        *
");
288     printf("	*                                                        *
");
289     printf("	*                                                        *
");
290     printf("	**********************************************************
");
291 }
292 
293 void Over() //信息模块2
294 {
295     Sleep(5000);
296     //system("CLS");
297     printf("	**********************************************************
");
298     printf("	*                                                        *
");
299     printf("	*                                                        *
");
300     printf("	*                                                        *
");
301     printf("	*                     游戏结束!                         *
");
302     printf("	*                                                        *
");
303     printf("	*                                                        *
");
304     printf("	*                                                        *
");
305     printf("	*                                                        *
");
306     printf("	**********************************************************
");
307 }
308 
309 void Welcome()
310 {
311     system("CLS");
312     printf("	**********************************************************
");
313     printf("	*                                                        *
");
314     printf("	*                                                        *
");
315     printf("	*                                                        *
");
316     printf("	*                       欢迎!                           *
");
317     printf("	*                                                        *
");
318     printf("	*                                                        *
");
319     printf("	*                                                        *
");
320     printf("	*                                                        *
");
321     printf("	**********************************************************
");
322     printf("	press any key to start!
");
323     getchar();
324 }
325 
326 int main()
327 {
328     int x,y; //行列坐标
329     char ch='y';
330     int winner; //赢家
331     int countpieces=0;//落子总数
332     Welcome();
333     DrawPanel();
334 
335     while(countpieces<N*N)
336     {
337         x=ZouQiHang();
338         y=ZouQiLie();
339         x=x-1;
340         y=y-1;
341         if(pieces[x][y]==0)//是否可以落子
342         {
343             pieces[x][y]=flag;
344             countpieces++;
345             //改变状态
346             if(flag==1)
347             {
348                 flag=2;
349             }
350             else
351             {
352                 flag=1;
353             }
354             //判断输赢,继续?
355             winner=Check(x,y);
356             if(winner==1)
357             {
358                 DrawPanel();
359                 printf("	恭喜A●赢了!
");
360                 break;
361             }
362             else if(winner==2)
363             {
364                 DrawPanel();
365                 printf("	恭喜B○赢了!
");
366                 break;
367             }
368         }
369         else
370         {
371             printf("ERROR!
");
372             printf("落子行列错误,请随意按键重新输入!
");
373             getchar();
374             getchar();
375         }
376         DrawPanel();
377     }//while
378 
379     if(countpieces==N*N)
380     {
381         HeQi();//和棋
382     }
383     else
384     {
385         Over();//结束
386     }
387     return 0;
388 
389 }
原文地址:https://www.cnblogs.com/Xbert/p/5130295.html