鱼C论坛

 找回密码
 立即注册
查看: 2950|回复: 18

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

[复制链接]
发表于 2017-10-28 00:22:41 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
/* 贪食蛇程序 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 [N];
  int y [N];

  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[0] = 100; snake.y [0] =100; /*蛇头*/
       
        snake.x[1] = 110; snake.y [1] =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[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: sanke.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);

                }

                /*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[10];

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

                }
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-10-28 10:29:37 | 显示全部楼层
代码太长了,请贴出出错提示
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 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)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-10-28 12:19:26 | 显示全部楼层
宝妹 发表于 2017-10-28 11:19
--------------------Configuration: snake - Win32 Debug--------------------
Compiling...
Greedy sna ...

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

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

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


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-10-28 12:21:01 | 显示全部楼层
weizhongyang 发表于 2017-10-28 12:19
错误修改:
1、结构体定义
struct Snake;    /*应该去年后面的";"*/

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

  2. #define N 200

  3. #include'graphics.h'

  4. #include <stdlib.h>

  5. #include <dos.h>


  6. #define LEFT 0x4b00

  7. #define RIGHT 0x4d00

  8. #define DOWN 0x5000

  9. #define UP 0x4800

  10. #define ESC 0x011b

  11. int i, key;

  12. int score = 0;/*得分*/

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

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

  20. struct Snake
  21. {
  22.   int x [N];
  23.   int y [N];

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

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

  35. void main(void);
  36. {
  37.     Init();/*图形驱动*/
  38.     DrawK();/*开始画面*/
  39.     GamePlay();/*玩游戏具体过程*/
  40.     Close();/*图形结束*/
  41. }

  42. /*图形驱动*/

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

  50. void DrawK(void);
  51. {
  52.     /*setbkcolor(LIGHTGREEN);*/
  53.     setcolor(11);
  54.     setlinestyle(SOLID_LINE,0,THICK_WIDTH);/*设置线型*/

  55.     for(i = 50; i<=600; i+=10);/*画围墙*/
  56.     {
  57.         rectangle(i,40, i + 10, 49);/*上边*/
  58.         rectangle(i,451, i + 10,460);/*下边*/
  59.     }

  60.     for(i = 40; i <=450; i+=10);
  61.     {
  62.         rectangle(50,i,59,i+10);/*左边*/
  63.         rectangle(601,i,610,i + 10);/*右边*/
  64.     }
  65. }


  66. /*玩游戏具体过程*/

  67. void GamePlay(void);
  68. {
  69.     randomize();/*随机数发生器*/
  70.     food.yes = 1;/*1表示需要出现新食物,0表示已经存在食物*/
  71.     snake.life = 0; /*活着*/
  72.     snake.direction = 1; /*方向往右*/
  73.     snake.x[0] = 100; snake.y [0] =100; /*蛇头*/
  74.     snake.x[1] = 110; snake.y [1] =100;
  75.     snake.node = 2; /*节数*/
  76.     PrScore();/*输出得分*/


  77.     while(1)/*可以重复玩游戏,压ESC键结束*/
  78.     {
  79.         while(!kbhit());/*在没有按键的情况下,蛇自己移动身体*/
  80.         {
  81.             if(food.yes = = 1);/*需要出现新食物*/
  82.             {
  83.                food.x = rand()%400 + 60;
  84.                food.y = rand()%350 + 60;

  85.                while(food.x % 10)! = 0)/*食物随机出现后必须让食物能够在整格内,这样才可以让蛇吃到*/

  86.                        food.x ++;

  87.                while(food.y % 10)! = 0)

  88.                        food.y ++;

  89.                food.yes = 0 ;/*画面上有食物了*/
  90.                
  91.             }

  92.             if(food.yes == 0);/*画面上有食物了就要显示*/
  93.             {
  94.                setcolor(GREEN);
  95.                rectangle(food.x,food.y,food.x +10, food.y -10);
  96.             }


  97.             for(i = snake.node -1; i>0; i--);/*蛇的每个环节往前移动,也就是贪吃蛇的关键算法*/
  98.             {
  99.                snake.x[i] = snake.x[i-1];
  100.                snake.y[i] = snake.y[i-1];
  101.             }

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

  103.             switch(snake.direction);
  104.             {
  105.                 case 1: snake.x[0]+= 10; break;
  106.                 case 2: sanke.x[0]-= 10; break;
  107.                 case 3: snake.y[0]-= 10; break;
  108.                 case 4: snake.y[0]+= 10; break;
  109.                 default:break;
  110.             }

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

  113.                 if(snake.x[i] = = snake.x[0]&& snake.y[i] = = snake.y[0]);
  114.                {
  115.                     GameOver();/*显示失败*/
  116.                     snake.life = 1 ;
  117.                     break;
  118.                }
  119.             }

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

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


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

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

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

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

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

  148.         if(key == ESC)/*按ESC键退出*/
  149.             break;
  150.         else if(key == UP&& snake.direction)! =4)
  151.             /*判断是否往相反的方向移动*/
  152.             snake.direction =3;
  153.         else if(key == RIGHT && snake.direction! = 2)
  154.             snake.direction=1;
  155.         else if(key == LEFT && snake.direction! =1)
  156.             snake.direction =2;
  157.         else if(key == DOWN && snake.direction! =3)
  158.             snake.direction = 4 ;
  159.     }
  160.     /*endwhile(1)*/
  161. }

  162. /*游戏结束*/

  163. void GameOver(void);
  164. {
  165.     cleardevice();
  166.     PrScore();
  167.     setcolor(RED);
  168.     settextstyle(0,0,4);
  169.     outtextxy(200,200,"GAME OVER");
  170.     getch();
  171. }

  172. /*输出成绩*/

  173. void PrScore(void);
  174. {
  175.     char str[10];
  176.     setfillstyle (SOLID_FILL,YELLOW);
  177.     bar(50,15,220,35);
  178.     setcolor(6);
  179.     settextstyle(0,0,2);
  180.     sprintf(str,"score:%d",score);
  181.     outtextxy (55,20,str);
  182. }

  183. /*图形结束*/

  184. void Close(void);
  185. {
  186.     getch();
  187.     closegraph();
  188. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-10-28 13:43:50 | 显示全部楼层

谢谢,我这就去试一下!看看能不能运行
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-10-28 14:57:43 | 显示全部楼层

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

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

3.while(1);也是上面的提示才加上去的,但现在试了还是运行不了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-10-29 11:42:30 | 显示全部楼层
宝妹 发表于 2017-10-28 14:57
我试过了还是不行,1. struct Snake 去掉了分号

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

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

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

  2. #define N 200

  3. #include'graphics.h'

  4. #include <stdlib.h>

  5. #include <dos.h>


  6. #define LEFT 0x4b00

  7. #define RIGHT 0x4d00

  8. #define DOWN 0x5000

  9. #define UP 0x4800

  10. #define ESC 0x011b

  11. int i, key;

  12. int score = 0;/*得分*/

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

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

  20. struct Snake
  21. {
  22.   int x [N];
  23.   int y [N];

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

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

  35. void main(void)
  36. {
  37.     Init();/*图形驱动*/
  38.     DrawK();/*开始画面*/
  39.     GamePlay();/*玩游戏具体过程*/
  40.     Close();/*图形结束*/
  41. }

  42. /*图形驱动*/

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

  50. void DrawK(void)
  51. {
  52.     /*setbkcolor(LIGHTGREEN);*/
  53.     setcolor(11);
  54.     setlinestyle(SOLID_LINE,0,THICK_WIDTH);/*设置线型*/

  55.     for(i = 50; i<=600; i+=10)/*画围墙*/
  56.     {
  57.         rectangle(i,40, i + 10, 49);/*上边*/
  58.         rectangle(i,451, i + 10,460);/*下边*/
  59.     }

  60.     for(i = 40; i <=450; i+=10)
  61.     {
  62.         rectangle(50,i,59,i+10);/*左边*/
  63.         rectangle(601,i,610,i + 10);/*右边*/
  64.     }
  65. }


  66. /*玩游戏具体过程*/

  67. void GamePlay(void)
  68. {
  69.     randomize();/*随机数发生器*/
  70.     food.yes = 1;/*1表示需要出现新食物,0表示已经存在食物*/
  71.     snake.life = 0; /*活着*/
  72.     snake.direction = 1; /*方向往右*/
  73.     snake.x[0] = 100; snake.y [0] =100; /*蛇头*/
  74.     snake.x[1] = 110; snake.y [1] =100;
  75.     snake.node = 2; /*节数*/
  76.     PrScore();/*输出得分*/


  77.     while(1)/*可以重复玩游戏,压ESC键结束*/
  78.     {
  79.         while(!kbhit())/*在没有按键的情况下,蛇自己移动身体*/
  80.         {
  81.             if(food.yes = = 1)/*需要出现新食物*/
  82.             {
  83.                food.x = rand()%400 + 60;
  84.                food.y = rand()%350 + 60;

  85.                while(food.x % 10)! = 0)/*食物随机出现后必须让食物能够在整格内,这样才可以让蛇吃到*/

  86.                        food.x ++;

  87.                while(food.y % 10)! = 0)

  88.                        food.y ++;

  89.                food.yes = 0 ;/*画面上有食物了*/
  90.                
  91.             }

  92.             if(food.yes == 0)/*画面上有食物了就要显示*/
  93.             {
  94.                setcolor(GREEN);
  95.                rectangle(food.x,food.y,food.x +10, food.y -10);
  96.             }


  97.             for(i = snake.node -1; i>0; i--)/*蛇的每个环节往前移动,也就是贪吃蛇的关键算法*/
  98.             {
  99.                snake.x[i] = snake.x[i-1];
  100.                snake.y[i] = snake.y[i-1];
  101.             }

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

  103.             switch(snake.direction)
  104.             {
  105.                 case 1: snake.x[0]+= 10; break;
  106.                 case 2: sanke.x[0]-= 10; break;
  107.                 case 3: snake.y[0]-= 10; break;
  108.                 case 4: snake.y[0]+= 10; break;
  109.                 default:break;
  110.             }

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

  113.                 if(snake.x[i] = = snake.x[0]&& snake.y[i] = = snake.y[0])
  114.                {
  115.                     GameOver();/*显示失败*/
  116.                     snake.life = 1 ;
  117.                     break;
  118.                }
  119.             }

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

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


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

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

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

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

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

  148.         if(key == ESC)/*按ESC键退出*/
  149.             break;
  150.         else if(key == UP&& snake.direction)! =4)
  151.             /*判断是否往相反的方向移动*/
  152.             snake.direction =3;
  153.         else if(key == RIGHT && snake.direction! = 2)
  154.             snake.direction=1;
  155.         else if(key == LEFT && snake.direction! =1)
  156.             snake.direction =2;
  157.         else if(key == DOWN && snake.direction! =3)
  158.             snake.direction = 4 ;
  159.     }
  160.     /*endwhile(1)*/
  161. }

  162. /*游戏结束*/

  163. void GameOver(void)
  164. {
  165.     cleardevice();
  166.     PrScore();
  167.     setcolor(RED);
  168.     settextstyle(0,0,4);
  169.     outtextxy(200,200,"GAME OVER");
  170.     getch();
  171. }

  172. /*输出成绩*/

  173. void PrScore(void)
  174. {
  175.     char str[10];
  176.     setfillstyle (SOLID_FILL,YELLOW);
  177.     bar(50,15,220,35);
  178.     setcolor(6);
  179.     settextstyle(0,0,2);
  180.     sprintf(str,"score:%d",score);
  181.     outtextxy (55,20,str);
  182. }

  183. /*图形结束*/

  184. void Close(void)
  185. {
  186.     getch();
  187.     closegraph();
  188. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-10-30 16:33:04 | 显示全部楼层
weizhongyang 发表于 2017-10-29 11:42
先确认几个问题
1、用的是什么编译软件
2、头文件graphics.h是否能链接到

不好意思,本来昨天回复过的,但是由于截图上传错误又无法更换与删除因而失去了发帖的机会,只得今天再发,以下是我的操作,请过目!
01.png
02.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

再试试我上面的程序,是否能编译过。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-10-31 21:41:32 | 显示全部楼层
weizhongyang 发表于 2017-10-30 17:20
你的这个软件安装目录怎么还有乱码,且有中文目录
改成英文的目录,不要有乱码目录

好的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-10-31 22:17:57 | 显示全部楼层
weizhongyang 发表于 2017-10-30 17:20
你的这个软件安装目录怎么还有乱码,且有中文目录
改成英文的目录,不要有乱码目录

这位前辈,我刚才按照你的指导从小甲鱼的软件下载处安装了英文版的VC++软件,并在include里面安装了头文件graphics.h,现在的结果是检查0错误,但程序仍无法运行,我的截图如下,请过目:
11.png
22.png
33.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 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[3],num;
char score[3];
char tail[3];

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[2])   //判断出界
{
        if ((head[0] < 1) || (head[0] > N) || (head[1] < 1) || (head[1] > N))
                return 1;
        return 0;
}

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

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

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

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

        *len = 3;
        score[0] = score[3] =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[0] = N/2 + 1;
                snake[1] = N/2 + 1 + i;
             }
            
        for (i = 1; i <= N; ++i)
                for (j = 1; j <= N; ++j)
                        plate[j] = 1;
                        
        apple[0] = rand()%N + 1; apple[1] = rand()%N + 1;
        apple[2] = 1;

        for (i = 0; i < N + 2; ++i)
                {
                gotoxy(0, i);
                for (j = 0; j < N + 2; ++j)
                        {
                        switch (plate[j])
                                {
                             case 0:
                                 color(12);printf("□");color(11); continue;
                        case 1: printf("■"); continue;
                             default: ;
                             }
                    }
                   putchar('\n');
            }
        for (i = 0; i < (*len); ++i)
       {
                gotoxy(snake[1] * 2, snake[0]);
                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[1]*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[1] = fgetc(fp)) != EOF);
   else
   score[1] = 0;
   return 0;
}

