C语言实现三子棋小游戏 适合初学者练习的C语言实现三子棋小游戏
小明bite 人气:0想了解适合初学者练习的C语言实现三子棋小游戏的相关内容吗,小明bite在本文为您仔细讲解C语言实现三子棋小游戏的相关知识和一些Code实例,欢迎阅读和指正,我们先划重点:C语言实现三子棋小游戏,C语言,三子棋小游戏,下面大家一起来学习吧。
用简单的C语言来实现小时候玩的三子棋游戏,下面是人机对战,当然这个代码的电脑对手是人工智障而不是人工智能
一、写代码前明确下棋时的步骤与顺序
- 1.创建一个3*3的棋盘.
- 2.将上面创建的棋盘中每个格初始化成' '状态.
- 3.打印出初始化完成的棋盘
- 4.玩家落子
- 5.电脑落子
- 6.判断胜负
写代码之前梳理好大概的思路,先写出初步的主函数
int main() { char winner = ' '; //1.创建一个棋盘,并初始化. char board[MAX_ROW][MAX_COL] = { 0 }; //2.init函数将棋盘每个格子初始化成' '. init(board); while (1) { //3.打印棋盘 printBoard(board); //4.玩家落子 playerMove(board); //5.判断胜负 winner = checkWinner(board); if (winner != ' ') { //胜负已分 break; } //6.电脑落子 computerMove(board); //7.判断胜负 winner = checkWinner(board); if (winner != ' ') { //胜负已分 break; } }
在创建棋盘是char board[][]
的[]中不要写3,写3在后面看代码时不能明确分清3代表什么
因此建议定义宏
#define MAX_ROW 3 #define MAX_COL 3
这样可以清楚的看出[]中的内容代表什么,提高可读性.
二 根据初步的主函数完成想要的代码
1.写一个函数来初始化棋盘
//将棋盘初始化成' ' void init(char board[MAX_ROW][MAX_COL]) { for (int row = 0; row < MAX_ROW; row++) { for(int col = 0; col < MAX_COL; col++) { board[row][col] = ' '; } } //设计随机种子 srand((unsigned int) time(0)); }
2.打印棋盘
void printBoard(char board[MAX_ROW][MAX_COL]) { system("cls"); for (int row = 0; row < MAX_ROW; row++) { printf("+---+---+---+\n"); for (int col = 0; col < MAX_COL; col++) { printf("| %c ", board[row][col]); } printf("|"); printf("\n"); } printf("+---+---+---+\n"); }
system("cls")
是让每次打印棋盘前清除之前的棋盘这样能让界面清晰一些
(使用的是简单的C来完成程序所以打印的棋盘也比较简陋)
3.玩家落子
void playerMove(char board[MAX_ROW][MAX_COL]) { printf("请玩家落子!"); while (1) { printf("请输入落子的位置(row col):"); int row = 0; int col = 0; scanf("%d %d", &row, &col); //输入后验证输入内容是否合法. if (row < 0 || row >= MAX_ROW || col < 0 || col >= MAX_COL) { printf("输入有误.请重新输入!\n"); continue; } if (board[row][col] != ' ') { printf("当前位置已有棋子,请重新输入!\n"); continue; } board[row][col] = 'x'; break; } }
以输入坐标的方式来实现落子,并且要检测玩家落子是否合理,以免输入无效的坐标.
4.电脑落子
void computerMove(char board[MAX_ROW][MAX_COL]) { printf("轮到电脑落子"); while (1) { int row = rand() % MAX_ROW; int col = rand() % MAX_COL; if (board[row][col] != ' ') { continue; } board[row][col] = 'o'; break; } }
电脑落子采用随机数的方式来进行落子,因此需要设置随机种子,将它写在初始化棋盘函数内,每次初始化一次进行一次随机种子的设置
由于是随机落子因此实现的不是人工智能而是人工智障.
5.判断胜负
int checkWinner(char board[MAX_ROW][MAX_COL]) { //检查所有行 for (int row = 0; row < MAX_ROW; row++) { if (board[row][0] != ' ' && board[row][0] == board[row][1] && board[row][0] == board[row][2]) { return board[row][0]; } } //检查所有列 for (int col = 0; col < MAX_COL; col++) { if (board[0][col] != ' ' && board[0][col] == board[1][col] && board[0][col] == board[2][col]) { return board[0][col]; } } //检查对角线 if (board[0][0] == board[1][1] && board[0][0] == board[2][2] && board[0][0] != ' ') { return board[0][0]; } if (board[0][2] == board[1][1] && board[0][2] == board[2][0] && board[0][2] != ' ') { return board[0][2]; } if (isFull(board)) { return 'q'; } return ' '; }
检查每行 每列 对角线是否有三个相同的棋子从而判断胜负.
int isFull(char board[MAX_ROW][MAX_COL]) { for (int row = 0; row < MAX_ROW; row++) { for (int col = 0; col < MAX_COL; col++) { if (board[row][col] == ' ') { //棋盘没满 return 0; } } } return 1; }
检查棋盘有没有下满(可能出现和棋)
这就实现一个简单的三子棋游戏
在主函数中玩家落子后应也判断一次胜负,以免出现玩家胜利电脑再落子的情况.
三、三子棋实现代码
#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<time.h> #define MAX_ROW 3 #define MAX_COL 3 //将棋盘初始化成' ' void init(char board[MAX_ROW][MAX_COL]) { for (int row = 0; row < MAX_ROW; row++) { for(int col = 0; col < MAX_COL; col++) { board[row][col] = ' '; } } //设计随机种子 srand((unsigned int) time(0)); } void printBoard(char board[MAX_ROW][MAX_COL]) { system("cls"); for (int row = 0; row < MAX_ROW; row++) { printf("+---+---+---+\n"); for (int col = 0; col < MAX_COL; col++) { printf("| %c ", board[row][col]); } printf("|"); printf("\n"); } printf("+---+---+---+\n"); } void playerMove(char board[MAX_ROW][MAX_COL]) { printf("请玩家落子!"); while (1) { printf("请输入落子的位置(row col):"); int row = 0; int col = 0; scanf("%d %d", &row, &col); //输入后验证输入内容是否合法. if (row < 0 || row >= MAX_ROW || col < 0 || col >= MAX_COL) { printf("输入有误.请重新输入!\n"); continue; } if (board[row][col] != ' ') { printf("当前位置已有棋子,请重新输入!\n"); continue; } board[row][col] = 'x'; break; } } void computerMove(char board[MAX_ROW][MAX_COL]) { printf("轮到电脑落子"); while (1) { int row = rand() % MAX_ROW; int col = rand() % MAX_COL; if (board[row][col] != ' ') { continue; } board[row][col] = 'o'; break; } } int isFull(char board[MAX_ROW][MAX_COL]) { for (int row = 0; row < MAX_ROW; row++) { for (int col = 0; col < MAX_COL; col++) { if (board[row][col] == ' ') { //棋盘没满 return 0; } } } return 1; } int checkWinner(char board[MAX_ROW][MAX_COL]) { //检查所有行 for (int row = 0; row < MAX_ROW; row++) { if (board[row][0] != ' ' && board[row][0] == board[row][1] && board[row][0] == board[row][2]) { return board[row][0]; } } //检查所有列 for (int col = 0; col < MAX_COL; col++) { if (board[0][col] != ' ' && board[0][col] == board[1][col] && board[0][col] == board[2][col]) { return board[0][col]; } } //检查对角线 if (board[0][0] == board[1][1] && board[0][0] == board[2][2] && board[0][0] != ' ') { return board[0][0]; } if (board[0][2] == board[1][1] && board[0][2] == board[2][0] && board[0][2] != ' ') { return board[0][2]; } if (isFull(board)) { return 'q'; } return ' '; } int main() { char winner = ' '; //1.创建一个棋盘,并初始化. char board[MAX_ROW][MAX_COL] = { 0 }; //2.init函数将棋盘每个格子初始化成' '. init(board); while (1) { //3.打印棋盘 printBoard(board); //4.玩家落子 playerMove(board); //5.判断胜负 winner = checkWinner(board); if (winner != ' ') { //胜负已分 break; } //6.电脑落子 computerMove(board); //7.判断胜负 winner = checkWinner(board); if (winner != ' ') { //胜负已分 break; } } if (winner == 'x') { printf("恭喜你,你赢了!\n"); }else if(winner=='o') { printf("你真菜连人工智障都玩不过\n"); }else { printf("你和人工智障五五开\n"); } return 0; }
运行界面如下:
加载全部内容