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

📄 tankfighting.cpp

📁 坦克大战小游戏 控制说明: 玩家1相关控制: A/W/S/D:控制方向 F:开火 1 :玩家1复活 玩家2相关控制: UP/LEFT/RIGHT/DOWN:控制方
💻 CPP
📖 第 1 页 / 共 3 页
字号:
		
		m_tankexplored_vec.push_back( lpExplored );
		m_cur_tankexplored_count++;
		sound_fx[m_tank_explored_sound_id].dsbuffer->Play(0,0,0);
	}
	//玩家坦克子弹与电脑坦克相撞情况,电脑坦克被击毁
	else if ( slug_geometry.m_style == GS_PLAYER_SLUG &&
		dest_geometry.m_style == GS_COMPUTER_TANK )
	{
		m_cur_computer_count--;
		m_total_computer--;
		m_total_score += 20;

		if ( m_total_computer == 0 )
		{
			sound_fx[m_mission_acom_sound_id].dsbuffer->Play(0,0,0);		
		}

		//删除电脑坦克对应的几何体对象
		for ( it_geometry = m_geometry_vec.begin(); 
			  it_geometry != m_geometry_vec.end(); it_geometry++ )
		{
			if ( it_geometry->m_lpBoundingBox == dest_geometry.m_lpBoundingBox )
			{
				m_geometry_vec.erase(it_geometry);
				break;
			}
		}

		//删除电脑坦克对象
		for ( it_computer = m_computer_vec.begin(); 
			  it_computer != m_computer_vec.end(); it_computer++ )
		{
			if ( dest_geometry.m_lpBoundingBox == &(*it_computer)->GetBoundingBox() )
			{
				//产生一个爆破对象
				lpExplored  = new CExplored();

				if ( NULL == lpExplored )
				{
					PostMessage(main_window_handle,WM_QUIT,0,0);			
					return(0);
				}

				lpExplored->Create( (*it_computer)->GetPosition(), 
					TANKEXPLORED_PIC_CELL_WIDTH, TANKEXPLORED_PIC_CELL_HEIGHT,
					TANKEXPLORED_PIC_CELL_COUNT, &m_tankexplored_surface[0] );
		
				m_tankexplored_vec.push_back( lpExplored );	
				m_cur_tankexplored_count++;
				sound_fx[m_tank_explored_sound_id].dsbuffer->Play(0,0,0);

				//删除电脑坦克对象
				delete (*it_computer);
				m_computer_vec.erase(it_computer);
				break;
			}
		}

	}

	return(1);
}

