宝妹 发表于 2017-10-28 00:22:41

我按照360搜索提供的贪食蛇程序编写总是出现1个错误,请大师及各位前辈指点!

/* 贪食蛇程序 by champking */

#define N 200

#include'graphics.h'

#include <stdlib.h>

#include <dos.h>


#define LEFT 0x4b00

#define RIGHT 0x4d00

#define DOWN 0x5000

#define UP 0x4800

#define ESC 0x011b

int i, key;

int score = 0;/*得分*/

int gamespeed = 100000;/*游戏速度自己调整*/

struct Food

{
        int x;/*食物的横坐标*/
    int y;/*食物的纵坐标*/
        int yes;/*判断是否要出现食的变量*/

}

food;/*食物的结构体*/
struct Snake;

{
int x ;
int y ;

int node;/*蛇的节数*/
int direction;/*蛇移动方向*/
int life;/*蛇的生命,0活着,1死亡*/
}
snake;

void Init(void);/*图形驱动*/
void Close(void);/*图形结束*/
void Drawk(void);/*开始画面*/
void GameOver(void);/*结束游戏*/
void GamePlay(void);/*玩游戏具体过程*/
void PrScore(void);/*输出成绩*/
/*主函数*/

   void main(void);


   {

           Init();/*图形驱动*/

           DrawK();/*开始画面*/
          
           GamePlay();/*玩游戏具体过程*/

           Close();/*图形结束*/
   
   }

   /*图形驱动*/

   void Init(void);

   {
    int gd = DETECT,gm;

        initgraph(&gd,&gm,"c:\\tc");

        cleardevice();


   
   }
   /*开始画面,左上角坐标为(50,40),右下角坐标为(610,460)的围墙*/

   void DrawK(void);

   {

    /*setbkcolor(LIGHTGREEN);*/

           setcolor(11);

           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(void);
   {
   

    randomize();/*随机数发生器*/

    food.yes = 1;/*1表示需要出现新食物,0表示已经存在食物*/

    snake.life = 0; /*活着*/

    snake.direction = 1; /*方向往右*/

        snake.x = 100; snake.y =100; /*蛇头*/
       
        snake.x = 110; snake.y =100;

        snake.node = 2; /*节数*/

    PrScore();/*输出得分*/

   
    while(1);/*可以重复玩游戏,压ESC键结束*/

        {
   
   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 = snake.x;

                   snake.y = snake.y;
          
          
           }

/*1,2,3,4表示右,左,上,下四个方向,通过这个判断来移动蛇头 */

           switch(snake.direction);

           {

           case 1: snake.x+= 10; break;
       
           case 2: sanke.x-= 10; break;

       case 3: snake.y-= 10; break;

       case 4: snake.y+= 10; break;

           }

           for(i = 3; i < snake.node; i++);/*从蛇的第四节开始判断是否撞到自己了,因为蛇头为两节,第三节不可能拐过来*/

           {

                   if(snake.x = = snake.x&& snake.y = = snake.y);

                   {

                GameOver();/*显示失败*/

                snake.life = 1 ;

                break;

                   }

           }

          if(snake.x<55||snake.x>595||snake.y<55||snake.y>455);/*蛇是否撞到墙壁*/

                {

                GameOver();/*本次游戏结束*/

                snake.life=1; /*蛇死*/

                }

                if(snake.life = = 1);/*以上两种判断以后,如果蛇死就出内循环不,重新开始*/

                break;

               
                if(snake.x == food.x && snake.y == food.y);/*吃到食物以后*/
               
                {

                setcolor(0);/*把画面上的食物东西去掉*/

                rectangle(food.x,food.y,food.x +10,food.y -10);
               
                snake.x =- 20; snake.y=-20;

                /*新的一节先放在看不见的位置,下次循环就取前一节的位置*/

                snake.node++;/*蛇的身体长一节*/

                food.yes =1; /*画面上需要出现新的食物*/

                score + = 10 ;

                PrScore();/*输出新得分*/

                }



                setcolor(4);/*画出蛇*/

                for(i = 0; i<snake.node; i++);

                rectangle(snake.x,snake.y,snake.x + 10,snake.y-10);


                delay(gamespeed);


                setcolor(0);/*用黑色去除蛇的最后一节*/

                rectangle(snake.x,snake.y,snake.x+10,snake.y-10);

                }

                /*endwhile(!kbhit)*/

                if(snake.life == 1);/*如果蛇死就跳出循环*/

      break;


                key = bioskey (0);/*接收按键*/


                if(key == ESC)/*按ESC键退出*/

      break;

                else

                if(key == UP&& snake.direction)! =4)

                /*判断是否往相反的方向移动*/

                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 ;

                }

                /*endwhile(1)*/

                }

                /*游戏结束*/

                void GameOver(void);

                {
                cleardevice();

                PrScore();
               
                setcolor(RED);

                settextstyle(0,0,4);

                outtextxy(200,200,"GAME OVER");

                getch();

                }

                /*输出成绩*/

                void PrScore(void);

                {
                char str;

      setfillstyle (SOLID_FILL,YELLOW);

                bar(50,15,220,35);

                setcolor(6);

                settextstyle(0,0,2);

                sprintf(str,"score:%d",score);

                outtextxy (55,20,str);

                }

                /*图形结束*/

                void Close(void);

                {

                getch();

                closegraph();

                }

