城固城乡建设规划网站,县城做信息网站,沈阳哪个公司可以做网站,中英文网站程序#x1f3af;每日努力一点点#xff0c;技术进步看得见 #x1f3e0;专栏介绍#xff1a;【C语言步行梯】专栏用于介绍C语言相关内容#xff0c;每篇文章将通过图片代码片段网络相关题目的方式编写#xff0c;欢迎订阅~~ 文章目录 需求分析具体实现主函数体菜单实现游戏实… 每日努力一点点技术进步看得见 专栏介绍【C语言步行梯】专栏用于介绍C语言相关内容每篇文章将通过图片代码片段网络相关题目的方式编写欢迎订阅~~ 文章目录 需求分析具体实现主函数体菜单实现游戏实现棋盘初始化显示棋盘玩家下棋电脑下棋判断棋盘是否已满判断输赢游戏函数主体 完整代码分文件编写 需求分析
上课摸鱼的时候我们可以画个九宫格在里面画上圆圈或者叉。现在我们通过C语言实现这个三子棋游戏实现用户与电脑下棋。
具体实现
主函数体
在主函数体内我们需要调用一个menu函数用它提醒用户输入1开始游戏输入0退出游戏。接收用户输入后通过switch语句执行game()函数或者退出游戏。menu和game函数将在下文中讲解。
int main()
{int input 0;do{menu();printf(请输入您的选择);scanf(%d, input);switch(input){case 1:game();//游戏具体实现函数break;case 0:printf(游戏结束\n);break;default:printf(输入有误请重新输入\n);}}while(input);return 0;
}菜单实现
首先我们需要一个菜单提示用户输入1可以开始游戏输入0会退出游戏。我通过封装一个menu函数实现↓↓↓
void menu()
{printf(*********************************************\n);printf(************** 1.play 0.exit ***************\n);printf(*********************************************\n);
}游戏实现
棋盘初始化
我们通过一个char board[3][3]来存储棋盘。如果board[i][j]为空格表示该位置还没有下棋如果board[i][j]存储’*‘星号表示该位置用户已经下棋如果board[i][j]存储‘#’井号表示该位置电脑已经下棋。 但在开始游戏前我们需要将棋盘数组每个元素都初始化空格。↓↓↓
void initBoard(char board[ROW][COL], int rows, int cols)
{for(int i 0; i rows; i){for(int j 0; j cols; j){board[i][j] ;}}
}显示棋盘
在游戏过程中玩家或者电脑下完棋后需要显示棋盘。用户才能知道当前棋盘的落子情况。
void displayBoard(char board[ROW][COL], int rows, int cols)
{for(int i 0; i rows; i){for(int j 0; j cols; j){printf( %c , board[i][j]);if(j ! cols - 1)printf(|);elseprintf(\n);}if(i ! rows - 1){for(int j 0; j cols; j){printf(---);if(j ! cols - 1)printf(|);elseprintf(\n);}}}
}上方打印棋盘效果如下图所示。
玩家下棋
提示玩家输入下棋的坐标接收到坐标后我们需要判断该坐标是否为空格表示还没有棋子如果是空格则下棋成功如果不是空格则下棋失败。
void playerAddChess(char board[ROW][COL], int rows, int cols)
{printf(玩家下棋\n);displayBoard(board, rows, cols);int x 0;int y 0;while (1){printf(请输入下棋坐标);scanf(%d %d, x, y);if (x rows || x 0 || y cols || y 0){printf(该坐标超出棋盘边界请重新输入\n);continue;}if (board[x - 1][y - 1] ! ){printf(该坐标已经下过棋子请重新输入\n);continue;}board[x - 1][y - 1] *;break;}}电脑下棋
通过随机数函数生成xy坐标。如果生成的坐标位置为空格则电脑下棋完成如果该坐标已被占用则重新生成坐标。
void computerAddChess(char board[ROW][COL], int rows, int cols)
{printf(电脑下棋\n);int x 0;int y 0;while(1){x rand() % 3 1;y rand() % 3 1;if(board[x][y] ! )continue;else{board[x - 1][y - 1] #;break;}}displayBoard(board, rows, cols);
}判断棋盘是否已满
假设经过判断没有三个棋子能连成一条直线那就无法判断谁赢谁输。若在此时棋盘已经满了但还是没有三个棋子练成一条直线则双方平手平局。如下图所示。 因此我们需要一个函数用来判断棋盘是否已经满了。如果满了则游戏结束没有满则游戏继续。
int isFull(char board[ROW][COL], int rows, int cols)
{for(int i 0; i rows; i){for(int j 0; j cols; j){if(board[i][j] )return 0;}}return 1;
}判断输赢
在电脑或者玩家下完棋后我们需要判断当前状态下是否有人获胜。根据三子棋的规则三个棋子连成直线即获胜。下面函数中如果玩家获胜则返回’*‘星号如果电脑获胜则返回’#‘井号如果棋盘满了则返回Q表示平局如果没人获胜棋盘也没满则游戏继续返回’C’。
char isWin(char board[ROW][COL], int rows, int cols)
{//对每一行判断for(int i 0; i rows; i){if(board[i][0] board[i][1] board[i][1] board[i][2] board[i][0] ! )return board[i][0];}//对每一列判断for(int i 0; i cols; i){if(board[0][i] board[1][i] board[1][i] board[2][i] board[0][i] ! )return board[0][i];}//对角线if(board[0][0] board[1][1] board[1][1] board[2][2] board[0][0] ! )return board[0][0];if(board[0][2] board[1][1] board[1][1] board[2][0] board[0][2] ! )return board[0][2];if(isFull(board, rows, cols))return Q;return C;
}游戏函数主体
在实现了上述各个函数后我们只要稍加组织就可以实现游戏了。
void game()
{char board[ROW][COL] { 0 };initBoard(board, ROW, COL);char ret 0;while (1){playerAddChess(board, ROW, COL);ret isWin(board, ROW, COL);if (ret ! C)break;computerAddChess(board, ROW, COL);ret isWin(board, ROW, COL);if (ret ! C)break;}switch (ret){case *:printf(玩家获胜\n);break;case #:printf(电脑获胜\n);break;case Q:printf(平局\n);break;}
}完整代码
上面代码中主函数中没有加入随机数种子在下面代码中加入了srand((unsigned int)time(NULL))同时对于上面出现ROW、COL的宏定义等也在下方代码整体给出。
#include stdio.h
#include stdlib.h
#include time.h#define ROW 3
#define COL 3void menu()
{printf(*********************************************\n);printf(************** 1.play 0.exit ***************\n);printf(*********************************************\n);
}void initBoard(char board[ROW][COL], int rows, int cols)
{for (int i 0; i rows; i){for (int j 0; j cols; j){board[i][j] ;}}
}void displayBoard(char board[ROW][COL], int rows, int cols)
{for (int i 0; i rows; i){for (int j 0; j cols; j){printf( %c , board[i][j]);if (j ! cols - 1)printf(|);elseprintf(\n);}if (i ! rows - 1){for (int j 0; j cols; j){printf(---);if (j ! cols - 1)printf(|);elseprintf(\n);}}}
}void playerAddChess(char board[ROW][COL], int rows, int cols)
{printf(玩家下棋\n);displayBoard(board, rows, cols);int x 0;int y 0;while (1){printf(请输入下棋坐标);scanf(%d %d, x, y);if (x rows || x 0 || y cols || y 0){printf(该坐标超出棋盘边界请重新输入\n);continue;}if (board[x - 1][y - 1] ! ){printf(该坐标已经下过棋子请重新输入\n);continue;}board[x - 1][y - 1] *;break;}}void computerAddChess(char board[ROW][COL], int rows, int cols)
{printf(电脑下棋\n);int x 0;int y 0;while (1){x rand() % 3 1;y rand() % 3 1;if (board[x - 1][y - 1] ! )continue;else{board[x - 1][y - 1] #;break;}}displayBoard(board, rows, cols);
}int isFull(char board[ROW][COL], int rows, int cols)
{for (int i 0; i rows; i){for (int j 0; j cols; j){if (board[i][j] )return 0;}}return 1;
}char isWin(char board[ROW][COL], int rows, int cols)
{//对每一行判断for (int i 0; i rows; i){if (board[i][0] board[i][1] board[i][1] board[i][2] board[i][0] ! )return board[i][0];}//对每一列判断for (int i 0; i cols; i){if (board[0][i] board[1][i] board[1][i] board[2][i] board[0][i] ! )return board[0][i];}//对角线if (board[0][0] board[1][1] board[1][1] board[2][2] board[0][0] ! )return board[0][0];if (board[0][2] board[1][1] board[1][1] board[2][0] board[0][2] ! )return board[0][2];if (isFull(board, rows, cols))return Q;return C;
}void game()
{char board[ROW][COL] { 0 };initBoard(board, ROW, COL);char ret 0;while (1){playerAddChess(board, ROW, COL);ret isWin(board, ROW, COL);if (ret ! C)break;computerAddChess(board, ROW, COL);ret isWin(board, ROW, COL);if (ret ! C)break;}switch (ret){case *:printf(玩家获胜\n);break;case #:printf(电脑获胜\n);break;case Q:printf(平局\n);break;}
}int main()
{int input 0;do{menu();printf(请输入您的选择);scanf(%d, input);switch (input){case 1:game();//游戏具体实现函数break;case 0:printf(游戏结束\n);break;default:printf(输入有误请重新输入\n);}} while (input);return 0;
}分文件编写
可以创建game.h保存头文件及各函数的函数声明game.c保存各个函数的具体实现main.c中保存主函数。
game.h ↓↓↓
#pragma once#include stdio.h
#include stdlib.h
#include time.h#define ROW 3
#define COL 3//初始化棋盘
void initBoard(char board[ROW][COL], int rows, int cols);//菜单
void menu();//打印棋盘
void displayBoard(char board[ROW][COL], int rows, int cols);//玩家下棋
void playerAddChess(char board[ROW][COL], int rows, int cols);//电脑下棋
void computerAddChess(char board[ROW][COL], int rows, int cols);//游戏
void game();//判断棋盘是否已经满了
int isFull(char board[ROW][COL], int rows, int cols);//判断是否赢
char isWin(char board[ROW][COL], int rows, int cols);game.c ↓↓↓
#include game.hvoid menu()
{printf(*********************************************\n);printf(************** 1.play 0.exit ***************\n);printf(*********************************************\n);
}void initBoard(char board[ROW][COL], int rows, int cols)
{for (int i 0; i rows; i){for (int j 0; j cols; j){board[i][j] ;}}
}void displayBoard(char board[ROW][COL], int rows, int cols)
{for (int i 0; i rows; i){for (int j 0; j cols; j){printf( %c , board[i][j]);if (j ! cols - 1)printf(|);elseprintf(\n);}if (i ! rows - 1){for (int j 0; j cols; j){printf(---);if (j ! cols - 1)printf(|);elseprintf(\n);}}}
}void playerAddChess(char board[ROW][COL], int rows, int cols)
{printf(玩家下棋\n);displayBoard(board, rows, cols);int x 0;int y 0;while (1){printf(请输入下棋坐标);scanf(%d %d, x, y);if (x rows || x 0 || y cols || y 0){printf(该坐标超出棋盘边界请重新输入\n);continue;}if (board[x - 1][y - 1] ! ){printf(该坐标已经下过棋子请重新输入\n);continue;}board[x - 1][y - 1] *;break;}}void computerAddChess(char board[ROW][COL], int rows, int cols)
{printf(电脑下棋\n);int x 0;int y 0;while (1){x rand() % 3 1;y rand() % 3 1;if (board[x - 1][y - 1] ! )continue;else{board[x - 1][y - 1] #;break;}}displayBoard(board, rows, cols);
}int isFull(char board[ROW][COL], int rows, int cols)
{for (int i 0; i rows; i){for (int j 0; j cols; j){if (board[i][j] )return 0;}}return 1;
}char isWin(char board[ROW][COL], int rows, int cols)
{//对每一行判断for (int i 0; i rows; i){if (board[i][0] board[i][1] board[i][1] board[i][2] board[i][0] ! )return board[i][0];}//对每一列判断for (int i 0; i cols; i){if (board[0][i] board[1][i] board[1][i] board[2][i] board[0][i] ! )return board[0][i];}//对角线if (board[0][0] board[1][1] board[1][1] board[2][2] board[0][0] ! )return board[0][0];if (board[0][2] board[1][1] board[1][1] board[2][0] board[0][2] ! )return board[0][2];if (isFull(board, rows, cols))return Q;return C;
}void game()
{char board[ROW][COL] { 0 };initBoard(board, ROW, COL);char ret 0;while (1){playerAddChess(board, ROW, COL);ret isWin(board, ROW, COL);if (ret ! C)break;computerAddChess(board, ROW, COL);ret isWin(board, ROW, COL);if (ret ! C)break;}switch (ret){case *:printf(玩家获胜\n);break;case #:printf(电脑获胜\n);break;case Q:printf(平局\n);break;}
}main.c ↓↓↓
int main()
{int input 0;do{menu();printf(请输入您的选择);scanf(%d, input);switch (input){case 1:game();//游戏具体实现函数break;case 0:printf(游戏结束\n);break;default:printf(输入有误请重新输入\n);}} while (input);return 0;
}这篇文章结束了~~ 如果文章中出现了错误欢迎私信或留言。(๑•̀ㅂ•́)و✧ 有任何疑问请评论或私信哦~~o(▽)ブ