INT CMyGameApplication::DoLogic( void )
{
	POINT pos;
	CComputerTank *lpTemp_computer;
	GEOMETRY	temp_geometry;

	//判断电脑坦克是否被击毁完,击毁完则认为玩家胜利
	if ( m_total_computer <= 0 )
	{
		if ( ! m_bGameStop )
		{
			m_bGameStop = TRUE;
		}

		DDraw_Draw_Surface(m_game_acom_surface,120,208, 
				GAME_ACOM_PIC_WIDTH, GAME_ACOM_PIC_HEIGHT, lpddsback,1);

		while (FAILED(lpddsprimary->Flip(NULL, DDFLIP_WAIT)));

		m_game_state	= GAME_LEVELUP;
	
	}
	//若电脑坦克未被击毁完,判断是否有坦克被击毁灭,根据总数情况,生成新的电脑坦克
	else if ( m_cur_computer_count < m_show_computer_count 
		    && m_total_computer >= m_show_computer_count )
	{
		for ( int i=0; i<m_show_computer_count-m_cur_computer_count; i++ )
		{
			int kind = rand()%(TANK_KIND_NUM-1) + 1;

		
			lpTemp_computer = new CComputerTank();

			if ( NULL == lpTemp_computer )
			{
				PostMessage(main_window_handle,WM_QUIT,0,0);
				return(0);
			}

			pos.x = rand()%((MAP_REGION.right - MAP_REGION.left)/2) + MAP_REGION.left + 5*TANK_PIC_CELL_WIDTH;
			pos.y = rand()%((MAP_REGION.bottom - MAP_REGION.top)/2) + MAP_REGION.top + 5*TANK_PIC_CELL_WIDTH;

			while ( !lpTemp_computer->Create( kind, 0, pos, &m_tank_surface[0][0], &MAP_REGION, 
						&m_geometry_vec ) )
			{
				pos.x = rand()%((MAP_REGION.right - MAP_REGION.left)/2) + MAP_REGION.left + 5*TANK_PIC_CELL_WIDTH;
				pos.y = rand()%((MAP_REGION.bottom - MAP_REGION.top)/2) + MAP_REGION.top + 5*TANK_PIC_CELL_WIDTH;
			}	

			temp_geometry.m_lpBoundingBox = &lpTemp_computer->GetBoundingBox();
			temp_geometry.m_style = GS_COMPUTER_TANK;
			temp_geometry.m_objectID = 20000+i;
			m_geometry_vec.push_back(temp_geometry);

			m_computer_vec.push_back(lpTemp_computer);			
		}

		m_cur_computer_count = m_show_computer_count;
	}

	//判断玩家坦克数量是否被击毁完,击毁完则认为玩家失败
	if ( m_total_player <= 0 )
	{
		if ( ! m_bGameStop )
		{
			m_bGameStop = TRUE;
		}

		DDraw_Draw_Surface(m_game_fail_surface,120,208, 
				GAME_FAIL_PIC_WIDTH, GAME_FAIL_PIC_HEIGHT, lpddsback,1);

		while (FAILED(lpddsprimary->Flip(NULL, DDFLIP_WAIT)));

		m_game_state	= GAME_OVER;
	}
	//若未被击毁完,判断玩家当前是否死亡,死亡的话则将玩家坦克重新设置
	else if ( m_bPlayerDie)
	{
		pos.x = rand()%((MAP_REGION.right - MAP_REGION.left)/2) + MAP_REGION.left + 5*TANK_PIC_CELL_WIDTH;
		pos.y = rand()%((MAP_REGION.bottom - MAP_REGION.top)/2) + MAP_REGION.top + 5*TANK_PIC_CELL_WIDTH;
		
		while ( ! m_player.SetPosition(pos) )
		{
			pos.x = rand()%((MAP_REGION.right - MAP_REGION.left)/2) + MAP_REGION.left + 5*TANK_PIC_CELL_WIDTH;
			pos.y = rand()%((MAP_REGION.bottom - MAP_REGION.top)/2) + MAP_REGION.top + 5*TANK_PIC_CELL_WIDTH;	
		}

		temp_geometry.m_lpBoundingBox = &m_player.GetBoundingBox();
		temp_geometry.m_style = GS_PLAYER_TANK;
		temp_geometry.m_objectID = 10000;
		m_geometry_vec.push_back(temp_geometry);

		m_bPlayerDie = FALSE;
	}


	return(1);
}

int	 CMyGameApplication::ReleaseObjects( void )
{
	vector<CBarrier *>::iterator it_barrier;
	vector<CSlug *>::iterator it_slug;
	vector<CComputerTank *>::iterator it_computer;
	vector<CExplored *>::iterator it_explored;

	while ( m_geometry_vec.begin() != m_geometry_vec.end() )
	{ 
		m_geometry_vec.pop_back();
	}

	for ( it_barrier = m_barrier_vec.begin(); 
			it_barrier != m_barrier_vec.end(); it_barrier++ )
	{
		delete (*it_barrier);
	}

	while ( !m_barrier_vec.empty() )
	{
	    m_barrier_vec.pop_back();
	}

	for ( it_slug = m_slug_vec.begin(); 
			it_slug != m_slug_vec.end(); it_slug++ )
	{
		delete (*it_slug);
	}

	while ( ! m_slug_vec.empty() )
	{
	    m_slug_vec.pop_back();
	}

	for ( it_computer = m_computer_vec.begin(); 
			it_computer != m_computer_vec.end(); it_computer++ )
	{
		delete (*it_computer);
	}

	while ( ! m_computer_vec.empty() )
	{
	    m_computer_vec.pop_back();
	}

	for ( it_explored = m_tankexplored_vec.begin(); 
			it_explored != m_tankexplored_vec.end(); it_explored++ )
	{
		delete (*it_explored);
	}

	while ( ! m_tankexplored_vec.empty() )
	{
	    m_tankexplored_vec.pop_back();
	}

	return(1);
}