BngThea 发表于 2017-10-28 10:29:37

代码太长了,请贴出出错提示

宝妹 发表于 2017-10-28 11:19:32

--------------------Configuration: snake - Win32 Debug--------------------
Compiling...
Greedy snake.cpp
e:\vc++\msdev98\myprojects\snake\greedy snake.cpp(5) : error C2015: too many characters in constant
e:\vc++\msdev98\myprojects\snake\greedy snake.cpp(5) : error C2006: #include expected a filename, found 'constant'
e:\vc++\msdev98\myprojects\snake\greedy snake.cpp(40) : error C2447: missing function header (old-style formal list?)
e:\vc++\msdev98\myprojects\snake\greedy snake.cpp(48) : error C2501: 'snake' : missing storage-class or type specifiers
e:\vc++\msdev98\myprojects\snake\greedy snake.cpp(61) : error C2447: missing function header (old-style formal list?)
e:\vc++\msdev98\myprojects\snake\greedy snake.cpp(77) : error C2447: missing function header (old-style formal list?)
e:\vc++\msdev98\myprojects\snake\greedy snake.cpp(91) : error C2447: missing function header (old-style formal list?)
e:\vc++\msdev98\myprojects\snake\greedy snake.cpp(125) : error C2447: missing function header (old-style formal list?)
e:\vc++\msdev98\myprojects\snake\greedy snake.cpp(330) : error C2447: missing function header (old-style formal list?)
e:\vc++\msdev98\myprojects\snake\greedy snake.cpp(349) : error C2447: missing function header (old-style formal list?)
e:\vc++\msdev98\myprojects\snake\greedy snake.cpp(370) : error C2447: missing function header (old-style formal list?)
e:\vc++\msdev98\myprojects\snake\greedy snake.cpp(393) : error C2143: syntax error : missing ';' before '}'
e:\vc++\msdev98\myprojects\snake\greedy snake.cpp(393) : error C2143: syntax error : missing ';' before '}'
e:\vc++\msdev98\myprojects\snake\greedy snake.cpp(393) : error C2143: syntax error : missing ';' before '}'
执行 cl.exe 时出错.

snake.exe - 1 error(s), 0 warning(s)

weizhongyang 发表于 2017-10-28 12:19:26

宝妹 发表于 2017-10-28 11:19
--------------------Configuration: snake - Win32 Debug--------------------
Compiling...
Greedy sna ...

错误修改:
1、结构体定义
struct Snake;    /*应该去年后面的";"*/
{
int x ;
int y ;

int node;/*蛇的节数*/
int direction;/*蛇移动方向*/
int life;/*蛇的生命,0活着,1死亡*/
}snake;

2、while()!kbhit()); /*应该改为while(!kbhit());*/
3、while(1);          /*应该去年后面的“;”*/


weizhongyang 发表于 2017-10-28 12:21:01

weizhongyang 发表于 2017-10-28 12:19
错误修改:
1、结构体定义
struct Snake;    /*应该去年后面的";"*/


修改后的程序:
/* 贪食蛇程序 by champking */

#define N 200

#include'graphics.h'

#include <stdlib.h>

#include <dos.h>


#define LEFT 0x4b00

#define RIGHT 0x4d00

#define DOWN 0x5000

#define UP 0x4800

#define ESC 0x011b

int i, key;

int score = 0;/*得分*/

int gamespeed = 100000;/*游戏速度自己调整*/

