简明目录

  • 写在前面
  • easyx库
  • 准备工作
    • 新建项目文件
    • 分析
    • 素材分析
  • 上代码吧
    • 地图表示
    • 开始界面
    • 地图初始化(打乱)
    • 游戏过程实现
    • 主函数的实现
    • 测试
    • 优化
      • 1、游戏分数
      • 2、游戏时间
      • 3、number_write函数没有给出
      • 4、游戏结束函数
      • 5、游戏下一关的设定
      • 6、游戏重新进入
      • 7、分数显示
      • 8、返回优化
  • 效果展示
  • 待优化部分
  • 源码和素材

写在前面

所用素材若有侵权,联系我删除。
素材和源码在文末
另外,其实这是从我的一个大一点的项目中摘取出来的,尽管有所修改,但是难免有些问题,而且代码非常繁琐,没有简化,注释也写的不够全面……

easyx库

点击这里下载如下图,点击右上角黄色区域下载。

安装:如下图,安装对应版本即可

准备工作

新建项目文件

新建文件的时候要注意,文件后缀使用.cpp而不是.c,因为easyx库的一些东西使用了C++,所以这样最为保险。

分析

我们先进行一定的分析,理一下思路。

void main()
{
//主函数
}
void set_map()
{
//地图的初始化
}
int play()
{
//游戏过程
}
int begin_menu()
{
//开始界面
}
int game_over()
{
//结束界面
}

素材分析

事实上,这个游戏的实现就是通过调用不同的图片来实现的。我收集了一些图片:

上代码吧

地图表示

#include <graphics.h>//引用easyx库
#define UP 1
#define DOWN 2
#define LEFT 3
#define RIGHT 4
int map[6][6] = {{1,1,1,1,2,2},{2,2,5,5,2,2},{3,3,3,3,4,4},{5,5,6,6,6,6},{7,7,1,1,7,7},{8,8,4,4,8,8} };

我们用数组来表示地图内容,数字分别代表图片。

开始界面

int begin_menu()
{initgraph(1152, 648);//界面绘制IMAGE menu;//开始菜单图片loadimage(&menu, _T("begin_menu0.jpg"), 1152, 648);IMAGE shuoming;//游戏说明loadimage(&shuoming, _T("begin_menu01.jpg"), 1152, 648);putimage(0, 0, &menu);MOUSEMSG mouse;MOUSEMSG mouse2;int x2, y2;int x, y;while (1){mouse = GetMouseMsg();if (mouse.uMsg == WM_LBUTTONDOWN)//左键按下{x = mouse.x;y = mouse.y;//鼠标坐标if (x <= 635 && x >= 461 && y >= 185 && y <= 238)//开始游戏{break;}else if (x <= 635 && x >= 461 && y >= 281 && y <= 330)//说明{cleardevice;putimage(0, 0, &shuoming);while (1){mouse2 = GetMouseMsg();if (mouse2.uMsg == WM_LBUTTONDOWN){mouse2 = GetMouseMsg();x2 = mouse2.x;y2 = mouse2.y;if (x2 <= 228 && x2 >= 52 && y2 >= 15 && y2 <= 65)//返回{putimage(0, 0, &menu);break;}}Sleep(10);}continue;}}Sleep(10);}return 0;closegraph();
}

地图初始化(打乱)

void set_maps()
{initgraph(800, 600);setlinecolor(WHITE);setfillcolor(BLACK);fillrectangle(602, 1, 799, 599);srand((unsigned int)time(NULL));//随机数种子for (int a = 0; a < 5; a++)//反复打乱{for (int x = 0; x < 6; x++){for (int y = 0; y < 6; y++){int suijishu = rand() % 100;//产生随机数if (x == 0 && y == 0){if (suijishu > 50){chang_one(x, y, RIGHT)//和右边数字交换}else{chang_one(x, y, DOWN);}}//………………此处省略很多行}}}
}

因为涉及到边角等块的情况不同,所以我分类很多,而且用了随机数来增加随机性,所以分类就更多了。这里为了数字交换方便起见,我定义了一个change_one函数,用于交换两个数字。

void chang_one(int x, int y, int direction)
{int t;if (direction == RIGHT){t = map[x][y];map[x][y] = map[x][y + 1];map[x][y + 1] = t;}else if (direction == DOWN){t = map[x][y];map[x][y] = map[x + 1][y];map[x + 1][y] = t;}else if (direction == LEFT){t = map[x][y];map[x][y] = map[x][y - 1];map[x][y - 1] = t;}else if (direction == UP){t = map[x][y];map[x][y] = map[x - 1][y];map[x - 1][y] = t;}
}

游戏过程实现

int plays()
{IMAGE imgs[10];//不同的图片loadimage(&imgs[0], _T("0.jpg"), 100, 100);loadimage(&imgs[1], _T("1.jpg"), 100, 100);loadimage(&imgs[2], _T("2.jpg"), 100, 100);loadimage(&imgs[3], _T("3.jpg"), 100, 100);loadimage(&imgs[4], _T("4.jpg"), 100, 100);loadimage(&imgs[5], _T("5.jpg"), 100, 100);loadimage(&imgs[6], _T("6.jpg"), 100, 100);loadimage(&imgs[7], _T("7.jpg"), 100, 100);loadimage(&imgs[8], _T("8.jpg"), 100, 100);loadimage(&imgs[9], _T("yuanshi.jpg"), 100, 100);//背景图for (int x = 0; x < 6; x++){for (int y = 0; y < 6; y++){putimage(100 * y, 100 * x, &imgs[0]);//先放满背景图Sleep(25);}}MOUSEMSG mouse;int x, y;//鼠标数组下标int times = 0;int t, x0 = -1, y0 = -1;number_write(30, 650, 350, 0, WHITE);///自己定义的函数。用于书写数字while (1){mouse = GetMouseMsg();if (mouse.uMsg == WM_LBUTTONDOWN){x = mouse.y / 100;y = mouse.x / 100;if (map[x][y] != 0 && mouse.x < 600)//防止点击到右边界面{if (((x0 != x) | (y0 != y)))//保证两次点击的不是同一张图片{times++;putimage(100 * y, 100 * x, &imgs[map[x][y]]);}if (times % 2 == 0){if (map[x][y] != t){Sleep(100);putimage(100 * y0, 100 * x0, &imgs[0]);putimage(100 * y, 100 * x, &imgs[0]);t = -1;x0 = -1;y0 = -1;}else if (map[x][y] == t && ((x0 != x) | (y0 != y))){Sleep(100);putimage(100 * y0, 100 * x0, &imgs[9]);putimage(100 * y, 100 * x, &imgs[9]);map[x][y] = 0;map[x0][y0] = 0;jishuqi += 2;}}else if (times % 2 == 1 && ((x0 != x) | (y0 != y))){t = map[x][y];//记录上一次点击的数字x0 = x;y0 = y;}}}Sleep(2);if (jishuqi == 36)//成功检测return SUCCESS;}
}

主函数的实现

void main()
{begin:begin_menu();set_maps();int result = plays();int choice = game_over(result);if (choice == 1){closegraph();initgraph(1152, 648);goto begin;}system("pause");
}

测试


主界面大概就是这样,下面看看游戏界面,勉强凑活吧(太丑了)………………

优化

其实,上面的过程中有很多的问题没有解决,下面优化一部分:

1、游戏分数

游戏的计分方式没有设定,我就暂时先设定一下,
我的规则是下面这样:
补充一点,游戏最低分为0分。

2、游戏时间

我认为游戏应该是随时显示时间,并且不能无限玩下去吧??我就暂时先设置成60s吧……

3、number_write函数没有给出

void number_write(int number_size, int x, int y, int number, COLORREF color)
{TCHAR s[30];_stprintf_s(s, _T("%d"), number);//需要先把数字进行转换settextstyle(number_size, 0, _T("黑体"));settextcolor(color);outtextxy(x, y, s);
}

4、游戏结束函数