INT	 CMyGameApplication::GameLevelUp( void )
{
	POINT pos;
	GEOMETRY temp_geometry;
	CComputerTank *lpTemp_computer;

	if ( KEYDOWN(VK_ESCAPE) )
	{
		ShowCursor(TRUE);
		ReleaseObjects();
		m_game_state = GAME_MENU;

		return(0);
	}

	if ( !KEYDOWN(VK_RETURN) )
	{
		return(0);
	}

	//清空当前所有动态对象
	ReleaseObjects();	

	m_cur_computer_count = 0;
    m_cur_slug_count = 0;
	m_cur_tankexplored_count = 0;

	//过关后,局数增加
	m_game_level++;
	//障碍物减少1
	m_barrier_count--;
	if ( m_barrier_count < 0)
	{
		m_barrier_count = 0;
	}
	//电脑坦克总数增加5个
	m_total_computer = 10 + 5*(m_game_level-1);
	//可显示电脑数目增加1个
	m_show_computer_count++;
	//过三关奖励玩家一辆坦克
	if ( 0 == (m_game_level-1) % 2 ) 
		m_total_player++;


	m_bPlayerDie = FALSE;
    m_bGameStop = FALSE;

	//产生随机地图
	MakeRandomMap();

	//随机产生1辆玩家坦克
	pos.x = rand()%((MAP_REGION.right - MAP_REGION.left)/2) + MAP_REGION.left + 5*TANK_PIC_CELL_WIDTH;
	pos.y = rand()%((MAP_REGION.bottom - MAP_REGION.top)/2) + MAP_REGION.top + 5*TANK_PIC_CELL_WIDTH;
	while ( ! m_player.Create( 0, 0, pos, &m_tank_surface[0][0], &MAP_REGION, 
						&m_geometry_vec ) )
	{
		pos.x = rand()%((MAP_REGION.right - MAP_REGION.left)/2) + MAP_REGION.left + 5*TANK_PIC_CELL_WIDTH;
		pos.y = rand()%((MAP_REGION.bottom - MAP_REGION.top)/2) + MAP_REGION.top + 5*TANK_PIC_CELL_WIDTH;
	}

	temp_geometry.m_lpBoundingBox = &m_player.GetBoundingBox();
	temp_geometry.m_style = GS_PLAYER_TANK;
	temp_geometry.m_objectID = 10000;
	m_geometry_vec.push_back(temp_geometry);

	//随机产生可见的电脑坦克,与玩家坦克区别
	
	for (int i=0; i<m_show_computer_count; i++)
	{
		int kind = rand()%(TANK_KIND_NUM-1) + 1;
		
		lpTemp_computer = new CComputerTank();

		if ( NULL == lpTemp_computer )
		{
			PostMessage(main_window_handle,WM_QUIT,0,0);
			return(0);
		}

		pos.x = rand()%((MAP_REGION.right - MAP_REGION.left)/2) + MAP_REGION.left + 5*TANK_PIC_CELL_WIDTH;
		pos.y = rand()%((MAP_REGION.bottom - MAP_REGION.top)/2) + MAP_REGION.top + 5*TANK_PIC_CELL_WIDTH;

		while ( !lpTemp_computer->Create( kind, 0, pos, &m_tank_surface[0][0], &MAP_REGION, 
						&m_geometry_vec ) )
		{
			pos.x = rand()%((MAP_REGION.right - MAP_REGION.left)/2) + MAP_REGION.left + 5*TANK_PIC_CELL_WIDTH;
			pos.y = rand()%((MAP_REGION.bottom - MAP_REGION.top)/2) + MAP_REGION.top + 5*TANK_PIC_CELL_WIDTH;
		}

		temp_geometry.m_lpBoundingBox = &lpTemp_computer->GetBoundingBox();
		temp_geometry.m_style = GS_COMPUTER_TANK;
		temp_geometry.m_objectID = 20000+i;
		m_geometry_vec.push_back(temp_geometry);

		m_computer_vec.push_back(lpTemp_computer);

		m_cur_computer_count++;

	}

	m_game_state = GAME_RUNNING;

	return(1);
}

