本文共 5856 字,大约阅读时间需要 19 分钟。
三子棋是大家都很熟悉且玩起来比较轻松的小游戏。那如何用C语言简单去实现这个小游戏呢?以下是我思路:
第一步:对于玩游戏的人来说都有选择玩或者不玩的权利,直接把游戏放在玩家面前让玩家去玩肯定是不合理的,所以我们得先打印出一个简单的游戏菜单供玩家选择,这里我们自定义一个函数menu()帮我们实现打印菜单。然后在用switch语句去判断玩家的选择。为了使玩家结束一局三子棋游戏后还可以选择是否继续三子棋游戏,这里可以使用do...while()循环。
第二步:自定义游戏函数game(),首先定义一个二维数组board[ ][ ]目的是为了玩家输入坐标以实现落子。在定义数组后再调用自定义函数init_board()将数组内元素初试化为' '。接下来得实现打印棋盘、玩家和电脑落子、根据已经落子的情况判断输赢。
1.定义函数display_board()来实现打印棋盘,用字符'-'和字符'|'我们可以打印出我们想要的棋盘。打印棋盘过程中先将棋盘中的每一行看成一个整体使用一个for循环打印,然后再将每行中的每一格用for循环将其依次打印。
2.定义函数PlayerMove()来实现玩家落子,玩家输入的棋子坐标的两个值必将都大于0但是有可能会超出棋盘范围,所以得判断玩家输入棋子坐标的合理性,如果超出棋盘范围就报错使其重新输入直到正确为止,其次在判断玩家输入的坐标位置是否已经有棋,如果有棋的话报错让玩家重新输入。这里将玩家下的棋子用来打印在棋盘上。再定义函数ComputerMove()来实现电脑落子,电脑落子相比玩家落子简单,只要随机生成坐标落子,然后生成坐标处是否有棋。没有直接落子,有的话继续随机生成坐标直到坐标处无棋。
3.既然是三子棋,那表示横线、竖线、两种对角线上有连续三个相同的棋子就表示该棋子方获胜,或者棋盘落满都没有连续的三个棋子时则判平局。
代码如下:
//头文件game.h#include#include #include #define ROW 3#define COL 3void maue();void game();void init_board(char board[ROW][COL], int row, int col);void display_board(char board[ROW][COL], int row, int col);void PlayerMove(char board[ROW][COL], int row, int col);void ComputerMoveint(char board[ROW][COL], int row, int col);char CheckWin(char board[ROW][COL], int row, int col);
game.c#include "game.h"void init_board(char board[ROW][COL] , int row, int col){ int i = 0; int j = 0; for (i = 0; i < row; i++) { for (j = 0; j < col; j++) { board[i][j] = ' '; } }}void display_board(char board[ROW][COL], int row, int col){ int i = 0; int j = 0; for (i = 0; i < row; i++) { for (j = 0; j < col; j++) { printf(" %c ",board[i][j] ); if (j < col - 1) { printf("|"); } } printf("\n"); if (i < row-1) { for (j = 0; j < col; j++) { printf("---"); if (j < col - 1) { printf("|"); } } printf("\n"); } }}void PlayerMove(char board[ROW][COL], int row, int col){ int x = 0; int y = 0; printf("玩家走:>\n"); while (1) { printf("请输入要落子的坐标:>"); scanf("%d%d", &x, &y); if ((x>=1) && (x<=row) && (y>=1) && (y <=col)) { if (board[x-1][y-1] != ' ') { printf("该位置有棋子,请重新落子\n"); } else { board[x - 1][y - 1] = '*'; break; } } else { printf("输入有误,请重新输入\n"); } }}void ComputerMove(char board[ROW][COL], int row, int col){ int x = 0; int y = 0; printf("电脑走:>\n"); while (1) { x = rand() % row; y = rand() % col; if (board[x][y] == ' ') { board[x][y] = '#'; break; } }}static int IsFull(char board[ROW][COL], int row, int col){ int i = 0; int j = 0; for (i = 0; i < row; i++) { for (j = 0; j < col; j++) { if(board[i][j] == ' ') return 0; } } return 1;}char CheckWin(char board[ROW][COL], int row, int col){ int i = 0; int j = 0; for (i = 0; i < row; i++) { for (j = 0; j < col - 2; j++) { if ((board[i][j] == board[i][j + 1]) && (board[i][j + 1] == board[i][j + 2]) && (board[i][j] != ' ')) return board[i][j]; } } for (j = 0; j < col; j++) { for (i = 0; i < row - 2; i++) { if ((board[i][j] == board[i + 1][j]) && (board[i + 1][j] == board[i + 2][j]) && (board[i][j] != ' ')) return board[i][j]; } } for (i = 0; i < row - 2; i++) { for (j = 0; j < col - 2; j++) { if ((board[i][j] == board[i + 1][j + 1]) && (board[i + 1][j + 1] == board[i + 2][j + 2]) && (board[i][j] != ' ')) return board[i][j]; } } for (i = 0; i < row - 2 ; i++) { for (j = 2; j < col; j++) { if ((board[i][j] == board[i + 1][j - 1]) && (board[i + 1][j - 1] == board[i + 2][j - 2]) && (board[i][j] != ' ')) return board[i][j]; } } if (IsFull(board, row, col) == 1) { return 'Q';//平局 } return 'C';//继续}
//实现三子棋的主函数#include "game.h"void maue(){ printf("**************************\n"); printf("****** 1.play ******\n"); printf("****** 0.exit ******\n"); printf("**************************\n");}void game(){ char board[ROW][COL] = { 0 }; char ret = 0; init_board(board, ROW, COL); display_board(board, ROW, COL); while (1) { PlayerMove(board, ROW, COL); display_board(board, ROW, COL); ret = CheckWin(board, ROW, COL); if (ret != 'C') break; ComputerMove(board, ROW, COL); display_board(board, ROW, COL); ret = CheckWin(board, ROW, COL); if (ret != 'C') break; } if (ret == '*') { printf("玩家赢\n"); } else if (ret == '#') { printf("电脑赢\n"); } else if (ret == 'Q') { printf("平局\n"); }}int main(){ int input = 0; srand((unsigned int)time(NULL)); do { maue(); printf("请输入到你的选择:>"); scanf("%d", &input); switch (input) { case 1: game(); break; case 0: printf("退出游戏!\n"); break; default: printf("输入错误,请重新输入:>\n"); break; } } while (input); system("pause"); return 0;}
注:
1.在定义二维数组board[ ][ ]时可以直接在填入具体的数值表示棋盘的大小,后期如果想改变棋盘大小时就必须得将整个代码中的board[ ][ ]的数值修改。由于过于繁琐所以在头文件中用#define来修饰ROW,COL来表示棋盘大小的值。后期只要改变头文件中这两个值就可以改变棋盘大小。2.玩家落子和电脑落子后紧跟着打印棋盘,以保证落子后都能看到棋盘上落子的具体情况。每次落子后还得对棋盘的格局进行判断,如果没有任何一方获胜或者平局则继续落子,否则跳出循环判断哪方获胜或者平局。代码中有有的表述可能过于繁琐,如有不当之处请指出,以便修改。
转载于:https://blog.51cto.com/14233687/2374918