求在VC++6.0中运行的贪吃蛇代码

 我来答
大宝妈谈教育
高粉答主

2020-06-20 · 关注我不会让你失望
知道小有建树答主
回答量:3306
采纳率:100%
帮助的人:53.6万
展开全部

#包括< stdio, h >

#包括< process。H >

#包括< Windows。H >

#包括< conio。H >

#包括<时间。H >

#包括< stdlib。H >

#defineWIDTH40

#defineHEIGH12

枚举方向{//方向

离开了,

对的,

向上

};

StructFood{//食品

Intx;

Inty;

};

{//绘制蛇体

intx;

inty;

structNode*next;

};

structSnake{//蛇属性du

intlenth;//长度

enumdirectiondir;//方向

};

structFood*food;//食物

structSnake*snake;//蛇属性

structNode*snode,*tail;//蛇身

intSPEECH=200;

intscore=0;//分数

intsmark=0;//吃食物标zhi记

inttimes=0;

intSTOP=0;

voidInitfood();//产生食物

voidInitsnake();//构造snake

voidEatfood();//头部前进

voidAddnode(intx,inty);//增加蛇身

voiddisplay(structNode*shead);//显示蛇身坐dao标

voidmove();//蛇移动

voiddraw();//画蛇

voidHomepage();//主页

voidkeybordhit();//监控键盘按键

voidAddtail();//吃到食物

voidgotoxy(intx,inty)//定位光标

COORDpos;

pos.X=x-1;

pos.Y=y-1;

SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),pos);

voidInitsnake()//构造snake

inti;

snake=(structSnake*)malloc(sizeof(structSnake));

tail=(structNode*)malloc(sizeof(structNode));

food=(structFood*)malloc(sizeof(structFood));

snake->lenth=5;//初始长度 5

snake->dir=RIGHT;//初始蛇头方向 右

for(i=2;i<=snake->lenth+2;i++)//增加 5 个结点

Addnode(i,2);

voidInitfood()//产生食物

structNode*p=snode;

intmark=1;

srand((unsigned)time(NULL));//以时间为种子产生随机数

while(1)

food->x=rand()%(WIDTH-2)+2;//食物X坐标

food->y=rand()%(HEIGH-2)+2;//食物Y坐标

while(p!=NULL)

if((food->x==p->x)&&(food->y==p->y))//如果食物产生在蛇身上

