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

📄 snakemodel.cpp

📁 一个在Pocket PC上运行的贪食蛇游戏
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// SnakeModel.cpp: implementation of the CSnakeModel class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "Snake.h"
#include "SnakeModel.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

extern struct Setting_Parameters
{
	int mode;
	int level;
	int mazes;
}Settings;

static leveUpScore[]={50,100,150,200,250};

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CSnakeModel::CSnakeModel()
{

}

CSnakeModel::~CSnakeModel()
{
	
}

void CSnakeModel::reset()
{
	canChangeDirection=true;
	hasTongue=false;
	direction=LEFT;
	mfDirection=LEFT;
    score=0;                            
	snakeLan=0;
	numFood=0;
	extModeLevel=0;	//0代表普通模式,非0代表闯关模式的等级
	efType=-1;
	step=0;//0是正常速度,负数是减速后所剩步数,正数是加速后所剩步数
	
	//设置迷宫
	if(Settings.mode==1)
	{
		setSpeed();
		setMazes();
	}
	else if(Settings.mode==2)
	{
		setSpeed(extModeLevel+3);
		setMazes(extModeLevel);
		extModeLevel++;
	}
	else
	{
		AfxMessageBox(_T("mode error!"));
	}

    // 初始化蛇体
	initSnake();

    // 创建食物
    food=createFood();

	extFood.x=-1;
	extFood.y=-1;

	stone.x=-1;
	stone.y=-1;

	movFood.x=-1;
	movFood.y=-1;
}

void CSnakeModel::initSnake()
{
	snakeLan=0;

    for (int k=0;k<INITLAN;k++) 
	{
        int x=MAX/2-3+k;
        int y=MAX/2;
		body[snakeLan].x=x;
		body[snakeLan].y=y;
		snakeLan++;
        matrix[x][y]=true;
    }
	for(int n=snakeLan;n<MAXLEN;n++)
	{
		body[n].x=-1;
		body[n].y=-1;
	}
}

int CSnakeModel::moveOn()
{
	int x=body[0].x;
    int y=body[0].y;

    // 根据方向增减坐标值
    switch(direction) 
	{
    case UP:
        y--;
		if(y<0)
		{
			y+= MAX;
		}
        break;
    case DOWN:
        y++;
        if(y>=MAX)
		{
			y-=MAX;
		}
        break;
    case LEFT:
        x--;
		if(x<0)
		{
			x+=MAX;
		}
        break;
    case RIGHT:
        x++;
		if(x>=MAX)
		{
			x-=MAX;
		}
        break;
    }

	//处理移动食物
	if(movFood.x!=-1&&movFood.y!=-1)
	{
		movMovFood();
	}
	//处理加速或减数得步数
	if(extModeLevel!=0&&step!=0)
	{
		if(step>0)
		{
			step--;
		}
		else
		{
			step++;
		}
	}

	// 如果新坐标点上有东西(蛇体,食物或者边框)
    if (matrix[x][y]) 
	{
		if(hasTongue)
		{
			hasTongue=false;
		}

		// 吃到普通食物,成功
		if (x==food.x&&y==food.y) 
		{    
			return eatFood();
        }
		// 吃到移动食物,成功
		else if(x==movFood.x&&y==movFood.y)
		{
			return eatMovFood();
		}
		// 吃到扩展食物,成功
		else if(extModeLevel!=0&&x==extFood.x&&y==extFood.y)
		{
			return eatExtFood();
		}
		else if(extModeLevel!=0&&x==stone.x&&y==stone.y)//碰到石头,失败
		{
			stone.x=-1;
			stone.y=-1;

			return 0;
		}
		// 吃到蛇体自身,失败
		else if(isBody(x,y))           
		{
			return 0;
		}
		// 触到边框,失败
    	else
		{
            return 0;
		}
    } 
	// 如果新坐标的点上没有东西,移动蛇体
	else             
	{	
		//伸舌头
		if(hasTongue)
		{
			hasTongue=false;

			int xx=body[0].x;
			int yy=body[0].y;

			//舌头长3格
			for(int i=0;i<3;i++)
			{
				// 根据方向增减坐标值
				switch(direction) 
				{
				case UP:
					yy--;
					if(yy<0)
					{
						yy+= MAX;
					}
					break;
				case DOWN:
					yy++;
					if(yy>=MAX)
					{
						yy-=MAX;
					}
					break;
				case LEFT:
					xx--;
					if(xx<0)
					{
						xx+=MAX;
					}
					break;
				case RIGHT:
					xx++;
					if(xx>=MAX)
					{
						xx-=MAX;
					}
					break;
				}
				if(!matrix[xx][yy])
				{
					continue;
				}
				else
				{
					// 吃到普通食物,成功
					if (xx==food.x&&yy==food.y) 
					{    
						return eatFood();
					}
					// 吃到移动食物,成功
					else if(xx==movFood.x&&yy==movFood.y)
					{
						return eatMovFood();
					}
					// 吃到扩展食物,成功
					else if(extModeLevel!=0&&xx==extFood.x&&yy==extFood.y)
					{
						return eatExtFood();
					}
					else
					{
						break;
					}					
				}				
			}
			moveBody();

			return 2;
		}
		//不伸舌头
		else
		{
			moveBody();

			return 2;
		}		
    }
}