struct Food
{
    int x;/*食物的横坐标*/
    int y;/*食物的纵坐标*/
    int yes;/*判断是否要出现食的变量*/
}food;/*食物的结构体*/

struct Snake
{
int x ;
int y ;

int node;/*蛇的节数*/
int direction;/*蛇移动方向*/
int life;/*蛇的生命,0活着,1死亡*/
}snake;

void Init(void);/*图形驱动*/
void Close(void);/*图形结束*/
void Drawk(void);/*开始画面*/
void GameOver(void);/*结束游戏*/
void GamePlay(void);/*玩游戏具体过程*/
void PrScore(void);/*输出成绩*/
/*主函数*/

void main(void);
{
    Init();/*图形驱动*/
    DrawK();/*开始画面*/
    GamePlay();/*玩游戏具体过程*/
    Close();/*图形结束*/
}

/*图形驱动*/

void Init(void);
{
    int gd = DETECT,gm;
    initgraph(&gd,&gm,"c:\\tc");
    cleardevice();
}
/*开始画面,左上角坐标为(50,40),右下角坐标为(610,460)的围墙*/

void DrawK(void);
{
    /*setbkcolor(LIGHTGREEN);*/
    setcolor(11);
    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(void);
{
    randomize();/*随机数发生器*/
    food.yes = 1;/*1表示需要出现新食物,0表示已经存在食物*/
    snake.life = 0; /*活着*/
    snake.direction = 1; /*方向往右*/
    snake.x = 100; snake.y =100; /*蛇头*/
    snake.x = 110; snake.y =100;
    snake.node = 2; /*节数*/
    PrScore();/*输出得分*/


    while(1)/*可以重复玩游戏,压ESC键结束*/
    {
      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 = snake.x;
               snake.y = snake.y;
            }

            /*1,2,3,4表示右,左,上,下四个方向,通过这个判断来移动蛇头 */

            switch(snake.direction);
            {
                case 1: snake.x+= 10; break;
                case 2: sanke.x-= 10; break;
                case 3: snake.y-= 10; break;
                case 4: snake.y+= 10; break;
                default:break;
            }

            for(i = 3; i < snake.node; i++);/*从蛇的第四节开始判断是否撞到自己了,因为蛇头为两节,第三节不可能拐过来*/
            {

                if(snake.x = = snake.x&& snake.y = = snake.y);
               {
                  GameOver();/*显示失败*/
                  snake.life = 1 ;
                  break;
               }
            }

            if(snake.x<55||snake.x>595||snake.y<55||snake.y>455);/*蛇是否撞到墙壁*/
            {
                GameOver();/*本次游戏结束*/
                snake.life=1; /*蛇死*/
            }

            if(snake.life = = 1);/*以上两种判断以后,如果蛇死就出内循环不,重新开始*/
                break;


            if(snake.x == food.x && snake.y == food.y);/*吃到食物以后*/
            {
                setcolor(0);/*把画面上的食物东西去掉*/
                rectangle(food.x,food.y,food.x +10,food.y -10);
                snake.x =- 20; snake.y=-20;
                /*新的一节先放在看不见的位置,下次循环就取前一节的位置*/
                snake.node++;/*蛇的身体长一节*/
                food.yes =1; /*画面上需要出现新的食物*/
                score + = 10 ;
                PrScore();/*输出新得分*/
            }

            setcolor(4);/*画出蛇*/
            for(i = 0; i<snake.node; i++);
                rectangle(snake.x,snake.y,snake.x + 10,snake.y-10);

            delay(gamespeed);
            setcolor(0);/*用黑色去除蛇的最后一节*/
            rectangle(snake.x,snake.y,snake.x+10,snake.y-10);
      }/*endwhile(!kbhit)*/

      if(snake.life == 1);/*如果蛇死就跳出循环*/
            break;

      key = bioskey (0);/*接收按键*/

      if(key == ESC)/*按ESC键退出*/
            break;
      else if(key == UP&& snake.direction)! =4)
            /*判断是否往相反的方向移动*/
            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 ;
    }
    /*endwhile(1)*/
}

/*游戏结束*/

void GameOver(void);
{
    cleardevice();
    PrScore();
    setcolor(RED);
    settextstyle(0,0,4);
    outtextxy(200,200,"GAME OVER");
    getch();
}

/*输出成绩*/