{//则重新生成食物

mark=0;//食物生成无效

break;

p=p->next;

if(mark==1)//如果食物不在蛇身上,生成食物,否则重新生成食物

gotoxy(food->x,food->y);

printf("%c",3);

break;

mark=1;

p=snode;

voidmove()//移动

structNode*q,*p=snode;

if(snake->dir==RIGHT)

Addnode(p->x+1,p->y);

if(smark==0)

while(p->next!=NULL)

q=p;

p=p->next;

q->next=NULL;

free(p);

if(snake->dir==LEFT)

Addnode(p->x-1,p->y);

if(smark==0)

while(p->next!=NULL)

q=p;

p=p->next;

q->next=NULL;

free(p);

if(snake->dir==UP)

Addnode(p->x,p->y-1);

if(smark==0)

while(p->next!=NULL)

q=p;

p=p->next;

q->next=NULL;

free(p);

if(snake->dir==DOWN)

Addnode(p->x,p->y+1);

if(smark==0)

while(p->next!=NULL)

q=p;

p=p->next;

q->next=NULL;

free(p);

voidAddnode(intx,inty)//增加蛇身

structNode*newnode=(structNode*)malloc(sizeof(structNode));

structNode*p=snode;

newnode->next=snode;

newnode->x=x;

newnode->y=y;

snode=newnode;//结点加到蛇头

if(x<2||x>=WIDTH||y<2||y>=HEIGH)//碰到边界

STOP=1;

gotoxy(10,19);

printf("撞墙,游戏结束,任意键退出!\n");//失败

_getch();

free(snode);//释放内存

free(snake);

exit(0);

while(p!=NULL)//碰到自身

if(p->next!=NULL)

if((p->x==x)&&(p->y==y))

STOP=1;

gotoxy(10,19);

printf("撞到自身,游戏结束,任意键退出!\n");//失败

_getch();

free(snode);//释放内存

free(snake);

exit(0);

p=p->next;

voidEatfood()//吃到食物

Addtail();

score++;

voidAddtail()//增加蛇尾

structNode*newnode=(structNode*)malloc(sizeof(structNode));

structNode*p=snode;

tail->next=newnode;

newnode->x=50;

newnode->y=20;

newnode->next=NULL;//结点加到蛇头

tail=newnode;//新的蛇尾

voiddraw()//画蛇

structNode*p=snode;

inti,j;

while(p!=NULL)

gotoxy(p->x,p->y);

printf("%c",2);

tail=p;

p=p->next;

if(snode->x==food->x&&snode->y==food->y)//蛇头坐标等于食物坐标

smark=1;

Eatfood();//增加结点

Initfood();//产生食物

if(smark==0)

gotoxy(tail->x,tail->y);//没吃到食物清除之前的尾结点

printf("%c",'');//如果吃到食物,不清楚尾结点

else

times=1;

if((smark==1)&&(times==1))

gotoxy(tail->x,tail->y);//没吃到食物清除之前的尾结点

printf("%c",'');//如果吃到食物,不清楚尾结点

smark=0;

gotoxy(50,12);

printf("食物: %d,%d",food->x,food->y);

gotoxy(50,5);

printf("分数:%d",score);

gotoxy(50,7);

printf("速度:%d",SPEECH);

gotoxy(15,14);

printf("按o键加速");

gotoxy(15,15);

printf("按p键减速");

gotoxy(15,16);

printf("按空格键暂停");

voidHideCursor()//隐藏光标

CONSOLE_CURSOR_INFOcursor_info={1,0};

SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info);

voidHomepage()//绘主页

intx,y;

HideCursor();//隐藏光标

printf("----------------------------------------\n");

printf("|\t\t\t\t|\n");

printf("|\t\t\t\t|\n");

printf("|\t\t\t\t|\n");

printf("|\t\t\t\t|\n");

printf("|\t\t\t\t|\n");

printf("|\t\t\t\t|\n");

printf("|\t\t\t\t|\n");

printf("|\t\t\t\t|\n");

printf("|\t\t\t\t|\n");

printf("|\t\t\t\t|\n");

printf("----------------------------------------\n");

gotoxy(5,13);

printf("任意键开始游戏!按W.A.S.D控制方向");

_getch();

Initsnake();

Initfood();

gotoxy(5,13);

printf("");

voidkeybordhit()//监控键盘

charch;

if(_kbhit())

ch=getch();

switch(ch)

case'W':

case 'w':if(snake->dir==DOWN)//如果本来方向是下,而按相反方向无效

break;

else

snake->dir=UP;break;

case'A':

case 'a':if(snake->dir==RIGHT)//如果本来方向是右,而按相反方向无效

break;

else

snake->dir=LEFT;break;

case'S':

case 's':if(snake->dir==UP)//如果本来方向是上,而按相反方向无效

break;

else

snake->dir=DOWN;break;

case'D':

case 'd':if(snake->dir==LEFT)//如果本来方向是左,而按相反方向无效

break;

else

snake->dir=RIGHT;break;

case'O':

case'o':

if(SPEECH>=150)//速度加快

SPEECH=SPEECH-50;

break;

case'P':

case'p':

if(SPEECH<=400)//速度减慢

SPEECH=SPEECH+50;

break;

case''://暂停

gotoxy(15,18);

printf("游戏已暂停,按任意键恢复游戏");

system("pause>nul");

gotoxy(15,18);

printf("");

break;

default:break;

intmain(void)//程序入口

Homepage();

while(!STOP)

keybordhit();//监控键盘按键

