鱼C论坛

 找回密码
 立即注册
查看: 3100|回复: 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;    /*应该去年后面的";"*/

修改后的程序:
/* 贪食蛇程序 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;
                default: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 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后面你都加了;

试下修改后的代码:
/* 贪食蛇程序 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;
                default: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-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[i], 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[i] = (char *)malloc(sizeof(char) * 2);
               
        for (i = 0; i < 3; ++i)
                {
                snake[i][0] = N/2 + 1;
                snake[i][1] = N/2 + 1 + i;
             }
            
        for (i = 1; i <= N; ++i)
                for (j = 1; j <= N; ++j)
                        plate[i][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[i][j])
                                {
                             case 0:
                                 color(12);printf("□");color(11); continue;
                        case 1: printf("■"); continue;
                             default: ;
                             }
                    }
                   putchar('\n');
            }
        for (i = 0; i < (*len); ++i)
       {
                gotoxy(snake[i][1] * 2, snake[i][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[i]);
        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-11-28 20:44

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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