基于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<graphics.h>   //EGE图形库
#include<cstdio>
所需的一些函数如下:
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;
}
为了不让胜利信息显示一下就直接消失,可以加一个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;else   return 0;
}

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

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


完整代码:

#include<graphics.h>
#include<cstdio>
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文库

感谢支持!

2022.4.30
14:11

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

  1. 基于Linux ncurses图形库的贪吃蛇小游戏

    达者为先  师者之意 基于Linux ncurses图形库的贪吃蛇小游戏 前言 1 ncurses库程序的标准模式 2 ncurses库的常用函数 3 基于Linux ncurses图形库的贪吃蛇小游 ...

  2. Java编写的五子棋小游戏

    看书的时候看到一个不完整的Java编写的一个五子棋小游戏,为了恢复一下编程能力刚刚把这个小程序完成了. 实现的功能很简单,两人对下五子棋,程序自动回判断输赢.在ubuntu下搞得,没有装什么高端的输入 ...

  3. 基于深度学习的一款五子棋小游戏

    今天分享一个基于深度学习而开发的AI小游戏 简单介绍 这一款基于深度学习的五子棋小游戏的界面是使用Unity开发的,而网络结构是使用keras搭建的. 环境 笔者的环境如下 操作系统 windows ...

  4. 用C语言代码编写一个五子棋小游戏

    五子棋: 需要的数据: 1.定义一个1515的棋盘 2.定义变量用于记录棋子的坐标 3.定义角色变量 业务逻辑: 是否需要对数据进行初始化 for( ; ; ) { 1.刷新屏幕,显示棋盘 2.落子 ...

  5. python语言编写五子棋小游戏

    摘要 这是我基于pygame库做个一个五子棋小游戏,通过上网学习pygame库内的具体函数,以及一些前辈的指导.在这里我们需要绘画棋盘,棋子.棋盘直接调用pygame库中的draw.lines()函数 ...

  6. 基于 Blazor 开发五子棋小游戏

    今天是农历五月初五,端午节.在此,祝大家端午安康! 端午节是中华民族古老的传统节日之一.端午也称端五,端阳.此外,端午节还有许多别称,如:午日节.重五节.五月节.浴兰节.女儿节.天中节.地腊.诗人节. ...

  7. c语言五子棋学年论文,基于c语言五子棋小游戏生本科论文.doc

    基于c语言五子棋小游戏生本科论文 五子棋小游戏 需求分析 现在有越来越多的人使用电脑,而且五子棋的受众广泛但实体棋操作较为繁琐且平时较难实现,所以电脑版的五子棋游戏应运而生.大家对于这个小游戏的需求如 ...

  8. 基于控制台的五子棋小游戏(简易)

    基于控制台的五子棋小游戏(简易) 展示 源码: 使用: GoBang类: 展示 话不多说上代码 Don't talk much, say the code! 源码: 使用: new完直接运行 publ ...

  9. 基于flask的五子棋小游戏

    基于flask的五子棋小游戏 前言 ​ 首先说明一下,本人方向是java后端,只因老师布置了一个作业,要用flask来做一个五子棋,没办法被逼上梁山,程序不太美观,但是应付作业还是够了的. ​ 废话不 ...

最新文章

  1. Redis初学:8(Hash类型)
  2. C语言 递归实现分解质因数
  3. java生成带文字的图片_Java在背景图片上面加文字或者文字自动生成图片
  4. 人生第一个过万 Star 的 GitHub 项目诞生
  5. 离线语音识别_离线语音识别库_离线语音识别sdk - 云+社区 - 腾讯云
  6. 组建Forefront TMG独立陈列(上)-案例介绍与服务器准备
  7. Arduino提高篇01—点亮OLED显示屏
  8. 看点视频解析去水印原理分析过程及源码,rowkey的秘密
  9. CP2102 USB转串口驱动下载
  10. SPSS如何计算Cronbach alpha和进行折半信度检验
  11. 注塑模具的温度对注塑工艺的影响到底有多大呢
  12. php get month,JavaScript从Date对象返回月份 (0 ~ 11)的方法getMonth()
  13. Qt报错Parse error at “IID“的解决办法
  14. JavaWeb个人信息修改及修改密码
  15. Oracle数据库(三)可插拔数据库使用
  16. 维度诅咒_让我们面对现实:“敏捷”是一个被诅咒的名字
  17. unable to access ‘https://code.srdcloud.cn/a/ifst/ifst-fe/‘: Failed to connect to code.srdcloud.c
  18. 戰女神V、ef_latter、BaldrSky 注册表补丁
  19. android 程序a启动程序b的权限,android app微信分享
  20. Win10 蓝屏 SFC /SCANNOW发现损坏文件

热门文章

  1. 图片局部放大镜,可在大图上下左右移动并放大对应的区域
  2. l连接mysql数据库时报错(1045, Access denied for user 'root'@'127.0.0.1 (using password: YES))
  3. Deep Knowledge Tracing (深度知识追踪)
  4. C++运算符重载2--左移运算符
  5. C++ Primer 第四章
  6. [zz]Memory Barriers(内存屏障): a Hardware View for Software Hackers 阅读笔记
  7. 卸载oracle9i精简版,Oracle精简版客户端
  8. 大数据调度平台之Rundeck生产实践
  9. 半导体存储器 —— 译码驱动方式
  10. 项目管理和“登门槛效应”