welcome to my greedy snake game
project name: greedy snake
project role: leader and main developer
project technique: vs 2005 ,c/c++,MFC
project introduction: the pc edition of the popular game on NOKIA cell phone .
project core code:
#include"GreedySnakeDlg.h"
#include<iostream>
#include<set>
using namespace std;
enum{RIGHT,UP,LEFT,DOWN};
class CGameObject
{
public:
virtual bool TestCollision(CGameObject *pObject)=0;//这个函数是用来测试碰撞情况的
virtual void Update()=0;//此函数是用来更新物体的状态
virtual void Draw(CDC *pDrawDC)=0;///此函数是用来将物体绘制到屏幕上
virtual bool IsValid()=0;///判断物体是否有效,无效就不再显示在屏幕上
};
class Knot
{
public:
int i,j;
public:
Knot(){}
Knot(int x,int y)
{
i=x;
j=y;
}
bool operator==(const Knot &knot)const
{
return knot.i==i&&knot.j==j;
}
bool operator<(const Knot &knot)const
{
return knot.i>i;
}
};
class CSnake:public CGameObject
{
private:
///这里记录了玩家的信息
Knot m_body[20];///当20节中都有位置时说明玩家过关了
int m_nKnotsNumber;///等于20时过关,初始为3
int m_nLifeNumber;//生命的个数,初始为1
int m_nScores;//玩家的分数,初始为0
int m_nDirection;///玩家移动的方向,有左右,上下
int m_nMoveStep[4][2];
public:
CSnake(){};
~CSnake(){}
void Init();
bool TestCollision(CGameObject*pObject);///对于蛇主要是测试与地图的边缘以及石头碰撞
void Update();//更新位置,把蛇向他的方向前进一步
void Draw(CDC *pDrawDC);///以圆圈相连的形式显示蛇
bool IsValid();///如果生命为0就无效了
//////////////
void KeyControl(UINT nFlags)
{
if(nFlags==RIGHT&&m_nDirection!=LEFT)
m_nDirection=RIGHT;
else if (nFlags==UP&&m_nDirection!=DOWN)
m_nDirection=UP;
else if(nFlags==LEFT&&m_nDirection!=RIGHT)
m_nDirection=LEFT;
else if(nFlags==DOWN&&m_nDirection!=UP)
m_nDirection=DOWN;
}
void GetSnakeHeadPos(int &x,int &y);
void AddScore(int score)
{
m_nScores+=score;
}
void MinusScore(int score)
{
m_nScores-=score;
}
void AddLife(int life)
{
m_nLifeNumber+=life;
}
void MinusLife(int life);
void AddKnots();
void MinusKnots();
int GetLife()
{
return m_nLifeNumber;
}
int GetScore()
{
return m_nScores;
}
int GetKnots()
{
return m_nKnotsNumber;
}
};
class CStone:public CGameObject
{
private:
int i,j;
int m_nScores;///蛇撞到不同的石头减的分数不一样的
int m_nLevel;///石头的级别,级别分1-5,撞到后减去的分数依次为5,10,20,35,55
public:
CStone();
CStone(int x,int y);
bool TestCollision(CGameObject *pObject);//测试石头与蛇的碰撞
void Update();
void Draw(CDC *pDrawDC);
bool IsValid();
void SetPos(int x,int y);
};
class CFood :public CGameObject///所有食物的基类
{
protected:
int i,j;//食物出现的位置
int m_nLifeTime;//食物的生命时间
public:
void GetPos(int &x,int &y)///返回食物的位置
{
x=i;
y=j;
}
bool IsValid()
{
return m_nLifeTime!=0;
}
};
class CHealthFood :public CFood ///健康食物 玩家吃了加节数
{
private:
int m_nKnots;//吃了后玩家增加的节数
public:
CHealthFood(int x,int y);
bool TestCollision(CGameObject *pObject);
void Update();
void Draw(CDC *pDrawDC);
};
class CAddScoreFood:public CFood////加分食物 玩家吃了加分
{
private:
int m_nScores;
int m_nLevel;
public:
CAddScoreFood(int x,int y);
bool TestCollision(CGameObject *pObject);
void Update();
void Draw(CDC *pDrawDC);
};
class CAddLifeFood:public CFood////加命食物 玩家吃了加命
{
public:
CAddLifeFood(int x,int y);
bool TestCollision(CGameObject *pObject);
void Update();
void Draw(CDC *pDrawDC);
};
class CPoisonFood:public CFood////有毒食物 玩家吃了减节数
{
private:
int m_nKnots;
public:
CPoisonFood(int x,int y);
bool TestCollision(CGameObject *pObejct);
void Update();
void Draw(CDC *pDrawDC);
};
class CMinusScoreFood:public CFood/////减分食物 玩家吃了减分
{
private:
int m_nScores;
int m_nLevel;
public:
CMinusScoreFood(int x,int y);
bool TestCollision(CGameObject *pObject);
void Update();
void Draw(CDC *pDrawDC);
};
class CDealthFood:public CFood/////致命食物 玩家吃了游戏结束
{
public:
CDealthFood(int x,int y);
bool TestCollision(CGameObject *pObject);
void Update();
void Draw(CDC *pDrawDC);
};
class CGameMap/////地图 管理地图上的食物 和记录地图上的布局
{
private:
CStone m_stones[12];
public:
CGameMap(){};
void Init();
bool TestCollision(CGameObject *pObject);
void DrawMap(CDC *pDrawDC);
};
class CFoodFactory ////食物工厂 负责生产食物 处理垃圾食物
{
private:
CFood *m_pFoodSlots[100];////用于装食物的生产槽
bool m_bSlotUsed[100];
int m_nFoodNumber;
int m_nHealthFoodNumber;
private:
CFood *CreateFood(UINT nFlags=0);
public:
CFoodFactory();
void Init();
void Update();
void DrawAllFoods(CDC *pDrawDC);
bool TestCollision(CGameObject *pObject);
void HealthFoodMinus()
{
m_nHealthFoodNumber--;
}
//////
};
class CGameManagement////游戏管理类,也是游戏的入口 负责玩家 地图 食物的管理
{
private:
CGameMap m_gameMap;
CFoodFactory m_foodFactory;
CSnake m_snake;
set<Knot> m_knotSet;
CGreedySnakeDlg *m_pUIDlg;
public:
set<Knot> * GetKnotSet();
static CGameManagement * GetGameManagement();
void InitGame(CGreedySnakeDlg *pDlg);
void Update();
void RenderGame(CDC *pDrawDC);
void WinGame();
void LoseGame();
void KeyControl(UINT nFlags)
{
m_snake.KeyControl(nFlags);
}
bool TestCollision();
CGreedySnakeDlg *GetDlg()
{
return m_pUIDlg;
}
CFoodFactory *GetFoodFactory()
{
return &m_foodFactory;
}
private:
CGameManagement();
static CGameManagement *m_pGameManagement;
};