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("\n");
 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("\n");
 54     }
 55 
 56 }
 57 
 58 int ZouQiHang() //下棋模块1
 59 {
 60     int x;
 61     if(flag==1)
 62     {
 63         printf("\t玩家A●");
 64     }
 65     else
 66     {
 67         printf("\t玩家B○");
 68     }
 69     printf("\t请输入要走棋子的行数!\n");
 70     printf("\tx=");
 71     scanf("%d",&x);
 72     while(x>N-1||x<1)
 73     {
 74         printf("\terror!\n");
 75         if(flag==1)
 76         {
 77             printf("\t玩家A●");
 78         }
 79         else
 80         {
 81             printf("\t玩家B○");
 82         }
 83         printf("\t请输入要走棋子的行数!\n");
 84         printf("\tx=");
 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("\t玩家A●");
 96     }
 97     else
 98     {
 99         printf("\t玩家B○");
100     }
101     printf("\t请输入要走棋子的列数!\n");
102     printf("\ty=");
103     scanf("%d",&y);
104     while(y>N-1||y<1)
105     {
106         printf("\terror!\n");
107         if(flag==1)
108         {
109             printf("\t玩家A●");
110         }
111         else
112         {
113             printf("\t玩家B○");
114         }
115         printf("\t请输入要走棋子的列数!\n");
116         printf("\ty=");
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("\t**********************************************************\n");
282     printf("\t*                                                        *\n");
283     printf("\t*                                                        *\n");
284     printf("\t*                                                        *\n");
285     printf("\t*                   和棋!                               *\n");
286     printf("\t*                                                        *\n");
287     printf("\t*                                                        *\n");
288     printf("\t*                                                        *\n");
289     printf("\t*                                                        *\n");
290     printf("\t**********************************************************\n");
291 }
292 
293 void Over() //信息模块2
294 {
295     Sleep(5000);
296     //system("CLS");
297     printf("\t**********************************************************\n");
298     printf("\t*                                                        *\n");
299     printf("\t*                                                        *\n");
300     printf("\t*                                                        *\n");
301     printf("\t*                     游戏结束!                         *\n");
302     printf("\t*                                                        *\n");
303     printf("\t*                                                        *\n");
304     printf("\t*                                                        *\n");
305     printf("\t*                                                        *\n");
306     printf("\t**********************************************************\n");
307 }
308 
309 void Welcome()
310 {
311     system("CLS");
312     printf("\t**********************************************************\n");
313     printf("\t*                                                        *\n");
314     printf("\t*                                                        *\n");
315     printf("\t*                                                        *\n");
316     printf("\t*                       欢迎!                           *\n");
317     printf("\t*                                                        *\n");
318     printf("\t*                                                        *\n");
319     printf("\t*                                                        *\n");
320     printf("\t*                                                        *\n");
321     printf("\t**********************************************************\n");
322     printf("\tpress any key to start!\n");
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("\t恭喜A●赢了!\n");
360                 break;
361             }
362             else if(winner==2)
363             {
364                 DrawPanel();
365                 printf("\t恭喜B○赢了!\n");
366                 break;
367             }
368         }
369         else
370         {
371             printf("ERROR!\n");
372             printf("落子行列错误,请随意按键重新输入!\n");
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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
题目:五子棋对弈 对弈规则如下: 主要功能是实现两人之间的对弈,在画好的棋盘上,两个玩家轮流选择自己的落子坐标,然后由五子棋系统自动识别判断游戏的进展,知道一方的五子连成一条线或者棋盘已经无法落子时游戏结束。 选定五子棋的棋盘大小为19*19,玩家可以在这个棋盘上选择落子坐标位置,通过在棋盘上显示不同的符号来代替不同玩家所下的棋子,“o”代表A玩家,“*”代表B玩家。玩家每次落子之后游戏系统都会对落子位置进行检查,如果落子坐标输入有错应提示错误,并要求玩家继续输入。 当出现同一玩家五子连成一线时,无论是行、列或是对角线的五子连线,都表示玩家游戏胜利,退出游戏 任务:编程实现以下功能 1. 欢迎主界面 提示玩家选择游戏开始,结束,设置悔棋次数等。 2. 绘制棋盘 该模块要求的功能是实现棋盘的显示及棋子的显示,,“o”代表A玩家,“*”代表B玩家。在每次下棋后要对棋盘进行刷新,将棋盘的状态变化为当前最新状态,然后等待另一个玩家下棋。 3. 玩家交替下棋 玩家能在棋盘上下棋,玩家每次选择好下棋的行和列坐标,并在该位置落子。 要求:a.提示当前玩家输入落子坐标 b.能判断用户输入的坐标是否正确(坐标超出范围或该处已有棋子) 4. 悔棋功能 玩家选择悔棋后刷新棋盘,删除前一次的落子,悔棋次数有限制。 5. 输赢判断 判断输赢模块的作用是每次玩家落子后判断是否已分出胜负,如果是,则返回胜利者相关信息。 6. 设计丰富的用户界面,方便用户操作 设计要求: ① 根据以上功能需求,自己定义合适的数据结构,并说明原因; ② 每个功能能提供友好的用户界面,方便用户操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值