本文主要详细介绍了用C语言实现简单的五子棋游戏。本文中的示例代码非常详细,具有一定的参考价值。感兴趣的朋友可以参考一下。
本文分享简单五子棋游戏的C语言具体代码,供大家参考。具体内容如下
效果图如下:
设计思路:
棋盘设计为1515的正方形,初始光标在棋盘的中心。白棋先行,依次走棋。当一方连五或满棋盘时,游戏结束(连五者胜,满棋盘为平局)。当游戏一方获胜时,显示胜利信息,用汉字点阵输出提示信息。
程序是二维平面,可以用二维数组来实现。数组的两个下标可以表示棋盘上的位置,数组元素的值表示棋盘上的状态。有三种情况,即0代表空格,1代表白棋,2代表黑棋。程序的主要工作是接收玩家的按键操作。玩家1通过设置四个键来控制光标移动,回车键表示移动。棋手2用其他四个键控制光标移动,空格键表示移动。当你收到回车键或空格键,这意味着棋手移动。先判断是否是有效位置,即棋子的位置不能互相重叠。棋子一旦掉落成功,立即判断以该位置为中心的八个方向:上、下、左、右、左上、左下、右上、右下是否有相同颜色的棋子,并连接成五个棋子。如果它们连接成五个棋子,游戏就结束了。
# includestdio.h
#includestdlib.h
#includewindows.h
#pragma注释(lib,' WINMM。LIB’)
#包含mmsystem.h
#includeconio.h
#includetime.h
#定义宽度32 //棋盘的总宽度
#定义高31 //棋盘的总高度
#定义MAX_X 15 //棋盘上水平方格的数量
#定义MAX_Y 15 //棋盘上垂直方格的个数
#define WIDTH (16 width) //游戏总高度
#define HIGH (high 4) //游戏总高度
#定义玩家1 1 //白子玩家
#定义播放器2 2 //黑子播放器
#define emptyPlayer 0//没有子级
#定义Unplayer -2 //中途退出游戏,没有玩家获胜。
typedef结构堆栈{
//记录下每次移动的坐标。
int X[MAX _ X * MAX _ Y];
int Y[MAX _ X * MAX _ Y];
//相当于栈顶指针
int top
}栈;
int pos[MAX _ X][MAX _ Y];//存储棋盘上每个位置的状态,比如白子是1,黑子是2,无子女是0。
int px,py;//光标位置
int player=1;//从白边记录当前玩家的默认玩家。
int flag 1=0;//标记游戏的开始
int game over _ player=-1;//判断结束的标志
int pre_px=-1,pre _ py=-1;//记录最后一个坐标位置
void gotoxy(int x,int y);//设置CMD窗口的光标位置
void hide_cursor()。//隐藏CMD窗口光标
void map();//打印地图
void game_Description()。//打印动态游戏描述
void initMapState();//初始化游戏位置数据
void mapState(int qizi);//数组记录对应位置的状态。
int is goplay();//确定自己是否可以继续前进。
int hasGoPlay(int播放器);//以棋盘掉落的地方为中心,判断棋盘掉落后的棋盘是否与五个棋盘相连。
void goPlay(int Player,Stack * p);//玩家1 2 0
void yidongwuan();//移动盒子
void player 1 _ move();//玩家1_ Move
void player 2 _ move();//玩家2_ Move
int game over();//判断游戏是否结束
stack * create stack();//创建一个空堆栈
void push(Stack* p,int x,int y);//堆栈
void color(const无符号短text color);//自定义字母根据参数改变颜色。
//void setColor(无符号short back color);//设置游戏背景颜色
Voigotoxy (int x,int y)//设置CMD窗口的光标位置
{
COORD coord
坐标。X=x
坐标。Y=y
SetConsoleCursorPosition(GetStdHandle(STD _ OUTPUT _ HANDLE),coord);
}
voi Hide _ cursor()//隐藏CMD窗口光标
{
控制台_光标_信息CCI;
cci.bVisible=FALSE
CCI . dw size=sizeof(CCI);
HANDLE HANDLE=GetStdHandle(STD _ OUTPUT _ HANDLE);
SetConsoleCursorInfo(handle,CCI);
}
void color(const unsigned short text color)//自定义函数根据参数改变颜色。
{
If(textColor0 textColor=15) //颜色,参数范围为0-15
SetConsoleTextAttribute(GetStdHandle(STD _ OUTPUT _ HANDLE),文本颜色);//用一个参数,改变字体颜色
else //默认的字体颜色是白色
SetConsoleTextAttribute(GetStdHandle(STD _ OUTPUT _ HANDLE),7);
}
//打印地图
空贴图()
{
int x,y;
颜色(02);
/*开始打印棋盘格子*/
//打印横向图格
for(y=2;y高-1;y=2){
for(x=1;x宽度-2;x=2){
gotoxy(x,y);
printf('-');
}
}
//打印竖向图格
for(y=1;y高;y=2) {
for(x=2;x宽度-2;x=2){
gotoxy(x,y);
printf(' | ');
}
}
/*打印棋盘格子结束*/
/*开始打印图框*/
//打印棋盘图框
for(y=0;y高;y)
{
for(x=0;x宽度;x=2)
{
if (x==0 || x==width - 2){
gotoxy(x,y);
printf(' | ');
}
if(y==0 || y==高- 1 ){
gotoxy(x,y);
printf('-');
}
}
}
//打印右图框
for(y=0;y高;y ){
对于(x=)宽度;x宽度;x=2){
if (x==WIDTH - 2){
gotoxy(x,y);
printf(' | ');
}
if(y==0 || y==高- 1 ){
gotoxy(x,y);
printf('-');
}
}
}
//打印下图框你-高~高-1 x-0 ~宽-2
for(y=高;y高;y ){
for(x=0;x宽度;x=2){
if (x==0 || x==WIDTH - 2){
gotoxy(x,y);
printf(' | ');
}
if(y==高|| y==高- 1 ){
gotoxy(x,y);
printf('-');
}
}
}
//打印下图框内容
gotoxy( 1,高1);
printf('欢迎来到五子棋游戏!');
//打印右图框内容
gotoxy(宽度-1,1);
printf('游戏说明:');
gotoxy(宽度-1,3);
printf('1)X表示玩家一棋');
gotoxy(宽度-1,4);
printf('子,而O表示玩家');
gotoxy(宽度-1,5);
printf('二棋子');
gotoxy(宽度-1,7);
printf('2)X先、O后,交替');
gotoxy(宽度-1,8);
printf('下子,每次只能下');
gotoxy(宽度-1,9);
printf('一子');
gotoxy(宽度-1,11);
printf('3)棋子下在棋盘');
gotoxy(宽度-1,12);
printf('的格子内,棋子下');
gotoxy(宽度-1,13);
printf('定后,不得向其它');
gotoxy(宽度-1,14);
printf('点移动');
gotoxy(宽度-1,16);
printf('4)最先连成五子');
gotoxy(宽度-1,17);
printf('的一方即为获胜');
gotoxy(宽度-1,19);
printf('玩家一移动键:');
gotoxy(宽度-1,20);
printf('w上s下a左d右');
gotoxy(宽度-1,21);
printf('下子:空格键');
gotoxy(宽度-1,23);
printf('玩家二移动键:');
gotoxy(宽度-1,24);
printf('i上k下j左l右');
gotoxy(宽度-1,25);
printf('下子:回车键');
gotoxy(宽度1,27);
颜色(4);
printf('退出键:Y’);
gotoxy(宽度1,29);
颜色(6);
printf('悔棋键:G’);
/*打印图框结束*/
颜色(02);
/*打印棋盘上的四个标记点*/
gotoxy( 3*2 2,3 * 2 2);
printf(' * ');
gotoxy( (MAX_X-4)*2,3 * 2 ^ 2);
printf(' * ');
gotoxy(3 * 2 ^ 2,(max _ y-4)* 2);
printf(' * ');
gotoxy( (MAX_X-4)*2,(MAX _ Y-4)* 2);
printf(' * ');
/*打印结束*/
/*开始修边*/
/*gotoxy(宽度- 1,0);
printf(" ");
gotoxy(宽度- 1,高度-1);
printf(" ");*/
/*修边结束*/
/*打印地图完成*/
}
//打印动态游戏说明
无效游戏_描述()
{
//打印下图框内容
gotoxy( 1,高1);
printf(" ");
if(player==player1){
gotoxy( 1,高1);
颜色(2);
printf('玩家一下棋中.');
}else if(player==player2){
gotoxy( 1,高1);
颜色(2);
printf('玩家二下棋中.');
}
}
//初始化游戏位置数据
void initMapState()
{
for(int I=0;I MAX _ Y;i ){
for(int j=0;j MAX _ X;j ){
pos[I][j]=0;//初始状态全为空
}
}
//注意光标的位置和存储在数组中的位置是不同的
px=7;
py=7;
gotoxy(py*2 1,px * 2 1);//初始位置
}
//数组记录下对应位置的状态
void mapState(int qizi)
{//2 * px 1=x//2 * py 1=y//px-0 ~ 14//py-0 ~ 14
if(px=MAX _ X | | px 0 | | py=MAX _ Y | | py 0)
返回;//其他情况下不能记录状态。
pos[px][py]=qizi;
}
//确定自己是否可以继续前进。
int isGoPlay()
{
if(px=MAX _ X | | px 0 | | py=MAX _ Y | | py 0)
返回0;//其他情况下不能记录状态。
if(pos[px][py]==emptyplayer){//表示没有子代。
返回1;
}else{//表示有孩子。
返回0;
}
}
//以棋盘掉落的地方为中心,判断棋盘掉落后的棋盘是否与五个棋盘相连。
int hasGoPlay(int播放器)
{//它分为两部分。首先,在一部分中记录同一玩家的号码。
//记录其他部分的数量,并将它们相加,得到相连部分的总数。
int port1=0,port 2=0;
int x,y,count
//上下看
x=px,y=py-1;
while(pos[x][y]==Player y=0){
端口1;//上部零件的数量
-y;//上移
}
y=py 1;
while(pos[x][Y]==Player Y MAX _ Y){
端口2;//下部的数量
y;//向下移动
}
//计算总数
count=port1 port2 1
if(count=5)返回1;
//环顾四周
端口1=0,端口2=0;
x=px-1,y=py
while(pos[x][y]==Player x=0){
端口1;//上部零件的数量
-x;//向左移动
}
x=px 1;
while(pos[X][y]==Player X MAX _ X){
端口2;//下部的数量
x;//向右移动
}
//计算总数
count=port1 port2 1
if(count=5)返回1;
//左上角,右下角搜索
端口1=0,端口2=0;
x=px-1,y=py-1;
while(pos[x][y]==Player x=0y=0){
端口1;//上部零件的数量
-x;//向左移动
-y;//上移
}
x=px 1,y=py 1;
while(pos[X][Y]==Player X MAX _ X Y MAX _ Y){
端口2;//下部的数量
x;//向右移动
y;//向下移动
}
//计算总数
count=port1 port2 1
if(count=5)返回1;
//右上,左下搜索
端口1=0,端口2=0;
x=px 1,y=py-1;
while(pos[X][y]==Player X MAX _ X y=0){
端口1;//上部零件的数量
x;//向左移动
-y;//上移
}
x=px-1,y=py 1;
while(pos[x][Y]==Player x=0y MAX _ Y){
端口2;//下部的数量
-x;//向右移动
y;//向下移动
}
//计算总数
count=port1 port2 1
if(count=5)返回1;
返回0;
}
//玩家1 2 0
void goPlay(int Player,Stack* p)
{
If(isGoPlay()){//表示可以继续前进。
mapState(播放器);//记录数组中相应位置的情况
If(hasGoPlay(Player)){//如果五子相连,gameover
gameOver_player=玩家;//记录此时获胜的玩家,结束游戏。
}
/*堆栈*/
push(p,px,py);
/*角色切换*/
if(Player==player1){
player=player2//切换到玩家1
gotoxy(px*2 1,py * 2 1);//将光标移动到相应的位置
颜色(07);
printf(' X ');//打印播放器1
游戏_描述();//动态描述
}else if(Player==player2){
player=player1//切换到另一个播放器2
gotoxy( px*2 1,py * 2 1);//将光标移动到相应的位置
颜色(07);
printf(' O ');//打印播放器2
游戏_描述();//动态描述
}
}
}
//堆栈
void push(Stack* p,int x,int y)
{
//堆叠此刻的坐标
int top=p-top;
p-top;//移动堆栈指针
p-x[top]=x;
p-y[top]=y;
返回;
}
//退出堆栈
无效弹出(堆栈* p)
{
int x,y;
//弹出堆栈,移动顶部指针。
//如果堆栈为空,则不会弹出
if(p-top=0)返回;
-p-top;
int top=p-top;
//记录弹出位置。
x=p-x[top];
y=p-y[top];
//在弹出位置打印空格
gotoxy(x * 2 ^ 1,y * 2 ^ 1);
printf(“”);
//删除记录
pos[x][y]=0;
}
//移动盒子
void移动框()
{
//打印移动框
gotoxy(px*2,py * 2 1);
颜色(11);
printf('[');
gotoxy(px*2 2,py * 2 1);
printf(']');
//打印移动框结束
如果(pre_px!=-1 pre_py!=-1){
If(pre_px px pre_py==py){//向左移动时
//保持最后一个位置的右侧不变
gotoxy(pre_px*2 2,pre _ py * 2 1);
颜色(2);
printf(' | ');
}else if(pre_px px pre_py==py){//当向右移动时
//将上一个位置的左边保持原样
gotoxy(pre_px*2,pre _ py * 2 1);
颜色(2);
printf(' | ');
}else{//当向上下移动时
//将上一个位置的左右边保持原样
gotoxy(pre_px*2 2,pre _ py * 2 1);
颜色(2);
printf(' | ');
gotoxy(pre_px*2,pre _ py * 2 1);
颜色(2);
printf(' | ');
}
}
前px=px
pre _ py=py
}
//玩家一移动
void player1_move(Stack* p)
{
茶键;
if (_kbhit())//检测是否按键
{
fflush(stdin);
key=_ getch();//保存按键
游戏_描述();//动态说明
}
开关(钥匙)
{
格“w”:py-;一东匡();打破;//上
案例“a”:px-;一东匡();打破;//左
案例“d”:px;一东匡();打破;//右
大小写:py;一东匡();打破;//下
案例“”:goPlay(玩家1,p);打破;//落子
情况‘y’:game over _ player=-2;游戏结束();//退出游戏
情况‘Y’:game over _ player=-2;游戏结束();//退出游戏
格' g ':pop(p);pop(p);打破;//悔棋
格' g ':pop(p);pop(p);打破;//悔棋
默认:断开
}
//限制光标范围
if(py 0)py=MAX _ Y-1;
else if(py=MAX _ Y)py=0;
else if(px 0)px=MAX _ X-1;
else if(px=MAX _ X)px=0;
gotoxy(2*py 1,2 * py 1,2
}
//玩家2移动
void player2_move(Stack* p)
{
茶键;
if (_kbhit())//检测是否按键
{
fflush(stdin);
key=_ getch();//保存按键
游戏_描述();//动态说明
}
开关(钥匙)
{
格' I ':py-;一东匡();打破;//上
案例“j”:px-;一东匡();打破;//左
案例“l”:px;一东匡();打破;//右
格' k ':py;一东匡();打破;//下
case '\r': goPlay(player2,p);打破;//落子
情况‘y’:game over _ player=-2;游戏结束();//退出游戏
情况‘Y’:game over _ player=-2;游戏结束();//退出游戏
格' g ':pop(p);pop(p);打破;//悔棋
格' g ':pop(p);pop(p);打破;//悔棋
默认:断开
}
//限制光标范围
if(py 0)py=MAX _ Y-1;
else if(py=MAX _ Y)py=0;
else if(px 0)px=MAX _ X-1;
else if(px=MAX _ X)px=0;
gotoxy(2*px 1,2 * px 1,2
}
//创建空栈
Stack* createStack(){
//申请空间
Stack * p=(Stack *)malloc(sizeof(Stack));
//如果未申请到空间
if(p==NULL)返回NULL
p-top=0;//初始化栈顶
返回p;
}
//判断游戏是否结束
int gameOver()
{ //gamerOver_player -1表示继续游戏一表示白方胜利2表示黑方胜利0 表示平局
//五子相连一方取胜你-高~高-1 x-0 ~宽-2
if(gameOver_player==-1){
返回1;
} else if(game over _ player==player 1){//白方胜利
gotoxy( 1,高1);
printf('玩家一胜利!');
返回0;
} else if(game over _ player==player 2){//黑方胜利
gotoxy( 1,高1);
printf('玩家2胜利!');
返回0;
} else if(game over _ player==emptyPlayer){//棋盘满棋平局
gotoxy( 1,高1);
printf('平局!');
返回0;
} else if(game over _ player==Unplayer){//中途退出
gotoxy( 1,高1);
printf('正在退出游戏中.');
出口(1);
}
返回1;
}
int main(){
//调整游戏框
系统('模式控制列=48行=35 ');
//打印地图
map();
//初始化游戏位置数据
initMapState();
//创建空栈
stack * p=create stack()。
//隐藏光标
hide_cursor()。
//游戏循环控制移动
while(gameOver()){
//不断调换人物
if(player==player1)
玩家1 _移动(p);//切换玩家一
else if(player==player2)
玩家2 _移动(p);//切换玩家2
}
免费(p);
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。