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

飞机大战小游戏来源:[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产生。 通过逆向分析和修改现有代码,我学习到了其他开发者的设计思路和实现方法,有助于提升我的编程能力和理解能力,非常有实际意义。
posted @   2252326  阅读(45)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示