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

问题描述

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

解决方案

错误有点多,这里不一一列举,主要是很多变量名打错,如声明的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;
 }  

时间: 2025-01-20 17:34:30

测试-贪吃蛇语法有问题 求各位大神帮帮忙的相关文章

database-自学数据库我碰到的这种问题?不知道从何下手?求各位大神帮帮忙!

问题描述 自学数据库我碰到的这种问题?不知道从何下手?求各位大神帮帮忙! 1.设一个关系为R(A,B,C,D,E),它的最小函数依赖集为FD={A→B, C→D,(A,C) →E}则该关系的候选码是什么?该关系属于第几范式?为什么? 2.设一个关系为R(A,B,C,D,E),它的最小函数依赖集为FD={A→B, A→C,A→D,D →E}则该关系的候选码是什么?该关系属于第几范式?为什么?若要规范化为高一级范式,则将得到哪些关系?

求各位大神 帮帮忙 assembly.CreateInstance()

问题描述 求各位大神 帮帮忙 assembly.CreateInstance() Assembly assembly = Assembly.GetExecutingAssembly(); var form = assembly.CreateInstance("HumanResources.成本报表.发货成本明细") as Form; form.MdiParent = ComClass.MainForm; form.Show(); 报调用目标发生了异常 求各位大神帮帮忙 解决方案 Hum

c语言-C语言学籍管理系统,我想添加专业和家庭地址的代码,求各位大神帮帮忙!小菜鸟我感激不尽啊啊啊啊

问题描述 C语言学籍管理系统,我想添加专业和家庭地址的代码,求各位大神帮帮忙!小菜鸟我感激不尽啊啊啊啊 #include #include #include #define M 2 void maininterface(); void findinterface(); void choice(long sno[], char sname[][20], int sage[], float cs[], int N); void findchoice(long sno[], char sname[][

jsp-JSP传给action的是字符串类型,转换数据类型,让getlist()接收,求大神帮帮忙写下代码

问题描述 JSP传给action的是字符串类型,转换数据类型,让getlist()接收,求大神帮帮忙写下代码 JSP传给action的是字符串类型,怎么转换数据类型,然后让getlist()接收,求各位大神帮帮忙写下代码~ 如果能够给解释一下,那就千恩万谢啦 解决方案 可以通过强制转换在前面加上int 解决方案二: gongWenLeiBieList = dao.getList(Integer.parseInt(mingCheng));

算法-c++的一个简单的实现 求大神帮帮忙

问题描述 c++的一个简单的实现 求大神帮帮忙 1. 定义一个普通帐户类Account,成员变量包括:string型的m_acctNo(账号)和m_acctPass(取款密码),double型的m_balance(余额).成员函数包括构造函数,取款WithDraw(double m).存款Deposit(double m).修改密码ChangePass()和显示帐户信息Display(). 以Account类做基类,派生出信用卡类Credit,新增成员变量m_overDraft,表示信用卡透支额

c++-关于clang语法树AST操作。求大神帮帮忙。

问题描述 关于clang语法树AST操作.求大神帮帮忙. 我需要将c++代码利用clang生成语法树,在语法树上进行改动,再变回代码. 请问应该怎么做? clang生成的语法树信息存在哪里,怎么提取?怎么将AST再转成c++代码?

java-Java 新手问题 求大神帮帮忙

问题描述 Java 新手问题 求大神帮帮忙 大家好,我最近刚刚开始学习编程.?今天有个作业是让我们做一个类似于超速罚单的程序.?但是我怎么都显示不出来罚单. /** ?*?Lab3b?for?secction?3 ?*? ?*?@author?(Castiel) ?*?@version?(01-10-2015) ?*/ public?class?Driver { ????//?instance?variables?-?replace?the?example?below?with?your?own

session-求大神帮帮忙,有一句代码不理解,求详解,万分感谢~return

问题描述 求大神帮帮忙,有一句代码不理解,求详解,万分感谢~return 求大神重点详细地讲解下,try里的那段代码,万分感谢 `` public ZheJiuSheZhi get(int id) { Session sess = this.getSessionFactory().openSession(); try { return (ZheJiuSheZhi) sess.get(ZheJiuSheZhi.class, id); } finally { sess.close(); } }` 解

新生 求大神帮帮忙!

问题描述 新生 求大神帮帮忙! 解决方案 求大神帮帮忙 解决方案二: 先看看你的数据库启动了没 解决方案三: 试试: 打开'程序'-'所有程序'-'Microsoft SQL Server 2012 '-'配置工具'-'SQL Server 配置管理器',在弹出的窗体中,找到'SQL Server 2012 网络配置',把'MSSQLSERVER的协议'下的"Named Pipes"和"TCP/IP"启动,然后重新启动Microsoft SQL Server 201