✨作者:@平凡的人1 ✨专栏:《C语言从0到1》 ✨一句话:凡是过往,皆为序章 ✨说明: 过去无可挽回, 未来可以改变
目录
大家好啊,我发现三子棋好像已经烂大街了,随便一搜,便能搜到各式各样的三子棋版本,简单易懂的版本,优化过的版本等等,但是这些并不具有一个普遍的通用性,很多游戏的输赢都仅仅只是围绕着3行3列而展开的,局限性太大。基于此,我仅以这篇博客对三子棋的基本实现进行改造,使三子棋游戏具有更加通用的普遍性,希望能够对你有所帮助。💖
🧨借助此篇博客,㊗大家五一快乐!🎉
开始之前,很有必要先说说游戏逻辑的基本框架,我看许多别的博客基本都是一上来就直接开始代码了,代码的事情并不着急,重要的是我们要先理清楚游戏的逻辑是怎么一回事。这里我会分成两个部分:
🌀游戏可以支持玩家多次玩,反复玩 🌀需要一个菜单界面提示玩家做出选择 🌀游戏需要一个棋盘(基于二维数组) 🌀打印棋盘,看看初始化界面 🌀玩家下棋,输入坐标 🌀判断输赢,打印棋盘,看看效果如何 🌀电脑下棋,产生范围内的随机坐标(可以自己自行设计算法,优化电脑下棋,本篇博客并不讨论此问题) 🌀判断输赢,打印棋盘,看看效果如何
本篇博客将以*作为玩家的棋子,以#作为电脑的棋子
用*来代表玩家赢,用#代表电脑赢,以'Q'代表平局,以‘C’代表继续
通过模块化设计,分为3个部分:
test.c
主函数部分,对游戏的逻辑进行测试运行
game.h
库函数头文件的包含 行列的自定义设置 函数的定义
game.c
游戏功能的实现,即对game.h中定义的函数进行实现
好了,通过上面的介绍对游戏有了一定的认识。下面,进入我们的代码实现部分👇
1.我们知道,要支持玩家多次重复玩游戏,这里采用dowhile循环来实现,无论如何,我们至少都能够进入游戏一次🚀 2.菜单,可通过简单的打印printf提示玩家进行选择,根据玩家的输入我们可以通过switch来作为选择🚀 3.主体部分game()游戏的实现:定义初始化一个棋盘,打印看看效果,while()循环,玩家下棋,打印棋盘,判断输赢 电脑下棋,打印棋盘,判断输赢🚀
下面来一起看看我们的代码🎁
//头文件的包含
#include "game.h"
//开始界面
void menu()
{
printf("*************************\n");
printf("***** 1.play 0.exit ****\n");
printf("*************************\n");
}
//游戏逻辑
void game()
{
char board[ROW][COL] = { 0 };
//初始化棋盘
InitBoard(board,ROW, COL);
//打印棋盘
DisplayBoard(board,ROW,COL);
char ret = 0;
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");
}
if (ret == '#')
{
printf("什么?电脑赢了,你连人机都打不过\n");
}
if (ret == 'Q')
{
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 1:
//进入游戏
game();
break;
case 0:
printf("退出游戏!\n");
break;
default:
printf("选择错误!\n");
break;
}
} while (input);
return 0;
}
注:上面的函数都会在game.h中定义,接着往下走吧👇
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
//自定义行列
#define ROW 4//行
#define COL 4//列
//初始化棋盘
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);
本游戏以4行4列为例子。当你想改行和列之时,只需要通过改变#define后面的数字即可
注意:#define这里有一个小细节处:那就是定义的数字后面千万不能加分号(;)可千万不要因为敲代码敲多成习惯了❌
#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;
int j = 0;
for (i = 0; i < row; i++)
{
//打印数据
//printf(" %c | %c | %c \n"
for (j = 0; j < row; j++)
{
printf(" %c ", board[i][j]);
//打印出|
if(j<col-1)
printf("|");
}
printf("\n");
//打印分割信息
//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 >= 1 && y <= col)
{
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");
int x = 0;
int y = 0;
while (1)
{
x = rand() % row;
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;
int j = 0;
char ret = 0;
//行的判断
for (i = 0; i < row; ++i)
{
ret = 1;
for (j = 0; j < col - 1; ++j)
{
if (board[i][j] == board[i][j + 1] && board[i][j] != ' ')
;
else
{
ret = 0;
break;
}
}
if (ret)
return board[i][j];
}
//列的判断
for (j = 0; j < col; j++)
{
ret = 1;
for (i = 0; i < row - 1; i++)
{
if (board[i][j] == board[i + 1][j] && board[i][j] != ' ')
;
else
{
ret = 0;
break;
}
}
if (ret)
return board[i][j];
}
//左对角线的判断
ret = 1;
for (i = 0, j = 0; i < row - 1 && j < col - 1; i++, j++)
{
if (board[i][i] == board[i + 1][i + 1] && board[i][i] != ' ')
;
else
{
ret = 0;
break;
}
}
if (ret)
return board[i][i];
//右对角线的判断
ret = 1;
for (i = 0, j = col - 1; i < row - 1 && j > 0; i++, j--)
{
if (board[i][j] == board[i + 1][j - 1] && board[i][j] != ' ')
;
else
{
ret = 0;
break;
}
}
if (ret)
return board[i][j];
//判断是否平局
if (isFull(board, row, col))
return 'Q';
//继续
return 'C';
}
好啦,代码的实现就到这里结束了,下面我们来简单看看运行效果如何,走你🛫
输入1时我们进入了游戏界面,现在我们开始下棋:
这时候我们就可以与电脑斗争斗勇了(这里如果觉得电脑不够灵活的话可以自己设置一个算法,这里只是基于能够让电脑下起棋来,通俗易懂)
最后,不出意外我们赢了!😂
最后,这里还测试了一下10*10
逻辑上还是行得通的。🎯
好啦,本次关于N子棋游戏的实现就到这里结束了,如果觉得不错的话,记得点赞加收藏哦🌹