c语言用vc编写的贪吃蛇怎么实现未点击按键时,按原来方向自动移动。

c语言用vc编写的贪吃蛇怎么实现未点击按键时,按原来方向自动移动。比如一开始按w向上移动,那么没有按其他按键之前自动向上移动怎么实现?... c语言用vc编写的贪吃蛇怎么实现未点击按键时,按原来方向自动移动。比如一开始按w向上移动,那么没有按其他按键之前自动向上移动怎么实现? 展开
 我来答
匿名用户
2016-11-02
展开全部
# include<stdio.h>
# include<stdlib.h>
# include<time.h>
# include<Windows.h>
# include<conio.h>
//#define KEYCODE
//#define TESTSNAKE
#define maxx 23
#define maxy 38
typedef struct Snake //定义蛇结构体
{
 int x; 
 int y;
 struct Snake *next;
}snake;
snake *head = NULL; //初始化头尾指针
snake *tail = NULL;
snake *egg = NULL;
vx = 1;
vy = 0;
int speed=5;
void checkkey();
void Pos(); //设置光标函数
void Startgame(); //游戏开始
void Gamecircle(); //游戏循环
void Creatmap(); //创建地图
void Inisnake(); //初始化蛇身
void Printsnake(); //打印蛇
void Snakemove(); //蛇移动
void Deletetail(); //去头
void Dessnake();
int newegg();
void printegg();
int  eategg();
void main()
{
 #ifdef KEYCODE
 checkkey();
 #endif
 Startgame();
 Gamecircle();
 Dessnake();
 Pos(maxx+2,4);
 system("pause");
}
void Pos(int y,int x) //设置控制台光标位置
{
 HANDLE hOutput; //建立一个句柄
 COORD pos; //定义光标位置
 pos.X=x<<1;
 pos.Y=y;
 hOutput=GetStdHandle(STD_OUTPUT_HANDLE); //获取句柄
 SetConsoleCursorPosition(hOutput,pos); //在显示器上显示光标地址
}
void Startgame()
{
 srand(time(0));
 Pos(5,3);
 printf("欢迎来到贪吃蛇的世界!\n");
 Pos(7,6);
 printf("用↑ ↓ ← →分别控制蛇的移动, ");
 Pos(8,6);
 printf("Ctrl+↑为加速,Ctrl+↓为减速。\n\n\n");
 system("pause");
 system("cls");
 Creatmap();
 Inisnake();
 newegg();
 Printsnake();
}
void testsnake()
{ snake *t;
 for(t= tail;t;t=t->next)
  if(t==0xcdcdcdcd)
  {
   printf("\t\t数据完整性破坏\n\t\t系统将退出");t=0;
  }
}
void Gamecircle()
{int ch,tick=1;
 while(1)
 {
  Sleep(25);
  if(kbhit()){
   ch=getch();
   if(ch==27) break; // ESC键退出
   if(ch==224) ch=getch(); else continue;
   switch(ch){
   case 72 : {if(vy==0) vy = -1; vx = 0; break;} // ↑
   case 80 : {if(vy==0) vy =  1; vx = 0; break;} // ↓
   case 77 : {if(vx==0) vx =  1; vy = 0; break;} // ← 
   case 75 : {if(vx==0) vx = -1; vy = 0; break;} // →
   case 141: {if(speed > 1 ) speed--;    break;} // Ctrl+↑为加速,
   case 145: {if(speed < 20) speed++;    break;} // Ctrl+↓为减速
   default : ;
   }
  }
  if(!--tick){
   if(!eategg()) // 如果不是吃掉了蛋就移动
   { 
    Snakemove(); //蛇移动
    Deletetail(); //去蛇尾
    printegg();
   }
   tick=speed;
  }
 }
}
void Creatmap()
{
 int i;
 for(i=0;i<=maxy+1;i++) //打印上下边框(29个格子)
 {
  Pos(0,i);
  printf("■");
  Pos(maxx+1,i);
  printf("■");
 }
 for (i=1;i<maxx+1;i++) //打印左右边框(25个格子,不算重叠)
 {
  Pos(i,0);
  printf("■");
 }
 for (i=1;i<maxx+1;i++)
 {
  Pos(i,maxy+1);
  printf("■");
 } 
}
void Inisnake() //初始化蛇身(尾添加)
{
 int i;
 snake *pTemp; //建立第一个节点
 pTemp = (snake *)malloc(sizeof(snake)); 
 pTemp->x = 12;
 pTemp->y = 5;
 if (NULL == head) //节点接入链表
 {
  head = pTemp;
  tail = pTemp;
 } 
 for (i =1;i<3;i++) //后面节点接入
 {
  pTemp = (snake *)malloc(sizeof(snake));
  pTemp->x = 12+i;
  pTemp->y = 5;
  head->next = pTemp;
  head = pTemp;
 }
 head->next = NULL; // 最后一个节点next置空
}
void Dessnake() //初始化蛇身(尾添加)
{ snake * t;
 while(tail!=NULL) // 还有节点
 {
  t=tail->next;
  free(tail);
  tail =t;
 }
 if(egg) free(egg);
}
void Printsnake() //输出蛇
{
 snake *pTempPrint = tail;
 while(pTempPrint != NULL)
 {
  Pos(pTempPrint->x,pTempPrint->y);
  printf("■");
  pTempPrint = pTempPrint->next;
 }
}
void Snakemove() //蛇前进(添新头去尾)
{
 snake * Newhead;
 int x = head->x, y = head->y;
 int delt=0;
 if( vx ){
  y += vx;
  if (y > maxy ) {
   delt =  y - maxy ;
   y = maxy;
  }
  if ( y < 1 ) {
   delt =  1-y ;
   y = 1;
  }
  if (delt)
  {
   vx =abs(vx);
   vy = ((x>maxx/2)? -vx:vx);
   x += ((x>maxx/2)? -delt : delt);
   vx = 0;
  }
 }
 else{
  x += vy;
  if (x > maxx ) {
   delt =  x - maxx ;
   x = maxx;
  }
  if ( x < 1 ) {
   delt =  1-x ;
   x = 1;
  }
  if (delt)
  {
   vy =abs(vy);
   vx = ((y>maxy/2)? -vy:vy);
   y += ((y>maxy/2)? -delt : delt);
   vy = 0;
  }
 }
 Newhead = (snake *)malloc(sizeof(snake)); //添加新尾
 
 Newhead->x = x;
 Newhead->y = y ;
 Newhead->next = NULL;
 head->next = Newhead; //先连后断
 head = Newhead;
}
void printegg()
{
 Pos(egg->x,egg->y);
 printf("■");
}
int newegg()
{ snake * t; int i;
 if(!(egg = (snake *)malloc(sizeof(snake))))
  return 0; 
 for(i=0;i<10000;i++){
  egg->x = rand()%maxx+1;
  egg->y = rand()%maxy+1;
  for(t=tail;t;t=t->next)
   if(t->x == egg->x && t->y == egg->y)
    break;
  if(!t) break;
 }
 if(i>=10000)
  return 0;
 egg->next = NULL;
 printegg();
 return 1;
}
int eategg()
{
 int x=head->x,y=head->y;
 if((x+vy==egg->x) && (y+vx==egg->y))
 {
  head->next = egg;
  head = egg;
  newegg();
  return 1;
 }
 else return 0;
}
void Deletetail() //去尾
{
 snake *p,*p1,*p2;
 p1 = tail; // p2 = NULL;
 p2 = p1->next; //p2得到倒数第二节的地址
 Pos(p1->x,p1->y);
 printf(" "); //尾节点用空格代替
 free(p1); //释放尾节点
 tail = p2; //尾指针挪到倒数第二节
 p = head; //输出蛇身
 while(p2->next != NULL)
  p2 = p2->next;
 Pos(p2->x,p2->y);
 printf("■");
 
}
void checkkey()
{
 int ch;
 printf("键盘键码测试,ESC退出...\n");
 while(1)
 {
  if(kbhit()){
   ch=getch();
   if(ch==27) break; // ESC键退出
   if(ch==224) {printf("%d",ch); ch=getch(); }else continue;
   printf("\t%d\n",ch);
  }
 }
}

上面是一个部分实现的贪吃蛇,里面就通过延时等待,实现了自动的移动。主要在void Gamecircle()函数中。

如还有问题,请追问

推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式