C++调用EasyX库实现嫦娥奔月小游戏

 更新时间:2023年09月15日 14:37:20   作者:GZX墨痕  
这篇文章主要为大家详细介绍了C++如何调用EasyX库编写一个简单的嫦娥奔月小游戏,文中的示例代码讲解详细,感兴趣的小伙伴可以参考一下

引言

不羡嫦娥成神仙,月宫寒冷恨无边;不羡吴刚桂花酒,人间美酒比蜜甜。中秋之夜庆团圆,家家户户笑声欢。愿以此心寄明月,国泰民安长万年。

前期准备

这个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游戏的资料请关注脚本之家其它相关文章!

相关文章

  • C语言实现多项式的相加

    C语言实现多项式的相加

    这篇文章主要为大家介绍了C语言实现多项式的相加,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-10-10
  • 浅谈Windows系统下C语言编程中Glib库的使用

    浅谈Windows系统下C语言编程中Glib库的使用

    这篇文章主要介绍了Windows系统下C语言编程中Glib库的使用,Glib库在多线程编程中经常可以用到,需要的朋友可以参考下
    2016-02-02
  • C++全面细致讲解复数类

    C++全面细致讲解复数类

    本文章向大家介绍C++ 标准库中的复数类,主要包括C++ 标准库中的复数类使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下
    2022-06-06
  • C++数据结构与算法之哈夫曼树的实现方法

    C++数据结构与算法之哈夫曼树的实现方法

    这篇文章主要介绍了C++数据结构与算法之哈夫曼树的实现方法,简单说明了哈夫曼树的原理,并结合具体实例形式分析了C++实现哈夫曼树的相关操作技巧,需要的朋友可以参考下
    2017-11-11
  • 对C语言中sizeof细节的三点分析介绍

    对C语言中sizeof细节的三点分析介绍

    以下是对C语言中sizeof的细节进行了详细的分析介绍,需要的朋友可以参考下
    2013-07-07
  • 详解C语言学习记录之指针

    详解C语言学习记录之指针

    关于指针,其是C语言的重点,C语言学的好坏,其实就是指针学的好坏。其实指针并不复杂,学习指针,要正确的理解指针,本片文章能给就来学习一下
    2021-11-11
  • 指针与const限定符的使用分析

    指针与const限定符的使用分析

    本篇文章对指针与const限定符的使用进行了分析介绍。需要的朋友参考下
    2013-05-05
  • C语言详解UDP通信的实现

    C语言详解UDP通信的实现

    UDP协议是用户数据报协议,面向无连接的、不稳定、不可靠、不安全的数据报传递---更像是是收发短信;UDP传输不需要建立连接,传输效率更高,在稳定的局域网内环境相对可靠;UDP天然支持多客户端
    2022-05-05
  • QT计算时间差的方法详解

    QT计算时间差的方法详解

    这篇文章主要为大家详细介绍了利用QT实现计算两个时间的时间差的方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-12-12
  • Qt实现SqlTableModel映射组件应用小结

    Qt实现SqlTableModel映射组件应用小结

    在Qt中提供了QSqlTableModel模型类,它为开发者提供了一种直观的方式来与数据库表格进行交互,本文就来介绍一下Qt实现SqlTableModel映射组件应用小结,感兴趣的可以了解一下
    2023-12-12

最新评论