qq_33968059 2016-03-13 05:38 采纳率: 100%
浏览 1454
已采纳

贪吃蛇语法有问题 求各位大神帮帮忙

#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<string.h>
#include<time.h>
const char Shead = '@';//蛇头
const char Sbody = '#';//蛇身
const char Sfood = '*';//食物
const char Snode = '.';//地图的每一个node 
const int High = 8;//地图的高  
const int Long = 16;//地图的宽度 
char GameMap[High][Long];//地图
int Key; //按键保存 
int Sum = 1;//蛇的结束 
int Over  = 0; //蛇的生命(死亡)
int dy[4] = {0,0,-1,1};//上下左右
int dx[4] = {1,-1,0,0};
struct Snake  //定义蛇的结构体 
{
    int x;
    int y;//位置 
    int now;//保存当前节点的方向,为0 1 2 3 分别为上下左右 
}Snake[High*Long] //蛇的最大大小(node) 
void Initial();//地图的初始化 
void Create_Food(); //随机构造食物
void Show();//刷新并显示地图
void Button();//取出按键并且判断方向
void Move();// 蛇的移动
void Check_Border();//检查蛇头是否越界 
void Check_Head(int x,int y);
int main(void)
{
    Initial();
    show();
    return 0;
}
void Initial()//地图的初始化 
{
    int i,j;
    int hx,hy;
    system("title 贪吃蛇");//窗口的标题
    memset(GameMap,'.',sizeof(GameMap));//把地图Initial为'.'
    system("cls"); 
    srand(time(0));//随即的某个种子
    hx = rand()%Long;//产生随即的蛇头 
    hy = rand()%High; 
    GameMap[hx][hy] = Shead; //待测试
    Snake[0].x = hx;//待测试 
    Snake[0].y = hy;//初始化随即的蛇头
    Snake[0].now = -1;//初始化方向
    Create_Food();//随即生成食物
    for(i = 0;i < High;i++)  //地图的显示 
     {
        for(j = 0;j < Long;j++) 
        pritnf("%c",GameMap[i][j]);
        printf("\n"); 
     }
     printf("霸气De蝈蝈★贪吃蛇小游戏!!!\n");
     printf("按任意方向键开始游戏\n");
     getch();//接受一个按键
     Button();//取出输入的按键,并且判断方向  
}
void Create_Food()
{
    int fx,fy;
    while(1)
    {
        fx = rand()%High;
        fy = rand()%Long;
        if(GameMap[fx][fy] == '.')//不能出现在蛇的身上 
        {
            GameMap[fx][fy] = Sfood;
            break; 
        } 
    } 

}
void show()//刷新显示地图 
{
    int i,j;
    while(1)
    {
        sleep(500);//延迟半秒刷新一次地图,1000为1s   
        Button();//判断方向 
        Move(); //
        if(over) 
        { 
             printf("贪吃蛇死亡!\n");
             printf("再来一次吧!\n");
             getchar();
             break; 
        }
        system("cls");//清空地图并且显示地图
        for(i = 0;i < High;i++)
        {
            for(j = 0;j <Long;j++) 
            {
                printf("%c",GameMap[i][j]);
                printf("\n");
            } 
        }
    printf("霸气De蝈蝈★贪吃蛇小游戏!!!\n");
    pritnf("按任意方向键开始游戏\n");
    } 
}
void Button()
{
    if(kbhit =! 0) //kbhit检测是否输入按键,若有则返回一个非零值。
    {
        while(kbhit =! 0) //可能存在许多的按键,要都取完,以最后一个为主 
        key = getch;
        switch(key)
        {
            case 75: Snake[0].now = 0;/*左*/
            break; 
            case 77: Snake[0].now = 1;/*右*/ 
            break;  
            case 72: Snake[0].now = 2;/*上*/ 
            break;
            case 80: Snake[0].now = 3;/*下*/  
            break; 
        }   
    } 
}
void Move()//蛇的移动 
{
    int i,x,y;
    int t =sum;//保存蛇的节数
    x = Snake[0].x; y = Snake[0].y; GameMap[x][y] = '.';//前进后设置蛇头为空 
    Snake[0].x = Snake[0].x + dx[Snake[0].now];//蛇头的移动 
    Snake[0].y = Snake[0].y + dy[Snake[0].now];
    Check_Border();//判断是否越界 
    Check_Head(); //判断蛇头的目前坐标参数
    if(sum = t)//如果未吃到食物,移动 
    {
    for(i = 1;i < sum; i++) 
    {  
   if(i == 1)   //尾节点设置为空再移动  
   GameMap[ Snake[i].x ][ Snake[i].y ] = '.';
   if(i = sum - 1)
   {
    Snake[i].x = x;
    Snake[i].y = y;
    Snake[i].now = Snake[0].now;
   }
   else
   {
    Snake[i].x = Snake[i+1].x; 
    Snake[i].y = Snake[i+1].y;
    Snake[i].now = Snake[i+1].now;
   }
   GameMap[Snake[i].x][Snake[i].y] = '#';
   }
   }
 void Check_Border() //检查蛇头是否越界
 {
    if(Snake[0].x < 0 || Snake[0].x >= High  
 || Snake[0].y < 0 || Snake[0].y >= Long)
    over = 1; 
 } 
 void Check_Head()
 {   
    if(GameMap[ Snake[0].x ][ Snake[0].y ] == '.')  //为空  
  GameMap[ Snake[0].x ][ Snake[0].y ] = '@';  
 else 
  if(GameMap[ Snake[0].x ][ Snake[0].y ] == '*')  //为食物  
  {  
   GameMap[ Snake[0].x ][ Snake[0].y ] = '@';    
   Snake[sum].x = x;   //新增加的蛇身为蛇头后面的那个  
      Snake[sum].y = y;  
      Snake[sum].now = Snake[0].now;  
         GameMap[ Snake[sum].x ][ Snake[sum].y ] = '#';   
   sum++;  
   Create_Food();  //食物吃完了马上再产生一个食物  
  }  
  else 
   over = 1;   
 }  
  • 写回答

1条回答 默认 最新

  • tookkke 2016-03-13 06:19
    关注

    错误有点多,这里不一一列举,主要是很多变量名打错,如声明的Sum,下面使用时却用了sum,还有kbhit是函数,却不加括号。
    除了语法的问题,还有一些算法上的,出生地点可能直接就判定失败,方向输入有问题(这里修改了下),还有个最大的问题,就是蛇尾不跟着一起动啊,出来了就直接停在那里了啊,还有建议改成回车后直接开始下一回合,否则每次都要重启很烦的有没有,写出这样长的代码,也算是很有毅力了,加油吧!

    #include<stdio.h>
    #include<stdlib.h>
    #include<conio.h>
    #include<string.h>
    #include<time.h>
    #include <windows.h>
    const char Shead = '@';//蛇头
    const char Sbody = '#';//蛇身
    const char Sfood = '*';//食物
    const char Snode = '.';//地图的每一个node 
    const int High = 8;//地图的高  
    const int Long = 16;//地图的宽度 
    char GameMap[High][Long];//地图
    int Key; //按键保存 
    int Sum = 1;//蛇的结束 
    int Over  = 0; //蛇的生命(死亡)
    int dy[4] = {0,0,-1,1};//上下左右
    int dx[4] = {1,-1,0,0};
    struct Snake  //定义蛇的结构体 
    {
        int x;
        int y;//位置 
        int now;//保存当前节点的方向,为0 1 2 3 分别为上下左右 
    }Snake[High*Long]; //蛇的最大大小(node) 
    void Initial();//地图的初始化 
    void Create_Food(); //随机构造食物
    void Show();//刷新并显示地图
    void Button();//取出按键并且判断方向
    void Move();// 蛇的移动
    void Check_Border();//检查蛇头是否越界 
    void Check_Head(int x,int y);
    int main(void)
    {
        Initial();
        Show();
        return 0;
    }
    void Initial()//地图的初始化 
    {
        int i,j;
        int hx,hy;
        system("title 贪吃蛇");//窗口的标题
        memset(GameMap,'.',sizeof(GameMap));//把地图Initial为'.'
        system("cls"); 
        srand(time(0));//随即的某个种子
        hx = rand()%Long;//产生随即的蛇头 
        hy = rand()%High; 
        GameMap[hx][hy] = Shead; //待测试
        Snake[0].x = hx;//待测试 
        Snake[0].y = hy;//初始化随即的蛇头
        Snake[0].now = -1;//初始化方向
        Create_Food();//随即生成食物
        for(i = 0;i < High;i++)  //地图的显示 
         {
            for(j = 0;j < Long;j++) 
            printf("%c",GameMap[i][j]);
            printf("\n"); 
         }
         printf("霸气De蝈蝈★贪吃蛇小游戏!!!\n");
         printf("按任意方向键开始游戏\n");
         getch();//接受一个按键
         Button();//取出输入的按键,并且判断方向  
    }
    void Create_Food()
    {
        int fx,fy;
        while(1)
        {
            fx = rand()%High;
            fy = rand()%Long;
            if(GameMap[fx][fy] == '.')//不能出现在蛇的身上 
            {
                GameMap[fx][fy] = Sfood;
                break; 
            } 
        } 
    
    }
    void Show()//刷新显示地图 
    {
        int i,j;
        while(1)
        {
            Sleep(500);//延迟半秒刷新一次地图,1000为1s   
            Button();//判断方向 
            Move(); //
            if(Over) 
            { 
                 printf("贪吃蛇死亡!\n");
                 printf("再来一次吧!\n");
                 getchar();
                 break; 
            }
            system("cls");//清空地图并且显示地图
            for(i = 0;i < High;i++)
            {
                for(j = 0;j <Long;j++) 
                {
                    printf("%c",GameMap[i][j]);
                    //printf("\n");/************************************这里严重错误 ***************************************/
                } 
                printf("\n");
            }
        printf("霸气De蝈蝈★贪吃蛇小游戏!!!\n");
        printf("按任意方向键开始游戏\n");
        } 
    }
    void Button()
    {
        if(kbhit() != 0) //kbhit检测是否输入按键,若有则返回一个非零值。
        {
            while(kbhit() != 0) //可能存在许多的按键,要都取完,以最后一个为主 
            Key = getch();
            switch(Key)
            {
                case 's':case 'S': Snake[0].now = 0;/*下*/
                break; 
                case 'w':case 'W': Snake[0].now = 1;/*上*/ 
                break;  
                case 'a':case 'A': Snake[0].now = 2;/*左*/ 
                break;
                case 'd':case 'D': Snake[0].now = 3;/*右*/  
                break; 
            }   
        } 
    }
    void Move()//蛇的移动 
    {
        int i,x,y;
        int t =Sum;//保存蛇的节数
        x = Snake[0].x; y = Snake[0].y; GameMap[x][y] = '.';//前进后设置蛇头为空 
        Snake[0].x = Snake[0].x + dx[Snake[0].now];//蛇头的移动 
        Snake[0].y = Snake[0].y + dy[Snake[0].now];
        Check_Border();//判断是否越界 
        Check_Head(x,y); //判断蛇头的目前坐标参数
        if(Sum = t)//如果未吃到食物,移动 
        {
        for(i = 1;i < Sum; i++) 
        {  
       if(i == 1)   //尾节点设置为空再移动  
       GameMap[ Snake[i].x ][ Snake[i].y ] = '.';
       if(i = Sum - 1)
       {
        Snake[i].x = x;
        Snake[i].y = y;
        Snake[i].now = Snake[0].now;
       }
       else
       {
        Snake[i].x = Snake[i+1].x; 
        Snake[i].y = Snake[i+1].y;
        Snake[i].now = Snake[i+1].now;
       }
       GameMap[Snake[i].x][Snake[i].y] = '#';
       }
       }
    }
    
     void Check_Border() //检查蛇头是否越界
     {
        if(Snake[0].x < 0 || Snake[0].x >= High  
     || Snake[0].y < 0 || Snake[0].y >= Long)
        Over = 1; 
     } 
     void Check_Head(int x,int y)
     {   
        if(GameMap[ Snake[0].x ][ Snake[0].y ] == '.')  //为空  
      GameMap[ Snake[0].x ][ Snake[0].y ] = '@';  
     else 
      if(GameMap[ Snake[0].x ][ Snake[0].y ] == '*')  //为食物  
      {  
       GameMap[ Snake[0].x ][ Snake[0].y ] = '@';    
       Snake[Sum].x = x;   //新增加的蛇身为蛇头后面的那个  
          Snake[Sum].y = y;  
          Snake[Sum].now = Snake[0].now;  
             GameMap[ Snake[Sum].x ][ Snake[Sum].y ] = '#';   
       Sum++;  
       Create_Food();  //食物吃完了马上再产生一个食物  
      }  
      else 
       Over = 1;   
     }  
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥50 易语言把MYSQL数据库中的数据添加至组合框
  • ¥20 求数据集和代码#有偿答复
  • ¥15 关于下拉菜单选项关联的问题
  • ¥20 java-OJ-健康体检
  • ¥15 rs485的上拉下拉,不会对a-b<-200mv有影响吗,就是接受时,对判断逻辑0有影响吗
  • ¥15 使用phpstudy在云服务器上搭建个人网站
  • ¥15 应该如何判断含间隙的曲柄摇杆机构,轴与轴承是否发生了碰撞?
  • ¥15 vue3+express部署到nginx
  • ¥20 搭建pt1000三线制高精度测温电路
  • ¥15 使用Jdk8自带的算法,和Jdk11自带的加密结果会一样吗,不一样的话有什么解决方案,Jdk不能升级的情况