INT CMyGameApplication::GameOver( void )
{
	if ( KEYDOWN(VK_ESCAPE) )
	{
		ShowCursor(TRUE);
		ReleaseObjects();
		m_game_state = GAME_MENU;

		return(0);
	}

	if ( ! KEYDOWN(VK_RETURN) )
	{
		return(0);	
	}

	m_game_state = GAME_RESTART;
}

INT CMyGameApplication::GameRestart( void )
{
	ReleaseObjects();

    DDraw_Draw_Surface(m_background_surface_game,0,0, SCREEN_WIDTH, SCREEN_HEIGHT, lpddsback,0);

	while (FAILED(lpddsprimary->Flip(NULL, DDFLIP_WAIT)));	

	m_game_state = GAME_INIT;

	return(1);
}

INT CMyGameApplication::GameShutDown( void )
{
	int i, j;

	ReleaseObjects();


	//清除资源
	if ( NULL != m_background_surface_menu )
	{
		
		m_background_surface_menu->Release();
		m_background_surface_menu = NULL;
	}

	if ( NULL != m_background_surface_game )
	{
		m_background_surface_game->Release();
		m_background_surface_game = NULL;
	}

	for (i=0; i<MENU_ITEM_NUM; i++)
	{
		if ( NULL != m_menuitem_surface[i] )
		{
			m_menuitem_surface[i]->Release();
			m_menuitem_surface[i] = NULL;
		}
	}

	for (i=0; i<TANK_KIND_NUM; i++)
	{
		for (j=0; j<TANK_PIC_CELL_COUNT; j++)
		{
			if ( NULL != m_tank_surface[i][j] )
			{
				m_tank_surface[i][j]->Release();
				m_tank_surface[i][j] = NULL;
			}		
		}
	}

	for (i=0; i<SLUG_PIC_CELL_COUNT; i++)
	{
		if ( NULL != m_slug_surface[i] )
		{
			m_slug_surface[i]->Release();
			m_slug_surface[i] = NULL;
		}			
	}

	for (i=0; i<BARRIER_PIC_COUNT; i++)
	{
		if ( NULL != m_barrier_surface[i] )
		{
			m_barrier_surface[i]->Release();
			m_barrier_surface[i] = NULL;
		}			
	}

	for (i=0; i<TANKEXPLORED_PIC_CELL_COUNT; i++)
	{
		if ( NULL != m_tankexplored_surface[i] )
		{
			m_tankexplored_surface[i]->Release();
			m_tankexplored_surface[i] = NULL;
		}			
	}

	if ( NULL !=  m_game_fail_surface )
	{
		m_game_fail_surface->Release();
		m_game_fail_surface = NULL;
	}

	if ( NULL !=  m_game_acom_surface )
	{
		m_game_acom_surface->Release();
		m_game_acom_surface = NULL;
	}

	return(1);
}

int	CMyGameApplication::IntToStr(char destStr[], int dest_maxlen, int num)
{
	BOOL bShowMinus = FALSE;
	char *p1 = NULL, *p2 = NULL;
	char chr = 0;
	int num_count = 0;
	int num_temp = 0;

	if ( NULL == destStr )
	{
		return(0);
	}

	if ( dest_maxlen <= 0 )
	{
		return(0);	
	}

	if ( num < 0 )
	{
		bShowMinus = TRUE;
	}

	num_temp = abs(num);
	do
	{
		num_count++ ; 
		num_temp /= 10;
	} while (num_temp != 0);

	if ( bShowMinus )
	{
		num_count++ ;
	}

	if ( dest_maxlen < num_count+1 )
	{
		return(0);
	}

	if ( bShowMinus )
	{
		num_count--;
		*(destStr++) = '-';
	}

	for ( int i=num_count-1; i>=0; i--)
	{
		*(destStr++) = '0' + (int)( abs(num)/pow(10, i) ) % 10;
	}

	*destStr = '\0';

	return(1);
}

⌨️ 快捷键说明

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