easyx为基的跳球游戏

本文详细描述了一个初学者使用EasyX库开发的游戏项目,包括界面设计、难度选择功能及小球运动逻辑,旨在分享学习经验并促进技术交流。
摘要由CSDN通过智能技术生成

前言

家人们我只是单纯的分享一下自己学习easyx时创造的小作品,水平不高,而且做的比较粗糙。做的比我好的大有人在加油兄弟们,希望能和大家共同分享一起进步。(这个需要easyx)兄弟们直接去官网下吧,这个很好玩的。

一,关于easyx

关于easyx这是一款基于C/C++的图形库,EasyX Graphics Library 是针对 Visual C++ 的免费绘图库,支持 VC6.0 ~ VC2022,简单易用,学习成本极低,应用领域 广泛。目前已有许多大学将 EasyX 应用在教学当中。
EasyX 含有一些简单的函数集合,几乎不用学习,直接翻看参考手册就可以直接使用。在线参考手册地址 https://docs.easyx.cn

正因为 EasyX 足够简单,在进行 C/C++、图形学、图像学、分形学等课程实验时,可以专注在课程知识上,不被绘图部分牵扯太多精力。以下是 EasyX 的使用演示:

在 VC6 的控制台程序中使用 EasyX,请参考 https://easyx.cn/used-in-vc6-console
在 VC6 的窗口程序中使用 EasyX,请参考 https://easyx.cn/used-in-vc6-win32
在 VC2010 的控制台程序中使用 EasyX,请参考 https://easyx.cn/used-in-vc2010-console
在 VC2010 的窗口程序中使用 EasyX,请参考 https://easyx.cn/used-in-vc2010-win32
在其它各版本 VC 中使用 EasyX,和 VC2010 区别不大,不再演示。

二, 初始界面

初始界面包含“开始游戏”,“难度选择”

开始游戏

这是游戏初始界面
首先我们应该初始化一个界面,这个界面首先我们应该设置两个方块,在方块里面设置文体,为此我们写一个函数来初始化方块。我们用fillroundrect来定义方块,设置上下左右的坐标,以及文体样式。具体见如下代码

void creat_brick(int x, int y, int w, int h, const char c[])
{
	setbkmode(TRANSPARENT);
	setfillcolor(BROWN);
	fillroundrect(x, y, x + w, y + h, 10, 10);
	int tx, ty;
	settextstyle(30, 0, "黑体");
	tx = x + (w - textwidth(c)) / 2;
	ty = y + (h - textheight(c)) / 2;

	outtextxy(tx, ty, c);
}

当方块函数设置好后我们初始化游戏初始页面,并读取鼠标信息,用easyx内置函数peekmessage来读取并得到鼠标的位置,并当鼠标点击时运行代码并break。代码见下:

double speedX = 0.008, speedY = 0.008;//这个是关于速度的初始设置也就是难度
initgraph(640, 640, EX_SHOWCONSOLE);
creat_brick(270, 290, 120, 80, "开始游戏");
creat_brick(270,390,120,80,"难度选择");
ExMessage mou;
int temp = 0;
while (true)//死循环
{
	if (peekmessage(&mou, EX_MOUSE))//读取鼠标信息
	{
		switch (mou.message)
		{
		case WM_LBUTTONDOWN:
			if (mou.x >= 270 && mou.x <= 270 + 120 && mou.y >= 290 && mou.y <= 290 + 80)
			{
				closegraph();
				temp = 1;
			}
			else if (mou.x >= 270 && mou.x <= 270 + 120 && mou.y >= 390 && mou.y <= 390 + 80)
			{
				closegraph();
				temp = 2;//当temp==2时这个便是难度选择的界面
			}
			break;
		default:
			break;
		}
	}
	if (temp == 1||temp==2) break;//一旦点击跳出死循环
}

自此“开始游戏”界面边设置完毕

难度选择

关于难度选择就是也是通过读取鼠标信息来选择难度,通过改变速度来改变难度,通过点击难度来改变,界面如下

关于难度选择的界面

同样利用上面写的函数来设置三个方块,并判断鼠标的坐标来判断鼠标的所处的难度,点击时来改变难度并进入游戏界面,分为困难,中等,简单来改变游戏难度,而且easy难度也就是简单难度是这场游戏初始化难度,具体实现代码如下:

if (temp == 2)//进入该界面的前置条件
{
	initgraph(640, 640, EX_SHOWCONSOLE);
	creat_brick(270, 50, 120, 80, "Difficult");
	creat_brick(270, 150, 120, 80, "Hard");
	creat_brick(270, 250, 120, 80, "Easy");
	while (true)
	{
		if (peekmessage(&mou, EX_MOUSE))//判断鼠标信息
		{
			switch (mou.message)
			{
			case WM_LBUTTONDOWN:
				if (mou.x >= 270 && mou.x <= 270 + 120 && mou.y >= 150 && mou.y <= 150 + 80)//hard难度
				{
					speedX = 0.09, speedY = 0.09;
					closegraph();
					temp = 1;
				}
				else if (mou.x >= 270 && mou.x <= 270 + 120 && mou.y >= 250 && mou.y <= 250 + 80)//easy难度
				{
					closegraph();
					temp = 1;
				}
				else if (mou.x >= 270 && mou.x <= 270 + 120 && mou.y >= 50 && mou.y <= 50 + 80)//Difficult
				{
					speedX = 0.1, speedY = 0.1;
					closegraph();
					temp = 1;
				}
				break;
			default:
				break;
			}
		}
		if (temp == 1) break;
	}
}

就是这了

三,游戏内容

游戏内容是一个乒乓球拍来反弹小球的非常简单的小游戏,这是我作为一个大一上了半年才刚刚接触C语言没多久能做出来的最大限度了西忘能够一起努力。

