📄 game.h
字号:
#pragma once
#include <stdio.h>
#include <list>
#include "draw.h"
#include "input.h"
#include "sound.h"
using namespace std;
#define WAY_UP 1 // 运动的方向
#define WAY_DOWN 0
#define WAY_LEFT 3
#define WAY_RIGHT 2
#define STATUS_FREE 0 // 玩家的状态
#define STATUS_MOVE 1
#define STATUS_DIED 2
#define STATUS_DELAY 3
#define CAN_BLOCK 0 // 玩家可执行的动作
#define CAN_MOVE 1
#define CAN_PUSH 2
#define CAN_KICK 3
#define TYPE_NULL 0 // 玩家的身份标识
#define TYPE_USER 1
#define TYPE_USEROTHER 2
#define TYPE_COMPUTER 3
#define MaxVertexNum 13*15
#define PLAYER_NUM 8
#define INFINITY 1000 // 大于13*15即可
#define SoundEffectNum 9 // 音效个数
#define START 0 // 音效的编号
#define WIN 1
#define DEUCE 2
#define LOST 3
#define LAY 4
#define DETONATION 5
#define APPEAR 6
#define GET 7
#define DIE 8
#define GAME_FREE 0
#define GAME_START 1
#define GAME_WIN 2
#define GAME_DEUCE 3
#define GAME_LOST 4
#define DISPLAYCOUNTER 300
struct PLAYER
{
int x; // x坐标(以像素为单位)
int y; // y坐标(以像素为单位)
int way; // 主角方向
int bomb; // 炸弹数
bool kick; // 能踢泡泡
bool cast; // 投掷、扔泡泡
bool pin; // 救命针
int speed; // 速度(像素/帧,取值范围 1 -- 10)
int step; // 步长
int frame; // 动画贞数
int counter; // 计数器
int status; // 状态
int power; // 泡泡的威力
int type; // 主角类型
int presswaykey;// 连续按住方向键计数(因为推箱子或是踢泡泡需要一段时间)
int image; // 图像编号
};
struct ITEM
{
int type; // 物体的类型
int status; // 当前的状态,针对不同的物体,有不同的解释
int xoffset; // 针对箱子表示x偏移,针对爆炸效果表示爆炸效果当前的长度
int yoffset; // 针对箱子表示y偏移
int way; // 移动时的方向(针对箱子)
int counter; // 计数器(针对箱子)
int move; // 是否移动(针对箱子)
int tag; // 附属品
int who; // 此泡泡是谁摆放的
};
struct MOVEBOMB
{
int x; // x坐标(以像素为单位)
int y; // y坐标(以像素为单位)
int way; // 运动方向
int mode; // 0:踢,1:扔
int tox; // 目标点x坐标,如果是踢的话则此参数无意义,扔的话则事先算好目标点当落下时如果发现有东西,则再算一次
int toy; // 目标点y坐标
int counter; // 计数器
int offset; // 扔泡泡的时候y方向上的偏移
int power; // 威力
bool addorsub; // 控制偏移量增加或是减少,true表示增加
int who; // 此泡泡是谁摆放的
};
class CGame
{
public:
CGame(void);
~CGame(void);
bool Create(HWND hWnd, HINSTANCE hInstance);
HRESULT Run();
HRESULT ChangeDisplayMode( BOOL bWindowed );
HRESULT RestoreSurfaces();
void ResetMapInfor();
void DoInput(); // 处理玩家输入
void DoMove(); // 处理角色移动
void DoKick(); // 处理踢泡泡
void DoCast(); // 处理扔泡泡
void DoProperty(); // 处理道具
void DoKill(); // 判断对方是否已被炸,若是,则经过时可立刻杀死对方
void SetBlast(int i,int j);
bool FindPropertyForGet(int PlayerIndex); // 查看道具的位置,若找到则去吃
bool FindAdversaryForAttack(int PlayerIndex); // 查找对手的位置,找到后去攻击
bool FindTeammateForRescue(int PlayerIndex); // 查找需要营救的队友的位置
bool FindSafety(int PlayerIndex); // 查找一个安全的位置,找到后去躲藏
bool FindLay(int PlayerIndex); // 查找一个放置炸弹的位置(能炸对手就炸对手,否则炸物体,以便得到道具)
bool FindAddress(int PlayerIndex,int s); // 查找一个放置
int GetDestroyNumber(int PlayerIndex,int x,int y); // 得到某个玩家在(x,y)处方下炸弹可以摧毁的物体数目
bool IsDangerous(int player_x,int player_y); // 检查当前是否有危险(输入参数为玩家的坐标)
bool IsRescue(); // 检查现在是否要救人
void SetGraph(int PlayerIndex); // 设置图
void Dijkstra(int G[MaxVertexNum][MaxVertexNum], int D[MaxVertexNum], int P[MaxVertexNum],int s); // 迪杰斯特拉算法
HWND m_hWnd;
BOOL m_bWindowed;
CDraw* m_pDraw;
CSurface* m_pSurface;
CSurface* m_pSurfacePlayer;
CSurface* m_pSurfaceWord;
CInput* m_pInput;
CSound* m_pSound;
CWavMidi* m_pSoundEffect[SoundEffectNum];
CMP3* m_pBackgroundMusic;
PLAYER m_Player[PLAYER_NUM]; // 存放所有玩家信息
bool m_PlayerLay[PLAYER_NUM]; // 是否放炸弹
int m_LayX[PLAYER_NUM]; // 炸弹摆放位置x
int m_LayY[PLAYER_NUM]; // 炸弹摆放位置y
int m_Delay[PLAYER_NUM]; // 躲避危险的延时时间
int m_GameState;
int m_GameCounter;
ITEM m_ScreenItem[13][15]; // 存放背景信息
list<MOVEBOMB> m_bombKick; // 存放踢出来的泡泡信息
list<MOVEBOMB> m_bombCast; // 存放扔出来的泡泡信息
int m_Graph[MaxVertexNum][MaxVertexNum]; // 图的邻接矩阵,此处用二维数组表示
int m_Distance[MaxVertexNum]; // 源点到其它各顶点的最短距离
int m_Path[MaxVertexNum]; // 源点到其它各顶点的最短路径
BOOL m_bHelp;
DWORD m_timeNew;
DWORD m_timeOld;
DWORD m_counter;
float m_fps;
POINT m_CursorPos; // 鼠标坐标
int test; // must delete!
};
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -