基于EasyX图形库的天天爱消除

什么是EasyX图形库

EasyX 是针对 C++ 的图形库,可以帮助 C++语言初学者快速上手图形和游戏编程。
http://www.easyx.cn/

其实EasyX真的已经很老了(当然也非常感激那些辛苦维护的无私大佬们,如果没有他们,我们这些菜鸟怎么能这么简单的领略编程的美呢,毕竟那些库函数没有点本事可是写不出来的,至少我会被难住,哈哈),起码我在用vs编写的时候就遇到过很多新旧不兼容的问题,因为学的还少,大多也是不求甚解,希望以后可以解决这些问题。

这里要特别感谢 香蕉地 的老张,他的C视频确实很不错,打开了人的思维和眼界,至少让我在初始编程的路上有了更加坚定的决心和对未来的信心。
[老张的香蕉地](http://xiangjiaodi.com/)


天天爱消除

用visual studio 2013 写的,比较简陋,但是基本框架都是有的,话不多说,直接贴程序。

#pragma warning(disable:4996)
#define KEY_DOWN(vk_c) (GetAsyncKeyState(vk_c)&0x8000?1:0)     //按键宏定义#include <stdio.h>
#include <graphics.h>
#include <conio.h>
#include <time.h>typedef struct position
{int x;int y;
}posType;void init(void);                            //初始化界面
void gamebegin(void);                       //游戏开始界面
void gameplay(void);                        //玩游戏
void close(void);                           //游戏结束释放资源
void drawcursor(posType, COLORREF);         //绘制光标
void drawtime(int sec);                     //绘制时间
void drawscore(int score);                  //绘制分数
void getsamecolorballs(posType, COLORREF);  //获取同色小球
int isValid(posType, COLORREF);             //判断数组坐标是否正确,返回0不合法,返回1合法
void ballsfall(void);                       //小球下落posType cur;                                //光标位置结构体
posType ballsArr[180];                      //同色小球坐标
int index = 0;                              //同色小球个数
COLORREF colorArr[6] = { RGB(200, 0, 0), RGB(0, 200, 0), RGB(0, 0, 200),RGB(0, 200, 200), RGB(200, 0, 200), RGB(200, 200, 0), };            //随机颜色池int main()
{init();gamebegin();gameplay();close();
}void init(void)                             //初始化界面尺寸
{initgraph(1000, 700);
}void gamebegin(void)                        //游侠开始界面
{//绘制游戏边框setlinecolor(RGB(100, 100, 100));       //设置线颜色setlinestyle(PS_SOLID , 10);            //设置线风格rectangle(255,45,745,655);              //绘制空心矩形,左上xy/右下xy//绘制小球setlinestyle(PS_SOLID);                 //设置圆线风格srand((unsigned)time(NULL));            //提供随机数种子for (int x = 280; x < 740; x += 40)     {for (int y = 70; y < 650; y += 40){COLORREF cl = colorArr[rand() % 6];     //产生0~5六个随机数在随即颜色池中取颜色setlinecolor(cl);                       //设置圆线颜色setfillcolor(cl);                       //设置填充颜色fillcircle(x, y, 19);                   //绘制圆}}//绘制光标cur.x = 480;                                    //初始光标,位于界面中央cur.y = 390;drawcursor(cur, RGB(200, 200, 200));            //光标子函数//倒计时子函数drawtime(30);                                                                   //分数子函数drawscore(0);
}void gameplay(void)                                 //游戏算法
{TCHAR gg[] = _T("Game Over!");                  //结束语int score = 0;                                  //分数int i = 0;for (i = 299; i>-1; i--)                        //30s循环体{if (i % 10 == 0)                            //10 * Sleep(500)= 1s{drawtime(i / 10);}if (KEY_DOWN(VK_UP) && cur.y>70){drawcursor(cur, RGB(0, 0, 0));cur.y -= 40;drawcursor(cur, RGB(255, 255, 255));}else if (KEY_DOWN(VK_DOWN) && cur.y<630){drawcursor(cur, RGB(0, 0, 0));cur.y += 40;drawcursor(cur, RGB(255, 255, 255));}else if (KEY_DOWN(VK_LEFT) && cur.x>280){drawcursor(cur, RGB(0, 0, 0));cur.x -= 40;drawcursor(cur, RGB(255, 255, 255));}else if (KEY_DOWN(VK_RIGHT) && cur.x<720){drawcursor(cur, RGB(0, 0, 0));cur.x += 40;drawcursor(cur, RGB(255, 255, 255));}else if (KEY_DOWN(VK_RETURN) || KEY_DOWN(VK_SPACE))             //回车/空格消除{//获得光标所在位置周围的同色小球坐标,存入数组,并记录个数getsamecolorballs(cur, getpixel(cur.x, cur.y));//将数组中元素依次置黑一段时间if (index>1){int j = 0;for (j = 0; j<index; j++){setlinecolor(RGB(0, 0, 0));setfillcolor(RGB(0, 0, 0));fillcircle(ballsArr[j].x, ballsArr[j].y, 19);        //同色坐标绘制黑色}Sleep(400);                                              //停顿效果//上方的小球下落ballsfall();//刷新分数score += index;drawscore(score);}index = 0;}Sleep(150);}cleardevice();   //清除屏幕settextcolor(RGB(255, 0, 0));settextstyle(80, 0, _T("黑体"));outtextxy(300, 330, gg);drawscore(score);getchar();
}void close(void)
{//getchar();closegraph();
}void drawcursor(posType cur,COLORREF c1)//绘制光标
{setlinestyle(PS_SOLID, 2);setlinecolor(c1);rectangle(cur.x - 20, cur.y - 20, cur.x + 20, cur.y + 20);
}void drawtime(int sec)//绘制倒计时
{TCHAR s[30];settextcolor(RGB(255, 255, 0));settextstyle(25, 0, _T("黑体"));_stprintf_s(s, _T("剩余时间:%2d s"), sec);outtextxy(30, 50, s);
}void drawscore(int score)//绘制分数
{TCHAR s[30] ;settextcolor(RGB(255, 0, 0));settextstyle(25, 0, _T("宋体"));_stprintf_s(s, _T("分数:%3d"), score);outtextxy(30, 600, s);
}void getsamecolorballs(posType cur, COLORREF cl)
{int k = 0;posType tmpPos;ballsArr[index].x = cur.x;ballsArr[index].y = cur.y;index++;for (k = 0; k<4; k++){switch (k){case 0:tmpPos.x = cur.x; tmpPos.y = cur.y - 40; break; //上case 1:tmpPos.x = cur.x; tmpPos.y = cur.y + 40; break; //下case 2:tmpPos.x = cur.x - 40; tmpPos.y = cur.y; break; //左case 3:tmpPos.x = cur.x + 40; tmpPos.y = cur.y; break; //右}if (isValid(tmpPos, cl)){getsamecolorballs(tmpPos, cl);}}
}int isValid(posType cur, COLORREF c1)
{if (getpixel(cur.x, cur.y) != c1){return 0;                                                    //不合法}else{int i = 0;for (i = 0; i < index; i++){if (cur.x == ballsArr[i].x && cur.y == ballsArr[i].y)   {return 0;                                            //不合法}}return 1;                                                    //合法}
}void ballsfall(void)//小球下落
{int i = 0;int j = 0;int k = 0;posType temp;for (i = 0; i < index - 1; i++)                                  //使小坐标排在数组前面for (j = 0; j < index - 1 - i; j++)                          //冒泡法{if (ballsArr[j].x>ballsArr[j + 1].x){temp = ballsArr[j];ballsArr[j] = ballsArr[j + 1];ballsArr[j + 1] = temp;}if (ballsArr[j].y>ballsArr[j + 1].y){temp = ballsArr[j];ballsArr[j]= ballsArr[j + 1];ballsArr[j + 1] = temp;}}for (i = 0; i < index; i++)//下落{for (k = ballsArr[i].y; k>70; k-=40){COLORREF C1 = getpixel(ballsArr[i].x, k - 40);setlinecolor(C1);setfillcolor(C1);fillcircle(ballsArr[i].x, k, 18);}COLORREF C1 = colorArr[rand() % 6];//上方空域部分随机颜色setlinecolor(C1);setfillcolor(C1);fillcircle(ballsArr[i].x, 70, 18);}
}

改进方案

细节上其实还可以改进很多,比如

  • 分数算法方面。总不能消除两个球两分,消除十个球也两分吧

  • 倒计时算法方面。不能一味的倒计时,应该增加奖励机制,消除的块数大于一定值,应该相应增加时间

  • 初始以及结尾选择菜单。现在这个还是太简陋,没有一个进入游戏的选择菜单和一局游戏结束的再来一局或者结束的选择菜单。但是DOS下目前我想到的比较简单的方法就是打“*”的方法(参考我另一篇博客,猜数字搞怪版菜单),windows下倒是可以使用微软提供的API进行编程

哈哈,这算是我的一次编写这种量级的程序,当然和其他大佬们差距还远,但是自己已经很高兴了,忙完这一阵,研究一下Windows API 的编程,写一版完整的天天爱消除

基于EasyX图形库的天天爱消除相关推荐

  1. 用easyx画电子钟_基于EasyX图形库的多线程绘图应用

    本文<基于EasyX图形库的多线程绘图应用>由手机部落整理,仅供参考.如果觉得很不错,欢迎点评和分享-感谢你的阅读与支持! 张煜昕 摘要:EasyX 是C++语言进行图形化编程和游戏编程的 ...

  2. C语言之五子棋项目 基于EasyX图形库

    C语言之五子棋 前言 一.EasyX图形库下载与安装 1.EasyX图形库下载 2.VS2019设置EasyX图形库 二.五子棋中用到的图形库知识 1.初始化页面 2.文字显示 3.鼠标操作 4.棋盘 ...

  3. C++写的是男人就下一百层小游戏,基于EasyX图形库(本人菜鸟)

    是男人就下一百层 小游戏 游戏整体源代码已打包,在最下面 首先建立一个board类: #pragma once #ifndef BOARD_H_ #define BOARD_H_ const int ...

  4. c语言/c++大作业基于easyx图形库自制RPG类型小游戏代码(附源码)

    目录 一.游戏玩法 二.完整代码 三.部分细节 透明化人物背景 关于easyx库中怎样贴出透明图片 地图的链表实现 移动检测 碰撞检测 总结 前言: 花两天边看easyx文档边学边写的期末小作业. 学 ...

  5. 基于EasyX图形库的C/C++实战项目——西南大学大一C语言程序设计|课程设计《多功能应用平台》

    目录 一.扫雷 二.迷宫 三.通讯录 四.核心代码 一.扫雷 功能简介:1.   棋盘设置 2.    设置模式 3.   红旗标志 4.  递归展开(DFS) 扫雷 二.迷宫 功能介绍: 1.   ...

  6. 【C语言游戏】太空大战 | SpaceWar(基于EasyX图形库,FPS优化,碰撞判断,drawAlpha绘制透明贴图,音乐播放,源码素材免费分享)

    1. 数据结构介绍 //飞船的数据结构(包括己方战机和敌机) struct aircraft { int x;//横坐标 int y;//纵坐标 int HP;//飞船血量 int spead;//飞 ...

  7. c语言基于easyX樱花特效,C++基于easyx图形库实现推箱子游戏

    本文实例为大家分享了C++实现推箱子游戏的具体代码,供大家参考,具体内容如下 头文件: #include #include //#include #include #include #include ...

  8. 贪吃蛇—C—基于easyx图形库(下):从画图程序到贪吃蛇【自带穿墙术】

    上节我们用方向控制函数写了个小画图程序,它虽然简单好玩,但我们不应该止步于此.革命尚未成功,同志还需努力. 开始撸代码之前,我们先理清一下思路.和前面画图程序不同,贪吃蛇可以有很多节,可以用一个足够大 ...

  9. EasyX图形库学习(完整版)

    在此之前我们用C/C++编程面对的都是黑框框,可能会感觉很无聊.现在用easyX库可以很快的画一个房子.车子.人物等等.当然也可以基于easyX图形库来做一些我们平时玩过的游戏,比如贪吃蛇.俄罗斯方块 ...

  10. 基于easyx库的GUI扫雷项目

    基于easyx库的GUI扫雷项目 文章目录 基于easyx库的GUI扫雷项目 0.观前提醒 1.扫雷游戏项目效果展示 2.扫雷游戏项目基本信息 3.扫雷游戏项目设计思路 4.扫雷游戏实现原理 4.1 ...

最新文章

  1. 来了!微服务中的事务处理
  2. 软件项目管理大作业_信息系统项目管理师该如何备考?
  3. 讲你肯定能懂的机器学习多维极值求解
  4. 【MFC】带下拉菜单的工具栏
  5. 巨坑!同事离职前一天,偷偷将一个470欧的色环电阻串进我的电源线中......
  6. 创建IOS应用程序通用下的Setting以及读取方式
  7. 拓扑排序 Codeforces Round #290 (Div. 2) C. Fox And Names
  8. Java 获取本地时间,并格式化年、月、日
  9. 通过Kali linux 模拟CC攻击进行WEB压力测试实战
  10. 用计算机画统计图,统计图
  11. 贪心算法经典例题3:导弹发射问题
  12. C语言刷题系列——5.使用函数判断完全平方数
  13. html模拟百度人物百科,HTML MARC
  14. 【Git】从安装配置到简单使用
  15. [CodeForces877 E. Danil and a Part-time Job]dfs序+线段树
  16. 如何从0到1搭建一个个人网站
  17. 登陆千牛时显示服务器失败,千牛登陆云服务器
  18. Nand Flash原理分析与编程
  19. 巨杉数据库5.0携手同方软银促进金融科技创新
  20. 单片机毕设 人体定位智能调速风扇系统

热门文章

  1. 手机软件测试实习感想
  2. c++ vector基本函数、排序、查找用法
  3. 走近“云地基”的开拓者云快线
  4. [白话解析] 深入浅出极大似然估计 极大后验概率估计
  5. 【Tip】那些“想当然”的记录
  6. 测试小故事48:想当然
  7. 斐讯c 语言面试题,斐讯面试记录—三线程交替打印ABC
  8. 色织物数据集YDFID-1
  9. 【软件相关】EverythingSumatraPDF的一个小bug
  10. 利用Python制作动漫人物