小球

小球是这个游戏的关键,如果要读取键盘信息就必须阻塞,为了避免阻塞应用kbhit函数来判读一下是否有键盘信息输入,否则就继续,小球的反弹效果要实现非常简单,只需要将小球的单个方向的速度设置为相反就可以实现在这个方向的反弹。让我们来康康代码。

initgraph(640, 720);
double x = 20, y = 20;

double xt = 270, yt = 700;
while (true)
{
	int temp = 0;
	cleardevice();
	fillcircle(x, y, 20);//小球
	creat_brick(xt, yt, 100, 20, "brick");//球拍
	x += speedX;//这个是速度x
	y += speedY;//这个是y
	if (x <= 20 || x >= 620) {//遇墙反弹
		speedX = -speedX;
	}
	if (y >= 680) {//遇到板子
		if (x >= xt && x <= xt + 100) speedY = -speedY;//打中盘子
		else//没中
		{
			temp++;
			closegraph();
			break;
		}
	}
	if (y <= 20) {
		speedY = -speedY;
	}
	if (temp == 1) break;

板块

这个是击打球的球拍不是很有难度大家康康:

	if (kbhit())
	{
		char key = _getch();
		switch (key)
		{
		case 75:
		case 'a':
		case 'A':
			xt -= 10;
			break;
		case 77:
		case 'd':
		case 'D':
			xt += 10;
			break;
		default:
			break;
		}
	}

}

给兄弟们看看效果图在这里插入图片描述
这个界面设置比较大,这个可以调,当然我做的非常粗糙,大家拿着我的代码改进一下可以叫我看看哦嘻嘻嘻。

游戏结束

游戏结束时就是挑战失败,跳出界面即可;康康完整代码吧
家人们我就单纯分享一下哈,这个不是很牛相比于其他专业的。自己本身也是菜鸟一枚。

#include<iostream>
#include<easyx.h>
#include<graphics.h>
#include<conio.h>
using namespace std;
void creat_brick(int x, int y, int w, int h, const char c[])
{
	setbkmode(TRANSPARENT);
	setfillcolor(BROWN);
	fillroundrect(x, y, x + w, y + h, 10, 10);
	int tx, ty;
	settextstyle(30, 0, "黑体");
	tx = x + (w - textwidth(c)) / 2;
	ty = y + (h - textheight(c)) / 2;

	outtextxy(tx, ty, c);
}
int main()
{
	double speedX = 0.008, speedY = 0.008;
	initgraph(640, 640, EX_SHOWCONSOLE);
	creat_brick(270, 290, 120, 80, "开始游戏");
	creat_brick(270,390,120,80,"难度选择");
	ExMessage mou;
	int temp = 0;
	while (true)
	{
		if (peekmessage(&mou, EX_MOUSE))
		{
			switch (mou.message)
			{
			case WM_LBUTTONDOWN:
				if (mou.x >= 270 && mou.x <= 270 + 120 && mou.y >= 290 && mou.y <= 290 + 80)
				{
					closegraph();
					temp = 1;
				}
				else if (mou.x >= 270 && mou.x <= 270 + 120 && mou.y >= 390 && mou.y <= 390 + 80)
				{
					closegraph();
					temp = 2;
				}
				break;
			default:
				break;
			}
		}
		if (temp == 1||temp==2) break;
	}
	if (temp == 2)
	{
		initgraph(640, 640, EX_SHOWCONSOLE);
		creat_brick(270, 50, 120, 80, "Difficult");
		creat_brick(270, 150, 120, 80, "Hard");
		creat_brick(270, 250, 120, 80, "Easy");
		while (true)
		{
			if (peekmessage(&mou, EX_MOUSE))
			{
				switch (mou.message)
				{
				case WM_LBUTTONDOWN:
					if (mou.x >= 270 && mou.x <= 270 + 120 && mou.y >= 150 && mou.y <= 150 + 80)//hard难度
					{
						speedX = 0.09, speedY = 0.09;
						closegraph();
						temp = 1;
					}
					else if (mou.x >= 270 && mou.x <= 270 + 120 && mou.y >= 250 && mou.y <= 250 + 80)//easy难度
					{
						closegraph();
						temp = 1;
					}
					else if (mou.x >= 270 && mou.x <= 270 + 120 && mou.y >= 50 && mou.y <= 50 + 80)//Difficult
					{
						speedX = 0.1, speedY = 0.1;
						closegraph();
						temp = 1;
					}
					break;
				default:
					break;
				}
			}
			if (temp == 1) break;
		}
	}
	if (temp == 1)
	{
		initgraph(640, 720);
		double x = 20, y = 20;
		
		double xt = 270, yt = 700;
		while (true)
		{
			int temp = 0;
			cleardevice();
			fillcircle(x, y, 20);
			creat_brick(xt, yt, 100, 20, "brick");
			x += speedX;
			y += speedY;
			if (x <= 20 || x >= 620) {
				speedX = -speedX;
			}
			if (y >= 680) {
				if (x >= xt && x <= xt + 100) speedY = -speedY;
				else
				{
					temp++;
					closegraph();
					break;
				}
			}
			if (y <= 20) {
				speedY = -speedY;
			}
			if (temp == 1) break;
			if (kbhit())
			{
				char key = _getch();
				switch (key)
				{
				case 75:
				case 'a':
				case 'A':
					xt -= 10;
					break;
				case 77:
				case 'd':
				case 'D':
					xt += 10;
					break;
				default:
					break;
				}
			}

		}
		initgraph(320, 320);
		creat_brick(0, 0, 320, 320, "Game over");
		getchar();
	}
	return 0;
}
  • 47
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值