void PrScore(void);
{
    char str;
    setfillstyle (SOLID_FILL,YELLOW);
    bar(50,15,220,35);
    setcolor(6);
    settextstyle(0,0,2);
    sprintf(str,"score:%d",score);
    outtextxy (55,20,str);
}

/*图形结束*/

void Close(void);
{
    getch();
    closegraph();
}

宝妹 发表于 2017-10-28 13:43:50

weizhongyang 发表于 2017-10-28 12:21
修改后的程序:

谢谢,我这就去试一下!看看能不能运行{:5_92:}

宝妹 发表于 2017-10-28 14:57:43

weizhongyang 发表于 2017-10-28 12:21
修改后的程序:

我试过了还是不行,1. struct Snake 去掉了分号

2. while()!kbhit());这个我本来是按照你输入的样子的,但它老提示说少)和;所以才加上去的。

3.while(1);也是上面的提示才加上去的,但现在试了还是运行不了。

weizhongyang 发表于 2017-10-29 11:42:30

宝妹 发表于 2017-10-28 14:57
我试过了还是不行,1. struct Snake 去掉了分号

2. while()!kbhit());这个我本来是按照你输入的样子的 ...

先确认几个问题
1、用的是什么编译软件
2、头文件graphics.h是否能链接到
3、判断时,不需要在后面加";", 如if,for后面你都加了;

试下修改后的代码:
/* 贪食蛇程序 by champking */

#define N 200

#include'graphics.h'

#include <stdlib.h>

#include <dos.h>


#define LEFT 0x4b00

#define RIGHT 0x4d00

#define DOWN 0x5000

#define UP 0x4800

#define ESC 0x011b

int i, key;

int score = 0;/*得分*/

int gamespeed = 100000;/*游戏速度自己调整*/

struct Food
{
    int x;/*食物的横坐标*/
    int y;/*食物的纵坐标*/
    int yes;/*判断是否要出现食的变量*/
}food;/*食物的结构体*/

struct Snake
{
int x ;
int y ;

int node;/*蛇的节数*/
int direction;/*蛇移动方向*/
int life;/*蛇的生命,0活着,1死亡*/
}snake;

void Init(void);/*图形驱动*/
void Close(void);/*图形结束*/
void Drawk(void);/*开始画面*/
void GameOver(void);/*结束游戏*/
void GamePlay(void);/*玩游戏具体过程*/
void PrScore(void);/*输出成绩*/
/*主函数*/

void main(void)
{
    Init();/*图形驱动*/
    DrawK();/*开始画面*/
    GamePlay();/*玩游戏具体过程*/
    Close();/*图形结束*/
}

/*图形驱动*/

void Init(void)
{
    int gd = DETECT,gm;
    initgraph(&gd,&gm,"c:\\tc");
    cleardevice();
}
/*开始画面,左上角坐标为(50,40),右下角坐标为(610,460)的围墙*/

void DrawK(void)
{
    /*setbkcolor(LIGHTGREEN);*/
    setcolor(11);
    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(void)
{
    randomize();/*随机数发生器*/
    food.yes = 1;/*1表示需要出现新食物,0表示已经存在食物*/
    snake.life = 0; /*活着*/
    snake.direction = 1; /*方向往右*/
    snake.x = 100; snake.y =100; /*蛇头*/
    snake.x = 110; snake.y =100;
    snake.node = 2; /*节数*/
    PrScore();/*输出得分*/


    while(1)/*可以重复玩游戏,压ESC键结束*/
    {
      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 = snake.x;
               snake.y = snake.y;
            }

            /*1,2,3,4表示右,左,上,下四个方向,通过这个判断来移动蛇头 */

            switch(snake.direction)
            {
                case 1: snake.x+= 10; break;
                case 2: sanke.x-= 10; break;
                case 3: snake.y-= 10; break;
                case 4: snake.y+= 10; break;
                default:break;
            }

            for(i = 3; i < snake.node; i++)/*从蛇的第四节开始判断是否撞到自己了,因为蛇头为两节,第三节不可能拐过来*/
            {

                if(snake.x = = snake.x&& snake.y = = snake.y)
               {
                  GameOver();/*显示失败*/
                  snake.life = 1 ;
                  break;
               }
            }

            if(snake.x<55||snake.x>595||snake.y<55||snake.y>455)/*蛇是否撞到墙壁*/
            {
                GameOver();/*本次游戏结束*/
                snake.life=1; /*蛇死*/
            }

            if(snake.life = = 1)/*以上两种判断以后,如果蛇死就出内循环不,重新开始*/
                break;


            if(snake.x == food.x && snake.y == food.y)/*吃到食物以后*/
            {
                setcolor(0);/*把画面上的食物东西去掉*/
                rectangle(food.x,food.y,food.x +10,food.y -10);
                snake.x =- 20; snake.y=-20;
                /*新的一节先放在看不见的位置,下次循环就取前一节的位置*/
                snake.node++;/*蛇的身体长一节*/
                food.yes =1; /*画面上需要出现新的食物*/
                score + = 10 ;
                PrScore();/*输出新得分*/
            }

            setcolor(4);/*画出蛇*/
            for(i = 0; i<snake.node; i++)
                rectangle(snake.x,snake.y,snake.x + 10,snake.y-10);

            delay(gamespeed);
            setcolor(0);/*用黑色去除蛇的最后一节*/
            rectangle(snake.x,snake.y,snake.x+10,snake.y-10);
      }/*endwhile(!kbhit)*/

      if(snake.life == 1)/*如果蛇死就跳出循环*/
            break;

      key = bioskey (0);/*接收按键*/

      if(key == ESC)/*按ESC键退出*/
            break;
      else if(key == UP&& snake.direction)! =4)
            /*判断是否往相反的方向移动*/
            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 ;
    }
    /*endwhile(1)*/
}

