📄 game.cpp
字号:
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 + -