C++调用EasyX库实现嫦娥奔月小游戏
作者:GZX墨痕
引言
不羡嫦娥成神仙,月宫寒冷恨无边;不羡吴刚桂花酒,人间美酒比蜜甜。中秋之夜庆团圆,家家户户笑声欢。愿以此心寄明月,国泰民安长万年。
前期准备
这个C++项目需要调用Easyx图形库,可从官网下载使用:easyx.cn/
我们只需要将下载好的文件中的.exe文件复制粘贴到我们建立项目的地址处就可以使用了。
开始项目
在建立项目后,我们需要建立一个文件夹用来存放图片,这里需要存放 "嫦娥"、"月亮”图片:
完成这些之后,就可以安心敲代码了。
我们首先需要对程序设计进行大致分析,也就是说我需要干什么、怎么干。
在这里我需要设计一款游戏,玩家通过键盘进行移动,月亮在玩家移动后也会随机移动,玩家需要帮助嫦娥追到月亮。
初始化绘图窗口后加载图片,为了代码的可阅读性,这里使用棋盘的思想,设计一个棋盘,我们将月亮放在棋盘中间,将嫦娥放在棋盘左下角,宏定义棋盘格子的大小后,我们使嫦娥和月亮的坐标最小长度都为1,将相应的坐标乘上格子大小就是真实坐标了。
现在具体分析一下:
下面将需要全局声明、全局变量、宏定义、头文件贴出来:
#include <graphics.h> #include <conio.h> #include<iostream> using namespace std; #define WINDOW_LENGTH 1024 //棋盘长 #define WINDOW_WIDTH 768 //棋盘宽 #define BEGIN_X 85 //棋盘最左上角点的x坐标 #define BEGIN_Y 85 //棋盘最左上角点的y坐标 #define GRID_N 15 //格子数 #define GRID_LENGTH 30 //每个格子的边长(像素数) //定义图型变量 IMAGE pic_moon; IMAGE pic_ren; //定义二维棋盘数组 int chessboard[15][15] = { 0 }; //****************核心数据*****************// //定义判断玩家或电脑 int last = 1; //人物初始位置 int renX = 0; int renY = 14; int moonX = 7; int moonY = 7; int step = 0; //判断赢 int num = 0; void start(); void loadsource(); void playgame(); void wingame(); void drawpicture();
程序主要使用自定义函数,主函数非常简短:
void main() { start(); }
下面是start()函数代码:
void start() { //设置初始面板 //mciSendString("play music\qingtian.mp3",0,0,0); initgraph(WINDOW_LENGTH, WINDOW_WIDTH); loadsource(); playgame(); }
根据执行顺序,我们进入加载图片的函数:
void loadsource() { //加载 loadimage(&pic_moon, L"tupian\moon.png", GRID_LENGTH, GRID_LENGTH); loadimage(&pic_ren, L"tupian\ren.png", GRID_LENGTH, GRID_LENGTH); }
接下来就是玩游戏的函数了,这里相比之前的函数代码相对较长,但是也很好理解,我们将嫦娥和月亮限制在棋盘中,根据玩家的输入嫦娥移动,使用last来使玩家和电脑依次移动,最后判断是否胜利。
void playgame() { //移动人物 unsigned char ch; while (1) { drawpicture(); if (last == 1 && renX >= 0 && renX <= 14 && renY >= 0 && renY <= 14) { ch = _getch(); step++; switch (ch) { case 'a': case 'A': { renX--; last = 2; break; } case 'w': case 'W': { renY--; last = 2; break; } case 's': case 'S': { renY++; last = 2; break; } case 'd': case 'D': { renX++; last = 2; break; } } } if (renX > 14) renX--; if (renX < 0) renX++; if (renY > 14) renY--; if (renY < 0) renY++; //移动月亮 if (last == 2) { last = 1; int moon_temp_X = rand() % 3; int moon_temp_Y = rand() % 3; switch (moon_temp_X) { case 0: break; case 1: moonX++; break; case 2: moonX--; break; } switch (moon_temp_Y) { case 0: break; case 1: moonY++; break; case 2: moonY--; break; } } if (moonX > 14) moonX--; if (moonX < 0) moonX++; if (moonY > 14) moonY--; if (moonY < 0) moonY++; wingame(); } }
wengame()函数非常简短,也很简单:
void wingame() { if (renX == moonX && renY == moonY) num = 1; }
我们可以在playgame()函数中看到使用了显示图片函数,这个函数根据坐标显示嫦娥和月亮图片,并每一次都重新绘制图像,不然程序中会出现多个嫦娥和月亮,这是因为图片被显示后在程序中会一直存在,使用我们需要使用函数重新绘制图像。可以看到这里有画线的操作,其实在最后这是可以被注释掉的(不注释也不会有什么大问题,而且这可以帮助我们调整嫦娥和月亮位置),最后我们根据是否胜利进行输出。这里同样贴出代码:
void drawpicture() { for (int i = 0; i < GRID_N; i++) { setlinecolor(WHITE); line(100, 100 + i * GRID_LENGTH, 100 + GRID_LENGTH * 14, 100 + i * GRID_LENGTH); line(100 + i * GRID_LENGTH, 100, 100 + i * GRID_LENGTH, 100 + GRID_LENGTH * 14); } cleardevice(); putimage(BEGIN_X + renX * GRID_LENGTH, BEGIN_Y + renY * GRID_LENGTH, &pic_ren); putimage(BEGIN_X + moonX * GRID_LENGTH, BEGIN_Y + moonY * GRID_LENGTH, &pic_moon); if (num == 1) { settextcolor(BLACK); setbkmode(TRANSPARENT); settextstyle(50, 30, L"宋体"); outtextxy(650, 340, L"胜利,终端查看移动步数!"); cout << "玩家胜利,共移动" << step << "步" << endl; Sleep(1000); closegraph(); } }
结语
游戏到这里就基本设计结束了,当然也可以继续修改增加一些技能什么的,这个笔者后续可能会继续设计。下面贴出部分游戏画面:
以上就是C++调用EasyX库实现嫦娥奔月小游戏的详细内容,更多关于C++ EasyX游戏的资料请关注脚本之家其它相关文章!