c语言实现简单的五子棋游戏
这篇文章主要为大家详细介绍了c语言实现简单的五子棋游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
本文实例为大家分享了c语言实现简单五子棋游戏的具体代码,供大家参考,具体内容如下
环境vs2017
一、游戏设计思想
1.该代码设置为 玩家1(*) vs 玩家2(O)
2.选择玩游戏
2.1 显示棋盘,玩家1下棋,判断游戏结果
2.2 显示棋盘,玩家2下棋,判断游戏结果
3.判断游戏结果
有4种结果,玩家1赢,玩家2赢,平局,继续游戏
若结果为玩家1赢或玩家2赢或平局,则显示结果,退回菜单界面,不再循环下棋
若结果为继续,则循环2.1和2.2
4.选择退出,则退出游戏
二、图片解说
玩游戏时的棋盘如下,横向即从左往右(0-9)代表y的值,纵向即从上往下(0-9)代表x的值(这涉及到后面代码x,y)
三、代码分析
1.main.c
该部分代码为根据菜单选择游戏(1)或者退出(2)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | #include "game.h" void Menu() { printf ( "+-----------------------------------------------+\n" ); printf ( "| 1.paly 2.exit |\n" ); printf ( "+-----------------------------------------------+\n" ); } int main() { int quit = 0; int select = 0; while (!quit) { Menu(); printf ( "Please select#" ); scanf ( "%d" , &select); switch (select) { case 1: Game(); break ; case 2: quit = 1; break ; case 3: printf ( "Enter error,please try again!" ); break ; } } printf ( "===========================================\n" ); printf ( "ByeBye!\n" ); printf ( "===========================================\n" ); system ( "pause" ); return 0; } |
2.game.c
该部分为选择游戏时代码,一旦开始游戏,先显示棋盘,然后玩家1选择下棋,然后判断游戏结果,若游戏继续继续,则显示棋盘,轮到玩家2下棋,再判断游戏结果,若游戏继续,则又轮到玩家1下棋。如此循环,直到有了别的结果(玩家1赢,玩家2赢,平局)跳出循环,输出游戏结果。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | void Game() { int board[ROW][COL] = { 0 }; int ret = 0; //int curr = PLAYER1; while (1) { //curr = (curr == PLAYER1 ? PLAYER2 : PLAYER1); ShowBoard(board,ROW,COL); int *p=PlayerMove(board, ROW, COL, PLAYER1); ret = Jude(board,ROW,COL,*p,*(p+1)); if (ret != NEXT) { break ; } ShowBoard(board, ROW, COL); p=PlayerMove(board, ROW, COL, PLAYER2); ret = Jude(board,ROW,COL,*p,*(p+1)); if (ret != NEXT) { break ; } } ShowBoard(board, ROW, COL); switch (ret) { case PLAYER1: printf ( "PLATER 1 WIN!\n" ); break ; case PLAYER2: printf ( "PLATER 2 WIN!\n" ); break ; case DRAW: printf ( "DRAW!\n" ); break ; default : printf ( "Bug!\n" ); break ; } } |
该部分为Game()函数内调用的具体游戏函数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 | #include "game.h" /*还函数为显示函数,显示棋盘上棋子情况,包含画出棋盘样子(可参考2部分图片) 和棋盘内容赋值显示,当棋子为空,相应位置显示”.“符号,玩家1的棋子用”*“表示, 玩家2的棋子用”o“表示。ShowBoard()函数历遍board[][]数组, 将落子情况用相应符号表达出来*/ static void ShowBoard( int board[][COL], int row, int col) { system ( "cls" ); printf ( " " ); for ( int j = 0; j < col; j++) { printf ( " %2d" , j); //棋盘从左往右数字标号 } printf ( "\n" ); for ( int i = 0; i < row; i++) { printf ( "%-2d " , i); //棋盘从上往下数字标号 for ( int j = 0; j < col; j++) { if (board[i][j] == 0) { printf ( " . " ); } else if (board[i][j] == PLAYER1) { printf ( " * " ); } else if (board[i][j] == PLAYER2) { printf ( " o " ); } else { } } printf ( "\n" ); } } /* 玩家落子,输入参数为棋盘信息,棋盘row*col大小, who代表是谁在玩,输入PLAYER1是玩家1在玩,PLAYER2是玩家2在玩*/ int * PlayerMove( int board[][COL], int row, int col, int who) { int x = 0; int y = 0; static int post[2] = { 0 }; //用于存放选择的位置 int *p = post; //用于查看选择的位置 while (1) { printf ( "Please enter <x,y>[player%d]#" ,who); scanf ( "%d %d" , &x, &y); //判断位置是否合法,否则重新输入选择位置 if (x<0 || x>row - 1 || y<0 || y>col - 1) { printf ( "this postion is error!\n" ); continue ; } //当所选位置为空,则该位置放入who的值,代表是哪个玩家的落子 if (board[x][y] == 0) { board[x][y] = who; break ; } //所选位置非空,重新选择位置 else { printf ( "this postion is not empty!" ); continue ; } } post[0] = x; post[1] = y; return p; } //计算连子情况,输入参数为棋盘落子信息,计算方向,落子位置x,y int ChessCount( int board[][COL], int dir, int x, int y) { //将x,y值赋值给_x,_y int _x = x; int _y = y; int count = 1; //状态机 while (1) { switch (dir) { //计算方向为上,_x的依次递减, case UP: _x--; break ; case RIGHT_UP: //右上,_y的值增加,_x的值减少 _x--,_y++; break ; case RIGHT: _y++; break ; case RIGHT_DOWN: _x++, _y++; break ; case DOWN: _x++; break ; case LEFT_DOWN: _x++, _y--; break ; case LEFT: _y--; break ; case LEFT_UP: _x--, _y--; break ; } //合法范围内 if (_x>0 || _x<ROW - 1 || _y>0 || _y<COL - 1) { //沿着所选方向依次查看该位置与落子位置是否一致, //计算连子个数 if (board[x][y] == board[_x][_y]) { count++; } else { break ; } } else { break ; } } return count; } /* 当每落一子时(x,y),判断此时游戏的结果,输入参数为棋盘落子信息,棋盘大小 row,col 以及落子时的位置x,y。*/ static int Jude( int board[][COL], int row, int col, int x, int y) { /* count计算棋子个数,从落子的上,右上,右,右下,下,左下,左,左上, 八个方向判断落子连续的个数,并根据米字行,两两方向落子相加 */ int count = ChessCount(board, UP,x,y)+ ChessCount(board, DOWN,x,y); //count-1是因为两个方向相加时,落子位置计算了两次 //如果棋子个数大于等于5,则,此落子处的玩家赢得游戏 //返回落子位置的值,即代表玩家 if (count-1 >= 5) { return board[x][y]; } count = ChessCount(board, RIGHT_UP,x,y)+ ChessCount(board, LEFT_DOWN,x,y); if (count-1 >= 5) { return board[x][y]; } count = ChessCount(board, RIGHT,x,y)+ ChessCount(board, LEFT,x,y); if (count-1 >= 5) { return board[x][y]; } count = ChessCount(board, RIGHT_DOWN,x,y)+ ChessCount(board, LEFT_UP,x,y); if (count-1 >= 5) { return board[x][y]; } //当没有人赢时,判断是否平局(棋盘下满,但是没有人赢) for ( int i = 0; i < row; i++) { for ( int j = 0; j < col; j++) { //落子位置值为0,则不空,继续游戏 if (board[i][j] == 0) { return NEXT; } } } //结果为平局 return DRAW; } |
3.chess.h
该文件定义了一些参数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |