⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 game.cpp

📁 泡泡堂单机版,可能被转载够很多次,不过这个是比较完整的,一个很好的学习材料.
💻 CPP
📖 第 1 页 / 共 5 页
字号:
#include "game.h"

CGame::CGame(void)
{
	m_pDraw = NULL;
	m_pSurface = NULL;
	m_pSurfacePlayer = NULL;
	m_pSurfaceWord = NULL;

	m_pInput = NULL;

	m_pSound = NULL;
	m_pBackgroundMusic = NULL;
	for (int i=0;i<SoundEffectNum;i++)
	{
		m_pSoundEffect[i] = NULL;
	}

	m_bWindowed = TRUE;
	m_bHelp = TRUE;
}

CGame::~CGame(void)
{
	delete	m_pDraw;
	delete	m_pSurface;
	delete	m_pSurfacePlayer;
	delete	m_pSurfaceWord;

	delete	m_pInput;

	for (int i=0;i<SoundEffectNum;i++)
	{
		delete	m_pSoundEffect[i];
	}
	delete	m_pBackgroundMusic;
	delete	m_pSound;
}

bool	CGame::Create(HWND	hWnd, HINSTANCE hInstance)
{
	m_hWnd = hWnd;
	m_pDraw = new CDraw;

	m_pDraw->CreateWindowedDisplay(m_hWnd,800,600);
	m_pDraw->CreateSurface(&m_pSurface,800,600);
	m_pSurface->DrawBitmap(".\\picture\\pic.bmp",800,600);
	m_pSurface->SetColorKey(RGB(255,0,255),RGB(255,0,255));

	m_pDraw->CreateSurface(&m_pSurfacePlayer,1040,248);
	m_pSurfacePlayer->DrawBitmap(".\\picture\\player.bmp",1040,248);
	m_pSurfacePlayer->SetColorKey(RGB(255,0,255),RGB(255,0,255));
	
	m_pDraw->CreateSurface(&m_pSurfaceWord,240,320);
	m_pSurfaceWord->DrawBitmap(".\\picture\\word.bmp",240,320);
	m_pSurfaceWord->SetColorKey(RGB(255,0,255),RGB(255,0,255));

	m_pInput = new CInput;
	m_pInput->Create(hWnd,hInstance);

	m_pSound = new CSound();
	m_pSound->Initialize(hWnd);

	m_pSound->InitialiseMP3(&m_pBackgroundMusic);
	m_pBackgroundMusic->Load("Pirate.mp3");

	char	filename[][255]={	"start.wav",
							"win.wav",
							"deuce.wav",
							"lost.wav",
							"lay.wav",
							"detonation.wav",
							"appear.wav",
							"get.wav",
							"die.wav"};

	for (int i=0;i<SoundEffectNum;i++)
	{
		m_pSound->InitialiseWavMidi(&m_pSoundEffect[i]);
		m_pSoundEffect[i]->Load(filename[i]);
	}

	ResetMapInfor();

	return	true;
}
HRESULT	CGame::Run()
{

	if (!(m_pBackgroundMusic->IsPlaying()))
	{
		m_pBackgroundMusic->Play();
	}

	if (m_GameCounter == 0 && m_GameState != GAME_FREE && m_GameState != GAME_START )
	{
		while (m_pSoundEffect[m_GameState]->IsPlaying())
		{
			//	等待播放结束
		}
		ResetMapInfor();
	}

	RECT	rect;
	int		i,j;

//	1.逻辑处理部分
	if (m_GameState == GAME_FREE || m_GameState == GAME_START)
	{
		DoInput();					//	处理按键
		DoMove();					//	处理角色移动
		DoProperty();				//	处理道具
		DoKill();
	}

/*
	for (i=0;i<PLAYER_NUM;i++)
	{
		if (m_Player[i].type != TYPE_NULL && m_Player[i].status == STATUS_DELAY)
		{
			m_Delay[i]--;
			if (m_Delay[i] == 0)
			{
				m_Player[i].status == STATUS_FREE;
			}
		}
	}
*/

	for (i=0;i<PLAYER_NUM;i++)		//	判断是否被炸
	{
		if (m_Player[i].type != TYPE_NULL && m_Player[i].status != STATUS_DIED && m_Player[i].status != STATUS_MOVE)
		{
			if (m_ScreenItem[(m_Player[i].y+20)/40][(m_Player[i].x+20)/40].type == 9)
			{
				m_Player[i].status = STATUS_DIED;
				m_Player[i].counter = 600;
			}
		}
	}

	//	判断游戏结果
	if (m_GameState == GAME_FREE)
	{
		int		computerdie = false;
		int		userdie = false;
		for (i=0;i<PLAYER_NUM;i++)
		{
			if (m_Player[i].type == TYPE_COMPUTER && m_Player[i].status == STATUS_DIED && m_Player[i].counter < 60)
			{
				computerdie = true;
			}
		}
		if (m_Player[0].status == STATUS_DIED && m_Player[0].counter < 60)
		{
			userdie = true;
		}
		if (computerdie && userdie)
		{
			m_GameState = GAME_DEUCE;
			m_GameCounter = DISPLAYCOUNTER;
		}
		else	if (computerdie && !userdie)
		{
			m_GameState = GAME_WIN;
			m_GameCounter = DISPLAYCOUNTER;
		}
		else	if (!computerdie && userdie)
		{
			m_GameState = GAME_LOST;
			m_GameCounter = DISPLAYCOUNTER;
		}
	}


	//	以下5个函数用于处理电脑玩家的人工智能(每移动一个格子判断一次,因为背景上的信息随时在改变)

	for (i=0;i<PLAYER_NUM;i++)
	{
		if (m_Player[i].type == TYPE_COMPUTER && m_Player[i].status == STATUS_FREE)
		{
			//	已经在整个格子上了,m_MoveCount[i]在走之前设置,走完一步之后减1

			if (!FindSafety(i))							//	查找一个安全的位置,找到后去躲藏
			{
				//	目前所站位置是安全的
//				if (!FindTeammateForRescue(i))			//	查找需要营救的队友的位置
				{
					if (!FindPropertyForGet(i))			//	查看道具的位置,若找到则去吃
					{
						if (!FindAdversaryForAttack(i))	//	查找对手的位置,找到后去攻击
						{
							if (!FindLay(i))				//	查找一个放置炸弹的位置,以便炸出一些道具
							{

							}
						}
					}
				}
			}

	//判断是否要放炸弹
			if (m_PlayerLay[i])
			{
				if (m_Player[i].x == m_LayX[i]*40 && m_Player[i].y == m_LayY[i]*40)
				{
					if ( (m_Player[i].bomb != 0) && 
						(m_ScreenItem[(m_Player[i].y+20)/40][(m_Player[i].x+20)/40].type!=7))
					{
						m_ScreenItem[(m_Player[i].y+20)/40][(m_Player[i].x+20)/40].type = 7;
						m_ScreenItem[(m_Player[i].y+20)/40][(m_Player[i].x+20)/40].counter = 180;
						m_ScreenItem[(m_Player[i].y+20)/40][(m_Player[i].x+20)/40].status = m_Player[i].power;
						m_ScreenItem[(m_Player[i].y+20)/40][(m_Player[i].x+20)/40].who = i;
						m_Player[i].bomb--;
					}
					m_PlayerLay[i] = false;
				}
			}

		}
	}


//	2.显示图形部分

	//	清除背景
	m_pDraw->Clear(0);

	//	框架窗口
	m_pDraw->Blt(0,0,m_pSurface);

	//	地面
	rect.top = 160;
	rect.bottom = 200;
	for(i=0;i<13;i++)
	{
		for(j=0;j<15;j++)
		{
			rect.left = 40+(i+j)%2*40;
			rect.right = 80+(i+j)%2*40;
			m_pDraw->Blt(j*40+19,i*40+40,m_pSurface,&rect);
		}
	}

	//	显示物体
	for(i=0;i<13;i++)
	{
		for(j=14;j>=0;j--)
		{
			switch(m_ScreenItem[i][j].type)
			{
			case 1:					//	木块
				rect.left = 120;
				rect.top = 120;
				rect.right = 160;
				rect.bottom = 200;
				m_pDraw->Blt(j*40+19,i*40,m_pSurface,&rect);
				if (j!=0)			//	左边阴影
				{
					rect.left = 480;
					rect.top = 348;
					rect.right = 480+5;
					rect.bottom = 348+39;
					m_pDraw->Blt(j*40+19-5,i*40+40+1,m_pSurface,&rect);
				}
				if (i!=12)			//	下边阴影
				{
					rect.top = 387;
					rect.right = 480+44;
					rect.bottom = 387+5;
					if (j == 0)
					{
						rect.left = 480+5;
						m_pDraw->Blt(j*40+19,i*40+40+40,m_pSurface,&rect);
					}
					else
					{
						rect.left = 480;
						m_pDraw->Blt(j*40+19-5,i*40+40+40,m_pSurface,&rect);
					}
				}
				break;
			case 2:					//	箱子

				//	判断箱子是否在运动,若是修改其坐标偏移量
				if (m_ScreenItem[i][j].counter != 0)
				{
					m_ScreenItem[i][j].counter--;
					switch(m_ScreenItem[i][j].way)
					{
					case WAY_UP:
						m_ScreenItem[i][j].yoffset = -40+m_ScreenItem[i][j].counter;
						if (m_ScreenItem[i][j].counter == 0)
						{
							m_ScreenItem[i-1][j].type = m_ScreenItem[i][j].type;
							m_ScreenItem[i-1][j].status = m_ScreenItem[i][j].status;
							m_ScreenItem[i-1][j].counter = m_ScreenItem[i][j].counter;
							m_ScreenItem[i][j].type = 0;
						}
						break;
					case WAY_DOWN:
						m_ScreenItem[i][j].yoffset = 40-m_ScreenItem[i][j].counter;
						if (m_ScreenItem[i][j].counter == 0)
						{
							m_ScreenItem[i+1][j].type = m_ScreenItem[i][j].type;
							m_ScreenItem[i+1][j].status = m_ScreenItem[i][j].status;
							m_ScreenItem[i+1][j].counter = m_ScreenItem[i][j].counter;
							m_ScreenItem[i][j].type = 0;
						}
						break;
					case WAY_LEFT:
						m_ScreenItem[i][j].xoffset = -40+m_ScreenItem[i][j].counter;
						if (m_ScreenItem[i][j].counter == 0)
						{
							m_ScreenItem[i][j-1].type = m_ScreenItem[i][j].type;
							m_ScreenItem[i][j-1].status = m_ScreenItem[i][j].status;
							m_ScreenItem[i][j-1].counter = m_ScreenItem[i][j].counter;
							m_ScreenItem[i][j].type = 0;
						}
						break;
					case WAY_RIGHT:
						m_ScreenItem[i][j].xoffset = 40-m_ScreenItem[i][j].counter;
						if (m_ScreenItem[i][j].counter == 0)
						{
							m_ScreenItem[i][j+1].type = m_ScreenItem[i][j].type;
							m_ScreenItem[i][j+1].status = m_ScreenItem[i][j].status;
							m_ScreenItem[i][j+1].counter = m_ScreenItem[i][j].counter;
							m_ScreenItem[i][j].type = 0;
						}
						break;
					default:
						break;
					}
				}
				rect.left = 160;
				rect.top = 120;
				rect.right = 200;
				rect.bottom = 200;
				m_pDraw->Blt(j*40+19+m_ScreenItem[i][j].xoffset,i*40+m_ScreenItem[i][j].yoffset,m_pSurface,&rect);
				if (j!=0)			//	左边阴影
				{
					rect.left = 480;
					rect.top = 348;
					rect.right = 480+5;
					rect.bottom = 348+39;
					m_pDraw->Blt(j*40+19-5+m_ScreenItem[i][j].xoffset,i*40+40+1+m_ScreenItem[i][j].yoffset,m_pSurface,&rect);
				}
				if (i!=12)			//	下边阴影
				{
					rect.top = 387;
					rect.right = 480+44;
					rect.bottom = 387+5;
					if (j == 0)
					{
						rect.left = 480+5;
						m_pDraw->Blt(j*40+19+m_ScreenItem[i][j].xoffset,i*40+40+40+m_ScreenItem[i][j].yoffset,m_pSurface,&rect);
					}
					else
					{
						rect.left = 480;
						m_pDraw->Blt(j*40+19-5+m_ScreenItem[i][j].xoffset,i*40+40+40+m_ScreenItem[i][j].yoffset,m_pSurface,&rect);
					}
				}
				break;
			case 3:					//	木桩
				rect.left = 200;
				rect.top = 120;
				rect.right = 240;
				rect.bottom = 200;
				m_pDraw->Blt(j*40+19,i*40,m_pSurface,&rect);
				break;
			case 4:					//	海盗旗
				if (m_ScreenItem[i][j].status == 0)
				{
					rect.left = 240;
					rect.top = 40;
					rect.right = 440;
					rect.bottom = 240;
					m_pDraw->Blt(5*40+19,2*40+40,m_pSurface,&rect);
				}
				break;
			case 7:					//	泡泡(静止的,相对于移动的而言)
				rect.left = 480+m_ScreenItem[i][j].counter/30%3*44;
				rect.top = 304;
				rect.right = 480+44+m_ScreenItem[i][j].counter/30%3*44;
				rect.bottom = 304+44;
				m_pDraw->Blt(j*40+19-2,i*40+40-4,m_pSurface,&rect);
				m_ScreenItem[i][j].counter--;
				if (m_ScreenItem[i][j].counter == 0)		//	泡泡爆炸
				{
					SetBlast(i,j);
					m_pSoundEffect[DETONATION]->Play();		//	播放爆炸音效
				}
				break;
			case 8:					//	道具
				if (m_ScreenItem[i][j].counter % 10 == 0)
				{
					if (m_ScreenItem[i][j].status == 0)			//	加
					{
						m_ScreenItem[i][j].yoffset++;
						if (m_ScreenItem[i][j].yoffset == 3)
						{
							m_ScreenItem[i][j].status = -1;
						}
					}
					else										//	减
					{
						m_ScreenItem[i][j].yoffset--;
						if (m_ScreenItem[i][j].yoffset == -3)
						{
							m_ScreenItem[i][j].status = 0;
						}
					}
				}

				rect.left = 120;
				rect.top = 40;
				rect.right = 120+20;
				rect.bottom = 40+20;
				if (m_ScreenItem[i][j].yoffset>0)
				{
					rect.left = 120+20;
					rect.right = 120+20+20;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -