目录
解题思路:
- 首先有一个三行三列的九宫格棋盘,由玩家和电脑交替落子,最后先三颗棋子的一方连成一线则获胜;
- 首先,棋盘表示,创建一个字符型三行三列的二维数组;(x表示玩家落子,0表示电脑落子,' '表示未落子)
- 游戏开始时,进行棋盘初始化:把所有的元素设为空格' ';
- 提示玩家落子:让玩家输入一个坐标;
- 判断胜负:
- 未分胜负,电脑落子(基于随机数的方式生成一个坐标);
- 判断胜负:
代码分析:
主函数代码:
- 首先,主函数进入程序;
- 定义一个菜单,输入1则进入游戏;
- 输入0则结束游戏;
- 输入其他数字则做警示提醒;
- 代码如下:
-
int main() { while (1) { int choice = Menu(); if (choice == 1) { Game(); } else if (choice == 0) { printf("goodbye!\n"); break; } else { printf("您的输入有误!\n"); } } system("pause"); return 0; }
菜单函数代码:
- 定义一个菜单函数,进行打印游戏界面;
- 1代表开始游戏;
- 0代表结束游戏;
- 通过scanf函数获取用户输入数字,在主函数内的选择语句中进行执行下一步;
- 代码如下:
-
int Menu() { printf("====================\n"); printf(" 1.开始游戏\n"); printf(" 0.结束游戏\n"); printf("====================\n"); printf("请输入你的选择: "); int choice = 0; scanf("%d", &choice); return choice; }
游戏函数代码框架:
- 初始化棋盘函数;
- 打印棋盘printf();
- 玩家落子PlayerMove();
- 检测胜负CheakWinner();
- 电脑落子ComputerMove();
- 代码主框架如下:
void Game() {
//1.初始化棋盘,将棋盘每一个坐标点设置为空格;
Init();
char Winner = ' ';
while (1) {
//2.打印棋盘
Printf();
//3.玩家落子
PlayerMove();
//4.检测胜负
Winner = CheckWinner();
if (Winner != ' ') {
//胜负已分
break;
}
//5.电脑落子
ComputerMove();
//6.检测胜负
Winner = CheckWinner();
if (Winner != ' ') {
//胜负已分
break;
}
}
Printf();
if (Winner == 'x') {
printf("恭喜你,你赢了!\n");
}
else if (Winner == 'o') {
printf("你有点笨哦~\n");
}
else if (Winner == 'q') {
printf("你和电脑不分伯仲!\n");
}
else {
printf("代码好像出现了bug!\n");
}
}
初始化棋盘函数:
- 创建一个二维数组 表示棋盘;
- 初始化棋盘,棋盘每个坐标位置为空格;
- 代码示例:
-
//创建一个二维数组表示棋盘 char chess_board[MAX_ROW][MAX_COL]; void Init() { for (int row = 0; row < MAX_ROW; ++row) { for (int col = 0; col < MAX_COL; ++col) { chess_board[row][col] = ' '; } } }
打印棋盘函数:
- 代码示例:
-
void Printf() { for (int row = 0; row < MAX_ROW; ++row) { printf("| %c | %c | %c |\n", chess_board[row][0], chess_board[row][1], chess_board[row][2]); if (row != MAX_ROW - 1) { printf("|---|---|---|\n"); } } }
玩家落子函数:
- 提示玩家落子,玩家输入落子坐标;
- 对玩家选择的坐标进行合理性判断;
- 如果玩家坐标不属于数组内下标,则不合理;
- 如果玩家输入坐标值已经被占用则不合理;
- 如果合理,则在坐标处放置'x';
- 代码示例:
-
void PlayerMove() { printf("玩家落子!\n"); 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 (chess_board[row][col] != ' '){ printf("您要落子的地方已经被占用了!情重新输入!\n"); continue; } chess_board[row][col] = 'x'; break; } printf("玩家落子完毕!\n"); }
进行胜负判断函数:
- 返回值表示胜利者,表示玩家胜利,o表示电脑胜利,q表示和棋,' '未分出胜负;
- 检查所有行是否连成一线;检查所有列是否连成一线;检查所有对角线是否连成一线;
- 包含一个棋盘是否满的函数:
- 代码示例:
//返回值表示胜利者
//x表示玩家胜利
//o表示电脑胜利
//q表示和棋
//' '未分出胜负
char CheckWinner() {
//检查所有行是否连成一线,
for (int row = 0; row < MAX_ROW; ++row) {
if (chess_board[row][0] == chess_board[row][1] && chess_board[row][0] == chess_board[row][2]) {
return chess_board[row][0];
}
}
//检查所有列是否连成一线
for (int col = 0; col < MAX_COL; ++col) {
if (chess_board[0][col] == chess_board[1][col] && chess_board[0][col] == chess_board[2][col]) {
return chess_board[0][col];
}
}
//检查所有对角线是否连成一线
if (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[1][1] && chess_board[0][2] == chess_board[2][1]) {
return chess_board[0][2];
}
//棋盘满并且未分出胜负
if (IsFull()) {
return 'q';
}
return ' ';
}
判断棋盘满否函数:
- 代码示例:
-
//如果棋盘满了返回1,否则返回0; int IsFull() { for (int row = 0; row < MAX_ROW; ++row) { for (int col = 0; col < MAX_COL; ++col) { if (chess_board[row][col] == ' ') { //未满 return 0; } } } return 1; }
函数头文件:
- 代码示例;
-
#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> #include<time.h> //宏定义方式表示行和列,方便扩充,方便修改,提高可读性 #define MAX_ROW 3 #define MAX_COL 3
代码整体示例:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
//宏定义方式表示行和列,方便扩充,方便修改,提高可读性
#define MAX_ROW 3
#define MAX_COL 3
int Menu() {
printf("====================\n");
printf(" 1.开始游戏\n");
printf(" 0.结束游戏\n");
printf("====================\n");
printf("请输入你的选择: ");
int choice = 0;
scanf("%d", &choice);
return choice;
}
//创建一个二维数组表示棋盘
char chess_board[MAX_ROW][MAX_COL];
void Init() {
for (int row = 0; row < MAX_ROW; ++row) {
for (int col = 0; col < MAX_COL; ++col) {
chess_board[row][col] = ' ';
}
}
}
void Printf() {
for (int row = 0; row < MAX_ROW; ++row) {
printf("| %c | %c | %c |\n", chess_board[row][0], chess_board[row][1], chess_board[row][2]);
if (row != MAX_ROW - 1) {
printf("|---|---|---|\n");
}
}
}
void PlayerMove() {
printf("玩家落子!\n");
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 (chess_board[row][col] != ' '){
printf("您要落子的地方已经被占用了!情重新输入!\n");
continue;
}
chess_board[row][col] = 'x';
break;
}
printf("玩家落子完毕!\n");
}
void ComputerMove() {
//设置随机种子
//获取当前时间戳,时间戳:从1970 年1月1号0时0分开始为基准时刻,到当前时间的秒数
srand((unsigned int)time(0));
printf("电脑落子\n");
while (1) {
int row = rand() % 3;
int col = rand() % 3;
if (chess_board[row][col] != ' ') {
continue;
}
chess_board[row][col] = 'o';
break;
}
printf("电脑落子完毕!\n");
}
//如果棋盘满了返回1,否则返回0;
int IsFull() {
for (int row = 0; row < MAX_ROW; ++row) {
for (int col = 0; col < MAX_COL; ++col) {
if (chess_board[row][col] == ' ') {
//未满
return 0;
}
}
}
return 1;
}
//返回值表示胜利者
//x表示玩家胜利
//o表示电脑胜利
//q表示和棋
//' '未分出胜负
char CheckWinner() {
//检查所有行是否连成一线,
for (int row = 0; row < MAX_ROW; ++row) {
if (chess_board[row][0] == chess_board[row][1] && chess_board[row][0] == chess_board[row][2]) {
return chess_board[row][0];
}
}
//检查所有列是否连成一线
for (int col = 0; col < MAX_COL; ++col) {
if (chess_board[0][col] == chess_board[1][col] && chess_board[0][col] == chess_board[2][col]) {
return chess_board[0][col];
}
}
//检查所有对角线是否连成一线
if (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[1][1] && chess_board[0][2] == chess_board[2][1]) {
return chess_board[0][2];
}
//棋盘满并且未分出胜负
if (IsFull()) {
return 'q';
}
return ' ';
}
void Game() {
//1.初始化棋盘,将棋盘每一个坐标点设置为空格;
Init();
char Winner = ' ';
while (1) {
//2.打印棋盘
Printf();
//3.玩家落子
PlayerMove();
//4.检测胜负
Winner = CheckWinner();
if (Winner != ' ') {
//胜负已分
break;
}
//5.电脑落子
ComputerMove();
//6.检测胜负
Winner = CheckWinner();
if (Winner != ' ') {
//胜负已分
break;
}
}
Printf();
if (Winner == 'x') {
printf("恭喜你,你赢了!\n");
}
else if (Winner == 'o') {
printf("你有点笨哦~\n");
}
else if (Winner == 'q') {
printf("你和电脑不分伯仲!\n");
}
else {
printf("代码好像出现了bug!\n");
}
}
int main() {
while (1) {
int choice = Menu();
if (choice == 1) {
Game();
}
else if (choice == 0) {
printf("goodbye!\n");
break;
}
else {
printf("您的输入有误!\n");
}
}
system("pause");
return 0;
}
运行结果显示: