首页 > 其他分享 >飞机大战小游戏改进与创新

飞机大战小游戏改进与创新

时间:2024-03-06 21:11:50浏览次数:23  
标签:return ptPos int CBomb 大战 改进 小游戏 include CGameObject

飞机大战小游戏来源:[https://github.com/WindrunnerMax/AirplaneWar]
运行环境:visual studio 2019
运行截图如下:


对源文件的各项代码,我进行了一些修改和创新,Bomb.cpp文件中,我发现以下问题:
魔法数值硬编码:在Draw函数中出现了数字12和10,应该将这些魔法数值定义成常量或者宏以提高代码的可读性和可维护性。
潜在的bug:在Draw函数中,m_ptPos.x的更新逻辑可能会导致炸弹在横向上移动,但这个移动逻辑并没有在构造函数中初始化。应该确保在构造函数中对xx进行初始化。
源代码如下:

点击查看代码
#include "StdAfx.h"
#include "Bomb.h"
#include "resource.h"

CImageList CBomb::m_Images;


CBomb::CBomb(int x, int y) :CGameObject(x, y) {xx = 0;}
CBomb::CBomb(int x, int y,int z) : CGameObject(x, y),xx(z) 
{
}

CBomb::~CBomb(void)
{
}
BOOL CBomb::LoadImage()
{
	return CGameObject::LoadImage(m_Images,IDB_BOMB,RGB(0,0,0),10,20,1);
}
BOOL CBomb::Draw(CDC* pDC,BOOL bPause)
{
	if(!bPause)
	{
		m_ptPos.y = m_ptPos.y - 12;
		m_ptPos.x = m_ptPos.x - xx;
	}

	if(m_ptPos.y < -BOMB_HEIGHT)
		return FALSE;

	m_Images.Draw(pDC,0,m_ptPos,ILD_TRANSPARENT);

	return TRUE;
}
修改后为:
点击查看代码
#include "StdAfx.h"
#include "Bomb.h"
#include "resource.h"

CImageList CBomb::m_Images;

CBomb::CBomb(int x, int y, int z) : CGameObject(x, y), xx(z)
{
}

CBomb::~CBomb(void)
{
}

BOOL CBomb::LoadImage()
{
	return CGameObject::LoadImage(m_Images, IDB_BOMB, RGB(0, 0, 0), 10, 20, 1);
}

BOOL CBomb::Draw(CDC* pDC, BOOL bPause)
{
	const int BOMB_MOVE_SPEED = 12;

	if (!bPause)
	{
		m_ptPos.y -= BOMB_MOVE_SPEED;
		m_ptPos.x -= xx;
	}

	if (m_ptPos.y < -BOMB_HEIGHT)
	{
		return FALSE;
	}

	m_Images.Draw(pDC, 0, m_ptPos, ILD_TRANSPARENT);

	return TRUE;
}

修改后代码更加清晰,修改了一点点小bug。 该小游戏众多文件中均出现魔法数值硬编码的情况,将数字定义成常量进行修改,与上面类似,不一一列举。 Enemy.cpp文件中代码结构不清晰,对代码进行重构以提高可读性和维护性。 源代码如下:
点击查看代码
#include "StdAfx.h"
#include "Enemy.h"
#include "resource.h"

CImageList CEnemy::m_Images;

CEnemy::CEnemy(void)
{
	//随机确定X位置
	m_ptPos.x = rand()%(GAME_WIDTH-ENEMY_HEIGHT)+1;

	m_ptPos.y=-ENEMY_HEIGHT;

	m_nMotion = 1;
	//随机确定速度
	m_V = rand()%6+1;
	enemyHP = 30;
	m_nWait=0;
}

CEnemy::~CEnemy(void)
{
}
BOOL CEnemy::LoadImage()
{
	return CGameObject::LoadImage(m_Images,IDB_ENEMY,RGB(0,0,0),35,35,2);
}
BOOL CEnemy::Draw(CDC* pDC,BOOL bPause)
{
	m_nWait++;
	if(m_nWait>10)
		m_nWait=0;

	if(!bPause)
	{
		m_ptPos.y = m_ptPos.y + m_nMotion* m_V;
	}

	if(m_ptPos.y > GAME_HEIGHT+ENEMY_HEIGHT )
		return FALSE;
	if(m_ptPos.y < -ENEMY_HEIGHT)
		return FALSE;

	m_Images.Draw(pDC,0,m_ptPos,ILD_TRANSPARENT);
	pDC->FillSolidRect(m_ptPos.x + 2, m_ptPos.y - 6, 30, 2, RGB(255, 0, 0));
	pDC->FillSolidRect(m_ptPos.x + 2, m_ptPos.y - 6,enemyHP, 2, RGB(0, 255, 0));

	return TRUE;
}
BOOL CEnemy::Fired()
{
	if(m_nWait==0)
		return TRUE;
	else
		return FALSE;
}
修改后如下:
点击查看代码
#include "StdAfx.h"
#include "Enemy.h"
#include "resource.h"

CImageList CEnemy::m_Images;

CEnemy::CEnemy()
{
	m_ptPos.x = rand() % (GAME_WIDTH - ENEMY_HEIGHT) + 1;
	m_ptPos.y = -ENEMY_HEIGHT;
	m_nMotion = 1;
	m_V= rand() % 6 + 1; // 随机速度范围为1到6
	enemyHP = 30;
	m_nWait = 0;
}

CEnemy::~CEnemy()
{
}

BOOL CEnemy::LoadImage()
{
	return CGameObject::LoadImage(m_Images, IDB_ENEMY, RGB(0, 0, 0), 35, 35, 2);
}

BOOL CEnemy::Draw(CDC* pDC, BOOL bPause)
{
	m_nWait = (m_nWait + 1) % 10;

	if (!bPause)
	{
		m_ptPos.y = m_ptPos.y + m_nMotion * m_V;
	}

	if (m_ptPos.y > GAME_HEIGHT + ENEMY_HEIGHT || m_ptPos.y < -ENEMY_HEIGHT)
	{
		return FALSE;
	}

	m_Images.Draw(pDC, 0, m_ptPos, ILD_TRANSPARENT);
	pDC->FillSolidRect(m_ptPos.x + 2, m_ptPos.y - 6, 30, 2, RGB(255, 0, 0));
	pDC->FillSolidRect(m_ptPos.x + 2, m_ptPos.y - 6, enemyHP, 2, RGB(0, 255, 0));

	return TRUE;
}

BOOL CEnemy::Fired()
{
	return m_nWait == 0;
}

GameObject.cpp文件中缺少对资源的释放:在LoadImage函数中加载了位图资源,但没有对资源进行释放,可能导致内存泄漏问题。
错误处理不完善,在LoadImage函数中,没有对位图加载失败的情况进行处理,添加相应的错误处理逻辑。
参数传递不够灵活,LoadImage函数的参数列表较长,可以考虑将一些参数封装成结构体或者类,以提高代码的可读性和可维护性。
源代码如下:

点击查看代码
// GameObject.cpp : 实现文件
//

#include "stdafx.h"
#include "GameObject.h"


// CGameObject


CGameObject::CGameObject(int x,int y):m_ptPos(x,y)
{
	
}
CGameObject::~CGameObject()
{
}
BOOL CGameObject::LoadImage(CImageList& imgList,UINT bmpID,COLORREF crMask,int cx,int cy,int nInitial)
{
	CBitmap bmp;
	if(!bmp.LoadBitmap(bmpID))
		return FALSE;

	if(!imgList.Create(cx, cy, ILC_COLOR24|ILC_MASK, nInitial, 0))
		return FALSE;
	

	imgList.Add(&bmp, crMask);

	return TRUE;
}
修改后如下:
点击查看代码
#include "stdafx.h"
#include "GameObject.h"

CGameObject::CGameObject(int x, int y) : m_ptPos(x, y)
{
}

CGameObject::~CGameObject()
{
}

BOOL CGameObject::LoadImage(CImageList& imgList, UINT bmpID, COLORREF crMask, int cx, int cy, int nInitial)
{
    CBitmap bmp;
    if (!bmp.LoadBitmap(bmpID))
    {
        return FALSE;
    }

    if (!imgList.Create(cx, cy, ILC_COLOR24 | ILC_MASK, nInitial, 0))
    {
        return FALSE;
    }

    if (imgList.Add(&bmp, crMask) == -1)
    {
        return FALSE;
    }

    bmp.DeleteObject(); // 释放位图资源

    return TRUE;
}

由于游戏主体文件PlaneGameView.cpp过大,对游戏主体文件PlaneGameView.cpp文件没有进行大量修改,只是修改一些代码使程序更加稳定,bug减少,修改后运行界面与初始差距不大,不重复进行展示。 总结: 修改过程中分析现有代码的不足之处,并思考如何进行修改或重构,通过网络查询与书记翻阅,慢慢解决现有问题,并进行改进,对我提升很大。 逆向软件工程有助于理解现有代码结构,通过分析现有代码,我能大致了解到飞机大作战游戏的基本架构和设计模式。 还可以帮助我发现代码中的潜在问题和改进空间,进行代码结构的优化,减少bug产生。 通过逆向分析和修改现有代码,我学习到了其他开发者的设计思路和实现方法,有助于提升我的编程能力和理解能力,非常有实际意义。

标签:return,ptPos,int,CBomb,大战,改进,小游戏,include,CGameObject
From: https://www.cnblogs.com/LL2252326/p/18057413

相关文章

  • 基于c++的排雷小游戏二次开发
    源代码地址https://blog.csdn.net/weixin_45906253/article/details/121237647?spm=1001.2101.3001.6650.9&utm_medium=distribute.pc_relevant.none-task-blog-2~default~BlogCommendFromBaidu~Rate-9-121237647-blog-129464051.235^v43^pc_blog_bottom_relevance_base7&......
  • Java11改进的垃圾回收器
       传统的C/C++等编程语言,需要程序员负责回收已经分配的内存。显示进行垃圾回收是一件比较困难的事情,因为程序员并不总是知道内存应该何时被释放。如果一些分配出去的内存得不及时回收,就会引起系统运行速度下降,甚至导致程序瘫痪,这种现象被称为内存泄漏。总体而言,显示进行垃圾......
  • MATLAB数据挖掘用改进的K-Means(K-均值)聚类算法分析高校学生的期末考试成绩数据
    全文链接:http://tecdat.cn/?p=30832原文出处:拓端数据部落公众号本文首先阐明了聚类算法的基本概念,介绍了几种比较典型的聚类算法,然后重点阐述了K-均值算法的基本思想,对K-均值算法的优缺点做了分析,回顾了对K-均值改进方法的文献,最后在Matlab中应用了改进的K-均值算法对数据进行了......
  • 简易的射击坦克小游戏(easyx)的而从开发
    引言在网上看到了一个利用easyx图形库制作的简易射击游戏,并下载源码体验了一下之后发现存在以下缺点:1.鼠标点击之后发射的激光速度很慢,有一种很卡的感觉,影响游戏体验感。2.玩家移动过于缓慢,同样给玩家一种很卡的感觉。3.对于发射激光的图形即飞机......
  • 基于JAVA的2048小游戏的二次开发
    引言《2048Numberpuzzlegame》是一款数字益智游戏,而《2048》的初始数字则是由2+2组成的基数4。在操作方面的不同则表现为一步一格的移动,变成更为爽快的一次到底。相同数字的方框在靠拢、相撞时会相加。系统给予的数字方块不是2就是4,玩家要想办法在这小小的16格范围中凑出「2048」......
  • C语言“贪吃蛇”小游戏二次开发
    引言当谈到经典的电子游戏时,贪吃蛇(Snake)无疑是首选之一。贪吃蛇游戏以简单却具有挑战性的玩法深受玩家喜爱。在游戏中,玩家需要操控一条蛇在游戏界面上不断移动,吃掉食物并尽可能长大,同时避免撞到墙壁或者自己的身体。其简单却耐玩的特点使得贪吃蛇成为了许多人童年时的美好回忆。......
  • c语言项目 球球大作战(简易版)小游戏的二次开发
    引言《球球大作战》虽然在玩法上类似于大球吃小球的模式看起来很单薄,但是在游戏过程中会出现无数种意外情况,这就需要玩家运用一系列策略来达到不被吃和吃掉别人球的目的,大大增加了游戏的耐玩性。游戏彻底抛弃了枯燥无味的单机模式,采取全球玩家联网实时对战。当竞技在PC端打的火热......
  • 关于台历程序的逆向编程与改进
    1.来源https://zhuanlan.zhihu.com/p/3963903242.运行环境VSCODEc语言运行结果:3.主要问题:用户不可以自定义显示自己想要查看的年份月份不同国家的用户兼容性缺失代码不够模块化,扩展性不足改进:添加了用户输入功能,用户可以输入特定的年份和月份来显示指定月份的日历。......
  • java Flappy Bird小游戏二次开发
    引言FlappyBird是一款广为人知的经典小游戏,以其简单的操作方式和高难度挑战吸引了全球数百万玩家。游戏的核心机制非常直接——玩家通过点击屏幕使小鸟飞翔,避免碰撞到上下移动的管道,同时尽可能地飞行得更远。这种看似简单的游戏设计隐藏了深层的挑战性和上瘾性,让人不禁一试再试......
  • C语言贪吃蛇小游戏
    #include<stdio.h>#include<graphics.h>//里面有easyX图形库函数#include<conio.h>#include<time.h>#include<mmsystem.h>//#pragmacomment(lib,"winmm.lib")/******************************结构体*****************************......