源码来自罗德岛公共休息室的《C语言/C++经典游戏项目教程—飞机大战,非常适合小白入门练习》。
将敌机的飞机模型改成了狗头表情包,因为某人经常给我发狗头,我就想要做一个打爆狗头的小程序,哼!!
游戏开始界面:
飞机发射子弹
狗头被击打后
本代码编程使用的软件为Vistual Studio,感觉没有pycharm好用,不过用习惯了也还好吧。
完整代码如下:
#include
#include
#include
#include
using namespace std;
#define bu_num 15 //子弹数量
#define enemy_num 1
void createbu();
//加载玩家
IMAGE img_gamer[2];
IMAGE img_bk;
IMAGE img_bu[2];
IMAGE img_en[5];
void loadsource() {
//加载图片
loadimage(&img_bk, "resource/image/background.png");
loadimage(img_gamer+0, "resource/image/me2.png");
loadimage(img_gamer+1, "resource/image/me1.png");
loadimage(img_bu+0, "resource/image/bullet2.png");
loadimage(img_bu + 1, "resource/image/bullet1.png");
loadimage(img_en + 0, "resource/image/shimo12.png");
loadimage(img_en + 1, "resource/image/shimo13.png");
loadimage(img_en + 2, "resource/image/shimo14.png");
loadimage(img_en + 3, "resource/image/shimo15.png");
loadimage(img_en + 4, "resource/image/shimo16.png");
}
//自定义定时器
bool Timer(int ms, int id) {
static int start[5];
int end = clock();
if (end - start[id] >= ms) {
start[id] = end;
return true;
}
return false;
}
struct Plane {
int x;
int y;
bool isDie;
int frame;
}gamer;
Plane enemy[enemy_num];
//初始化函数
void plane_init(Plane* pthis,int x,int y) {
pthis->x = x;
pthis->y = y;
pthis->isDie = false;
pthis->frame = 0;
}
void plane_draw(Plane* pthis) {
putimage(pthis->x, pthis->y, img_gamer + pthis->frame);
pthis->frame = (pthis->frame + 1) % 2;
}
//移动飞机
void plane_move(Plane* pthis) {
int speed = 3;
if(GetAsyncKeyState(VK_UP))
{
pthis->y-=speed;
}
if (GetAsyncKeyState(VK_DOWN)){pthis->y+=speed;}
if (GetAsyncKeyState(VK_LEFT))
{
pthis->x-=speed;
}
if (GetAsyncKeyState(VK_RIGHT))
{
pthis->x+=speed;
}
if (GetAsyncKeyState(VK_SPACE)&&Timer(100,0) ){
createbu();
}
}
//子弹结构
struct Bu {
int x;
int y;
bool isDie;
}bullet[bu_num] = { 0 };
//创建子弹
void createbu() {
for (int i = 0;i < bu_num;i++)
{
if (bullet[i].isDie)
{
bullet[i].x = gamer.x + 51;
bullet[i].y = gamer.y ;
bullet[i].isDie = false;
break;
}
}
}
//子弹移动
void moveBu() {
for (int i = 0;i < bu_num;i++)
{
if (!bullet[i].isDie) {
bullet[i].y -= 4;
}
//如果子弹跑出窗口,让他消失
if (bullet[i].y < 0) {
bullet[i].isDie = true;
}
}
}
//狗头爆炸
void boom() {
for (int i = 0;i < enemy_num;i++)
{
if (!enemy[i].isDie)
putimage(enemy[i].x, enemy[i].y, img_en + 0);
putimage(enemy[i].x, enemy[i].y, img_en + 1);
putimage(enemy[i].x, enemy[i].y, img_en + 2);
putimage(enemy[i].x, enemy[i].y, img_en + 3);
putimage(enemy[i].x, enemy[i].y, img_en + 4);
enemy[i].isDie = true;
}
}
//创建狗头
void createenemy() {
for (int i = 0;i < enemy_num;i++)
{
if (enemy[i].isDie)
{
enemy[i].x = rand()%getwidth();
enemy[i].y = 82;
enemy[i].isDie = false;
break;
}
}
}
void zhuangji() {
for (int i = 0;i < bu_num;i++) {
for (int k = 0;k < enemy_num;k++) {
if (bullet[i].y > enemy[k].y && bullet[i].x < enemy[k].x+ 40 && bullet[i].x > enemy[k].x && bullet[i].y < enemy[k].y + 40)
{
bullet[i].isDie = true;
boom();
}
}
}
}
void moveenemy() {
for (int i = 0;i < enemy_num;i++)
{
if (!enemy[i].isDie)
{
enemy[i].y += 2;
if (enemy[i].y > getheight())
{
enemy[i].isDie = true;
}
}
}
}
//初始化玩家
void init() {
srand(GetTickCount());
loadsource();
plane_init(&gamer,(getwidth() - 102)/2, getheight()-126);
//初始化子弹
for (int i = 0;i < bu_num;i++)
{
bullet[i].isDie = true;
}
//初始化狗头
for (int i = 0;i < enemy_num;i++)
{
enemy[i].isDie = true;
}
}
//绘制界面
void draw() {
//输出图片
putimage(0, 0, &img_bk);
plane_draw(&gamer);
//绘制子弹
for (int i = 0;i < bu_num;i++)
{
if(!bullet[i].isDie)
putimage(bullet[i].x, bullet[i].y, img_bu+1);
}
for (int i = 0;i < enemy_num;i++)
{
if (!enemy[i].isDie)
putimage(enemy[i].x, enemy[i].y, img_en + 0);
}
}
int main() {
//创建窗口
initgraph(480,560);
init();
while (1) {
int starttime = clock();//获取程序执行到调用函数所经过的毫秒数
draw();
plane_move(&gamer);
moveBu();
if (Timer(800, 0)) {
createenemy();
}
moveenemy();
zhuangji();
int frametime = clock() - starttime;
if (1000 / 60 - frametime > 0) {
Sleep(1000 / 60 - frametime);
}
}
getchar();
return 0;
}
主要思路是
1、制作飞机,子弹,敌机。
2、定义飞机坐标,子弹坐标,敌机坐标。
3、键盘上下左右空格对应飞机移动和发射子弹。
4、敌机出现位置随机,位置会随时间变化向下移动。
5、子弹位置随时间变化向上移动。
6、当子弹位置与敌机位置重合时,子弹消失,敌机状态发生改变。