int game_over(int result)//1返回,0下一关
{IMAGE over[2];loadimage(&over[0], _T("success.jpg"), 500, 350);loadimage(&over[1], _T("failed.jpg"), 500, 350);if (result == 1)//游戏成功{putimage(50, 125, &over[0]);MOUSEMSG mouse;int x, y;while (1){mouse = GetMouseMsg();if (mouse.uMsg == WM_LBUTTONDOWN){x = mouse.x;y = mouse.y;if (x >= 200 && x <= 304 && y >= 248 && y <= 286)//返回{return 1;}else if (x >= 383 && x <= 486 && y >= 248 && y <= 286)//下一关{return 0;}}Sleep(10);}}else//失败{putimage(50, 125, &over[1]);MOUSEMSG mouse1;int x1, y1;while (1){mouse1 = GetMouseMsg();if (mouse1.uMsg == WM_LBUTTONDOWN){x1 = mouse1.x;y1 = mouse1.y;if (x1 >= 204 && x1 <= 412 && y1 >= 340 && y1 <= 405)//返回{return 1;}}Sleep(10);}}
}

5、游戏下一关的设定

这一块由于时间仓促,暂时还没有给出………………

6、游戏重新进入

这里有一个问题,如果退出以后,其实数组的值就已经改变了,,再次开始以后,不能初始化了??
这里,我们做一个修改

