目录
本案例代码采用win10系统下 Visual Studio 2022 编译器进行书写编译的。对于该编译器“scanf()”编译时无法通过,因此在声明文件内部加入一行代码:
#define _CRT_SECURE_NO_WARNINGS 1
🍬游戏总体逻辑:
1、完成游戏的基本框架。
2、用二维数组来进行数据的存储,首先初始化初始化一个3*3的二维数组最为三子棋的棋盘。
3、将棋盘打印到屏幕上。
4、玩家下棋,每下一步棋就打印一起棋盘,判定一次输赢或平局。
5、电脑下棋,每下一步棋就打印一起棋盘,判定一次输赢或平局。
🍬功能实现
🍃基本框架搭建
首先要有一个开始界面,选择是否进入游戏
void Menu()
{
printf("********** 三子棋 *********\n");
printf("******************************\n");
printf("********** 1、Play *********\n");
printf("********** 0、Exit *********\n");
printf("******************************\n");
}
void game(){}
int main()
{
srand((unsigned int)time(NULL));
int input = 0;
do
{
Menu();
printf("请选择:>");
scanf("%d", &input);
switch (input)
{
case 0:
printf("退出游戏!\n");
break;
case 1:
game();
break;
default:
printf("选择错误,请重新选择!\n");
break;
}
} while (input);
return 0;
}
🍃初始化棋盘
要将二维数组的每一个元素初始化为空格
void Initboard(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 Displayboard(char board[Row][Col], int row, int col)
{//打印棋盘
int i = 0;
for (i = 0; i < row; i++)
{
int j = 0;
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 <= col) && (y >= 1))
{
if (board[x - 1][y - 1] == ' ')
{//没有下过,可以落子
board[x - 1][y - 1] = '*';
break;
}
else
{//不能落子
printf("坐标已经落子,请重新落子:\n");
}
}
else
{
printf("坐标非法,请重新落子:\n");
}
}
}
🍃电脑下棋
要实现电脑的随机下棋,需要设置一个与时间戳相关联的随机数生成器,在主函数开始时调用
srand((unsigned int)time(NULL));
//此方法只需要调用一次即可
void Computermove(char board[Row][Col], int row, int col)
{//电脑下棋
printf("电脑落子>:\n");
while (1)
{
int x = rand() % row; //获取到随机坐标
int y = rand() % col;
if (board[x][y] == ' ')
{
board[x][y] = '#';
break;
}
}
}
🍃判定输赢及平局
不论是玩家还是电脑,每下一步棋都需要判定一次输赢
判定输赢有三种
判定三行、判断三列、判断两条对角线,哪一方三个棋子连成线,就是哪一方获胜
char Iswin(char board[Row][Col], int row, int col)
{//判断输赢
int i = 0;
for (i = 0; i < row; i++)
{//判断三行是否有连成一线的
if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][1] != ' ')
{
return board[i][1];
}
}
for (i = 0; i < col; i++)
{//判断三列
if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[1][i] != ' ')
{
return board[1][i];
}
}
if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[1][1] != ' ')
{//判断两条对角线
return board[1][1];
}
if (board[2][0] == board[1][1] && board[1][1] == board[0][2] && board[1][1] != ' ')
{
return board[1][1];
}
int ret = Isfull(board, row, col);
if (ret == 1)
{
return 'Q';
}
return 'C';
}
一共三种结果,玩家赢,电脑赢,以及平局。
判断平局
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; //没有空位置
}
大体功能就是这样。
🍬案例代码
🍃声明部分
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
#define Row 3
#define Col 3
//初始化棋盘为空格
void Initboard(char board[Row][Col], int row, int col);
//打印棋盘
void Displayboard(char board[Row][Col], int row, int col);
//玩家下棋
void Playermove(char board[Row][Col], int row, int col);
//电脑下棋
void Computermove(char board[Row][Col], int row, int col);
//判断输赢
char Iswin(char board[Row][Col], int row, int col);
//是否平局,下满棋盘未分胜负
int Isfull(char board[Row][Col], int row, int col);
🍃功能实现部分
#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
void Initboard(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 Displayboard(char board[Row][Col], int row, int col)
{//打印棋盘
int i = 0;
for (i = 0; i < row; i++)
{
int j = 0;
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 <= col) && (y >= 1))
{
if (board[x - 1][y - 1] == ' ')
{//没有下过,可以落子
board[x - 1][y - 1] = '*';
break;
}
else
{//不能落子
printf("坐标已经落子,请重新落子:\n");
}
}
else
{
printf("坐标非法,请重新落子:\n");
}
}
}
void Computermove(char board[Row][Col], int row, int col)
{//电脑下棋
printf("电脑落子>:\n");
while (1)
{
int x = rand() % row;
int y = rand() % col;
if (board[x][y] == ' ')
{
board[x][y] = '#';
break;
}
}
}
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 Iswin(char board[Row][Col], int row, int col)
{//判断输赢
int i = 0;
for (i = 0; i < row; i++)
{//判断三行是否有连成一线的
if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][1] != ' ')
{
return board[i][1];
}
}
for (i = 0; i < col; i++)
{//判断三列
if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[1][i] != ' ')
{
return board[1][i];
}
}
if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[1][1] != ' ')
{//判断两条对角线
return board[1][1];
}
if (board[2][0] == board[1][1] && board[1][1] == board[0][2] && board[1][1] != ' ')
{
return board[1][1];
}
int ret = Isfull(board, row, col);
if (ret == 1)
{
return 'Q';
}
return 'C';
}
🍃测试部分
#include"game.h"
void Menu()
{
printf("********** 三子棋 *********\n");
printf("******************************\n");
printf("********** 1、Play *********\n");
printf("********** 0、Exit *********\n");
printf("******************************\n");
}
void game()
{
char ret = 0;
char board[Row][Col] = { 0 };
//初始化棋盘为空格
Initboard(board, Row, Col);
//打印棋盘
Displayboard(board, Row, Col);
while (1)
{
//玩家下棋
Playermove(board, Row, Col);
Displayboard(board, Row, Col);
//判断输赢
ret = Iswin(board, Row, Col);
if (ret != 'C')
{
break;
}
//电脑下棋
Computermove(board, Row, Col);
Displayboard(board, Row, Col);
ret = Iswin(board, Row, Col);
if (ret != 'C')
{
break;
}
}
if (ret == '*')
{
printf("恭喜你,你赢了!\n");
}
else if (ret == '#')
{
printf("很遗憾,你输了...\n");
}
else
{
printf("战平!!!\n");
}
Displayboard(board, Row, Col);
}
int main()
{
srand((unsigned int)time(NULL));
int input = 0;
do
{
Menu();
printf("请选择:>");
scanf("%d", &input);
switch (input)
{
case 0:
printf("退出游戏!\n");
break;
case 1:
game();
break;
default:
printf("选择错误,请重新选择!\n");
break;
}
} while (input);
return 0;
}
这个小案例就介绍完了,这是一个初级的版本,大家有兴趣的可以继续完善功能
望一键三连,感谢支持❤️❤️❤️