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

📄 game.cpp

📁 泡泡堂单机版,可能被转载够很多次,不过这个是比较完整的,一个很好的学习材料.
💻 CPP
📖 第 1 页 / 共 5 页
字号:
		return hr;
	if( FAILED( hr = m_pSurface->SetColorKey(RGB(255,0,255),RGB(255,0,255)) ) )
		return hr;

	if( FAILED( hr = m_pDraw->CreateSurface(&m_pSurfacePlayer,1040,248) ) )
		return hr;
	if( FAILED( hr = m_pSurfacePlayer->DrawBitmap(".\\picture\\player.bmp",1040,248) ) )
		return hr;
	if( FAILED( hr = m_pSurfacePlayer->SetColorKey(RGB(255,0,255),RGB(255,0,255)) ) )
		return hr;

	if( FAILED( hr = m_pDraw->CreateSurface(&m_pSurfaceWord,240,320) ) )
		return hr;
	if( FAILED( hr = m_pSurfaceWord->DrawBitmap(".\\picture\\word.bmp",240,320) ) )
		return hr;
	if( FAILED( hr = m_pSurfaceWord->SetColorKey(RGB(255,0,255),RGB(255,0,255)) ) )
		return hr;

    return S_OK;
}

HRESULT CGame::RestoreSurfaces()
{
	HRESULT hr;

	if( FAILED( hr = m_pDraw->GetDirectDraw()->RestoreAllSurfaces()))
		return hr;

	if( FAILED( hr = m_pSurface->DrawBitmap(".\\picture\\pic.bmp",800,600)))
		return hr;

	if( FAILED( hr = m_pSurfacePlayer->DrawBitmap(".\\picture\\player.bmp",1040,248)))
		return hr;

	if( FAILED( hr = m_pSurfaceWord->DrawBitmap(".\\picture\\word.bmp",240,320)))
		return hr;

	return S_OK;
}

