大一实训之火箭大战

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

 


前言

于2022年6月22日首次完成实训编写一款小游戏的项目,留以纪念。


提示:以下是本篇文章正文内容,下面案例可供参考

一、游戏开发思路

(1)绘制边框【绘制好边框后,就可以用加载的图片设置为背景】;

(2)加载火箭,UFO等所需要的模型【因为游戏模型不好找,便用了老师提供的火箭和UFO作为此次游戏模型】;

  (3)加载音乐;

(4)这里我用了switch函数来操控飞行方向和攻击【火箭模型加载了肯定要能操控攻击和飞行才好玩】;

(5)给火箭和UFO一个飞行的范围;【若越界则坐标重置】;

(6)UFO随机刷新【每次出现的坐标和速度都是随机的】;

(7)碰撞检测【如果火箭的攻击击中UFO则积分+1,若火箭与UFO相撞则积分清零,火箭坐标重置】;

二、使用步骤

1.绘制边框

需要头文件【#include<graphics.h>】;

代码如下(示例):

#include<iostream>   
#include<graphics.h>
    float win_width = 1080;//定义长;
    float win_height = 580;//定义宽;
    initgraph(win_width, win_height);//绘制边框;

2.加载模型

需要添加外部头文件【#include"EasyXPng.h"】;

IMAGE background;//【定义】

loadimage(&background,_T("图片存放地址"));【注:要先在编译器资源里添加图片】

代码如下(示例):

#inlcude<iostream>
#include"EasyXPng.h"
IMAGE backg_bullet;//子弹模型;
IMAGE backg_rocket;//火箭模型;
IMAGE backg_ufo;//UFO模型;
//======================//
IMAGE backg_girl;//【背景图】因为当时时间快截止了就没有添加;
IMAGE backg_blowup;//【爆炸】击中目标后爆照模型替代UFO,UFO坐标刷新;【也是因为时间问题没有编写】

loadimage(&backg_rocket, _T("C:\\Users\\kekek\\Desktop\\小球运动测试v.20\\rocket.png"));//加载火箭图片;
putimagePng(rocket_x, rocket_y, &backg_rocket);//打开火箭图片;

loadimage(&backg_ufo, _T("C:\\Users\\kekek\\Desktop\\小球运动测试v.20\\ufo.png"));//加载UFO图片;
putimagePng(ufo_x, ufo_y, &backg_ufo);//打开UFO图片;

loadimage(&backg_bullet, _T("C:\\Users\\kekek\\Desktop\\小球运动测试v.20\\bullet.png"));//加载子弹图片;
putimagePng(bullet_x, bullet_y, &backg_bullet);//打开子弹图片;

3.加载音乐

需要头文件【#pragma comment(lib,"winmm.lib") 】;

第一段的mciSendString(_T("音乐存放地址"),NULL,0,NULL);【open是打开指令】

第二段的mciSendString(_T("音乐存放地址"),NULL,0,NULL);【play是播放指令】

代码如下(示例):

#include<iostream>
#pragma comment(lib,"winmm.lib") 
mciSendString(_T("open C:\\Users\\kekek\\Desktop\\小球运动测试v.20\\unstoppable.mp3"), NULL, 0, NULL);//打开音乐;
mciSendString(_T("play C:\\Users\\kekek\\Desktop\\小球运动测试v.20\\unstoppable.mp3"), NULL, 0, NULL);//播放音乐;

4.按键检测【实现自由移动和攻击】

需要头文件【#include<conio.h> 】;

通过_getch()函数实现按键监控;

而实现通过键盘控制火箭移动有两种方法;

其一如下(试例):

#include<iostream>
#include<conio.h>	
	if (_kbhit())
	{
		char input = _getch(); //get char(ch)
		if (input == ' ' )
		{
			bullet_vy = -20;
		}
	}

其二如下(实例):

Bug:子弹的初始位置和重置后的位置都没有与火箭对齐,而是在左上角;

#include<iostream>
#include<conio.h> 	
char userkey = _getch();//通过按键监控,使玩家可控制火箭运动方向;
		{
			switch (userkey)
			{
			case 'a':
				rocket_x -= 20;//左移;
				break;
			case 'd':
				rocket_x += 20;//右移;
				break;
			case 'w':
				rocket_y -= 20;//上移;
				break;
			case 's':
				rocket_y += 20;//下移;
				break;
			case ' ':
				bullet_y -= 150;//攻击键;

				if (bullet_y < 0)//如果子弹越界;
				{
					bullet_y = rocket_y;//横坐标重置【重置为火箭横坐标】;
					bullet_x = rocket_x;//纵坐标重置【重置为火箭纵坐标】;
				}
				break;//bug:子弹和火箭没有对齐;
			}
		}

5.【火箭】越界检测

#include<iostream>
        //越出下边界;
		if (rocket_y +69>= win_height)
		{
			rocket_y = win_height-69;//不得超出最大宽度;
			score = 0;
		}
        //越出上边界;
		if (rocket_y < 0)
		{
			rocket_y = 0;//不得超出最小宽度;
			score = 0;
		}
        //越出有边界;
		if (rocket_x +50>=win_width)
		{
			rocket_x = win_width-50;//不得超出最大长度;
			score = 0;
		}
        //越出左边界;
		if (rocket_x < 0)
		{
			rocket_x = 0;//不得超出最小长度;
			score = 0;

6.【UFO】越界检测

编写UFO坐标随机刷新时就加入了限制;

7.【UFO】坐标随机

需要头文件【#include<time.h>】

通过时间函数和随机函数实现坐标随机;

#include<iostream>
#include<time.h>
		srand((unsigned)time(0));
		ufo_x = rand() % 540 + 1;
		ufo_y = (rand() % 290) / float(2) + 1;
        ufo_v=rand()%6;//速度随变定义的;//当然我并没有定义速度这个参数【可以自行添加】;

7.碰撞检测

检测火箭与UFO的周围是否发生碰撞;

#include<iostream>
	if ((rocket_x + 50 >= ufo_x) && (rocket_x <= ufo_x + 60) && (rocket_y <= ufo_y + 45)&&(rocket_y+69>=ufo_y))
	{
		rocket_x = win_width / 2;//碰撞后横坐标重置为边框长的一半;
		rocket_y = win_height - 70;//碰撞后纵坐标重置为边框宽-70(火箭自身长度为69凑个整数);
		score = 0;//积分清零;
	}

7.积分机制

和第四步【按键检测】一样有个bug:就是子弹坐标重置后没有与火箭对齐;

#include<iostream>
		if ((bullet_x +20>= ufo_x) && (bullet_x <= ufo_x+60) && (bullet_y <= ufo_y+45))
		{
			bullet_x = rocket_x;//和上面一样的bug;
			bullet_y = rocket_y;//和上面一样的bug;
			score++;
		}

7.记分牌显示

#include<iostream>
		TCHAR s[20];
		swprintf_s(s, _T("当前得分:%d"), score);
		settextstyle(20, 0, _T("宋体"));//(字的大小,字的高,字体);
		settextcolor(0x00FFFF);//设置字体颜色;
		outtextxy(100, 50, s);//(横坐标,纵坐标,&参数);

 

8.总代码

#include<stdio.h>  //标准输入输出库,支持printf()/getch()等函数
#include<conio.h>  //con--console控制台输入输出,_getch()
#include<graphics.h>
#include<time.h>

#pragma comment(lib,"winmm.lib")
#include"EasyXPng.h"

int main()
{
	//======定义边框参数======//

	float win_width = 1080;
	float win_height = 580;

	//======绘制边框======//
	initgraph(win_width, win_height);

	//======定义火箭参数======//
	float rocket_x = win_width / 2, rocket_y = win_height / 2;//定义长宽;

	//======定义UFO参数======//
	float ufo_x=400, ufo_y=400;

	//======定义积分参数======//
	int  score = 0;

	//======定义子弹参数======//
	float bullet_x = rocket_x;
	float bullet_y = rocket_y;

	//======加载图片======//
	IMAGE backg_girl;//鸡哥背景图;
	IMAGE backg_bullet;//子弹;
	IMAGE backg_rocket;//火箭;
	IMAGE backg_blowup;//爆炸;
	IMAGE backg_ufo;//UFO;


	//======程序运行======//
	while (1)
	{
		// 输出字符串(自适应字符集)
		TCHAR s[20];
		swprintf_s(s, _T("当前得分:%d"), score);
		settextstyle(20, 0, _T("宋体"));
		settextcolor(0x00FFFF);
		outtextxy(100, 50, s);


		loadimage(&backg_rocket, _T("C:\\Users\\kekek\\Desktop\\小球运动测试v.20\\rocket.png"));//加载火箭图片;
		putimagePng(rocket_x, rocket_y, &backg_rocket);//打开火箭图片;

		loadimage(&backg_ufo, _T("C:\\Users\\kekek\\Desktop\\小球运动测试v.20\\ufo.png"));//加载UFO图片;
		putimagePng(ufo_x, ufo_y, &backg_ufo);//打开UFO图片;

		loadimage(&backg_bullet, _T("C:\\Users\\kekek\\Desktop\\小球运动测试v.20\\bullet.png"));//加载子弹图片;
		putimagePng(bullet_x, bullet_y, &backg_bullet);//打开子弹图片;

	//======加载音乐======//
		mciSendString(_T("open C:\\Users\\kekek\\Desktop\\小球运动测试v.20\\unstoppable.mp3"), NULL, 0, NULL);//打开音乐;
		mciSendString(_T("play C:\\Users\\kekek\\Desktop\\小球运动测试v.20\\unstoppable.mp3"), NULL, 0, NULL);//播放音乐;
		//按键测试;
		char userkey = _getch();//通过按键监控,使玩家可控制火箭运动方向;
		{
			switch (userkey)
			{
			case 'a':
				rocket_x -= 20;
				break;
			case 'd':
				rocket_x += 20;
				break;
			case 'w':
				rocket_y -= 20;
				break;
			case 's':
				rocket_y += 20;
				break;
			case ' ':
				bullet_y -= 150;

				if (bullet_y < 0)
				{
					bullet_y = rocket_y;
					bullet_x = rocket_x;
				}
				break;
			}
		}

		//攻击得分机制//
		if ((bullet_x +20>= ufo_x) && (bullet_x <= ufo_x+60) && (bullet_y <= ufo_y+45))
		{
			bullet_x = rocket_x;
			bullet_y = rocket_y;
			score++;
		}

	//======越界检测======//
		if (rocket_y +69>= win_height)
		{
			rocket_y = win_height-69;
			score = 0;
		}
		if (rocket_y < 0)
		{
			rocket_y = 0;
			score = 0;
		}
		if (rocket_x +50>=win_width)
		{
			rocket_x = win_width-50;
			score = 0;
		}
		if (rocket_x < 0)
		{
			rocket_x = 0;
			score = 0;
		}
		//======子弹越界检测======//子弹飞出界外则返回火箭
		if ((bullet_y >= win_height)||(bullet_y < 0))
		{
			bullet_y = rocket_y;
		}

		if( (bullet_x  >= win_width)||(bullet_x < 0))
		{
			bullet_x = rocket_x;
		}

		
		//======碰撞检测=======//
		if ((rocket_x + 50 >= ufo_x) && (rocket_x <= ufo_x + 60) && (rocket_y <= ufo_y + 45)&&(rocket_y+69>=ufo_y))
		{
			rocket_x = win_width / 2;
			rocket_y = win_width - 70;
			score = 0;
		}

	//   //怪物随机生成
		srand((unsigned)time(0));
		ufo_x = rand() % 540 + 1;
		ufo_y = (rand() % 290) / float(2) + 1;
     //==============//
		Sleep(100);
		cleardevice();
	}
	//======收尾======//
	closegraph();
	return 0;
}

总结

初次编写,技术有限,还勿见笑,望大佬们斧正。

 

 

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值