chenyonken 2017-02-11 11:16 采纳率: 0%
浏览 1263

贪吃蛇无法调试出错,提示内存泄漏

问题:调试时,一要进入Init() 函数时就提示错误,错误提示如图,无法调试

 #include<stdio.h>
#include<graphics.h>
#include<stdlib.h>
#include<string.h>
#include<time.h>
#include<dos.h>
#include<conio.h>

#define N 200
#define LEFT 1
#define RIGHT 3
#define DOWN 0
#define UP 5
#define Esc 9

long int i,key;
long int score=0;//得分
long int gamespeed=50000;//游戏速度可以自己调整

struct Food
{
     int x;
     int y;
     int yes;
}food;

struct Snake
{
     int x[N];
     int y[N];
     int node;
     int direction;
     int life;
}snake;

void Init();//图形驱动
void Close();//图形结束
void DrawK();//开始画面
void GameOver();//结束游戏
void GamePlay();//玩游戏的具体过程
void PrScore();//输出成绩
void delay(long int i);

void main()
{
    Init();
    DrawK();
    GamePlay();
    Close();    
}


/*图形驱动*/
void Init()
{
//  int gd=DETECT,gm;
//  initgraph(&gd,&gm,"");
    initgraph(640,480);
//  cleardevice();
}



/*开始界面,左上角坐标为(50,40),右下角坐标为(610,460)的围墙*/
void DrawK()
{
    setbkcolor(11);
    setlinestyle(0,1,NULL,0);//设置线型
//  setlinestyle(SOLID_LINE,0,THICK_WIDTH);
    for(i=50;i<=600;i+=10)
    {
        rectangle(i,40,i+10,49);//上边
        rectangle(i,451,i+10,460);//下边
    }
    for(i=40;i<=450;i+=10)
    {
        rectangle(50,i,59,i+10);//左边
        rectangle(601,i,610,i+10);//右边
    }
}

//玩游戏的具体过程
void GamePlay()
{
//  randomize();//随机数发生器
    srand(time(0));
    food.yes=1;//1表示需要出现新食物,0表示已经存在食物
    snake.life=0;//活着
    snake.direction=1;//方向往右
    snake.x[0]=100;snake.y[0]=100;//蛇头
    snake.x[1]=110;snake.y[1]=100;
    snake.node=2;//节数
    PrScore();//输出得分
    while(1)
    {
        while(!kbhit())
        {
            if(food.yes==1)//需要出现新食物
            {
                food.x=rand()%400+60;
                food.y=rand()%350+60;
                while(food.x%10!=0)//食物随机出现后必须让食物在整格内,才可以让蛇吃到
                {
                    food.x++;
                }
                while(food.y%10!=0)
                {
                    food.y++;
                }
                food.yes=0;//画面上有食物了
            }
            if(food.yes==0)//画面上有了食物就要显示
            {
                setcolor(GREEN);
                rectangle(food.x,food.y,food.x+10,food.y-10);
            }
            for(i=snake.node-1;i>0;i--)
            {
                //蛇的每个环节向前移动,也就是贪吃蛇的关键算法
                snake.x[i]=snake.x[i-1];
                snake.y[i]=snake.y[i-1];
            }
            //1,2,3,4表示右,左,上,下四个方向,通过这个判断来移动蛇头
            switch(snake.direction)
            {
                case 1:snake.x[0]+=10;break;
                case 2:snake.x[0]-=10;break;
                case 3:snake.y[0]-=10;break;
                case 4:snake.y[0]+=10;break;
            }
            for(i=3;i<snake.node;i++)/*从蛇的第四节开始判断是否咬到自己,不蛇头是两节,第三节不可能拐过来*/
            {
                if(snake.x[i]==snake.x[0] && snake.y[i]==snake.y[0])
                {
                    GameOver();//显示失败
                    snake.life=1;
                    break;
                }
            }
            if(snake.x[0]<55 || snake.x[0]>595 ||snake.y[0]<55 ||snake.y[0]>455)//蛇是否撞到墙壁
            {
                GameOver();
                snake.life=1;
            }
            if(snake.life==1)
            {
                break;
            }
            if(snake.x[0]==food.x && snake.y[0]==food.y)//吃到食物以后
            {
                setcolor(0);//把画面上的食物去掉
                rectangle(food.x,food.y,food.x+10,food.y-10);
                snake.x[snake.node]=-20;//
                snake.y[snake.node]=-20;//
                //新的一节先放在看不见的位置,下次循环就取前一节的位置
                snake.node++;//蛇的身体长一节
                food.yes=1;//画面上需要出现新的食物
                score+=10;
                PrScore();//输出新得分
            }
            setcolor(4);//画出蛇
            for(i=0;i<snake.node;i++)
                rectangle(snake.x[i],snake.y[i],snake.x[i]+10,snake.y[i]-10);
            delay(gamespeed);
            setcolor(0);//
            rectangle(snake.x[snake.node-1],snake.y[snake.node-1],snake.x[snake.node-1]+10,snake.y[snake.node-1]-10);   
        }
        if(snake.life==1)
        {
            break;
        }
    //  key=biolskey(0);
        scanf("%d",&key);
        if(key==Esc)//按ESC键退出
            break;
        else if(key==UP && snake.direction!=4)//判断是否wangle相反方向移动
            snake.direction=3;
        else if(key==RIGHT && snake.direction!=2)
            snake.direction=1;
        else if(key==LEFT && snake.direction!=1)
            snake.direction=2;
        else if(key==DOWN && snake.direction!=3)
            snake.direction=4;
    }

}


void PrScore()
{

}

void GameOver()//结束游戏
{
}
void Close()//图形结束
{

}

void delay(long int i)
{}

图片说明

  • 写回答

1条回答 默认 最新

  • 战在春秋 2017-02-11 12:27
    关注

    graphics.h是Borland c++使用的库。
    你用的是Visual c++, 电脑里应该没有该文件,很奇怪怎么不报错呢?

    评论

报告相同问题?

悬赏问题

  • ¥15 ads仿真结果在圆图上是怎么读数的
  • ¥20 Cotex M3的调试和程序执行方式是什么样的?
  • ¥20 java项目连接sqlserver时报ssl相关错误
  • ¥15 一道python难题3
  • ¥15 用matlab 设计一个不动点迭代法求解非线性方程组的代码
  • ¥15 牛顿斯科特系数表表示
  • ¥15 arduino 步进电机
  • ¥20 程序进入HardFault_Handler
  • ¥15 oracle集群安装出bug
  • ¥15 关于#python#的问题:自动化测试