c++实现五子棋游戏

设计思路


 

  先用二维数组定义一个棋盘,0代表没有玩家下过,1代表玩家一的棋子,2代表玩家二的棋子,将棋盘输出,然后让玩家依次输入所要下的位置的行数和列数,并赋值给数组,之后进行判断:判断棋盘上所有棋子是否有连续5个,如果是,则返回获胜玩家,如果否,则继续输入下一步要下的棋子坐标

 

代码实现


 

 

  1 #include<stdio.h>
  2 #include<stdlib.h>
  3 
  4 #define HEIGHT 15    //定义棋盘行数
  5 #define WIDTH 15    //定义棋盘列数
  6 #define PLAYER1 'X'    //定义玩家一棋子
  7 #define PLAYER2 'O'    //定义玩家二棋子
  8 
  9 int map[HEIGHT][WIDTH];    //定义游戏棋盘
 10 
 11 //输出棋盘
 12 void sc()
 13 {
 14     printf("    ");
 15     for (int i = 0;i < WIDTH;i++)
 16         if (i < 9)
 17             printf("0%d ", i+1);
 18         else
 19             printf("%d ",i+1);
 20     printf("\n    ");
 21     for (int i = 0;i <=WIDTH;i++)
 22         printf("-  ");
 23     printf("\n");
 24     for (int i = 0;i < HEIGHT;i++)
 25     {
 26         if (i < 9)
 27             printf("0%d ", i + 1);
 28         else
 29             printf("%d ", i + 1);
 30         printf("|");
 31         for (int j = 0;j < WIDTH;j++)
 32             if (map[i][j] == 0)
 33                 printf("+  ");
 34             else if (map[i][j] == 1)
 35                 printf("%c  ", PLAYER1);
 36             else
 37                 printf("%c  ",PLAYER2);
 38         printf("|\n");
 39     }
 40         printf("    ");
 41     for (int i = 0;i <= WIDTH;i++)
 42         printf("-  ");
 43     printf("\n");
 44 }
 45 //落子
 46 void play(int player)
 47 {
 48     int targetH = 0, targetW = 0;    //targetH:选定的格子行数    targetW:选定的格子列数
 49 
 50     if(player==1)
 51         printf("现在轮到玩家一,棋子:%c\n请输入格子的行数:", PLAYER1);
 52     else
 53         printf("现在轮到玩家二,棋子:%c\n请输入格子的行数:", PLAYER2);
 54     scanf_s("%d", &targetH);
 55     while (targetH <= 0 || targetH > HEIGHT)
 56     {
 57         printf("请输入正确的行数:");
 58         scanf_s("%d", &targetH);
 59     }
 60     printf("请输入格子的列数:");
 61     scanf_s("%d", &targetW);
 62     while (targetW <= 0 || targetW > WIDTH)
 63     {
 64         printf("请输入正确的行数:");
 65         scanf_s("%d",&targetW);
 66     }
 67     if(map[targetH - 1][targetW - 1] ==0)
 68         map[targetH-1][targetW-1]=player;
 69     else
 70     {
 71         printf("输入的坐标重复,请重新输入\n");
 72         play(player);
 73     }
 74 }
 75 
 76 //判断游戏是否结束,并返回胜利玩家
 77 int pd(int player)
 78 {
 79     int k = 0;    //判断当前有多少连续的棋子
 80 
 81     for (int i = 0;i < HEIGHT;i++)
 82         for (int j = 0;j <= WIDTH;j++)
 83         {
 84             if (map[i][j] == player)    
 85             {
 86                 for (k = 1;k < 5;k++)    //判断是否一行连续5个棋子
 87                 {
 88                     if (map[i][j + k] != player)
 89                         break;
 90                 }
 91                 if (k == 5)    
 92                     return player;
 93                 for (k = 1;k < 5;k++)    //判断是否一列连续5个棋子
 94                 {
 95                     if (map[i + k][j] != player)
 96                         break;
 97                 }
 98                 if (k == 5)
 99                     return player;
100                 for (k = 1;k < 5;k++)    //判断是否一斜线连续5个棋子
101                 {
102                     if (map[i + k][j + k] != player)
103                         break;
104                 }
105                 if (k == 5)
106                     return player;
107             }
108         }
109     return 0;    //如果都没有连续5个棋子,游戏继续
110 }
111 //初始化棋盘
112 void csh()
113 {
114     for (int i = 0;i < HEIGHT;i++)    //地图初始化
115         for (int j = 0;j < WIDTH;j++)
116             map[i][j] = 0;
117 }
118 
119 
120 void main()
121 {
122     int winPlayer=0,player=0,isAgain=0; //winPlayer:胜利的玩家    player:现在游戏中的玩家 isAgain:是否重开游戏
123 
124     csh();
125     sc();
126     while (winPlayer == 0)    
127     {    
128         play((player%2)+1);    //判断现在是哪一位玩家
129         winPlayer=pd((player % 2) + 1);
130         system("cls");    
131         player++;
132         sc();
133     }
134     winPlayer == 1 ? printf("恭喜玩家一获得胜利!!!\n") : printf("恭喜玩家二获得胜利!!!\n");
135         printf("输入1重新开始,输入其他任意数字退出游戏");
136         scanf_s("%d",&isAgain);
137         if (isAgain == 1)
138         {
139             system("cls");
140             main();
141         }
142             
143 }

 

 

 

效果截图

 


 

posted @ 2020-06-01 23:48  何必胜  阅读(3057)  评论(0编辑  收藏  举报