int map1[6][6] = { {1,1,1,1,2,2},{2,2,5,5,2,2},{3,3,3,3,4,4},{5,5,6,6,6,6},{7,7,1,1,7,7},{8,8,4,4,8,8} };
//定义一个数组来记录原来数组的值void main()
{……if (choice == 1){closegraph();initgraph(1152, 648);for (int x = 0; x < 6; x++){for (int y = 0; y < 6; y++){map[x][y] = map1[x][y];//数组值初始化}}goto begin;}system("pause");
}

7、分数显示

其实这里有一个问题。文伟我的分数模式会导致分数上升以后还有下降可能,所以会有问题。
比如,我的分数是10分,但是后来又变成了9分,由于分数书写时覆盖原来数字的,所以,9(一位数)不能完全覆盖10(两位数),所以,就会呈现出90分的样子……
所以,我的解决方法是用黑图片覆盖原来分数……

8、返回优化

如果游戏中想要返回呢?我就增加一个返回按钮吧。

******************初始化函数的一点修改
IMAGE back;
loadimage(&back, _T("back.jpg"), 160, 50);
putimage(620, 500, &back);
……………………^…………^……
……………………………………主函数一点修改
if (mouse.x >= 620 && mouse.x <= 780 && mouse.y >= 500 && mouse.y <= 550){return FAIL;}else if (map[x][y] != 0 && mouse.x < 600)…………………………………………

效果展示

游戏效果展示

待优化部分

1、下一关的问题,大家自行解决吧,也不难……
2、背景音乐的问题,虽然这个不难,但是没找到合适的素材,大家自己解决吧。
3、重点问题,
时间的问题,因为循环中,如果你的鼠标没有动作,那么程序就停在那里了????这咋办??

源码和素材

我放在微信公众号后台了。

点击获取…………

用C语言easyx库来写一个简单的翻翻乐小游戏(附源码素材)相关推荐

  1. 【Python游戏】用Python 和 Pyglet 编写一个我的世界小游戏 | 附源码

    相关文件 想学Python的小伙伴可以关注小编的公众号[Python日志] 有很多的资源可以白嫖的哈,不定时会更新一下Python的小知识的哈!! 需要源码的小伙伴可以在公众号回复我的世界 Pytho ...

  2. 基于C语言Ncurse库和链表的简单贪吃蛇小游戏

    参考:基于C语言Ncurse库和链表的简单贪吃蛇小游戏 作者:三速何时sub20 发布时间:2020-09-29 10:23:51 网址:https://blog.csdn.net/weixin_44 ...

  3. java计算机毕业设计vue开发一个简单音乐播放器(附源码、数据库)

    java计算机毕业设计vue开发一个简单音乐播放器(附源码.数据库) 项目运行 环境配置: Jdk1.8 + Tomcat8.5 + Mysql + HBuilderX(Webstorm也行)+ Ec ...

  4. 如何用CSS写一个缺角的div(附源码)

    今天用CSS写一个缺角的div,大致的效果是这样的,div的左上角和右上角缺掉了一块的效果,简称为缺角div <!DOCTYPE html> <html lang="en& ...

  5. 如何写一个拖拽日历组件(附源码)

    作者简介 Kid 蚂蚁金服·数据体验技术团队 本文会介绍如何写一个可拖拽日历组件,偏重点在于日历组件的功能挖掘以及对于开发过程的一些思考,编码部分会介绍核心部分的实现.代码在最后也会放出来给大家. 效 ...

  6. 【Python游戏】基于pygame实现的一个Dino Rush 恐龙宝贝冲冲冲的小游戏 | 附源码

    前言 halo,包子们晚上好 很久没有更新啦,主要是小编这边最近有点小忙 今天给大家整一个Dino Rush 恐龙宝贝冲冲冲的小游戏 还是一个比较记经典的小游戏,还记这可谷歌浏览器上没有网也能打发时间 ...

  7. Android UI开发: 横向ListView(HorizontalListView)及一个简单相册的完整实现 (附源码下载)

    本文内容: 1.横向ListView的所有实现思路; 2.其中一个最通用的思路HorizontalListView,并基于横向ListView开发一个简单的相册: 3.实现的横向ListView在点击 ...

  8. 【Python游戏】基于化学方程式的基础上,用Python实现一个消灭泡泡小游戏 | 附源码

    前言 halo,包子们下午好 今天实现的这个小游戏呀,说实话化学不太好的小伙伴可能看起来会有点懵逼 不过不用担心,咱们今天不是来学化学的,我们是来学习Python的 所以呀,不要太担心啦,大家先好好看 ...

  9. 一口气用Python写了13个小游戏 (附源码)

    大家好,今天给大家分享13个游戏源码,可以自己复现玩玩,研究下里面的编程逻辑,对学习编程(特别是初学者)应该会有很大帮助. 由于文章较长,大家记得滑到文末点个赞哈- 1.吃金币 源码分享: impor ...

最新文章

  1. python二叉树深度 判断平衡树
  2. ML 徒手系列 最大似然估计
  3. PKUWC2019游记
  4. android gridview item添加checkbox,手把手教你实现GridView中Checkbox全选
  5. 异常检测-LocalOutlierFactor的理解与应用
  6. Keras:基于Theano和TensorFlow的深度学习库
  7. PHP访问MySQL数据库
  8. 【转】最为详尽的WPF类继承关系*!
  9. (转)淘淘商城系列——MyBatis分页插件(PageHelper)的使用以及商品列表展示
  10. 单片机上电总是立即执行按键程序
  11. linux查看串口端口,规范模式Linux串行端口
  12. ns2 java_【NS2】用eclipse调试NS2(转载)
  13. CISSP考试过程,备考过程巨详细!
  14. Firebug下载地址及安装方法
  15. 计算机高级应用都有啥,计算机二级MS OFFICE高级应用都有什么题型?
  16. JAVA案例之使用接口实现手机功能
  17. 《从零开始的 RPG 游戏制作教程》第十二期:刷怪与防守(上)
  18. 【懒懒的Python学习笔记一】
  19. c++某商店开展买一送一活动,购买两件商品时,只需支付价格较高的商品的金额。要求程序在输入两个商品的价格后,输出所应支付的金额,请根据裁判程序编写函数cut,将代码补充完整。
  20. 把时间沉淀到自己的热爱里 | Kagol 的 2022 年终总结

热门文章

  1. Reparameterization 重参数/Gumbel-Max/Gumbel-Softmax
  2. IT世界里面的牛逼网站
  3. MT4一 获取K线价格
  4. MATLAB实现交叉小波变换
  5. 浙大三维视觉团队提出 Neural Body,单目RGB视频重建人体三维模型,无需预训练网络...
  6. ElasticSearch系列 - SpringBoot整合ES:实现分页搜索 from+size、search after、scroll
  7. 互联网公司招聘--58集团--前端--2017年笔试题1
  8. Win7语言栏不见了
  9. 从 async/await 看 redux-saga 原理
  10. 2021.7.18炬芯ATS3015开发经验