move();//蛇的坐标变化

draw();//蛇的重绘

Sleep(SPEECH);//暂时挂起线程

return0;

扩展资料:

注意事项:

1.代码将源信息转换为易于通信或存储的符号。译码(译码)是还原和译码的过程,它将代码符号转换为接受者能够理解的形式。

2.编码的原因之一是为了在普通语言(口头或书面)难以实现的情况下进行交流。例如,一面旗帜可以用一个特定的标记来表达一个特定的信息,而站在远处的另一个人可以解释标记来重现该信息。

jhanker
2019-09-11 · TA获得超过1479个赞
知道小有建树答主
回答量:675
采纳率:73%
帮助的人:497万
展开全部
/*
贪吃蛇游戏,由于是C++源码 且 用到Windows API ,是控制台界面不是图形界面,需要用VC++6.0 或 VC++2010 在windows环境编译运行。如果符合上述条件一定可以编译运行zjlj,2015.3.16
*/
#define DEBUG 0 //当程序在调试阶段时 DEBUG为 1
#include<iostream>
#include<windows.h>
#include<time.h>
#include<conio.h>
using namespace std;
void readini(FILE **fphead, int *score, char *argv[]) //创建或打开一个和运行文件对应的ini文件,读取最高纪录
{
 char filename[200],*pfilename;
 int flag=-1,i;
     
    strcpy(filename,argv[0]);
    for(i=0;filename[i]!='\0';i++)
 {
  if ('.'==filename[i])flag=1;
 }
  
 if(1==flag)
 {
 filename[i-1]='i';
    filename[i-2]='n';
 filename[i-3]='i';
 }
 else
 {
  filename[i]='.';
 filename[i+1]='i';
 filename[i+2]='n';
    filename[i+3]='i';
    filename[i+4]='\0';
 }
 for(;filename[i]!='\\'&&i>=0;i--)pfilename=&filename[i];
    if ( (*fphead=fopen(pfilename, "rb+"))==NULL)
 {
        if ( (*fphead=fopen(pfilename, "wb+"))==NULL)
  {
    printf("无法创建或打开\"%s\"文件\n",pfilename);
    system("pause");
       exit(0);
  }
    }
 else
 {
  fread(score,sizeof(int),1,*fphead);
 }
}
void writeini(FILE **fphead, int *score, char *argv[])  //打开一个和运行文件对应的ini文件,写入最高纪录
{
 char filename[200],*pfilename;
 int flag=-1,i;
    
    strcpy(filename,argv[0]);
    for(i=0;filename[i]!='\0';i++)
 {
  if ('.'==filename[i])flag=1;
 }
  
 if(1==flag)
 {
 filename[i-1]='i';
    filename[i-2]='n';
 filename[i-3]='i';
 }
 else
 {
  filename[i]='.';
 filename[i+1]='i';
 filename[i+2]='n';
    filename[i+3]='i';
    filename[i+4]='\0';
 }
 for(;filename[i]!='\\'&&i>=0;i--)pfilename=&filename[i];
    if ( (*fphead=fopen(pfilename, "wb+"))==NULL)
 {
          printf("无法写入\"%s\"文件,磁盘写保护!\n",pfilename);
    system("pause");
       exit(0);
 }
 else
 {
  rewind(*fphead);
  fwrite(score,sizeof(int),1,*fphead);
  fclose(*fphead);
 }
}
void gotoxy(int x,int y)//光标定位,光标定位函数SetConsoleCursorPosition是左上角位置是0,0然后向左向下延伸
{
COORD pos;
pos.X=2*y;
pos.Y=x;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),pos);
}
void color(int a)//颜色函数
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),a);
}
 
