这篇文章主要为大家详细介绍了C语言实现井字棋人机对弈游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
井字棋游戏:即三子棋,英文名叫Tic-Tac-Tic,是一种在3*3格子上进行的连珠游戏,和五子棋比较类似,由于棋盘一般不画边线框,格线排成井字故得名。
题目分析 :
要完成该游戏的编写,我们需要先分析出完成整个游戏过程都需要干什么?
1.首先,需要定义出一个3*3的棋盘,根据相关知识,我们可以以二维数组的方式将棋盘表示出来;
2.棋盘定义出来后,需要将棋盘初始化,将3*3二维数组的每一个位置初始化为‘ ’(空格);
3.有了棋盘,我们就可以开始进行下棋了,首先要确定是玩家先下还是电脑先下。在这里我们规定玩家先下且玩家的下棋方式为‘x’,电脑下棋方式为‘o’;
4.每一次下完棋后需要进行检测,判断该下棋位置是否合法、判断是否胜利等等。
根据上述分析,可以大致定义出以下函数窗口:
1 2 3 4 5 | void InitGame(); //初始化游戏(棋盘) void PrintChess(); //输出棋盘 void PlayerMove(); //玩家下棋 void ComputerMove(); //电脑下棋 char CheckGameOver(); //判断游戏是否结束(玩家胜/电脑胜/和棋) |
初始化棋盘:将3*3的二维数组棋盘的每个位置初始化为‘ ’
1 2 3 4 5 6 7 8 | void InitGame() { for ( int i = 0; i < ROW; i++) { for ( int j = 0; j < COL; j++) chess_board[i][j] = ' ' ; } } |
输出棋盘: 输出棋盘时,棋盘的风格可以根据自己的喜好来设计
1 2 3 4 5 6 7 8 9 | void PrintfChess() //输出棋盘,棋盘的设计可以根据自己的喜好设计 { for ( int i = 0; i < ROW; i++) { printf ( "| %c | %c | %c |\n" , chess_board[i][0], chess_board[i][1], chess_board[i][2]); if (i < ROW - 1) printf ( "|---|---|---|\n" ); } } |
玩家下棋: 玩家输入下棋位置后,需要判断该位置是否合法、输入位置是否已被占用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | void PlayerMove() //玩家下棋 { printf ( "玩家落子.\n" ); int row, col; while (1) { printf ( "请输入一组坐标(下棋位置):>" ); scanf ( "%d %d" , &row, &col); //检查坐标的有效性 if (row < 0 || row > ROW || col < 0 || col > COL) { printf ( "输入非法,请重新输入..." ); continue ; } if (chess_board[row][col] != ' ' ) { printf ( "输入的位置已被占用,请重新输入..." ); continue ; } chess_board[row][col] = 'x' ; //x代表玩家下的棋 break ; } } |
电脑下棋: 电脑下棋时,下棋的位置利用srand函数随机产生
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | void ComputerMove() //电脑下棋 { srand ( time (0)); while (1) { int row = rand () % ROW; int col = rand () % COL; if (chess_board[row][col] != ' ' ) { continue ; } chess_board[row][col] = 'o' ; //o代表电脑下的棋 break ; } } |
检查棋盘 :在检测棋盘时,分别判断行、列、对角线,在这里我规定:
‘x’代表玩家赢 ‘o’代表电脑赢 ‘h’代表和棋 ‘c’代表继续
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 | char CheckGameOver() //检测游戏是否结束 { //检查行 for ( int i = 0; i < ROW; i++) { if (chess_board[i][0] != ' ' && chess_board[i][0] == chess_board[i][1] && chess_board[i][0] == chess_board[i][2] ) return chess_board[i][0]; } //检查列 for ( int j = 0; j < COL; j++) { if (chess_board[0][j] != ' ' && chess_board[0][j] == chess_board[1][j] && chess_board[0][j] == chess_board[2][j] ) return chess_board[0][j]; } //检查对角线 if (chess_board[0][0] != ' ' && chess_board[0][0] == chess_board[1][1] && chess_board[0][0] == chess_board[2][2] ) return chess_board[0][0]; if (chess_board[0][2] != ' ' && chess_board[0][2] == chess_board[1][1] && chess_board[0][2] == chess_board[2][0] ) return chess_board[0][2]; //判断是否和棋 if (ChessFull()) return 'h' ; return 'c' ; } |
至此,主要的功能函数均已编写完毕,整个程序的流程如下所示:
1.初始化棋盘;
2.输出棋盘;
3.玩家下棋;
4.检测棋盘;
5.电脑下棋;
6.检测棋盘
代码如下:
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 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 | #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <time.h> #include <stdbool.h> #include <stdlib.h> #define START 1 #define QUIT 0 #define ROW 3 #define COL 3 static char chess_board[ROW][COL]; //定义棋盘 void StartGame(); void InitGame(); void PrintfChess(); void PlayerMove(); void ComputerMove(); char CheckGameOver(); bool ChessFull(); int main( int argc, char * argv[]) { int select = 1; while (select) { printf ( "*********************\n" ); printf ( "* [1] Start Game *\n" ); printf ( "* [2] Over Game *\n" ); printf ( "*********************\n" ); printf ( "请选择:>" ); scanf_s( "%d" , &select); if (select == QUIT) break ; if (select != START) { printf ( "输入有错,请重新输入.....\n" ); continue ; } StartGame(); } printf ( "GoodBye....." ); return 0; } void StartGame() { char winner; //1 初始化游戏(棋盘) InitGame(); //2 进入游戏 while (1) { //3 输出棋盘 PrintfChess(); //4玩家下棋 PlayerMove(); //5检查结果 winner = CheckGameOver(); if (winner != 'c' ) break ; //6电脑下棋 ComputerMove(); //7检查结果 CheckGameOver(); winner = CheckGameOver(); if (winner != 'c' ) break ; } if (winner == 'x' ) printf ( "玩家赢.\n" ); if (winner == 'o' ) printf ( "电脑赢.\n" ); if (winner == 'h' ) printf ( "和棋.\n" ); } void InitGame() { for ( int i = 0; i < ROW; i++) { for ( int j = 0; j < COL; j++) chess_board[i][j] = ' ' ; } } void PrintfChess() //输出棋盘,棋盘的设计可以根据自己的喜好设计 { for ( int i = 0; i < ROW; i++) { printf ( "| %c | %c | %c |\n" , chess_board[i][0], chess_board[i][1], chess_board[i][2]); if (i < ROW - 1) printf ( "|---|---|---|\n" ); } } void PlayerMove() //玩家下棋 { printf ( "玩家落子.\n" ); int row, col; while (1) { printf ( "请输入一组坐标(下棋位置):>" ); scanf ( "%d %d" , &row, &col); //检查坐标的有效性 if (row < 0 || row > ROW || col < 0 || col > COL) { printf ( "输入非法,请重新输入..." ); continue ; } if (chess_board[row][col] != ' ' ) { printf ( "输入的位置已被占用,请重新输入..." ); continue ; } chess_board[row][col] = 'x' ; //x代表玩家下的棋 break ; } } void ComputerMove() //电脑下棋 { srand ( time (0)); while (1) { int row = rand () % ROW; int col = rand () % COL; if (chess_board[row][col] != ' ' ) { continue ; } chess_board[row][col] = 'o' ; //o代表电脑下的棋 break ; } } /* * 'x'代表玩家赢 * 'o'代表电脑赢 * 'h'代表和棋 * 'c'代表继续 */ char CheckGameOver() //检测游戏是否结束 { //检查行 for ( int i = 0; i < ROW; i++) { if (chess_board[i][0] != ' ' && chess_board[i][0] == chess_board[i][1] && chess_board[i][0] == chess_board[i][2] ) return chess_board[i][0]; } //检查列 for ( int j = 0; j < COL; j++) { if (chess_board[0][j] != ' ' && chess_board[0][j] == chess_board[1][j] && chess_board[0][j] == chess_board[2][j] ) return chess_board[0][j]; } //检查对角线 if (chess_board[0][0] != ' ' && chess_board[0][0] == chess_board[1][1] && chess_board[0][0] == chess_board[2][2] ) return chess_board[0][0]; if (chess_board[0][2] != ' ' && chess_board[0][2] == chess_board[1][1] && chess_board[0][2] == chess_board[2][0] ) return chess_board[0][2]; //判断是否和棋 if (ChessFull()) return 'h' ; return 'c' ; } bool ChessFull() { for ( int i = 0; i < ROW; i++) { for ( int j = 0; j < COL; j++) { if (chess_board[i][j] == ' ' ) return false ; } } return true ; } |
运行测试图:
程序的运行界面我们还可以利用system(“cls”)对界面进行优化,这样可以使界面更加美观。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
相关文章
暂无评论...