| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 4002 人关注过本帖
标题:c写的贪吃蛇
取消只看楼主 加入收藏
zhulei1978
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:53
帖 子:1351
专家分:1200
注 册:2006-12-17
结帖率:100%
收藏
 问题点数:0 回复次数:3 
c写的贪吃蛇
程序代码:
#include <graphics.h>    /*调用图象的函数的头文件*/ 
#include <stdlib.h>  /*常用函数库*/ 
#include <time.h> 
#include <dos.h>/*DOS库*/ 


#define MAX_JOINTS 200 
#define LEFT      0x4b00 
#define RIGHT      0x4d00 
#define DOWN      0x5000 
#define UP        0x4800 
#define ESC        0x011b 
#define MV_RIGHT  1 
#define MV_LEFT    2 
#define MV_UP      3 
#define MV_DOWN    4 


void InitGraph(void);    /*图形驱动初始化函数*/ 
void DrawKFence(void);    /*绘制游戏场景*/ 
void GameOver(int score); /*结束游戏*/ 
void GamePlay(void);      /*玩游戏具体过程*/ 
void PrScore(int score);  /*输出成绩*/ 


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


struct Snake              /*蛇的结构体定义*/ 
{ 
int x[MAX_JOINTS];      /*保存蛇身每一节位于屏幕上的列坐标*/ 
int y[MAX_JOINTS];      /*保存蛇身每一节位于屏幕上的行坐标*/ 
int joint;              /*蛇的节数*/ 
int direction;          /*蛇移动方向*/ 
int life;                /*蛇的生命,0活着,1死亡*/ 
}; 


/*主函数*/ 
void main(void) 
{ 
InitGraph();            /*图形驱动*/ 
DrawKFence();            /*游戏场景*/ 
GamePlay();              /*玩游戏具体过程*/ 
Closegraph();            /*图形结束*/ 
} 


/*图形驱动初始化函数*/ 
void InitGraph(void) 
{  
int gd=DETECT,gm; 

initgraph(&gd,&gm," "); /*initgraph()中的第一个参数表示图形适配器的类型,第二个为在该类型下图形的显示模式,第三个参数指定驱动程序所在目录"c:\\tc"。*/ 
cleardevice();          /*清除图形屏幕*/ 
setbkcolor(BLUE); 
cleardecive(); 
setcolor(WHITE); 
settextstyle(DEFAULT_FONT,HORIZ_ZIR,3); 
outtextxy(170,150,"Greedy Snake"); 
outtextxy(219,254,"Ready?"); 
setcolor(BLUE); 
cleardecive(); 
} 


/*游戏开始画面,左上角坐标为(50,40),右下角坐标为(610,460)的围墙*/ 
void DrawKFence(void) 
{ 
int i; 

setbkcolor(LIGHTGREEN); /*设置颜色*/ 
setbkcolor(11); 
setlinestyle(SOLID_LINE,0,THICK_WIDTH); /*设置线型*/SOLID_LINE/*为整数型,用来定义所画直线类型*/ 0/*为无符号整数型,该参数在需要用户自定义线型时使用 ,如果是使用系统预定义的线型则参数取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) 
{ 

  int i,key; 
  int gamespeed=22000;          /*控制游戏速度*/ 
  int score=0;                  /*记录游戏得分*/ 
  struct Food food;            /*食物结构体变量*/ 
  struce Snake snake;          /*蛇结构体变量*/ 
  
  food.addFood=1;              /*1表示需要出现新食物,0表示已经存在食物*/ 
  snake.life=0;                /*置蛇的生命状态为活着*/ 
  snake.direction=MV_RIGHT;    /*置蛇头初始位置方向往右*/ 
  snake.x[0]=100;snake.y[0]=100; 
  snake.x[1]=110;snake.y[1]=100;/*先初始化了蛇头在X100,Y100的位置,然后蛇头在X方向向右移动了10个单位的位置*/ 
  snake.joint=2;                /*置蛇的初始节数为2*/ 

  PrScore(score);              /*显示游戏得分*/ 


  /*重复玩游戏,直到压ESC键结束*/ 
  srand(time(NULL)); 
  while(1) 
  { 
    while(!kbhit())            /*在没有按键的情况下,蛇自己移动身体*/ /*检查当前按下的键*/ 
    {  
      if(food.addFood==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.addFood=0;        /*画面上有食物了*/ 
      } 
    if(food.addFood==0)        /*画面上有食物了就要显示*/ 
      { 
        setcolor(GREEN); 
        rectangle(food.x,food.y,food.x+10,food.y-10); 
      } 
    

      for(i=snake.joint-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 MV_RIGHT:snake.x[0]+=10;break; 
        case MV_LEFT: snake.x[0]-=10;break; 
        case MV_UP: snake.y[0]-=10;break; 
        case MV_DOWN: snake.y[0]+=10;break; 
        }  


        /*从蛇的第四节开始判断是否撞到自己了,因为蛇头为两节,第三节不可能拐过来*/ 
        for(i=3;i <snake.joint;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.joint]=-20;snake.y[snake.joint]=-20; 
          snake.joint++;                                        /*蛇的身体长一节*/ 
          food.yes=1;                                          /*画面上需要出现新的食物*/ 
          score+=10; 
          PrScore(score);                                      /*输出新得分*/ 
        } 


      /*画出蛇*/ 
      setcolor(4); 
      for(i=0;i <snake.joint;i++) 
        { 
            rectangle(snake.x[i],snake.y[i],snake.x[i]+10, 
            snake.y[i]-10); 
        } 
      delay(gamespeed); /*延时控制蛇的速度*/ 


      /*用黑色去除蛇的的最后一节*/ 
      setcolor(0); 
      rectangle(snake.x[snake.joint-1],snake.y[snake.joint-1], snake.x[snake.joint-1]+10,snake.y[snake.joint-1]-10); 
      }                                                        /*end of while(!kbhit)*/ 

      if(snake.life==1) break;                                /*如果蛇死就跳出循环*/ 
      key=bioskey(0);                                          /*接收按键*/ 
    

      /*判断按键,是否往相反方向移动,按ESC键退出*/  
      if(key==ESC) break; 
      else if(key==UP&&snake.direction!=4) 
          snake.direction=MV_UP; 
      else if(key==RIGHT&&snake.direction!=MV_LEFT) 
          snake.direction=MV_RIGHT; 
      else if(key==LEFT&&snake.direction!=MV_RIGHT) 
          snake.direction=MV_LEFT; 
      else if(key==DOWN&&snake.direction!=MV_UP) 
          snake.direction=MV_DOWN; 
    }                                                          /*end of while(1)*/ 
} 