void Refresh(int q[][22], int grade, int gamespeed, int length,int score) //  输出贪吃蛇棋盘
{
 int i,j;
 for(i=0;i<22;i++)
 {
  for(j=0;j<22;j++)
  {
   if(q[i][j]==0)//输出棋盘空白
   {
    gotoxy(i,j);
    color(11);
    cout<<"■";
   }
   if(q[i][j]==1||q[i][j]==2)//输出棋盘墙壁
   {  
    gotoxy(i,j);
    color(11);
    cout<<"□";
   }
   if(q[i][j]==3)//输出蛇头
   {  
    gotoxy(i,j);
    color(14);
    cout<<"★";
   }
   if(q[i][j]==4)//输出蛇身
   {  
    gotoxy(i,j);
    color(12);
    cout<<"◆";
   }
     if(q[i][j]==5)//输出果子
   {  
    gotoxy(i,j);
    color(12);
    cout<<"●";
   }
  }
  if(i==0) cout << "\t***********************";
  if(i==1) cout << "\t等级为:" << grade;//显示等级
  if(i==3) cout << "\t自动前进时间";
  if(i==4) cout << "\t间隔为:" << gamespeed << "ms";//显示时间
     if(i==6) cout << "\t历史最高分为:" << score << "分";
  if(i==7) cout << "\t你现在得分为:" << (length+(grade-1)*8)*10 << "分";
  if(i==8) cout << "\t**********************";
     if(i==9) cout << "\t游戏说明:";
     if(i==10) cout << "\t(1)用小键盘方向键控制";
  if(i==11) cout << "\t蛇头运动方向;";
  if(i==12) cout << "\t(2)蛇每吃一个果子蛇身";
  if(i==13) cout << "\t增加一节;";
  if(i==14) cout << "\t(3)蛇咬到自己或碰到墙";
  if(i==15) cout << "\t壁游戏结束。";
  if(i==18) cout << "\t**********************";
     if(i==19) cout << "\tC/C++语言作业:";
     if(i==20) cout << "\tzjlj,2015.03.16 ";
 }
}
  
int main(int argc, char *argv[]){
    int tcsQipan[22][22];     //  贪吃蛇棋盘是一个二维数组(如22*22,包括墙壁)
    int i,j,score,directiontemp;
 FILE  *fpini;//*fpini 信息文件
 readini(&fpini, &score, argv);//读取ini文件的最高纪录
 if (score<0)//最高成绩小于零设置为零,初建文件会是负数
  score=0;
 while(1)
 {
  for(i=1;i<=20;i++)
   for(j=1;j<=20;j++)
    tcsQipan[i][j]=0;    //贪吃蛇棋盘相应坐标标上中间空白部分的标志0
  for(i=0;i<=21;i++)
   tcsQipan[0][i] = tcsQipan[21][i] = 1;      //贪吃蛇棋盘相应坐标标上上下墙壁的标志1
  for(i=1;i<=20;i++)
   tcsQipan[i][0] = tcsQipan[i][21] = 2;      //贪吃蛇棋盘相应坐标标上左右墙壁的标志2
  int tcsZuobiao[2][500];     //蛇的坐标数组
  for(i=0; i<4; i++)
  {
   tcsZuobiao[0][i] = 1;//蛇身和蛇头的x坐标
   tcsZuobiao[1][i] = i + 1;//蛇身和蛇头的y坐标
  }
  int head = 3,tail = 0;//标示蛇头和蛇尾的数组偏移量
  for(i=1;i<=3;i++)
   tcsQipan[1][i]=4;    //蛇身
  tcsQipan[1][4]=3;       //蛇头
  int x1, y1;           // 随机出果子
  srand(time(0));//设置随机种子
  do
  {
   x1=rand()%20+1;
   y1=rand()%20+1;
  }
  while(tcsQipan[x1][y1]!=0);//如果不是在空白处重新出果子
  tcsQipan[x1][y1]=5;//贪吃蛇棋盘相应坐标标上果子的标志5
  color(12);
  cout<<"\n\n\t\t\t\t贪吃蛇游戏即将开始 !"<<endl;//准备开始
  long start,starttemp;
  int grade = 1, length = 4;  //设置初始等级和蛇的初始长度
  int gamespeed = 500;  //设置初始前进时间间隔
  for(i=3;i>=0;i--)
  {
   start=clock();
   while(clock()-start<=1000);
   system("cls");
   if(i>0)
    cout << "\n\n\t\t\t\t进入倒计时:" << i << endl;  //倒计时显示
   else
    Refresh(tcsQipan,grade,gamespeed,length,score);  //初始棋盘显示
  }
  int timeover=1,otherkey=1;//初始化超时时间和按键判断参数
  char direction = 77;  // 设置初始情况下,向右运动
  int x=tcsZuobiao[0][head],y=tcsZuobiao[1][head];//保存蛇头坐标到x,y变量
  while(1)//运行一局游戏
  {
   start = clock();
   while((timeover=((starttemp=clock())-start<=gamespeed))&&!kbhit());//如果有键按下或时间超过自动前进时间间隔则终止循环
   if(direction==72||direction==80||direction==75 ||direction==77)
   directiontemp=direction;//保留上一次方向按键
            //starttemp=gamespeed+start-starttemp;//保留停留时间
   if(timeover)
   {
    #if (DEBUG==1)
    direction = getch();//调试代码
             #else
    if((direction =getch())==-32)
     direction = getch();
       #endif
   }
             #if (DEBUG==1)//调试代码
       start=clock();
    while(clock()-start<=2000);
    gotoxy(24,4);
    cout << "\t按键ASCII代码"<<(int)direction<<"    "<<endl;
             #endif
    if(!(direction==72||direction==80||direction==75 ||direction==77))
    {   
     otherkey=0;//  按键非方向键,otherkey设置为0
    }
    else
    {
     otherkey=1;//  按键为方向键,otherkey设置为1
    }
             if(direction==72 && directiontemp==80)//忽略反方向按键
    {
        direction=32;
     otherkey=0;
                 //start = clock();
        //while(clock()-start<=starttemp);
    }
    else if(direction==80 && directiontemp==72)
   {
        direction=32;//设置按键为非方向键
      otherkey=0;//  按键为非方向键,otherkey设置为0
                // start = clock();
       //while(clock()-start<=starttemp);//补偿等待时间
    }
    else if(direction==75 && directiontemp==77)
    {
        direction=32;
     otherkey=0;
                 //start = clock();
        //while(clock()-start<=starttemp);
    }
    else if(direction==77 && directiontemp==75)
    {
        direction=32;
     otherkey=0;
                 //start = clock();
        //while(clock()-start<=starttemp);
    }
     
     
    switch(direction)//判断方向键
    {
     case 72: x= tcsZuobiao[0][head]-1; y= tcsZuobiao[1][head];break;      // 向上
     case 80: x= tcsZuobiao[0][head]+1; y= tcsZuobiao[1][head];break;      // 向下
     case 75: x= tcsZuobiao[0][head]; y= tcsZuobiao[1][head]-1;break;      // 向左
     case 77: x= tcsZuobiao[0][head]; y= tcsZuobiao[1][head]+1;break;      // 向右
     default: break;
    }
    
  
    if(x==0 || x==21 ||y==0 || y==21)      // 蛇头碰到墙壁,结束本局游戏
    {  
     gotoxy(22,12);
     cout << "\t游戏已结束!" << endl;
     if(score>=(length+(grade-1)*8)*10)//判断是否破记录
     {
      gotoxy(10,7);
      color(12);
      cout << "闯关失败 加油耶!" << endl;
      fclose(fpini);//关闭ini文件
     }
     else
     {
      gotoxy(10,7);
      color(12);
      cout << "恭喜您打破记录" << endl;
      score=(length+(grade-1)*8)*10;
      writeini(&fpini, &score, argv);//写入ini文件的最高纪录
     }
     gotoxy(23,12);
        cout << "按回车键重新开始,按ESC退出游戏" << endl;//显示的提示
     break;//退出该局游戏
    }
    if(tcsQipan[x][y]!=0&&!(x==x1&&y==y1)&&tcsQipan[x][y]!=3) //   蛇头碰到蛇身,结束本局游戏
    {
     gotoxy(22,12);
     cout << "\t游戏已结束!" << endl;
     if(score>=(length+(grade-1)*8)*10)//判断是否破记录
     {
      gotoxy(10,7);
      color(12);
      cout << "闯关失败 加油耶!" << endl;
      fclose(fpini);//关闭ini文件
     }
     else
     {
      gotoxy(10,7);
      color(12);
      cout << "恭喜您打破记录" << endl;
      score=(length+(grade-1)*8)*10;
      writeini(&fpini, &score, argv);//写入ini文件的最高纪录
     }
     gotoxy(23,12);
     cout << "按回车键重新开始,按ESC退出游戏" << endl;//显示的提示
     break;//退出该局游戏
    }
    /*
    游戏运行时的核心算法开始
    */
    if(x==x1 && y==y1) //  吃果子,长度加1
    {   
     length ++;
     if(length>=8)//长度大于等于8重新计算长度,等级加1
     {
      length -= 8;//重新计算长度
      grade ++;//等级加1
      if(gamespeed>50)//控制最快速度为50
       gamespeed = 550 - grade * 50; // 改变自动前进时间间隔
     }
     tcsQipan[x][y]= 3;//贪吃蛇棋盘相应坐标现在蛇头标志改为蛇头标志3
     tcsQipan[tcsZuobiao[0][head]][tcsZuobiao[1][head]] = 4;//贪吃蛇棋盘相应坐标原来蛇头标志改为蛇身标志4
     head = (head+1)%400;//防止数组越界
     tcsZuobiao[0][head] = x;//蛇头的x坐标
     tcsZuobiao[1][head] = y;//蛇头的y坐标
     do//随机出果子
     {
      x1=rand()%20+1;
      y1=rand()%20+1;
     }
     while(tcsQipan[x1][y1]!=0);//如果不是在空白处重新出果子
     tcsQipan[x1][y1]=5;//贪吃蛇棋盘相应坐标标上果子的标志5
     gotoxy(22,12);
     cout << "\t游戏进行中!" << endl;
     Refresh(tcsQipan,grade,gamespeed,length,score);
    }
    else  //  不吃果子
    {  
     if(otherkey)
     {
      tcsQipan [tcsZuobiao[0][tail]][tcsZuobiao[1][tail]]=0;
      tail=(tail+1)%400;//防止数组越界
      tcsQipan [tcsZuobiao[0][head]][tcsZuobiao[1][head]]=4;
      head=(head+1)%400;//防止数组越界
      tcsZuobiao[0][head]=x;//蛇头的x坐标
      tcsZuobiao[1][head]=y;//蛇头的y坐标
      tcsQipan[tcsZuobiao[0][head]][tcsZuobiao[1][head]]=3;
      gotoxy(22,12);
      cout << "\t游戏进行中!" << endl;
      Refresh(tcsQipan,grade,gamespeed,length,score);
     }
     else
     {
      gotoxy(22,12);
      cout << "\t游戏暂停中!" << endl;
     }
    }
    /*
    游戏运行时的核心算法结束
    */
       }
    while(1)
    {
     while(!kbhit());
     if((direction =getch())==13)//按回车键开始下一局
      break;
     if(direction ==27)//按ESC退出游戏
      exit(0);
    }
       system("cls");//清除屏幕重新开始
 }
 return 0;
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
283802332
推荐于2017-09-08 · TA获得超过3310个赞
知道小有建树答主
回答量:367
采纳率:0%
帮助的人:175万
展开全部
#include<stdio.h>
#include<process.h>
#include<windows.h>
#include<conio.h>
#include<time.h>
#include<stdlib.h>
#define WIDTH 40
#define HEIGH 12
enum direction{//方向
LEFT,
RIGHT,
UP,
DOWN
};
struct Food{//食物
int x;
int y;
};
struct Node{//画蛇身
int x;
int y;
struct Node *next;
};
struct Snake{//蛇属性
int lenth;//长度
enum direction dir;//方向
};
struct Food *food; //食物
struct Snake *snake;//蛇属性
struct Node *snode,*tail;//蛇身
int SPEECH=200;
int score=0;//分数
int smark=0;//吃食物标记
int times=0;
int STOP=0;
void Initfood();//产生食物
void Initsnake();//构造snake
void Eatfood();//头部前进
void Addnode(int x, int y);//增加蛇身
void display(struct Node *shead);//显示蛇身坐标
void move();//蛇移动
void draw();//画蛇
void Homepage();//主页
void keybordhit();//监控键盘按键
void Addtail();//吃到食物
void gotoxy(int x, int y)//定位光标
{
COORD pos;
pos.X = x - 1;
pos.Y = y - 1;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),pos);
}
void Initsnake()//构造snake
{
int i;
snake=(struct Snake*)malloc(sizeof(struct Snake));
tail=(struct Node*)malloc(sizeof(struct Node));
food = (struct Food*)malloc(sizeof(struct Food));
snake->lenth=5;//初始长度 5
snake->dir=RIGHT;//初始蛇头方向 右
for(i=2;i<=snake->lenth+2;i++)//增加 5 个结点
{
Addnode(i,2);
}
}
void Initfood()//产生食物
{
struct Node *p=snode;
int mark=1;
srand((unsigned)time(NULL));//以时间为种子产生随机数
while(1)
{
food->x=rand()%(WIDTH-2)+2;//食物X坐标
food->y=rand()%(HEIGH-2)+2;//食物Y坐标
while(p!=NULL)
{
if((food->x==p->x)&&(food->y==p->y))//如果食物产生在蛇身上
{//则重新生成食物
mark=0;//食物生成无效
break;
}
p=p->next;
}
if(mark==1)//如果食物不在蛇身上,生成食物,否则重新生成食物
{
gotoxy(food->x,food->y);
printf("%c",3);
break;
}
mark=1;
p=snode;
}
}
void move()//移动
{
struct Node *q, *p=snode;
if(snake->dir==RIGHT)
{
Addnode(p->x+1,p->y);
if(smark==0)
{
while(p->next!=NULL)
{
q=p;
p=p->next;
}
q->next=NULL;
free(p);
}
}
if(snake->dir==LEFT)
{
Addnode(p->x-1,p->y);
if(smark==0)
{
while(p->next!=NULL)
{
q=p;
p=p->next;
}
q->next=NULL;
free(p);
}
}
if(snake->dir==UP)
{
Addnode(p->x,p->y-1);
if(smark==0)
{
while(p->next!=NULL)
{
q=p;
p=p->next;
}
q->next=NULL;
free(p);
}
}
if(snake->dir==DOWN)
{
Addnode(p->x,p->y+1);
if(smark==0)
{
while(p->next!=NULL)
{
q=p;
p=p->next;
}
q->next=NULL;
free(p);
}
}
}
void Addnode(int x, int y)//增加蛇身
{
struct Node *newnode=(struct Node *)malloc(sizeof(struct Node));
struct Node *p=snode;
newnode->next=snode;
newnode->x=x;
newnode->y=y;
snode=newnode;//结点加到蛇头
if(x<2||x>=WIDTH||y<2||y>=HEIGH)//碰到边界
{
STOP=1;
gotoxy(10,19);
printf("撞墙,游戏结束,任意键退出!\n");//失败
_getch();
free(snode);//释放内存
free(snake);
exit(0);
}
while(p!=NULL)//碰到自身
{
if(p->next!=NULL)
if((p->x==x)&&(p->y==y))
{
STOP=1;
gotoxy(10,19);
printf("撞到自身,游戏结束,任意键退出!\n");//失败
_getch();
free(snode);//释放内存
free(snake);
exit(0);
}
p=p->next;
}
}
void Eatfood()//吃到食物
{
Addtail();
score++;
}
void Addtail()//增加蛇尾
{
struct Node *newnode=(struct Node *)malloc(sizeof(struct Node));
struct Node *p=snode;
tail->next=newnode;
newnode->x=50;
newnode->y=20;
newnode->next=NULL;//结点加到蛇头
tail=newnode;//新的蛇尾
}
void draw()//画蛇
{
struct Node *p=snode;
int i,j;
while(p!=NULL)
{
gotoxy(p->x,p->y);
printf("%c",2);
tail=p;
p=p->next;
}
if(snode->x==food->x&&snode->y==food->y)//蛇头坐标等于食物坐标
{
smark=1;
Eatfood();//增加结点
Initfood();//产生食物
}
if(smark==0)
{
gotoxy(tail->x,tail->y);//没吃到食物清除之前的尾结点
printf("%c",' ');//如果吃到食物,不清楚尾结点
}
else
{
times=1;
}
if((smark==1)&&(times==1))
{
gotoxy(tail->x,tail->y);//没吃到食物清除之前的尾结点
printf("%c",' ');//如果吃到食物,不清楚尾结点
smark=0;
}
gotoxy(50,12);
printf("食物: %d,%d",food->x,food->y);
gotoxy(50,5);
printf("分数: %d",score);
gotoxy(50,7);
printf("速度: %d",SPEECH);
gotoxy(15,14);
printf("按o键加速");
gotoxy(15,15);
printf("按p键减速");
gotoxy(15,16);
printf("按空格键暂停");
}
void HideCursor()//隐藏光标
{
CONSOLE_CURSOR_INFO cursor_info = {1, 0};
SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info);
}
void Homepage()//绘主页
{
int x,y;
HideCursor();//隐藏光标
printf("----------------------------------------\n");
printf("|\t\t\t\t |\n");
printf("|\t\t\t\t |\n");
printf("|\t\t\t\t |\n");
printf("|\t\t\t\t |\n");
printf("|\t\t\t\t |\n");
printf("|\t\t\t\t |\n");
printf("|\t\t\t\t |\n");
printf("|\t\t\t\t |\n");
printf("|\t\t\t\t |\n");
printf("|\t\t\t\t |\n");
printf("----------------------------------------\n");
gotoxy(5,13);
printf("任意键开始游戏!按W.A.S.D控制方向");
_getch();
Initsnake();
Initfood();
gotoxy(5,13);
printf(" ");
}
void keybordhit()//监控键盘
{
char ch;
if(_kbhit())
{
ch=getch();
switch(ch)
{
case 'W':
case 'w':if(snake->dir==DOWN)//如果本来方向是下,而按相反方向无效
{
break;
}
else
snake->dir=UP;break;
case 'A':
case 'a':if(snake->dir==RIGHT)//如果本来方向是右,而按相反方向无效
{
break;
}
else
snake->dir=LEFT;break;
case 'S':
case 's':if(snake->dir==UP)//如果本来方向是上,而按相反方向无效
{
break;
}
else
snake->dir=DOWN;break;
case 'D':
case 'd':if(snake->dir==LEFT)//如果本来方向是左,而按相反方向无效
{
break;
}
else
snake->dir=RIGHT;break;
case 'O':
case 'o':
if(SPEECH>=150)//速度加快
{
SPEECH=SPEECH-50;
}
break;
case 'P':
case 'p':
if(SPEECH<=400)//速度减慢
{
SPEECH=SPEECH+50;
}
break;
case ' '://暂停
gotoxy(15,18);
printf("游戏已暂停,按任意键恢复游戏");
system("pause>nul");
gotoxy(15,18);
printf(" ");
break;
default:break;
}
}
}
int main(void)//程序入口
{
Homepage();
while(!STOP)
{
keybordhit();//监控键盘按键
move();//蛇的坐标变化
draw();//蛇的重绘
Sleep(SPEECH);//暂时挂起线程
}
return 0;
}
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式