> 文档中心 > 基于c++EGE图形库编写的五子棋小游戏

基于c++EGE图形库编写的五子棋小游戏


基于c++EGE图形库编写的五子棋小游戏

EGE图形库

新手推荐使用

EGE(Easy Graphics Engine),是windows下的简易绘图库,是一个类似BGI(graphics.h)的面向C/C++语言新手的图形库,它的目标也是为了替代TC的BGI库而存在。

它的使用方法与TC中的graphics.h相当接近,对新手来说,简单,友好,容易上手,免费开源,而且接口意义直观,即使是完全没有接触过图形编程的,也能迅速学会基本的绘图。

目前,EGE图形库已经完美支持VC6, VC2008, VC2010, VC2012, VC2013, VC2015, VC2017, VC2019, C-Free, DevCpp, Code::Blocks, wxDev, Eclipse for C/C++等IDE,即支持使用MSVC和MinGW为编译环境的IDE。如果你需要在VC下使用graphics.h,那么ege将会是很好的替代品。

引用自EGE图形库官网

EGE官网:Easy Graphics Engine – EGE图形库主站 (xege.org)


结果展示

在这里插入图片描述

简易的五子棋


实现原理

步骤:

1.打印棋盘

2.打印棋子;

3.判断胜利方;

在一整张棋盘图纸上添加黑白子不好写,那我们可以换个思路。把棋盘分为n个格子,分别为:

1)空白格子

2)下了黑子的格子

3)下了白子的格子

那我们就需要三种图片拼接起来

在这里插入图片描述

编写过程

使用EGE图形库:

在这里插入图片描述

在这里插入图片描述

在EGE官网中下载小熊猫dev-c++,在菜单中依次点击文件→新建→新建项目→多媒体→Graphics.h

这就是EGE的图形库了

头文件加载:
#include//EGE图形库#include
所需的一些函数如下:
int chessBord[15][15];//棋盘int player=2;//当前玩家PIMAGE picture[3];//棋盘图片mouse_msg msg;//鼠标int loadPicture();//加载图片函数int printBord();//打印棋盘int judgeWiner(int x,int y);//判断输赢函数

为了将图片导入到程序中,需要预先加载

设置棋盘处括号内数字为棋盘大小,可自行设置,如我的样例为15*15

加载图片函数:
int loadPicture(){char path[100];//加载图片路径for(int i=0;i<3;i++){picture[i]=newimage();//向计算机申请一个图片空间sprintf(path,"image/%d.jpg",i);//拼接图片相对路径getimage(picture[i],path);//将系统中的图片数据存入picture}return 0;}

有了图片,我们就可以打印棋盘了。

打印棋盘函数:
int printBord(){for(int i=0;i<15;i++)for(int j=0;j<15;j++)putimage(i*25,j*25,picture[chessBord[i][j]]);return 0;}

先写主函数

我们已经有了加载图片函数和打印棋盘函数,接下来就可以设置棋盘的基础信息然后打印了

棋盘设置与打印:
initgraph(375,375);//设置幕布大小并显示setcaption("五子棋");//设置程序标题loadPicture();//调用加载图片函数 将素材存入picture图片数组中printfBord();//打印棋盘

要知道,下棋时就是鼠标点哪,棋子就下在哪,而且要双方黑白子轮流下

持续监测鼠标点击直到点击:
while(mousemsg()){msg=getmouse();}

检测到了鼠标点击,然后就把点击到的地方的图片换成对应的棋子

注意
是否能落子在鼠标点击处需满足一下两个条件:

1.鼠标点击的地方在棋盘范围内;

2.点击处没有已经下了的棋子;

所以需要写一个判断:
int x=msg.x/25,y=msg.y/25;if(chessBord[x][y]==0)//判断当前格子是否可以落子    { chessBord[x][y]=player;//改变当前棋盘格子状态player=player==1?2:1;//换手    }

下棋部分做好了,接下来就是要判断输赢了,判断输赢要在每次落子后。

if(judgeWiner(x,y)){printBord();if(player==1)outtextxy(150,150,"白方获胜");elseouttextxy(150,150,"黑方获胜");getch();return 0;}
为了不让胜利信息显示一下就直接消失,可以加一个getch()在后面,效果相当于点击任意键后退出
接下来时判断输赢函数:
int judgeWiner(int x,int y){int nx,ny;int lr=1,ud=1,ld=1,lu=1;nx=x,ny=y-1;//左右方向while(chessBord[nx][ny]==chessBord[x][y])lr++,ny--;nx=x,ny=y+1;while(chessBord[nx][ny]==chessBord[x][y])lr++,ny++;nx=x-1,ny=y;//上下方向while(chessBord[nx][ny]==chessBord[x][y])ud++,nx--;nx=x+1,ny=y; while(chessBord[nx][ny]==chessBord[x][y])ud++,nx++;nx=x-1,ny=y-1;//左上到右下while(chessBord[nx][ny]==chessBord[x][y])ld++,nx--,ny--;nx=x+1,ny=y+1; while(chessBord[nx][ny]==chessBord[x][y])ld++,nx++,ny++;nx=x+1,ny=y-1;//左下到右上while(chessBord[nx][ny]==chessBord[x][y])lu++,nx++,ny--;nx=x-1,ny=y+1;while(chessBord[nx][ny]==chessBord[x][y])lu++,nx--,ny++;if(lr>=5||ud>=5||ld>=5||lu>=5)return 1;elsereturn 0; }

其实并没有看起来那么复杂,这里类似于广度优先搜索。

到这里程序的大部分都完成了,剩下的就是组合起来,然后进行小小的优化。


完整代码:

#include#includeint chessBord[15][15];//棋盘int player=2;//当前玩家PIMAGE picture[3];//棋盘图片mouse_msg msg;//鼠标int loadPicture();//加载图片函数int printBord();//打印棋盘int judgeWiner(int x,int y);//判断输赢函数int main(){initgraph(375,375);//设置幕布大小并显示setcaption("五子棋");//设置程序标题loadPicture();//调用加载图片函数 将素材存入picture图片数组中for(;is_run();delay_fps(180)){while(mousemsg()){msg=getmouse();}if(msg.is_down()){int x=msg.x/25,y=msg.y/25;if(chessBord[x][y]==0)//判断当前格子是否可以落子{chessBord[x][y]=player;//改变当前棋盘格子状态if(judgeWiner(x,y)){printBord();if(player==1)outtextxy(150,150,"白方获胜");elseouttextxy(150,150,"黑方获胜");getch();return 0;}player=player==1?2:1;//换手}}printBord();//更新棋盘}return 0;}int loadPicture(){char path[100];//加载图片路径for(int i=0;i<3;i++){picture[i]=newimage();//向计算机申请一个图片空间sprintf(path,"image/%d.jpg",i);//拼接图片相对路径getimage(picture[i],path);//将系统中的图片数据存入picture}return 0;}int printBord(){for(int i=0;i<15;i++)for(int j=0;j=5||ud>=5||ld>=5||lu>=5)return 1;elsereturn 0; }

八十多行就解决了,并不难,有一定基础就能做


免费的图片及实例下载链接

免费的图片及实例下载链接:基于EGE的c++五子棋人对人小游戏-其他文档类资源-CSDN文库

感谢支持!

2022.4.30
14:11

组词