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 }
效果截图