/*游戏结束*/

void GameOver(void)
{
    cleardevice();
    PrScore();
    setcolor(RED);
    settextstyle(0,0,4);
    outtextxy(200,200,"GAME OVER");
    getch();
}

/*输出成绩*/

void PrScore(void)
{
    char str;
    setfillstyle (SOLID_FILL,YELLOW);
    bar(50,15,220,35);
    setcolor(6);
    settextstyle(0,0,2);
    sprintf(str,"score:%d",score);
    outtextxy (55,20,str);
}

/*图形结束*/

void Close(void)
{
    getch();
    closegraph();
}

宝妹 发表于 2017-10-30 16:33:04

weizhongyang 发表于 2017-10-29 11:42
先确认几个问题
1、用的是什么编译软件
2、头文件graphics.h是否能链接到


不好意思,本来昨天回复过的,但是由于截图上传错误又无法更换与删除因而失去了发帖的机会,只得今天再发,以下是我的操作,请过目!

weizhongyang 发表于 2017-10-30 17:20:22

宝妹 发表于 2017-10-30 16:33
不好意思,本来昨天回复过的,但是由于截图上传错误又无法更换与删除因而失去了发帖的机会,只得今天再发 ...

你的这个软件安装目录怎么还有乱码,且有中文目录
改成英文的目录,不要有乱码目录

再试试我上面的程序,是否能编译过。

宝妹 发表于 2017-10-31 21:41:32

weizhongyang 发表于 2017-10-30 17:20
你的这个软件安装目录怎么还有乱码,且有中文目录
改成英文的目录,不要有乱码目录



好的。

宝妹 发表于 2017-10-31 22:17:57

weizhongyang 发表于 2017-10-30 17:20
你的这个软件安装目录怎么还有乱码,且有中文目录
改成英文的目录,不要有乱码目录



这位前辈,我刚才按照你的指导从小甲鱼的软件下载处安装了英文版的VC++软件,并在include里面安装了头文件graphics.h,现在的结果是检查0错误,但程序仍无法运行,我的截图如下,请过目:

宝妹 发表于 2017-10-31 22:29:12

本帖最后由 宝妹 于 2017-10-31 22:31 编辑

weizhongyang 发表于 2017-10-30 17:20
你的这个软件安装目录怎么还有乱码,且有中文目录
改成英文的目录,不要有乱码目录



另外前辈,这是我找到的另一种关于贪食蛇的源代码,它却可以运行,甚至是在原来那个中文版带乱码的编辑器里,我想知道它是怎么做到的,请过目:



#include <windows.h>
#include <stdlib.h>
#include <time.h>
#include <stdio.h>
#include <string.h>
#include <conio.h>
#define N 21

int apple,num;
char score;
char tail;

void gotoxy(int x, int y)    //输出坐标
{
      COORD pos;
      pos.X = x;
      pos.Y = y;
      SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos);
}

void color(int b)         //颜色函数
{
    HANDLE hConsole = GetStdHandle((STD_OUTPUT_HANDLE)) ;
    SetConsoleTextAttribute(hConsole,b) ;
}

