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