int File_out()    //存数据
{
        
        FILE *fp;
        if(score[1] > score[0])
        {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[0],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[N+2][N+2] = {{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[2]) {
                        apple[0] = rand()%N + 1;
                        apple[1] = rand()%N + 1;
                        apple[2] = 1;
                        num++;
                                        if(num>8)
                                               num=0;
                }
                Sleep(200-score[3]*10);
                setbuf(stdin, NULL);
                if (kbhit())
                   {
                        gotoxy(0, N+2);
                        ch = getche();
                    }
                 snake = Move(snake, ch, &len);
                 if (Block(snake[0])==1)
                  {
                        gotoxy(N+2, N+2);
                        puts("你输了");
                        File_out();
                        Free(snake, len);
                        getche();
                        exit(0);
                  }                        
        }
        Free(snake, len);
        exit(0);
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

你好,

这个可以支持,是因为这所用的是windows的VC自带的图形库文件<conio.h><windows.h>,所以可以跑起来没问题。
但貌似graphics.h这个文件是在TC软件里的,是从外面引用进来的吧,程序运行不了,应该是不兼容的问题。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-11-1 23:10:05 | 显示全部楼层
weizhongyang 发表于 2017-11-1 15:26
你好,

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

谢谢!实不相瞒前辈,我现在电脑里面乱乱的,之前随便的安装了一个中文版的VC++编译器后,因为你说有乱码于是又安装了一个英文版的,这次没有乱码,但不兼容,没曾想原来的那个乱码的中文版编译器也不能用了,因为输入了C语言的第一课,您好!世界,已经无法运行了,我现在正在清理E盘,删除所有,然后再重新安装,看看是否能再次运行。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 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文件,但结果如下面的截图,看来任何事物一开始可能都是欺生的……
44.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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,有两种方法可以解决此问题,参照一下吧

你可以的,加油
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-11-2 22:44:16 | 显示全部楼层
weizhongyang 发表于 2017-11-2 08:59
建议好好看看这个:http://www.cnblogs.com/geore/p/5914664.html
里面详细告诉你怎么用graphics.h,有 ...

思索了一天,觉得这段时间一直不太对劲,不在状态,而且每次下载VC++编译器的时候,总有人打断,谢谢前辈的指点,我可能会休息一二天或者调整好心态再继续学习,在这里给前辈留下言,不回复觉得不太礼貌,祝前辈你工作顺利,身体健康!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-23 22:22

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表