2 qq 33968059 qq_33968059 于 2016.03.13 13:38 提问

贪吃蛇语法有问题 求各位大神帮帮忙
#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
tookkke   2016.03.13 14: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;   
 }  

qq_37102420
qq_37102420 Check_Head 函数中Sum++什么作用啊
12 个月之前 回复
qq_33968059
qq_33968059 谢谢
接近 2 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!