贪吃蛇(完全版_吧)

晚上去看了场电影,路上又构思好了怎样完善之前的代码

多加了几个设定,又多敲了几个注释

#include<cstdio>
#include<windows.h>
#include<conio.h>
#include<ctime>
using namespace std;
const int N=15;
char sit[N+1][N+1],ctl;
int d[4][2]={
    
    {
    
    -1,0},{
    
    1,0},{
    
    0,-1},{
    
    0,1}},dir,len=1;
bool flag=1,op;
void HideCursor()//隐藏光标 
{
    
    
    CONSOLE_CURSOR_INFO cursor_info = {
    
    1,0};
    SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info);
}
void print()//输出 
{
    
    
 system("cls"); 
 for(int i=0;i<=N+1;i++)
 {
    
    
  for(int j=0;j<=N+1;j++)
  {
    
    
   if(i==0||j==0||i==N+1||j==N+1)
   printf("#");
   else printf("%c",sit[i][j]);
  }
  printf("\n");
 }
}
class snake//定义snake类型 
{
    
    
 public:
 snake* ne;
 int x,y; 
 void move(int tox,int toy)//移动到它上一个节点的位置 
 {
    
    
  sit[x][y]=' ';
  x=tox,y=toy;
  sit[x][y]='*';
 }
 snake(int a,int b)//初始化 
 {
    
    
  x=a,y=b;
  sit[x][y]='*';
  ne=NULL;
 }
};
snake head(N/2,N/2);//蛇的头 
void bmove(snake* body,int p,int q,bool add)//蛇身移动 
{
    
    
 int a=body->x,b=body->y;
 body->move(p,q);
 if(body->ne)//如果它后面有节点 
 bmove(body->ne,a,b,add);
 else if(add)//如果要新增节点 
 body->ne=new snake(a,b);
}
void hmove(snake* head,int dir)//蛇头移动 
{
    
    
 int a=head->x,b=head->y;
 int p=a,q=b;
 a+=d[dir][0];
 b+=d[dir][1];
 if(a<1||a>N||b<1||b>N||sit[a][b]=='*')
 flag=0;
 else 
 {
    
    
  bool add=sit[a][b]=='@'?1:0;//判断是否需要新增子节点 
  len+=add;
  sit[head->x][head->y]=' ';
  head->x=a,head->y=b;
  sit[a][b]='*';
  if(head->ne)//如果蛇头后面有子节点 
  bmove(head->ne,p,q,add);
  if(add&&head->ne==NULL)//特判只有头节点的情况 
  head->ne=new snake(p,q);
 }
}
void setap()//随机掉落苹果 
{
    
    
 int pd=rand()%10;
 if(pd) return;
 int x=rand()%N+1,y=rand()%N+1;
 sit[x][y]='@';
}
int main()
{
    
    
 HideCursor();
 srand(time(0));
 while(flag)
 {
    
    
  Sleep(50);//程序暂停,给玩家反应时间 
  print();
  hmove(&head,dir);
  setap();
  if(!kbhit()) continue;//如果玩家没有改变方向,就继续前进 
  ctl=getch();
  switch(ctl)//改变方向 
  {
    
    
   case 'w':
    dir=0;
    break;
   case 's':
    dir=1;
    break;
   case 'a':
    dir=2;
    break;
   case 'd':
    dir=3;
    break;
  }
 }
 system("cls");
 printf("Your point is %d",len);
 return 0;
}

tips:看的是《金刚川》哦

猜你喜欢

转载自blog.csdn.net/weixin_45383207/article/details/109697567