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

📄 game.cpp

📁 一个类似坦克大战的小小游戏
💻 CPP
📖 第 1 页 / 共 3 页
字号:
		
		// Witch type of enemy ship will come into the world?
		// LuggerPC's probability	: 20%
	    // Jalor's probability		: 30%
	    // Arrow's probability		: 20%
	    // Tortoise's probability	: 10%
	    // Business's probability	: 10%
	    // Transport's probability	: 10%
	
		int nShipIndex = ::rand() % 100;
		if ((nShipIndex < 20) && (nShipIndex >= 0))
		{
			// Create LuggerPc
			enemyShip.m_nSpeed = 1;
			enemyShip.m_dwScore = 5;
			enemyShip.m_nSpeedTemp = 1;
			enemyShip.m_nBulletPower = 1;
			enemyShip.m_nBulletCount = 2;
			enemyShip.m_nHp = 2;
			enemyShip.m_nShipType = LuggerPC;
			enemyShip.m_pTexture = m_pResource->m_textureWarship[6].m_pTexture;
			enemyShip.m_nWidth = m_pResource->m_textureWarship[6].m_nWidth;
			enemyShip.m_nHeight = m_pResource->m_textureWarship[6].m_nHeight;
			enemyShip.m_nTextureIndex = 4;
		}
		else if ((nShipIndex < 50) && (nShipIndex >= 20))
		{
			// Create Jalor
			enemyShip.m_nSpeed = 2;
			enemyShip.m_dwScore = 7;
			enemyShip.m_nSpeedTemp = 2;
			enemyShip.m_nBulletPower = 2;
			enemyShip.m_nBulletCount = 2;
			enemyShip.m_nHp = 3;
			enemyShip.m_nShipType = Jalor;
			enemyShip.m_pTexture = m_pResource->m_textureWarship[10].m_pTexture;
			enemyShip.m_nWidth = m_pResource->m_textureWarship[10].m_nWidth;
			enemyShip.m_nHeight = m_pResource->m_textureWarship[10].m_nHeight;
			enemyShip.m_nTextureIndex = 8;
		}
		else if ((nShipIndex < 70) && (nShipIndex >= 50))
		{
			// Create Arrow
			enemyShip.m_nSpeed = 3;
			enemyShip.m_dwScore = 7;
			enemyShip.m_nSpeedTemp = 3;
			enemyShip.m_nBulletPower = 2;
			enemyShip.m_nBulletCount = 2;
			enemyShip.m_nHp = 3;
			enemyShip.m_nShipType = Arrow;
			enemyShip.m_pTexture = m_pResource->m_textureWarship[14].m_pTexture;
			enemyShip.m_nWidth = m_pResource->m_textureWarship[14].m_nWidth;
			enemyShip.m_nHeight = m_pResource->m_textureWarship[14].m_nHeight;
			enemyShip.m_nTextureIndex = 12;
		}
		else if ((nShipIndex < 80) && (nShipIndex >= 70))
		{
			// Create Tortoise
			enemyShip.m_nSpeed = 1;
			enemyShip.m_dwScore = 12;
			enemyShip.m_nSpeedTemp = 1;
			enemyShip.m_nBulletPower = 5;
			enemyShip.m_nBulletCount = 3;
			enemyShip.m_nHp = 10;
			enemyShip.m_nShipType = Tortoise;
			enemyShip.m_pTexture = m_pResource->m_textureWarship[18].m_pTexture;
			enemyShip.m_nWidth = m_pResource->m_textureWarship[18].m_nWidth;
			enemyShip.m_nHeight = m_pResource->m_textureWarship[18].m_nHeight;
			enemyShip.m_nTextureIndex = 16;
		}
		else if ((nShipIndex < 90) && (nShipIndex >= 80))
		{
			// Create Business
			enemyShip.m_nSpeed = 2;
			enemyShip.m_dwScore = 7;
			enemyShip.m_nSpeedTemp = 2;
			enemyShip.m_nBulletPower = 2;
			enemyShip.m_nBulletCount = 2;
			enemyShip.m_nHp = 4;
			enemyShip.m_nShipType = Business;
			enemyShip.m_pTexture = m_pResource->m_textureWarship[22].m_pTexture;
			enemyShip.m_nWidth = m_pResource->m_textureWarship[22].m_nWidth;
			enemyShip.m_nHeight = m_pResource->m_textureWarship[22].m_nHeight;
			enemyShip.m_nTextureIndex = 20;
		}
		else
		{
			// Create Transport
			enemyShip.m_nSpeed = 1;
			enemyShip.m_dwScore = 12;
			enemyShip.m_nSpeedTemp = 1;
			enemyShip.m_nBulletPower = 2;
			enemyShip.m_nBulletCount = 2;
			enemyShip.m_nHp = 4;
			enemyShip.m_nShipType = Transport;
			enemyShip.m_pTexture = m_pResource->m_textureWarship[26].m_pTexture;
			enemyShip.m_nWidth = m_pResource->m_textureWarship[26].m_nWidth;
			enemyShip.m_nHeight = m_pResource->m_textureWarship[26].m_nHeight;
			enemyShip.m_nTextureIndex = 24;
		}

		// Add the ship into the list
		m_listEnemy.push_back(enemyShip);
		m_nEnemyCount++;
		m_timeCreateEnemy = timeGetTime();
	}
}