int Block(char head)   //判断出界
{
      if ((head < 1) || (head > N) || (head < 1) || (head > N))
                return 1;
      return 0;
}

int Eat(char snake)   //吃了苹果
{
      if ((snake == apple) && (snake == apple))
       {
                apple = apple = apple = 0;
                gotoxy(N+44,10);
                color(13);
                printf("%d",score*10);
                color(11);
                return 1;
         }
      return 0;
}

void Draw(char **snake, int len)    //蛇移动
{
      if (apple)
                {
                gotoxy(apple * 2, apple);
                color(12);
                printf("●");
                color(11);
      }
      gotoxy(tail * 2, tail);
      if (tail)
         {
                  color(num);
            printf("★");
            color(num);
         }
    else
      printf("■");
      gotoxy(snake * 2, snake);
      color(num);
      printf("★");
      color(num);
      putchar('\n');
}

char** Move(char **snake, char dirx, int *len)   //控制方向
{
      int i, full = Eat(snake);
      memcpy(tail, snake[(*len)-1], 2);
      for (i = (*len) - 1; i > 0; --i)
                memcpy(snake, snake, 2);
      switch (dirx)
          {
         case 'w': case 'W': --snake; break;
            case 's': case 'S': ++snake; break;
         case 'a': case 'A': --snake; break;
         case 'd': case 'D': ++snake; break;
         default: ;
         }
      if (full)   
         {
                snake = (char **)realloc(snake, sizeof(char *) * ((*len) + 1));
                snake[(*len)] = (char *)malloc(sizeof(char) * 2);
                memcpy(snake[(*len)], tail, 2);
                ++(*len);
                ++score;
                if(score < 16)
                ++score;
                tail = 1;
         }
         else
                tail = 0;
                return snake;
}

void init(char plate, char ***snake_x, int *len)//初始化
{
      int i, j;
      char **snake = NULL;

      *len = 3;
      score = score =3;
      snake = (char **)realloc(snake, sizeof(char *) * (*len));
      for (i = 0; i < *len; ++i)
                snake = (char *)malloc(sizeof(char) * 2);
               
      for (i = 0; i < 3; ++i)
                {
                snake = N/2 + 1;
                snake = N/2 + 1 + i;
             }
            
      for (i = 1; i <= N; ++i)
                for (j = 1; j <= N; ++j)
                        plate = 1;
                        
      apple = rand()%N + 1; apple = rand()%N + 1;
      apple = 1;

      for (i = 0; i < N + 2; ++i)
                {
                gotoxy(0, i);
                for (j = 0; j < N + 2; ++j)
                        {
                        switch (plate)
                              {
                           case 0:
                                 color(12);printf("□");color(11); continue;
                        case 1: printf("■"); continue;
                           default: ;
                           }
                  }
                   putchar('\n');
            }
      for (i = 0; i < (*len); ++i)
       {
                gotoxy(snake * 2, snake);
                printf("★");
            }
      putchar('\n');
      *snake_x = snake;
}

void Manual()
{
      gotoxy(N+30,2);
      color(10);
      printf("按 W S A D 移动方向");
      gotoxy(N+30,4);
      printf("按 space 键暂停");
      gotoxy(N+30,8);
      color(11);
      printf("历史最高分为: ");
      color(12);
      gotoxy(N+44,8);
      printf("%d",score*10);
      color(11);
      gotoxy(N+30,12);
      printf("你现在得分为: 0");         
}

int File_in()   //取记录的分数
{
   FILE *fp;
   if((fp = fopen("C:\\tcs.txt","a+")) == NULL)
   {
            gotoxy(N+18, N+2);
   printf("文件不能打开\n");
         exit(0);
   }
   if((score = fgetc(fp)) != EOF);
   else
   score = 0;
   return 0;
}

int File_out()    //存数据
{
      
      FILE *fp;
      if(score > score)
      {gotoxy(10,10);
      color(12);
      puts("闯关失败 加油耶");
      gotoxy(0,N+2);
      return 0;
      }
      if((fp = fopen("C:\\tcs.txt","w+")) == NULL)
      {
                printf("文件不能打开\n");
                exit(0);
      }
    if(fputc(--score,fp)==EOF)
         printf("输出失败\n");
    gotoxy(10,10);
      color(12);
      puts("恭喜您打破记录");
      gotoxy(0,N+2);
      return 0;
}