int CSnakeModel::eatFood()
{
	matrix[food.x][food.y]=false;

	// 从蛇头赠长
    addBody(); 
	
	//闯关模式下
	if(extModeLevel!=0)
	{
		// 分数规则
		score+=extModeLevel+3;

		//升级
		if((score>leveUpScore[extModeLevel-1]
			||score==leveUpScore[extModeLevel-1])
			&&extModeLevel>0&&extModeLevel<6)
		{
			return 3;
		}

		//产生新食物
		food=createFood();

		//产生移动食物
		if(numFood%5==0)
		{
			if(movFood.x!=-1&&movFood.y!=-1)
			{
				matrix[movFood.x][movFood.y]=false;
				movFood.x=-1;
				movFood.y=-1;
			}
			else
			{
				movFood=createMovFood();
			}
		}	
				
		//产生扩展食物
		if(numFood%4==0)
		{
			if(extFood.x!=-1&&extFood.y!=-1)
			{
				matrix[extFood.x][extFood.y]=false;
				extFood.x=-1;
				extFood.y=-1;
				efType=-1;
				step=0;
			}
			else
			{
				extFood=createExtFood();
			}
		}

		//产生石头
		if(numFood%3==0)
		{
			if(stone.x!=-1&&stone.y!=-1)
			{
				matrix[stone.x][stone.y]=false;
				stone.x=-1;
				stone.y=-1;
			}
			else
			{
				stone=createStone();
			}
		}
		return 1;
	}
	//普通模式
	else
    {
		// 分数规则
		score+=Settings.level;	
			
		// 创建新的食物
		food=createFood();                

		//产生移动食物
		if(numFood%5==0)
		{
			if(movFood.x!=-1&&movFood.y!=-1)
			{
				matrix[movFood.x][movFood.y]=false;
				movFood.x=-1;
				movFood.y=-1;
			}
			else
			{
				movFood=createMovFood();
			}
		}
		return 1;
	}	
		
}

int CSnakeModel::eatMovFood()
{
	matrix[movFood.x][movFood.y]=false;

	addBody();

	movFood.x=-1;
	movFood.y=-1;

	//闯关模式下
	if(extModeLevel!=0)
	{
		score+=(extModeLevel+3)*3;
			
		//升级
		if((score>leveUpScore[extModeLevel-1]
			||score==leveUpScore[extModeLevel-1])
			&&extModeLevel>0&&extModeLevel<6)
		{
			return 3;
		}
		return 1;
	}
	else
	{
		score+=Settings.level*3;
		return 1;
	}
}

int CSnakeModel::eatExtFood()
{
	matrix[extFood.x][extFood.y]=false;

	//吃到类型0的扩展食物加分而不长身体
	if(efType==0)
	{
		moveBody();

		extFood.x=-1;
		extFood.y=-1;		

		score+=extModeLevel+3;
			
		//升级
		if((score>leveUpScore[extModeLevel-1]
			||score==leveUpScore[extModeLevel-1])
			&&extModeLevel>0&&extModeLevel<6)
		{
			return 3;
		}

		//按移动蛇体的方式画图
		return 2;
	}
	//吃到类型1的扩展食物减慢速度40步
	else if(efType==1)
	{
		moveBody();

		if(step==0)
		{
			step=-40;
		}
		else
		{
			step=0;
		}

		extFood.x=-1;
		extFood.y=-1;

		//按移动蛇体的方式画图
		return 2;
	}
	//吃到类型2的扩展食物加快速度40步
	else
	{
		moveBody();

		if(step==0)
		{
			step=40;
		}
		else
		{
			step=0;
		}

		extFood.x=-1;
		extFood.y=-1;

		//按移动蛇体的方式画图
		return 2;
	}
}

void CSnakeModel::movMovFood()
{
	matrix[movFood.x][movFood.y]=false;
	//移动一格
	switch(mfDirection) 
	{
    case UP:
	    movFood.y=movFood.y-1;
		if(movFood.y<0)
		{
			movFood.y=movFood.y+MAX;
		}
        break;
    case DOWN:
        movFood.y=movFood.y+1;
	    if(movFood.y>=MAX)
		{
			movFood.y=movFood.y-MAX;
		}
        break;
    case LEFT:
        movFood.x=movFood.x-1;
		if(movFood.x<0)
		{
			movFood.x=movFood.x+MAX;
		}
        break;
    case RIGHT:
        movFood.x=movFood.x+1;
		if(movFood.x>=MAX)
		{
			movFood.x=movFood.x-MAX;
		}
        break;
	}
	//移动的这一格上有东西	
	if(matrix[movFood.x][movFood.y])
	{
		//是蛇头并与蛇运行方向相反,不动,让蛇头吃掉
		if(movFood.x==body[0].x&&movFood.y==body[0].y
			&&((mfDirection+1)%4+1)==direction)
		{
			mfDirection=(mfDirection+1)%4+1;

			switch(mfDirection) 
			{
			case UP:

⌨️ 快捷键说明

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