void	CGame::ResetMapInfor()
{
	//	地图信息
	memset((void*)m_ScreenItem,0,sizeof(m_ScreenItem));
	srand(timeGetTime());

	for(int i=0;i<13;i++)
	{
		for(int j=0;j<15;j++)
		{
			m_ScreenItem[i][j].tag = -1;				//	表示无道具
			if (rand()%100>30)
			{
				m_ScreenItem[i][j].type = 0;			//	0表示空
			}
			else
			{
				if (rand()%100<30)						//	30% 的几率
				{
					m_ScreenItem[i][j].tag = rand()%6;
				}

				if (rand()%100<80)
				{
					m_ScreenItem[i][j].type = 1;		//	1表示木块
				}
				else
				{
					m_ScreenItem[i][j].type = 2;		//	2表示箱子
				}
			}
		}
	}

	m_ScreenItem[1][1].type = 3;						//	3表示木桩
	m_ScreenItem[1][13].type = 3;
	m_ScreenItem[11][1].type = 3;
	m_ScreenItem[11][13].type = 3;

	m_ScreenItem[6][6].type = 4;						//	4,5,6表示海盗旗
	m_ScreenItem[6][6].status = 0;
	m_ScreenItem[6][7].type = 4;
	m_ScreenItem[6][6].status = 1;
	m_ScreenItem[6][8].type = 4;
	m_ScreenItem[6][6].status = 2;

	m_ScreenItem[0][1].type = 0;						//	预留4处空的位置
	m_ScreenItem[0][1].tag = -1;
	m_ScreenItem[0][2].type = 0;						//	预留4处空的位置
	m_ScreenItem[0][2].tag = -1;
	m_ScreenItem[1][2].type = 0;						//	预留4处空的位置
	m_ScreenItem[1][2].tag = -1;
	m_ScreenItem[2][2].type = 0;						//	预留4处空的位置
	m_ScreenItem[2][2].tag = -1;
	
	m_ScreenItem[0][12].type = 0;						//	预留4处空的位置
	m_ScreenItem[0][12].tag = -1;
	m_ScreenItem[1][12].type = 0;						//	预留4处空的位置
	m_ScreenItem[1][12].tag = -1;
	m_ScreenItem[2][12].type = 0;						//	预留4处空的位置
	m_ScreenItem[2][12].tag = -1;
	m_ScreenItem[0][13].type = 0;						//	预留4处空的位置
	m_ScreenItem[0][13].tag = -1;

	m_ScreenItem[10][2].type = 0;						//	预留4处空的位置
	m_ScreenItem[10][2].tag = -1;
	m_ScreenItem[11][2].type = 0;						//	预留4处空的位置
	m_ScreenItem[11][2].tag = -1;
	m_ScreenItem[12][2].type = 0;						//	预留4处空的位置
	m_ScreenItem[12][2].tag = -1;
	m_ScreenItem[12][1].type = 0;						//	预留4处空的位置
	m_ScreenItem[12][1].tag = -1;

	m_ScreenItem[10][12].type = 0;						//	预留4处空的位置
	m_ScreenItem[10][12].tag = -1;
	m_ScreenItem[11][12].type = 0;						//	预留4处空的位置
	m_ScreenItem[11][12].tag = -1;
	m_ScreenItem[12][12].type = 0;						//	预留4处空的位置
	m_ScreenItem[12][12].tag = -1;
	m_ScreenItem[10][13].type = 0;						//	预留4处空的位置
	m_ScreenItem[10][13].tag = -1;

	for (int i=0;i<PLAYER_NUM;i++)
	{
		m_Player[i].type = TYPE_NULL;
		m_PlayerLay[i] = false;
	}

	//	主角信息
	m_Player[0].bomb = 1;
	m_Player[0].cast = false;
	m_Player[0].kick = false;
	m_Player[0].pin = false;
	m_Player[0].counter = 0;
	m_Player[0].way = WAY_DOWN;
	m_Player[0].step = 8;
	m_Player[0].speed = 2;
	m_Player[0].frame = 4;
	m_Player[0].status = STATUS_FREE;
	m_Player[0].power = 1;
	m_Player[0].type = TYPE_USER;
	m_Player[0].presswaykey = 0;
	m_Player[0].image = 2;

	m_Player[1].bomb = 1;
	m_Player[1].cast = false;
	m_Player[1].kick = false;
	m_Player[1].pin = false;
	m_Player[1].counter = 0;
	m_Player[1].way = WAY_DOWN;
	m_Player[1].step = 8;
	m_Player[1].speed = 2;
	m_Player[1].frame = 4;
	m_Player[1].status = STATUS_FREE;
	m_Player[1].power = 1;
	m_Player[1].type = TYPE_COMPUTER;
	m_Player[1].presswaykey = 0;
	m_Player[1].image = 1;

	POINT	point[4]={{80,80},{480,80},{480,400},{80,400}};

	int	pos = rand()%4;
	m_Player[0].x = point[pos].x;
	m_Player[0].y = point[pos].y;

	pos =(pos+2)%4;						//	取对角位置
	m_Player[1].x = point[pos].x;
	m_Player[1].y = point[pos].y;

	m_pBackgroundMusic->Play();
	m_GameState = GAME_START;
	m_GameCounter = DISPLAYCOUNTER;

	m_timeOld = timeGetTime();
	m_timeNew = m_timeOld;
	m_counter = 0;

}