// Process enemy ship //////////////////////////////////////////////

void CGame::ProcessEnemy()
{
	CreateEnemy();

	list<CComputerShip>::iterator itrEnemy;
	for (itrEnemy = m_listEnemy.begin(); itrEnemy != m_listEnemy.end(); itrEnemy++)
	{
		if ((itrEnemy->m_nHp <= 0) && (itrEnemy->m_nBulletOut == 0))
		{
			// Enemy's dead, delete from the list
			m_nEnemyKilled++;	
			list<CComputerShip>::iterator itrTemp;
			itrTemp = itrEnemy++;
			m_listEnemy.erase(itrTemp);
			m_nEnemyCount--;
			if (itrEnemy == m_listEnemy.end())
			{
				break;
			}
		}
		else if (itrEnemy->m_nHp > 0) // Process
		{
			if (timeGetTime() - itrEnemy->m_timeInSeaweed > 300)
			{
				itrEnemy->m_nSpeed = itrEnemy->m_nSpeedTemp;
				itrEnemy->m_timeInSeaweed = false;
			}

			// Move
			switch (itrEnemy->m_nDirection)
			{
			case 0:		// Move up
				{
					itrEnemy->MoveUp(m_pResource);
					break;
				}
			case 1:		// Turn right
				{
					itrEnemy->MoveRight(m_pResource);
					break;
				}
			case 2:		// Move down
				{
					itrEnemy->MoveDown(m_pResource);
					break;
				}
			case 3:		// Turn left
				{
					itrEnemy->MoveLeft(m_pResource);
					break;
				}
			} // End switch

			// Change direction
			list<CGameObject>::iterator itrScenery;
			bool bChange = false;
			for (itrScenery = m_listScenery.begin(); itrScenery != m_listScenery.end(); itrScenery++)
			{
				if (itrEnemy->HitTest(*itrScenery))
				{
					if (itrScenery->m_objType == OT_Seaweed)
					{
						bChange = false;
						itrEnemy->m_nSpeed = 1;
						itrEnemy->m_bIsInSeaweed = true;
						itrEnemy->m_timeInSeaweed = timeGetTime();
					}
					else
					{
						bChange = true;
						break;
					}
				}
			}
			if ((timeGetTime() - itrEnemy->m_timeChange > 1000) || bChange)	
			{
				itrEnemy->ChangeDirection();
				itrEnemy->m_timeChange = timeGetTime();
			}
			if (itrEnemy->m_nX < 0)
			{
				itrEnemy->m_nDirection = 1;
			}
			else if (itrEnemy->m_nY < 0)
			{
				itrEnemy->m_nDirection = 2;
			}
			else if (itrEnemy->m_nX + itrEnemy->m_nWidth > 960)
			{
				itrEnemy->m_nDirection = 3;
			}
			else if (itrEnemy->m_nY + itrEnemy->m_nHeight > 540)
			{
				itrEnemy->m_nDirection = 0;
			}

			// Fire
			itrEnemy->Fire(m_pResource, m_pSound);

			m_listSort.push_back(*itrEnemy);
		}
		else if (itrEnemy->m_nHp <= 0 && !itrEnemy->m_bIsExplode)
		{
			// Draw fireworks
			CFireworks fireworks;
			fireworks.m_objType = OT_FireworksNormal;
			fireworks.m_pTexture = m_pResource->m_textureFireworks[1].m_pTexture;
			fireworks.m_vectorPos.x = (float)itrEnemy->m_nX;
			fireworks.m_vectorPos.y = (float)itrEnemy->m_nY;
			fireworks.m_vectorPos.z = 0.0f;
			m_listFireworks.push_back(fireworks);
			m_pSound->Play(ST_Explode);
			itrEnemy->m_bIsExplode = true;

			// Create Bonus
			if (itrEnemy->m_nShipType == Business)
			{
				CreateBonus(itrEnemy->m_nX, itrEnemy->m_nY);
			}
		}

		// Add active bullet of the enemy into the sort list.
		int nBulletCount;
		for (nBulletCount = 0; nBulletCount < itrEnemy->m_nBulletCount; nBulletCount++)
		{
			if (itrEnemy->m_bullet[nBulletCount].m_bActive)
			{
				m_listSort.push_back(itrEnemy->m_bullet[nBulletCount]);
			}
		}
	}
}