void Free(char **snake, int len)    //释放空间
{
      int i;
      for (i = 0; i < len; ++i)
                free(snake);
      free(snake);
}

int main(void)
{
      int len;
      char ch = 'g';
      char a = {{0}};
      char **snake;
      srand((unsigned)time(NULL));
      color(11);
      File_in();
      init(a, &snake, &len);
      Manual();
      while (ch != 0x1B)   // 按 ESC 结束
         {
                Draw(snake, len);
                if (!apple) {
                        apple = rand()%N + 1;
                        apple = rand()%N + 1;
                        apple = 1;
                        num++;
                                        if(num>8)
                                             num=0;
                }
                Sleep(200-score*10);
                setbuf(stdin, NULL);
                if (kbhit())
                   {
                        gotoxy(0, N+2);
                        ch = getche();
                  }
               snake = Move(snake, ch, &len);
               if (Block(snake)==1)
                  {
                        gotoxy(N+2, N+2);
                        puts("你输了");
                        File_out();
                        Free(snake, len);
                        getche();
                        exit(0);
                  }                        
      }
      Free(snake, len);
      exit(0);
}

weizhongyang 发表于 2017-11-1 15:26:40

宝妹 发表于 2017-10-31 22:29
另外前辈,这是我找到的另一种关于贪食蛇的源代码,它却可以运行,甚至是在原来那个中文版带乱码的编辑 ...

你好,

这个可以支持,是因为这所用的是windows的VC自带的图形库文件<conio.h><windows.h>,所以可以跑起来没问题。
但貌似graphics.h这个文件是在TC软件里的,是从外面引用进来的吧,程序运行不了,应该是不兼容的问题。

weizhongyang 发表于 2017-11-1 15:28:21

宝妹 发表于 2017-10-31 22:29
另外前辈,这是我找到的另一种关于贪食蛇的源代码,它却可以运行,甚至是在原来那个中文版带乱码的编辑 ...

如果真想用graphics.h文件来画图形的话
可以参照这个看看:http://www.cnblogs.com/geore/p/5914664.html
以及:http://blog.csdn.net/bcbobo21cn/article/details/51207782

宝妹 发表于 2017-11-1 23:10:05

weizhongyang 发表于 2017-11-1 15:26
你好,

这个可以支持,是因为这所用的是windows的VC自带的图形库文件,所以可以跑起来没问题。


谢谢!实不相瞒前辈,我现在电脑里面乱乱的,之前随便的安装了一个中文版的VC++编译器后,因为你说有乱码于是又安装了一个英文版的,这次没有乱码,但不兼容,没曾想原来的那个乱码的中文版编译器也不能用了,因为输入了C语言的第一课,您好!世界,已经无法运行了,我现在正在清理E盘,删除所有,然后再重新安装,看看是否能再次运行。{:5_91:}{:5_93:}

宝妹 发表于 2017-11-1 23:13:47

weizhongyang 发表于 2017-11-1 15:28
如果真想用graphics.h文件来画图形的话
可以参照这个看看:http://www.cnblogs.com/geore/p/5914664.htm ...

今天太晚了,只看到前辈发的第一个网址,在TC编译器里面加了graphics.h文件,但结果如下面的截图,{:5_93:}看来任何事物一开始可能都是欺生的……{:5_92:}

weizhongyang 发表于 2017-11-2 08:59:43

宝妹 发表于 2017-11-1 23:13
今天太晚了,只看到前辈发的第一个网址,在TC编译器里面加了graphics.h文件,但结果如下面的截图,{:5_93 ...

建议好好看看这个:http://www.cnblogs.com/geore/p/5914664.html
里面详细告诉你怎么用graphics.h,有两种方法可以解决此问题,参照一下吧

你可以的,加油{:5_95:}

宝妹 发表于 2017-11-2 22:44:16

weizhongyang 发表于 2017-11-2 08:59
建议好好看看这个:http://www.cnblogs.com/geore/p/5914664.html
里面详细告诉你怎么用graphics.h,有 ...

思索了一天,觉得这段时间一直不太对劲,不在状态,而且每次下载VC++编译器的时候,总有人打断,谢谢前辈的指点,我可能会休息一二天或者调整好心态再继续学习,在这里给前辈留下言,不回复觉得不太礼貌,祝前辈你工作顺利,身体健康!
页: [1]
查看完整版本: 我按照360搜索提供的贪食蛇程序编写总是出现1个错误,请大师及各位前辈指点!