void	CGame::SetGraph(int PlayerIndex)
{
	int		s = (m_Player[PlayerIndex].y+20)/40*15+(m_Player[PlayerIndex].x+20)/40;

	for (int i=0;i<MaxVertexNum;i++)
	{
		int	data1 = m_ScreenItem[i/15][i%15].type;
		if ( i == s)
		{
			data1 = 0;
		}
		for (int j=0;j<MaxVertexNum;j++)
		{
			int	data2 = m_ScreenItem[j/15][j%15].type;
			if ( j == s)
			{
				data2 = 0;
			}
			if (i/15 == j/15)			//	两个顶点在同一行上
			{
				if (j%15 == i%15-1 || j%15 == i%15+1)	//	在相邻的左边或是右边
				{
					if ((data1 != 0 && data1 != 8)
						|| (data2 != 0 && data2 != 8))
					{
						m_Graph[i][j] = INFINITY;
					}
					else
					{
						m_Graph[i][j] = 1;
					}
				}
				else
				{
					m_Graph[i][j] = INFINITY;
				}
			}
			else	if (i%15 == j%15)	//	两个顶点在同一列上
			{
				if (j/15 == i/15-1 || j/15 == i/15+1)	//	在相邻的上边或是下边
				{
					if ((data1 != 0 && data1 != 8)
						|| (data2 != 0 && data2 != 8))
					{
						m_Graph[i][j] = INFINITY;
					}
					else
					{
						m_Graph[i][j] = 1;
					}
				}
				else
				{
					m_Graph[i][j] = INFINITY;
				}
			}
			else
			{
				m_Graph[i][j] = INFINITY;
			}
		}
	}
}

void	CGame::Dijkstra(int G[MaxVertexNum][MaxVertexNum], int D[MaxVertexNum],	int P[MaxVertexNum],int s)
{
	//	G是无向网的邻接矩阵,若边(i,j)不存在,G[i][j] = INFINITY
	//	D是最短距离
	//	P是最短路径
	//	设源点 0 <= s <= MaxVertexNum-1

	bool	S[MaxVertexNum];				//	红点集合,S[i]为真表示红点,否则为蓝点
	int		i,j,k,min;
	for (i=0;i<MaxVertexNum;i++)
	{
		S[i] = false;						//	置红点集为空
		D[i] = G[s][i];						//	置初始的估计距离
		if (D[i]<INFINITY)					//	INFINITY表示无穷大
		{
			P[i] = s;						//	s是i的前趋(双亲)
		}
		else
		{
			P[i] = -1;						//	i无前趋,P[s]亦无前趋,因为G[s][s]亦为INFINITY
		}
	}

	S[s] = true;							//	红点集初始时只有源点
	D[s] = 0;								//	源点到源点的距离为0

	for (i=0;i<MaxVertexNum-1;i++)			//	扩充红点集
	{
		min = INFINITY;
		for (j=0;j<MaxVertexNum;j++)		//	在当前蓝点集中选估计距离最小的顶点k,即离s最近的顶点
		{
			if (!S[j] && D[j]<min)			//	j是蓝点且D[j]小于当前最小的估计距离
			{
				min = D[j];
				k = j;
			}
		}
		if (min == INFINITY)					//	蓝点集中已无估计距离小于INFINITY的顶点
		{
			return;
		}
		S[k] = true;						//	k加入红点集

		for (j=0;j<MaxVertexNum;j++)		//	调整剩余蓝点的估计距离
		{
			if (!S[j] && (D[j] > D[k] + G[k][j]))
			{
				D[j] = D[k] + G[k][j];		//	修改蓝点j的估计距离,使j离s更近
				P[j] = k;					//	k是j的前趋
			}
		}
	}
}

