C语言实现三子棋游戏(简单版)
相信大多数人童年时期都玩过三子棋游戏,我的童年亦是如此,只记得用一块破碎的砖块或者烧黑的木炭在空地上两横两竖,便和小伙伴开启三子棋游戏。
如今人去楼空,代替小伙伴的是电子设备,对弈的人变成“数字人”。那么今天要介绍的是简易版的三子棋游戏,和“数字人”展开对弈吧!
接下来将逐层介绍实现细节:
游戏的开始当然少不了游戏菜单的展示,这里我们用简单的输出函数暴力展示游戏菜单,达到目的即可。
void menu() {
printf("***********************************\n");
printf("********欢迎来到三子棋游戏!*******\n");
printf("********1.进入游戏 ********\n");
printf("********0.退出游戏 ********\n");
printf("***********************************\n");
}
当然菜单作为展示不需要返回值,因此用void关键词。根据选项,我们可以用switch语句进行选择判断,同时游戏是需要循环玩耍的,所以这里我用do…while语句完成,也可以选择while循环、for循环等,只要逻辑通就行
int main() {
srand((unsigned int)time(NULL));
int input = 0;
menu();
printf("请输入选项:>");
scanf("%d", &input);
do
{
switch (input)
{
case 1:
game();
break;
case 0:
printf("退出游戏!");
break;
default:
printf("输入错误,请重新输入!\n");
break;
}
menu();
printf("请输入选项:>");
scanf("%d", &input);
} while (input);
return 0;
}
这里game()就是进行游戏的主要功能函数,我们进入这个函数
void game() {
char board[ROW][COL] = {0};
InitBoard(board, ROW, COL);
ShowBoard(board, ROW, COL);
while (1) {
Player(board, ROW, COL);
ShowBoard(board, ROW, COL);
int p = IsWin(board, ROW, COL);
if (p == 0) {
printf("平局!游戏结束\n");
break;
}
else if (p == 1) {
printf("玩家胜利!\n");
break;
}
else if (p == 2) {
printf("电脑胜利!\n");
break;
}
Computer(board, ROW, COL);
ShowBoard(board, ROW, COL);
int c = IsWin(board, ROW, COL);
if (c == 0) {
printf("平局!游戏结束\n");
break;
}
else if (c == 1) {
printf("玩家胜利!\n");
break;
}
else if (c == 2) {
printf("电脑胜利!\n");
break;
}
}
}
这里首先需要宏定义棋盘长宽,虽然是三子棋,我们也用宏定义长宽,相当于一个拓展吧
#define ROW 3
#define COL 3
InitBoard(board, ROW, COL)这个函数是初始化棋盘,也就是将代表棋盘的二维数组进行初始化,便于后面进行操作,我初始化用空格代替
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] = ' ';
}
}
}
ShowBoard(board, ROW, COL)是用来展示当前棋盘的下棋情况,游戏期间需要时刻追踪游戏进度,因此玩家和电脑每下一次棋都要调用这个函数
void ShowBoard(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 (j != col - 1) {
printf(" %c |", board[i][j]);
}
else {
printf(" %c \n", board[i][j]);
}
}
if (i != row - 1) {
for (j = 0; j < col; j++) {
if (j != col - 1) {
printf("---|", board[i][j]);
}
else {
printf("---\n", board[i][j]);
}
}
}
}
}
Player(board, ROW, COL)是我们玩家下棋函数,需要我们先进行输入下棋位置坐标1~3,再根据棋盘情况进行填充
void Player(char board[ROW][COL], int row, int col) {
int x = 0;
int y = 0;
printf("--------玩家回合--------\n");
printf("请输入坐标:> ");
scanf("%d %d", &x, &y);
while (1)
{
if (x > 0 && x <= ROW && y > 0 && y <= COL) {
if (board[x - 1][y - 1] == ' ') {
board[x - 1][y - 1] = '*';
break;
}
else {
printf("该位置已被填充!请重新输入:>");
}
}
else {
printf("坐标不存在,请重新输入:>");
}
scanf("%d %d", &x, &y);
}
}
Computer(board, ROW, COL)是电脑选手的下棋函数,由于是简单版,所以电脑下棋方式就是采用随机数原则,只要随机到空位置,就下入棋子
void Computer(char board[ROW][COL], int row, int col) {
int x = rand() % row;
int y = rand() % col;
printf("--------电脑回合--------\n");
int i = 0;
int j = 0;
int flag = 0;
for (i = 0; i < row; i++) {
for (j = 0; j < col; j++) {
if (board[i][j] == ' ') {
flag++;
}
}
}
while (1) {
if (board[x][y] == ' ') {
board[x][y] = '#';
printf("电脑填充位置:> %d %d\n", x + 1, y + 1);
break;
}
else {
int tmp = 0;
int tmp1 = 0;
int tmp2 = 0;
if (flag == 2) {
for (i = 0; i < row; i++) {
for (j = 0; j < col; j++) {
if (board[i][j] == ' ') {
if (tmp1 == 1) {
board[i][j] = '#';
printf("电脑填充位置:> %d %d\n", i + 1, j + 1);
break;
}
tmp = rand() % 2;
if (tmp == 0 && tmp1 != 1) {
board[i][j] = '#';
tmp2 = 1;
printf("电脑填充位置:> %d %d\n", i + 1, j + 1);
break;
}
if (tmp == 1) {
tmp1 = 1;
}
}
}
if (tmp2 == 1) {
break;
}
}
break;
}
else {
x = rand() % row;
y = rand() % col;
}
}
}
}
IsWin(board, ROW, COL)就是判断输赢的函数,每下一次棋就进行判断,玩过三子棋的小伙伴都知道,三子棋输赢就是判断每行每列对角线是否相等,对应到代码就是下面的逻辑
int IsWin(char board[ROW][COL], int row, int col) {
int i = 0;
int j = 0;
char c = ' ';
char tmp = ' ';
int flag = 0;
//行
for (i = 0; i < ROW; i++) {
for (j = 0; j < COL - 1; j++) {
if (board[i][j] != c && board[i][j] == board[i][j+1]) {
flag++;
tmp = board[i][j];
}
}
if (flag == 2) {
if (tmp == '*') {
return 1;
}
if (tmp == '#') {
return 2;
}
}
flag = 0;
tmp = ' ';
}
//列
for (i = 0; i < ROW; i++) {
for (j = 0; j < COL - 1; j++) {
if (board[j][i] != c && board[j][i] == board[j + 1][i]) {
flag++;
tmp = board[i][j];
}
}
if (flag == 2) {
if (tmp == '*') {
return 1;
}
if (tmp == '#') {
return 2;
}
}
flag = 0;
tmp = ' ';
}
//对角线
int k = 0;
for (i = 0, j = 0; i < ROW - 1, j < COL - 1; i++, j++) {
if (board[i][j] != c && board[i][j] == board[i + 1][j + 1]) {
flag++;
tmp = board[i][j];
}
}
if (flag == 2) {
if (tmp == '*') {
return 1;
}
if (tmp == '#') {
return 2;
}
}
flag = 0;
tmp = ' ';
for ( i = 0, k = COL - 1; i < ROW - 1, k > 0; i++, k--) {
if (board[k][i] != c && board[k][i] == board[k - 1][i + 1]) {
flag++;
tmp = board[k][i];
}
}
if (flag == 2) {
if (tmp == '*') {
return 1;
}
if (tmp == '#') {
return 2;
}
}
flag = 0;
tmp = ' ';
for (i = 0; i < ROW; i++) {
for (j = 0; j < COL; j++) {
if (board[i][j] != ' ') {
flag++;
}
}
}
if (flag == ROW * COL) {
return 0;
}
else {
return -1;
}
}
综合上面代码,就能实现一个简单的三子棋游戏啦!!!
简单运行一下如下图结果!

好久没写过博客了,希望后面能坚持下去,最后感谢阅读啦!
&spm=1001.2101.3001.5002&articleId=150288437&d=1&t=3&u=c26e34755d72494089b62f366e8cf097)
936

被折叠的 条评论
为什么被折叠?