// Create Bonus ////////////////////////////////////////////////////

void CGame::CreateBonus(int &x, int &y)
{
	if (::rand() % 10 < 7)	// Probability 70% 
	{
		int i = 0;
		for (int i = 0; i < 3; i++)
		{
			if (!m_bonus[i].m_bActive)
			{
				m_bonus[i].m_nX = x;
				m_bonus[i].m_nY = y;
				m_bonus[i].m_bActive = true;
				m_bonus[i].m_objType = OT_Bonus;

				switch (::rand() % 8)
				{
				case 0:		// Level up
					{
						m_bonus[i].m_pTexture = m_pResource->m_textureBonus[0].m_pTexture;
						m_bonus[i].m_nIndex = 0;
						break;
					}
				case 1:		// Player ship++
					{
						m_bonus[i].m_pTexture = m_pResource->m_textureBonus[1].m_pTexture;
						m_bonus[i].m_nIndex = 1;
						break;
					}
				case 2:		// HP + 1
					{
						m_bonus[i].m_pTexture = m_pResource->m_textureBonus[2].m_pTexture;
						m_bonus[i].m_nIndex = 2;
						break;
					}
				case 3:		// HP + 2
					{
						m_bonus[i].m_pTexture = m_pResource->m_textureBonus[3].m_pTexture;
						m_bonus[i].m_nIndex = 3;
						break;
					}
				case 4:		// Power + 1
					{
						m_bonus[i].m_pTexture = m_pResource->m_textureBonus[4].m_pTexture;
						m_bonus[i].m_nIndex = 4;
						break;
					}
				case 5:		// Power + 2
					{
						m_bonus[i].m_pTexture = m_pResource->m_textureBonus[5].m_pTexture;
						m_bonus[i].m_nIndex = 5;
						break;
					}
				case 6:		// Speed + 1
					{
						m_bonus[i].m_pTexture = m_pResource->m_textureBonus[6].m_pTexture;
						m_bonus[i].m_nIndex = 6;
						break;
					}
				case 7:		// Speed + 2
					{
						m_bonus[i].m_pTexture = m_pResource->m_textureBonus[7].m_pTexture;
						m_bonus[i].m_nIndex = 7;
						break;
					}
				} // End switch
				break;
			}
		}
	}
}

// Sort ////////////////////////////////////////////////////////////

void CGame::Sort()
{
	// Add the scenery into the sort list
	list<CGameObject>::iterator itrScenery;
	for (itrScenery = m_listScenery.begin(); itrScenery != m_listScenery.end(); itrScenery++)
	{
		if (itrScenery->m_nHp <= 0)
		{
			// Add fireworks into the list of fireworks
			CFireworks fireworks;
			fireworks.m_objType = OT_FireworksNormal;
			fireworks.m_pTexture = m_pResource->m_textureFireworks[1].m_pTexture;
			fireworks.m_vectorPos.x = (float)itrScenery->m_nX;
			fireworks.m_vectorPos.y = (float)itrScenery->m_nY;
			fireworks.m_vectorPos.z = 0.0f;
			m_listFireworks.push_back(fireworks);

			// Play exploded sound
			m_pSound->Play(ST_Explode);

			// Delete the object from scenery list.
			list<CGameObject>::iterator itrTemp;
			itrTemp = itrScenery++;
			m_listScenery.erase(itrTemp);
			if (itrScenery == m_listScenery.end())
			{
				break;
			}
		}
		else
		{
			// Add object to the sort list
			m_listSort.push_back(*itrScenery);
		}
	}

	int i, j;
	for (i = 0; i < 2; i++)
	{
		if (m_playerShip[i].m_bActive)
		{
			m_listSort.push_back(m_playerShip[i]);
			for (j = 0; j < m_playerShip[i].m_nBulletCount; j++)
			{
				if (m_playerShip[i].m_bullet[j].m_bActive)
				{
					m_listSort.push_back(m_playerShip[i].m_bullet[j]);
				}
			}
		}
	}

	// Sort
	m_listSort.sort();
}

// Release Game ////////////////////////////////////////////////////