void	CGame::DoMove()
{
	static	int	step = 0;
	step++;
	if (step == 40)
	{
		step = 0;
	}

	for (int PlayerIndex=0;PlayerIndex<PLAYER_NUM;PlayerIndex++)
	{

		if	(m_Player[PlayerIndex].status == STATUS_MOVE && m_Player[PlayerIndex].type != TYPE_NULL)
		{
			int	offset = m_Player[PlayerIndex].speed;
			if	((m_Player[PlayerIndex].counter == 1) && (m_Player[PlayerIndex].step % m_Player[PlayerIndex].speed !=0))
			{
				offset = m_Player[PlayerIndex].step % m_Player[PlayerIndex].speed;
			}

			switch(m_Player[PlayerIndex].way)
			{
			case WAY_UP:
				m_Player[PlayerIndex].y -= offset;
				break;
			case WAY_DOWN:
				m_Player[PlayerIndex].y += offset;
				break;
			case WAY_LEFT:
				m_Player[PlayerIndex].x -= offset;
				break;
			case WAY_RIGHT:
				m_Player[PlayerIndex].x += offset;
				break;
			default:
				break;
			}

			m_Player[PlayerIndex].frame = step/10;

			m_Player[PlayerIndex].counter--;
			if	(m_Player[PlayerIndex].counter == 0)
			{
				if (m_Player[PlayerIndex].type != TYPE_COMPUTER)
				{
			//		m_Player[PlayerIndex].frame = 4;
					m_Player[PlayerIndex].status = STATUS_FREE;
				}
				else
				{
					if (m_Player[PlayerIndex].x%40 == 0 && m_Player[PlayerIndex].y%40 == 0)		//	到整格子了
					{
						m_Player[PlayerIndex].frame = 4;
						m_Player[PlayerIndex].status = STATUS_FREE;
					}
					else																		//	还没有到整格子
					{
						m_Player[PlayerIndex].counter = m_Player[PlayerIndex].step / m_Player[PlayerIndex].speed;	//	counter此处表示需要多少桢
						if (m_Player[PlayerIndex].step % m_Player[PlayerIndex].speed != 0)
						{
							m_Player[PlayerIndex].counter++;
						}
					}
				}
			}
		}
	}

}

void	CGame::DoKick()
{
	RECT	rect;
	for (list<MOVEBOMB>::iterator iter = m_bombKick.begin(); iter != m_bombKick.end(); iter++)
	{

		//	判断是否到达目标点,如果到达,从链表中删除该元素,将泡泡加入到背景信息中
		bool	deleteflag = false;
		//	踢出来的泡泡(前方有阻挡就停止运动)
		switch(iter->way)
		{
		case WAY_UP:
			if (iter->y%40 == 0)
			{
				//	此处检测前方有无玩家,若有则停止前进

				//	此处检测前方有无阻挡物,若有则停止前进
				if (iter->y == 0 || m_ScreenItem[iter->y/40-1][iter->x/40].type > 0 && m_ScreenItem[iter->y/40-1][iter->x/40].type <8)
				{
					m_ScreenItem[iter->y/40][iter->x/40].type = 7;
					m_ScreenItem[iter->y/40][iter->x/40].counter = iter->counter;
					m_ScreenItem[iter->y/40][iter->x/40].tag = -1;
					m_ScreenItem[iter->y/40][iter->x/40].status = iter->power;
					m_ScreenItem[iter->y/40][iter->x/40].who = iter->who;
					deleteflag = true;		//	设置删除标志
				}
			}
			break;
		case WAY_DOWN:
			if (iter->y%40 == 0)
			{
				//	此处检测前方有无玩家,若有则停止前进

				//	此处检测前方有无阻挡物,若有则停止前进
				if (iter->y == 12*40 || m_ScreenItem[iter->y/40+1][iter->x/40].type > 0 && m_ScreenItem[iter->y/40+1][iter->x/40].type <8)
				{
					m_ScreenItem[iter->y/40][iter->x/40].type = 7;
					m_ScreenItem[iter->y/40][iter->x/40].counter = iter->counter;
					m_ScreenItem[iter->y/40][iter->x/40].tag = -1;
					m_ScreenItem[iter->y/40][iter->x/40].status = iter->power;
					m_ScreenItem[iter->y/40][iter->x/40].who = iter->who;
					deleteflag = true;		//	设置删除标志
				}
			}
			break;
		case WAY_LEFT:
			if (iter->x%40 == 0)
			{
				//	此处检测前方有无玩家,若有则停止前进

				//	此处检测前方有无阻挡物,若有则停止前进
				

⌨️ 快捷键说明

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