源代码使用GCC编译器编译并运行于Linux,想在windows下运行需要修改少许字符输出语句。在自动控制snake上下了很大功夫,但是对防止进入自身封闭上做的很不好,而且没有使用另一线程实现玩家控制方向。为了方便编写,分为“snakeGame”、“sankeAI”、“sankeHead.h"三个文件。
“sankeHead.h"
#include <unistd.h>
#include <stdlib.h>
#include <curses.h>
#include <time.h>
typedef enum {null=-2,stop=-1,left=0,right=1,up=2,down=3}movtype;
typedef enum {air,food,wall}coltype;
typedef struct {
coltype type;
int chartype;
}charModel;
typedef struct {
int x;
int y;
movtype type;
}ctrlModel;
void writeLineQ(charModel cmTemp[]);
void removSnake(ctrlModel snakeModel[]);
int collidedeal(charModel cmTEMP[],ctrlModel snakeModel[]);
void addfood(ctrlModel snakeModel[],ctrlModel foodModel[],int amount);
void addsnakemod(ctrlModel snakeModel[],int amount);
#define SCR_WIDTH 60
#define SCR_HEIGHT 20
#define SNAKE_CHAR '*'
#define SNAKE_LENGTH 8
#define FOOD_AMOUNT_MAX 10
#define FOOD_CHAR '0'
“snakeGame”
#include "snakeAI.c"
#define CTRL_TIMES 5 // 每秒显示的步数
#define WINDOW_W 40
#define WINDOW_H 10
int main()
{
srand((int)time(0));
initscr();
charModel cmTEMP[SCR_WIDTH*SCR_HEIGHT];
ctrlModel snakeModel[SCR_WIDTH*SCR_HEIGHT];
ctrlModel foodModel[FOOD_AMOUNT_MAX];
while(1)
{
int i,usrctrl[2];
while(1)
{
for(i=0;i<SCR_WIDTH*SCR_HEIGHT;i++)//初始化用户界面
{
if( i%SCR_WIDTH == 0|| i%SCR_WIDTH == SCR_WIDTH-1){
cmTEMP[i].chartype='|';
}
else if(i/SCR_WIDTH == 0 || i/SCR_WIDTH == SCR_HEIGHT-1){
cmTEMP[i].chartype='-';
}
else{
cmTEMP[i].type=air;
cmTEMP[i].chartype=i%26+65;
}
}
for(i=0;i<WINDOW_W*WINDOW_H;i++)
{
int sum;
sum=(i/WINDOW_W+(SCR_HEIGHT-WINDOW_H)/2)*SCR_WIDTH+(i%WINDOW_W+(SCR_WIDTH-WINDOW_W)/2);
if(i%WINDOW_W == 0|| i%WINDOW_W == WINDOW_W-1 || i/WINDOW_W == 0 || i/WINDOW_W == WINDOW_H-1){
cmTEMP[sum].chartype='*';
}
else{
cmTEMP[sum].chartype=' ';
}
}
writeLineQ (cmTEMP);
move((SCR_HEIGHT-WINDOW_H)/2+1,(SCR_WIDTH-WINDOW_W)/2+1);
printw(" SnakeGame ");
switch(usrctrl[0])
{
case 1:
move((SCR_HEIGHT-WINDOW_H)/2+2,(SCR_WIDTH-WINDOW_W)/2+1);
printw(" Start SnakeGame ");
move((SCR_HEIGHT-WINDOW_H)/2+3,(SCR_WIDTH-WINDOW_W)/2+1);
printw(" >----Watch snakeAI----< ");
move((SCR_HEIGHT-WINDOW_H)/2+4,(SCR_WIDTH-WINDOW_W)/2+1);
printw(" About ");
move((SCR_HEIGHT-WINDOW_H)/2+5,(SCR_WIDTH-WINDOW_W)/2+1);
printw(" EXIT ");
move((SCR_HEIGHT-WINDOW_H)/2+7,(SCR_WIDTH-WINDOW_W)/2+1);
printw(" Tip UP:W DOWN:S Enter:D ");
move((SCR_HEIGHT-WINDOW_H)/2+3,(SCR_WIDTH-WINDOW_W)/2+31);
break;
case 2:
move((SCR_HEIGHT-WINDOW_H)/2+2,(SCR_WIDTH-WINDOW_W)/2+1);
printw(" Start SnakeGame ");
move((SCR_HEIGHT-WINDOW_H)/2+3,(SCR_WIDTH-WINDOW_W)/2+1);
printw(" Watch snakeAI ");
move((SCR_HEIGHT-WINDOW_H)/2+4,(SCR_WIDTH-WINDOW_W)/2+1);
printw(" >----About----< ");
move((SCR_HEIGHT-WINDOW_H)/2+5,(SCR_WIDTH-WINDOW_W)/2+1);
printw(" EXIT ");
move((SCR_HEIGHT-WINDOW_H)/2+7,(SCR_WIDTH-WINDOW_W)/2+1);
printw(" Tip UP:W DOWN:S Enter:D ");
move((SCR_HEIGHT-WINDOW_H)/2+4,(SCR_WIDTH-WINDOW_W)/2+31);
break;
case 3:
move((SCR_HEIGHT-WINDOW_H)/2+2,(SCR_WIDTH-WINDOW_W)/2+1);
printw(" Start SnakeGame ");
move((SCR_HEIGHT-WINDOW_H)/2+3,(SCR_WIDTH-WINDOW_W)/2+1);
printw(" Watch snakeAI ");
move((SCR_HEIGHT-WINDOW_H)/2+4,(SCR_WIDTH-WINDOW_W)/2+1);
printw(" About ");
move((SCR_HEIGHT-WINDOW_H)/2+5,(SCR_WIDTH-WINDOW_W)/2+1);
printw(" >----EXIT----< ");
move((SCR_HEIGHT-WINDOW_H)/2+7,(SCR_WIDTH-WINDOW_W)/2+1);
printw(" Tip UP:W DOWN:S Enter:D ");
move((SCR_HEIGHT-WINDOW_H)/2+5,(SCR_WIDTH-WINDOW_W)/2+31);
break;
default:
move((SCR_HEIGHT-WINDOW_H)/2+2,(SCR_WIDTH-WINDOW_W)/2+1);
printw(" >----Start SnakeGame----< ");
move((SCR_HEIGHT-WINDOW_H)/2+3,(SCR_WIDTH-WINDOW_W)/2+1);
printw(" Watch snakeAI ");
move((SCR_HEIGHT-WINDOW_H)/2+4,(SCR_WIDTH-WINDOW_W)/2+1);
printw(" About ");
move((SCR_HEIGHT-WINDOW_H)/2+5,(SCR_WIDTH-WINDOW_W)/2+1);
printw(" EXIT ");
move((SCR_HEIGHT-WINDOW_H)/2+7,(SCR_WIDTH-WINDOW_W)/2+1);
printw(" Tip UP:W DOWN:S Enter:D ");
move((SCR_HEIGHT-WINDOW_H)/2+2,(SCR_WIDTH-WINDOW_W)/2+31);
break;
}
refresh();
noecho();
switch(getch())
{
case 'w':
if(usrctrl[0]<=0){usrctrl[0]=3;}else{usrctrl[0]-=1;}break;
case 's':
if(usrctrl[0]>=3){usrctrl[0]=0;}else{usrctrl[0]+=1;}break;
case 'd':
if(usrctrl[0]==3){clear();exit(0);}
else{usrctrl[1]=usrctrl[0]+1;}
break;
}
if(usrctrl[1]==1||usrctrl[1]==2){break;}
else{
}
}
for(i=0;i<SCR_WIDTH*SCR_HEIGHT;i++)//初始化蛇模型
{
if(i<SNAKE_LENGTH)
{
snakeModel[i].x= (SCR_WIDTH+SNAKE_LENGTH)/2-i;
snakeModel[i].y= SCR_HEIGHT/2-1;
snakeModel[i].type=stop;
}
else
{
snakeModel[i].type=null;
}
}
for(i=0;i<FOOD_AMOUNT_MAX;i++)//初始化食物
{
foodModel[i].type=null;
}
addfood(snakeModel,foodModel,FOOD_AMOUNT_MAX);
snakeModel[0].type=right;//蛇的移动方向向右
while(1)
{
for(i=0;i<SCR_WIDTH*SCR_HEIGHT;i++)
{
if( i%SCR_WIDTH == 0|| i%SCR_WIDTH == SCR_WIDTH-1){
cmTEMP[i].type =wall;
cmTEMP[i].chartype='|';
}
else if(i/SCR_WIDTH == 0 || i/SCR_WIDTH == SCR_HEIGHT-1){
cmTEMP[i].type =wall;
cmTEMP[i].chartype='-';
}
else{
cmTEMP[i].type=air;
cmTEMP[i].chartype=' ';
}
}
removSnake(snakeModel);//移动蛇
for(i=0;i<FOOD_AMOUNT_MAX;i++) //添加食物图形
{
if(foodModel[i].type==null)
continue;
int sum;
sum=foodModel[i].x+foodModel[i].y*SCR_WIDTH;
cmTEMP[sum].type = food;
cmTEMP[sum].chartype=FOOD_CHAR;
}
int retdeal=collidedeal(cmTEMP,snakeModel);//碰撞处理
if(retdeal==1)
{
addsnakemod(snakeModel,1);
for(i=0;i<FOOD_AMOUNT_MAX;i++)
{
if(foodModel[i].x==snakeModel[0].x && foodModel[i].y==snakeModel[0].y){
foodModel[i].type=null;}
}
addfood(snakeModel,foodModel,FOOD_AMOUNT_MAX);
}
else if(retdeal==2)
{
for(i=0;i<5;i++)
{
move(SCR_HEIGHT/2-1,SCR_WIDTH/2-5);
printw("GAME OVER! %d...",5-i);
refresh();
sleep(1);
}
for(i=0;i<SCR_WIDTH*SCR_HEIGHT;i++)
{
if(i<SNAKE_LENGTH)
{
snakeModel[i].x= (SCR_WIDTH+SNAKE_LENGTH)/2-i;
snakeModel[i].y= SCR_HEIGHT/2-1;
snakeModel[i].type=stop;
}
else
{
snakeModel[i].type=null;
}
}
for(i=0;i<FOOD_AMOUNT_MAX;i++)
{
foodModel[i].type=null;
}
addfood(snakeModel,foodModel,FOOD_AMOUNT_MAX);
snakeModel[0].type=right;//测试 蛇的移动方向向右
continue;
}
for(i=0;i<SCR_WIDTH*SCR_HEIGHT;i++) //添加蛇模型
{
if(snakeModel[i].type==null)
break;
int sum;
sum=snakeModel[i].x+snakeModel[i].y*SCR_WIDTH;
cmTEMP[sum].type = wall;
cmTEMP[sum].chartype=SNAKE_CHAR;
if(i==0){
cmTEMP[sum].chartype='+';}
}
writeLineQ (cmTEMP);//显示合成图形
if(usrctrl[1]==2){
snakeModel[0].type=EatAI(cmTEMP,snakeModel,foodModel);}
else{
noecho();
switch(getch())
{
case 'a':
snakeModel[0].type=left;
break;
case 'w':
snakeModel[0].type=up;
break;
case 's':
snakeModel[0].type=down;
break;
case 'd':
snakeModel[0].type=right;
break;
default:
break;
}
}
}
}
endwin();
exit(EXIT_SUCCESS);
}
void ctrltimes()
{
static int a=0;
a+=1;
if(a==CTRL_TIMES)
{
sleep(1);
a=0;
}
}
void writeLineQ(charModel cmTEMP[])
{
int i;
for(i=0;i<SCR_WIDTH*SCR_HEIGHT;i++)
{
move(i/SCR_WIDTH,i%SCR_WIDTH);
addch((cmTEMP[i]).chartype);
}
refresh();
ctrltimes();
}
void removSnake(ctrlModel snakeModel[])
{
int i;
if( snakeModel[0].type==stop)
return;
for(i=0;i<SCR_WIDTH*SCR_HEIGHT;i++)
{
int nxtemp,nytemp,nttemp,xtemp,ytemp,ttemp;
if(snakeModel[i].type==null)
{
return;
}
nxtemp=snakeModel[i].x;
nytemp=snakeModel[i].y;
nttemp=snakeModel[i].type;
if(i==0)
{
xtemp=nxtemp;
ytemp=nytemp;
ttemp=nttemp;
switch(snakeModel[i].type)
{
case left:
snakeModel[i].x -=1;break;
case right:
snakeModel[i].x +=1;break;
case up:
snakeModel[i].y -=1;break;
case down:
snakeModel[i].y +=1;break;
default:
break;
}
}
else
{
snakeModel[i].x=xtemp;
snakeModel[i].y=ytemp;
snakeModel[i].type=ttemp;
xtemp=nxtemp;
ytemp=nytemp;
ttemp=nttemp;
}
}
}
int collidedeal(charModel cmTEMP[],ctrlModel snakeModel[])
{
int i;
for(i=1;i<=SCR_WIDTH*SCR_HEIGHT;i++)
{
if(snakeModel[i].type==null){
break;}
if(snakeModel[0].x==snakeModel[i].x && snakeModel[0].y==snakeModel[i].y){
return 2;}
}
int sum;
sum=snakeModel[0].x+snakeModel[0].y*SCR_WIDTH;
switch(cmTEMP[sum].type)
{
case air:
return 0;
case food:
return 1;
case wall:
return 2;
default:
return -1;
}
}
void addfood(ctrlModel snakeModel[],ctrlModel foodModel[],int amount)
{
int i;
for(i=0;i<amount;i++){
if(foodModel[i].type!=null){
return;}
}
for(i=0;i<amount;i++)
{
int x,y,randx;
do{
randx=rand();
}while(randx>=SCR_WIDTH*SCR_HEIGHT);
x=randx%SCR_WIDTH;y=randx/SCR_WIDTH;
if(x!=0 && y!=0 && x!= SCR_WIDTH-1 && y!=SCR_HEIGHT-1)
{
int times,ctrlbool=0;
for(times=0;times<SCR_WIDTH*SCR_WIDTH;times++)
{
if(snakeModel[times].type==null){
break;}
else if(snakeModel[times].x==x && snakeModel[times].y==y){
ctrlbool=-1;
break;}
}
if(ctrlbool==-1){
i--;
}
else{
foodModel[i].x=x;
foodModel[i].y=y;
foodModel[i].type=stop;
}
}
else
{
i--;
}
}
}
void addsnakemod(ctrlModel snakeModel[],int amount)
{
int i,times;
for(i=0;i<SCR_WIDTH*SCR_HEIGHT;i++)
{
if( snakeModel[i].type==null)
{
for(times=0;times<amount;times++)
{
snakeModel[i+times].type=stop;
switch(snakeModel[i+times-1].type)
{
case left:
snakeModel[i+times].x=snakeModel[i+times-1].x+1;
snakeModel[i+times].y=snakeModel[i+times-1].y;
break;
case right:
snakeModel[i+times].x=snakeModel[i+times-1].x-1;
snakeModel[i+times].y=snakeModel[i+times-1].y;
break;
case up:
snakeModel[i+times].x=snakeModel[i+times-1].x;
snakeModel[i+times].y=snakeModel[i+times-1].y+1;
break;
case down:
snakeModel[i+times].x=snakeModel[i+times-1].x;
snakeModel[i+times].y=snakeModel[i+times-1].y-1;
break;
default:
break;
}
}
return;
}
}
}
”sankeAI“
#include "snakeHead.h"
int closegraph(charModel cmTEMP[],ctrlModel snakeModel[],int direction);
movtype DirectionAlt(movtype type,int direction)
{
int irand;
switch(direction)
{
case 1:
return type;
case 2:
switch(type)
{
case left:
return down;
case right:
return up;
case up:
return left;
case down:
return right;
default:
return stop;
}
case 4:
switch(type)
{
case left:
return up;
case right:
return down;
case up:
return right;
case down:
return left;
default:
return stop;
}
case 3://随即选定一个方向 2选1
case 5:
irand=rand();
irand=irand%2;
if(irand==0){//偶数
return type;}
else{//奇数
return DirectionAlt(type,direction-1);}
case 6:
irand=rand();
irand=irand%2;
if(irand==0){//偶数
return DirectionAlt(type,2);}
else{//奇数
return DirectionAlt(type,4);}
case 7://随即选定一个方向 3选1
irand=rand();
irand=irand%3;
if(irand==0){
return type;}
else if(irand==1){
return DirectionAlt(type,2);}
else {
return DirectionAlt(type,4);}
default:
return stop;
}
}
movtype EatAI(charModel cmTEMP[],ctrlModel snakeModel[],ctrlModel foodModel[])
{
int ix,iy,i,foodamount[FOOD_AMOUNT_MAX],distance=SCR_WIDTH*SCR_HEIGHT,numfood[2];
//寻找头部周围的身体
int headbar[4]={0,0,0,0};//[0]左 [1]右 [2]上 [3]下
for(i=1;i<SCR_WIDTH*SCR_HEIGHT;i++)
{
if(snakeModel[i].type==null){
break;}
else if(snakeModel[i].x==snakeModel[0].x){
if(snakeModel[i].y==snakeModel[0].y-1){
headbar[2]=1;}
else if(snakeModel[i].y==snakeModel[0].y+1){
headbar[3]=1;}}
else if(snakeModel[i].y==snakeModel[0].y){
if(snakeModel[i].x==snakeModel[0].x-1){
headbar[0]=1;}
else if(snakeModel[i].x==snakeModel[0].x+1){
headbar[1]=1;}}
}
int direction=7; //1为向前 2为向左 4为向右 ,1+2 1+4 2+4 1+2+4 方向组合
//排除算法 排除墙体和身体碰撞
switch(snakeModel[0].type){
case left:
if(cmTEMP[(snakeModel[0].x-1)+snakeModel[0].y*60].type==wall || headbar[0]==1){
direction-=1;}
if(cmTEMP[(snakeModel[0].x)+(snakeModel[0].y+1)*60].type==wall || headbar[3]==1){
direction-=2;}
if(cmTEMP[(snakeModel[0].x)+(snakeModel[0].y-1)*60].type==wall || headbar[2]==1){
direction-=4;}
break;
case right:
if(cmTEMP[(snakeModel[0].x+1)+snakeModel[0].y*60].type==wall || headbar[1]==1){
direction-=1;}
if(cmTEMP[(snakeModel[0].x)+(snakeModel[0].y-1)*60].type==wall || headbar[2]==1){
direction-=2;}
if(cmTEMP[(snakeModel[0].x)+(snakeModel[0].y+1)*60].type==wall || headbar[3]==1){
direction-=4;}
break;
case up:
if(cmTEMP[snakeModel[0].x+(snakeModel[0].y-1)*60].type==wall || headbar[2]==1){
direction-=1;}
if(cmTEMP[(snakeModel[0].x-1)+snakeModel[0].y*60].type==wall || headbar[0]==1){
direction-=2;}
if(cmTEMP[(snakeModel[0].x+1)+snakeModel[0].y*60].type==wall || headbar[1]==1){
direction-=4;}
break;
case down:
if(cmTEMP[snakeModel[0].x+(snakeModel[0].y+1)*60].type==wall || headbar[3]==1){
direction-=1;}
if(cmTEMP[(snakeModel[0].x+1)+snakeModel[0].y*60].type==wall || headbar[1]==1){
direction-=2;}
if(cmTEMP[(snakeModel[0].x-1)+snakeModel[0].y*60].type==wall || headbar[0]==1){
direction-=4;}
break;
case stop:
default:
return stop;
}
if(direction==0){
return snakeModel[0].type;}//走投无路,自我毁灭
//是否形成闭合图形,检验方向可行性,防止自我封闭
if(direction!=1 && direction!=2 && direction!=4){
direction=closegraph(cmTEMP,snakeModel,direction);}
//自动寻物
for(i=0;i<FOOD_AMOUNT_MAX;i++)//取相对距离,并选取最小值
{
if(foodModel[i].type==null){
continue;}
ix=snakeModel[0].x-foodModel[i].x;iy=snakeModel[0].y-foodModel[i].y;
foodamount[i]=ix*ix+iy*iy;//平面两点坐标公式 x^2+y^2
if(distance>foodamount[i]){
numfood[0]=foodModel[i].x;
numfood[1]=foodModel[i].y;
distance=foodamount[i];}
}
//创建寻物方向
int fooddirection=0,subx=snakeModel[0].x-numfood[0],suby=snakeModel[0].y-numfood[1];
if(subx == 0){
if(suby < 0){
switch(snakeModel[0].type){
case left:
fooddirection+=2;
break;
case right:
fooddirection+=4;
break;
case up:
fooddirection+=6;
break;
case down:
fooddirection+=1;
break;
default:
break;}
}
else if(suby > 0){
switch(snakeModel[0].type){
case left:
fooddirection+=4;
break;
case right:
fooddirection+=2;
break;
case up:
fooddirection+=1;
break;
case down:
fooddirection+=6;
break;
default:
break;}
}
}
else if(subx<0){
if(suby== 0){
switch(snakeModel[0].type){
case left:
fooddirection+=6;
break;
case right:
fooddirection+=1;
break;
case up:
fooddirection+=4;
break;
case down:
fooddirection+=2;
break;
default:
break;
}
}
else if(suby < 0){
switch(snakeModel[0].type){
case left:
fooddirection+=2;
break;
case right:
fooddirection+=5;
break;
case up:
fooddirection+=4;
break;
case down:
fooddirection+=3;
break;
default:
break;
}
}
else{// suby > 0
switch(snakeModel[0].type){
case left:
fooddirection+=4;
break;
case right:
fooddirection+=3;
break;
case up:
fooddirection+=5;
break;
case down:
fooddirection+=2;
break;
default:
break;
}
}
}
else{// subx > 0
if(suby== 0){
switch(snakeModel[0].type){
case left:
fooddirection+=1;
break;
case right:
fooddirection+=6;
break;
case up:
fooddirection+=2;
break;
case down:
fooddirection+=4;
break;
default:
break;
}
}
else if(suby < 0){
switch(snakeModel[0].type){
case left:
fooddirection+=3;
break;
case right:
fooddirection+=4;
break;
case up:
fooddirection+=2;
break;
case down:
fooddirection+=5;
break;
default:
break;
}
}
else{// suby > 0
switch(snakeModel[0].type){
case left:
fooddirection+=5;
break;
case right:
fooddirection+=2;
break;
case up:
fooddirection+=3;
break;
case down:
fooddirection+=4;
break;
default:
break;
}
}
}
switch(direction){
case 1:
return snakeModel[0].type;
case 2:
case 4:
return DirectionAlt(snakeModel[0].type,direction);
case 7://前左右
return DirectionAlt(snakeModel[0].type,fooddirection);
case 6://左右
if(fooddirection>=direction || fooddirection==1){
return DirectionAlt(snakeModel[0].type,6);}
else if(fooddirection==2 || fooddirection==4){
return DirectionAlt(snakeModel[0].type,fooddirection);}
else if(fooddirection==3 || fooddirection==5){
return DirectionAlt(snakeModel[0].type,fooddirection-1);}
case 3://前左
if(fooddirection<=3){
return DirectionAlt(snakeModel[0].type,fooddirection);}
else if(fooddirection==5||fooddirection==6){
return DirectionAlt(snakeModel[0].type,fooddirection-4);}
else if(fooddirection==4||fooddirection==7){
return DirectionAlt(snakeModel[0].type,3);}
case 5://前右
if(fooddirection==5||fooddirection==7){
return DirectionAlt(snakeModel[0].type,5);}
else if(fooddirection<=3){
return DirectionAlt(snakeModel[0].type,1);}
else if(fooddirection==4||fooddirection==6){
return DirectionAlt(snakeModel[0].type,4);}
default:
return stop;
}
}
int closegraph(charModel cmTEMP[],ctrlModel snakeModel[],int direction)
{
//检测是否为闭合图形 1 蛇模型闭合 2 蛇模型+边界闭合
int i;
for(i=SCR_WIDTH*SCR_HEIGHT-1;i>=0;i--)//从蛇尾到倒找
{
if(snakeModel[i].type==null){
continue;}
if(i==2){
return direction;}
if(snakeModel[i].x-1==snakeModel[0].x && snakeModel[i].y-1==snakeModel[0].y){break;}
if(snakeModel[i].x-1==snakeModel[0].x && snakeModel[i].y==snakeModel[0].y){break;}
if(snakeModel[i].x-1==snakeModel[0].x && snakeModel[i].y+1==snakeModel[0].y){break;}
if(snakeModel[i].x==snakeModel[0].x && snakeModel[i].y-1==snakeModel[0].y){break;}
if(snakeModel[i].x==snakeModel[0].x && snakeModel[i].y+1==snakeModel[0].y){break;}
if(snakeModel[i].x+1==snakeModel[0].x && snakeModel[i].y-1==snakeModel[0].y){break;}
if(snakeModel[i].x+1==snakeModel[0].x && snakeModel[i].y==snakeModel[0].y){break;}
if(snakeModel[i].x+1==snakeModel[0].x && snakeModel[i].y+1==snakeModel[0].y){break;}
}
//如果结点为末尾无视
if(snakeModel[i+1].type==null){return direction;}
//判断前结点方向
movtype direfalse[2]={null,null};
if(snakeModel[i-1].x==snakeModel[i].x){
if(snakeModel[i-1].y-snakeModel[i].y==1){
direfalse[0]=down;}
else{direfalse[0]=up;}}
else if(snakeModel[i-1].y==snakeModel[i].y){
if(snakeModel[i-1].x-snakeModel[i].x==-1){
direfalse[0]=left;}
else{direfalse[0]=right;}}
//判断后结点方向
if(snakeModel[i].x==snakeModel[i+1].x){
if(snakeModel[i].y-snakeModel[i+1].y==1){
direfalse[1]=down;}
else{direfalse[1]=up;}}
else if(snakeModel[i].y==snakeModel[i+1].y){
if(snakeModel[i].x-snakeModel[i+1].x==-1){
direfalse[1]=left;}
else{direfalse[1]=right;}}
//方向
for(i=0;i<2;i++){
if(snakeModel[0].type==direfalse[i]){direction-=1;continue;}
if(direfalse[0]==direfalse[1]){break;}
switch(snakeModel[0].type){
case 0:
if(direfalse[i]==2){direction-=4;}
else if(direfalse[i]==3){direction-=2;}
break;
case 1:
if(direfalse[i]==2){direction-=2;}
else if(direfalse[i]==3){direction-=4;}
break;
case 2:
if(direfalse[i]==0){direction-=2;}
else if(direfalse[i]==1){direction-=4;}
break;
case 3:
if(direfalse[i]==0){direction-=4;}
else if(direfalse[i]==1){direction-=2;}
break;
default:
break;
}
}
return direction;
}