新手推荐使用
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.判断胜利方;
1)空白格子
2)下了黑子的格子
3)下了白子的格子
这就是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,"白方获胜");
else outtextxy(150,150,"黑方获胜");
getch();
return 0;
}
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;
else return 0;
}
其实并没有看起来那么复杂,这里类似于广度优先搜索。
到这里程序的大部分都完成了,剩下的就是组合起来,然后进行小小的优化。
#include
#include
int 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,"白方获胜");
else outtextxy(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<15;j++)
putimage(i*25,j*25,picture[chessBord[i][j]]);
return 0;
}
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;
else return 0;
}
八十多行就解决了,并不难,有一定基础就能做
免费的图片及实例下载链接:基于EGE的c++五子棋人对人小游戏-其他文档类资源-CSDN文库