/*游戏结束*/ 
void GameOver(int score) 
{ 
cleardevice();  
PrScore(score); 
setcolor(RED); 
settextstyle(0,0,4); 
outtextxy(200,200,"GAME OVER"); 
getch(); 
} 


/*输出成绩*/ 
void PrScore(int score) 
{  
  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(); 
} 


用tc运行后总说这两个语句参数太少,一个加参数后可以执行,但第二个无论加什么参数都运行不了!请高手前来赐教!


/*游戏结束*/ 
void GameOver(int score)// <---这个函数是需要一个参数的,所以你标注的地方应当传一个合适的值 
{ 
cleardevice(); 
PrScore(score); 
setcolor(RED); 
settextstyle(0,0,4); 
outtextxy(200,200,"GAME OVER"); 
getch(); 
} 

搜索更多相关主题的帖子: 贪吃蛇 
2016-04-20 07:18
zhulei1978
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:53
帖 子:1351
专家分:1200
注 册:2006-12-17
收藏
得分:0 
void GameOver(int score) 肯定是要传参数的
是不是还有什么头文件没有包含进来啊?

你是在什么环境下运行呢  我也遇到过类似的问题  

在tc下运行图形程序需要把bpl文件拷贝到源文件的同一个目录  

你用win—tc  比较方便  是tc的集成外挂  

也要按上述的做

其实我就是改变社会风气,提高少女素质,刺激电影市道,提高年轻人内涵,玉树临风,风度翩翩的整蛊专家,我名叫古晶,英文名叫JingKoo!
2016-04-20 07:18
zhulei1978
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:53
帖 子:1351
专家分:1200
注 册:2006-12-17
收藏
得分:0 
划线的:line(int x1,int x2,int y1,int y2);
画圆的:circle(int x,int y,int stangle,int endangle,int radius);

其实我就是改变社会风气,提高少女素质,刺激电影市道,提高年轻人内涵,玉树临风,风度翩翩的整蛊专家,我名叫古晶,英文名叫JingKoo!
2016-04-20 09:13
zhulei1978
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:53
帖 子:1351
专家分:1200
注 册:2006-12-17
收藏
得分:0 
tc帮助里有详细的介绍
发一本书上来,你看看

c游戏编程从入门到精通
网盘地址:http://pan.baidu.com/s/1bpFhRdH

其实我就是改变社会风气,提高少女素质,刺激电影市道,提高年轻人内涵,玉树临风,风度翩翩的整蛊专家,我名叫古晶,英文名叫JingKoo!
2016-04-20 09:22
快速回复:c写的贪吃蛇
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.021661 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved