C语言贪吃蛇代码

源代码使用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;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
用windows api 做的贪吃 #include #include"resource.h" #include"Node.h" #include #include TCHAR szAppname[] = TEXT("Snack_eat"); #define SIDE (x_Client/80) #define x_Client 800 #define y_Client 800 #define X_MAX 800-20-SIDE //点x的范围 #define Y_MAX 800-60-SIDE //点y的范围 #define TIME_ID 1 #define SECOND 100 #define NUM_POINT 10 //点的总个数 #define ADD_SCORE 10 LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) { HWND hwnd; //窗口句柄 MSG msg; //消息 WNDCLASS wndclass; //窗口类 HACCEL hAccel;//加速键句柄 wndclass.style = CS_HREDRAW | CS_VREDRAW; //窗口的水平和垂直尺寸被改变时,窗口被重绘 wndclass.lpfnWndProc = WndProc; //窗口过程为WndProc函数 wndclass.cbClsExtra = 0; //预留额外空间 wndclass.cbWndExtra = 0; //预留额外空间 wndclass.hInstance = hInstance; //应用程序的实例句柄,WinMain的第一个参数 wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION); //设置图标 wndclass.hCursor = LoadCursor(NULL, IDC_ARROW); //载入预定义的鼠标指针 wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); //设置画刷 wndclass.lpszMenuName = szAppname; //设置菜单 wndclass.lpszClassName = szAppname; //设置窗口类的名字 if (!RegisterClass(&wndclass))//注册窗口类 { MessageBox(NULL, TEXT("这个程序需要windows NT!"), szAppname, MB_ICONERROR); return 0; } hwnd = CreateWindow(szAppname, TEXT("Snack_eat"),//CreateWindow函数调用时,WndProc将受到WM_CREATE WS_OVERLAPPEDWINDOW&~WS_THICKFRAME& ~WS_MAXIMIZEBOX,//普通的层叠窗口&禁止改变大小&禁止最大化 CW_USEDEFAULT, //初始x坐标(默认) CW_USEDEFAULT, //初始y坐标 x_Client, //初始x方向尺寸 770 y_Client, //初始y方向尺寸 750 NULL, //父窗口句柄 NULL, //窗口菜单句柄 hInstance, //程序实例句柄 WinMain函数中第二个参数 NULL); //创建参数 ShowWindow(hwnd, iCmdShow);//显示窗口,iCmdShow是WinMain的第四个参数,决定窗口在屏幕中的初始化显示形式,例:SW_SHOWNORMAL表示正常显示 UpdateWindow(hwnd);//使窗口客户区重绘,通过向WndProc发送一条WM_PAINT消息而完成的 hAccel = LoadAccelerators(hInstance, szAppname);//加载加速键 while (GetMessage(&msg, NULL, 0, 0)) { if (!TranslateAccelerator(hwnd, hAccel, &msg)) { TranslateMessage(&msg); DispatchMessage(&msg); } }/* while (GetMessage(&msg, NULL, 0, 0))//GetMessage函数从消息队列中得到消息,填充msg。如果msg.message等于WM_QUIT,返回0,否则返回非0 { TranslateMessage(&msg);//将msg返回给windows已进行某些键盘消息的转换 DispatchMessage(&msg);//将msg再次返回给windows }*/ return msg.wParam;//msg.wParam是PostQuitMessage函数的参数值,通常是0 } ...

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值