void CGame::Release()
{
	m_listScenery.clear();
	m_listEnemy.clear();
	m_listSort.clear();
	m_listFireworks.clear();

	if (NULL != m_pMap)
	{
		SAFE_DELETE(m_pMap);
	}

	if (NULL != m_pMp3)
	{
		SAFE_DELETE(m_pMp3);	
	}

	if (NULL != m_pSound)
	{
		SAFE_DELETE(m_pSound);	
	}

	if (NULL != m_pInput)
	{
		SAFE_DELETE(m_pInput);	
	}

	if (NULL != m_pResource)
	{
		SAFE_DELETE(m_pResource);	
	}

	if (NULL != m_pGraphics)
	{
		SAFE_DELETE(m_pGraphics);	
	}
}

// Draw background ////////////////////////////////////////////////////////

void CGame::DrawBackground()
{
	// Draw sea
	int i, j;
	for (i = 0; i < 960; i += 64)
		for (j = 0; j < 580; j += 64)
		{
			m_backGround.Draw(m_pGraphics->Getd3dDevice(), i, j);
		}		
}

// Draw state /////////////////////////////////////////////////////////////

void CGame::DrawGameState(int inState)
{
	if ((NULL != m_pGraphics) && (NULL != m_pResource))
	{
		if (m_pGraphics->BeginScene())
		{
			m_pGraphics->DrawObject(m_pResource->m_textureState[inState].m_pTexture,
				0, 0, 960, 600, 0xffffffff);
			m_pGraphics->EndScene();
		}
	}
}

// Render /////////////////////////////////////////////////////////////////

void CGame::Render()
{
	if ((NULL != m_pGraphics) && (NULL != m_pResource))
	{
		Sort();
		if (m_pGraphics->BeginScene())
		{
			// Draw back ground first
			DrawBackground();
			list<CGameObject>::iterator itr;
			for (itr = m_listSort.begin(); itr != m_listSort.end(); itr++)
			{
				itr->Draw(m_pGraphics->Getd3dDevice());
			}
			int i;
			
			// Draw Bonus
			for (i = 0; i < 3; i++)
			{
				if (m_bonus[i].m_bActive)
				{
					m_bonus[i].Draw(m_pGraphics->Getd3dDevice());
				}
			}

			// Draw fireworks
			list<CFireworks>::iterator itrFireworks;
			list<CFireworks>::iterator itrTemp;
			for (itrFireworks = m_listFireworks.begin(); itrFireworks != m_listFireworks.end(); itrFireworks++)
			{
				if (OT_FireworksBullet == itrFireworks->m_objType)
				{
					itrFireworks->DrawBulletFireworks(m_pGraphics->GetSprite());
				}
				else
				{
					itrFireworks->DrawFireworks(m_pGraphics->GetSprite());
				}

				if (8 == itrFireworks->m_nFrame)
				{
					// Frames' over, remove it from the list.
					itrTemp = itrFireworks++;
					m_listFireworks.erase(itrTemp);
					if (itrFireworks == m_listFireworks.end())
					{
						break;
					}
				}
			}

			// Draw rect
			m_pGraphics->DrawObject(NULL, 0, 560, 960, 30, 0x66000000);
			m_pGraphics->EndScene();
		}

		m_listSort.clear();

		// Use GDI to draw score
		char strPlayer1[128];
		char strPlayer2[128];
		::wsprintf(strPlayer1, "Black Pearl  Ships:%d   HP:%d   Speed:%d   Power:%d   Score:%d",
				m_playerShip[0].m_nShipCount, m_playerShip[0].m_nHp, m_playerShip[0].m_nSpeed, 
				m_playerShip[0].m_nBulletPower, m_playerShip[0].m_dwScore);
		::wsprintf(strPlayer2, "Flying Dutchmen  Ships:%d   HP:%d   Speed:%d   Power:%d   Score:%d",
				m_playerShip[1].m_nShipCount, m_playerShip[1].m_nHp, m_playerShip[1].m_nSpeed, 
				m_playerShip[1].m_nBulletPower, m_playerShip[1].m_dwScore);
		HDC hdc = ::GetDC(m_hWnd);
		::SetBkMode(hdc , TRANSPARENT);
		::SetTextColor(hdc , RGB(255 , 255 ,255));
		::TextOut(hdc, 30, 570, strPlayer1, (int)strlen(strPlayer1));
		::TextOut(hdc, 510, 570, strPlayer2, (int)strlen(strPlayer2));
		::ReleaseDC(m_hWnd, hdc);
	}
}

⌨️ 快捷键说明

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