| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 4041 人关注过本帖
标题:c写的贪吃蛇
只看楼主 加入收藏
zhulei1978
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:53
帖 子:1351
专家分:1200
注 册:2006-12-17
结帖率:100%
收藏
 问题点数:0 回复次数:15 
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
wanglianyi1
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:14
帖 子:647
专家分:2067
注 册:2015-6-18
收藏
得分:0 
没看懂,,不过你自己回答自己的问题倒挺顽皮的啊。
对了,请教下,我也想学学怎么写游戏的,就像贪吃蛇,俄罗斯方块,还有迷宫这类似的掌中机游戏,不过不知道需要的那些图形处理函数或者说一些语句语法再哪里能查到相关的知识呢?直接游戏代码百度也能查到,但是这样看的不太明白,不知道为啥这么写。能帮下嘛?在哪里或者说什么书可以查到相关的知识呢?
2016-04-20 08:46
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
wanglianyi1
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:14
帖 子:647
专家分:2067
注 册:2015-6-18
收藏
得分:0 
回复 5楼 zhulei1978
感谢
2016-04-20 13:47
cybermaster
Rank: 2
等 级:论坛游民
帖 子:9
专家分:31
注 册:2016-9-11
收藏
得分:0 
回复 5楼 zhulei1978
题主,在VC6上运行不了呀!]
2016-09-14 09:20
wanglianyi1
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:14
帖 子:647
专家分:2067
注 册:2015-6-18
收藏
得分:0 
回复 7楼 cybermaster
你试试下面这个呢?
程序代码:
#include<stdio.h>//基本库
#include<stdlib.h>//系统库
#include<windows.h>//光标定位、字符颜色函数库
#include<time.h>//时间函数库
#include<conio.h>//键值读入函数库
#define width 60
#define height 25
struct ssnake
{
    int f;//蛇身有效标志
    int x;
    int y;//蛇身坐标
};
void color(int b)         //颜色函数 
{
    HANDLE hConsole = GetStdHandle((STD_OUTPUT_HANDLE)) ; 
    SetConsoleTextAttribute(hConsole,b) ;
} 
void HideCursor()//隐藏光标
{
    HANDLE hOut=GetStdHandle(STD_OUTPUT_HANDLE);
    CONSOLE_CURSOR_INFO cursor_info={1,0};
    SetConsoleCursorInfo(hOut,&cursor_info);
}

void gotoxy(int x,int y)//设置字符显示位置
{
    HANDLE hOut=GetStdHandle(STD_OUTPUT_HANDLE);
    COORD loc={x,y};
    SetConsoleCursorPosition(hOut,loc);
}
void drawmap(char *mp,char *omp,ssnake *snp)
{//画场景
    char pel[]="  ◆■●";
    int i,j,k;
    for(i=0;snp[i].f>0;i++)
    {
        j=4;//蛇身
        if(i==0)j=2;//蛇头
        mp[snp[i].x*height+snp[i].y]=j;
    }
    for(k=0;k<width*height;k++)
    {
        if(mp[k]!=omp[k])
        {
            i=k/height;j=k%height;
            color(15);
            if(mp[k]==6)color(13);
            omp[k]=mp[k];
            gotoxy(i,j);
            printf("%c",pel[mp[k]]);
            printf("%c",pel[mp[k]+1]);
        }
    }
}
void rndapple(ssnake *snp,int *px,int *py)
{//产生苹果随机位置
    bool f=false;
    int i,j,k=0,z[1500][2]={0};
    char map[width][height]={0};
    *px=-1;*py=-1;
    for(i=0;snp[i].f>0;i++)map[snp[i].x][snp[i].y]=1;
    for(i=0;i<width;i+=2)
        for(j=0;j<height;j++)
        {
            if(map[i][j]==0)
            {
                z[k][0]=i;
                z[k][1]=j;
                k++;
            }
        }
    if(k>0)
    {
        i=rand()%k;
        *px=z[i][0];
        *py=z[i][1];
    }
}

int main(void)
{
    char map[width][height]={0},oldmap[width][height]={0};//场景 0:空 2:蛇头 4:蛇身 6:苹果
    int mx=0,my=0;//蛇头移动方向
    int apx=-1,apy=-1;//苹果位置
    int i,j,sc=0,ef=0,sp=210;
    long t1,nt;//计时
    char a;
    bool pf=false;//暂停标志
    ssnake sn[1500]={0};//蛇,最长1500个关节,关节数据结构为ssnake,
    nt=clock();
    t1=nt;
    system("mode con cols=80 lines=25");
    HideCursor();
    for(i=0;i<height;i++){gotoxy(width,i);printf("");}
    color(14);
    gotoxy(width+4,12);printf("控制:←↑→↓");
    gotoxy(width+4,14);printf("空格:暂停");
    gotoxy(width+4,16);printf("ESC :退出");
    gotoxy(width+4,18);printf("得分:%d",sc);
    sn[0].f=1;sn[0].x=30;sn[0].y=10;sn[1].f=0;//蛇头位置
    srand((unsigned)time(NULL)); 
    while(1)
    {
        nt=clock();
        if(kbhit())   //判断击键
        {
            a=getch();
            if(a<0)
            {
                a=getch();
                if(a=='K'&&mx!=2){mx=-2;my=0;}
                if(a=='M'&&mx!=-2){mx=2;my=0;}//左右移动,由于用汉字符号表示,所以步长为2
                if(a=='H'&&my!=1){my=-1;mx=0;}
                if(a=='P'&&my!=-1){my=1;mx=0;}//上下移动
            }
            else
            {
                if(a==27){ef=1;break;}//人为退出
                if(a==32)pf=!pf;
            }
        }
        if(!pf&&nt-t1>sp)
        {
            t1=nt;
            for(i=0;sn[i].f>0;i++);
            for(j=i;j>0;j--){sn[j].x=sn[j-1].x;sn[j].y=sn[j-1].y;}//蛇身前进
            sn[0].x+=mx;sn[0].y+=my;//蛇头前进
            if(sn[0].x<0||sn[0].x>=width||sn[0].y<0||sn[0].y>=height){ef=2;break;}//越界
            for(j=1;sn[j].f>0;j++){if(sn[j].x==sn[0].x&&sn[j].y==sn[0].y)break;}
            if(sn[j].f!=0){ef=3;break;}//判断是否自己吃自己
            if(sn[0].x==apx&&sn[0].y==apy)//吃了苹果
            {
                sn[i].f=1;sn[i+1].f=0;apx=-1;apy=-1;sp--;
                sc=sc+10+i;//成绩累加
                gotoxy(64,18);printf("得分:%d",sc);
            }
        }
        for(i=0;i<width;i++)
            for(j=0;j<height;j++)
                map[i][j]=0;
        if(apx<0&&apy<0)rndapple(sn,&apx,&apy);//获取苹果位置
        if(apx>=0&&apy>=0)
            map[apx][apy]=6;//设置苹果
        else
        {//已经没有空位画苹果位置了,说明蛇足够长,这是不可能的
            gotoxy(62,24);
            printf("厉害,满分!");
            break;
        }
        drawmap(&map[0][0],&oldmap[0][0],sn);
    }
    gotoxy(25,23);
    color(15);
    if(ef==1)printf("不玩了!Game Over!\n");
    if(ef==2)printf("越界死翘翘!Game Over!\n");
    if(ef==3)printf("吃自己死翘翘!Game Over!\n");
}
2016-09-14 09:26
书生牛犊
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:星夜征程
等 级:贵宾
威 望:10
帖 子:1101
专家分:5265
注 册:2015-10-27
收藏
得分:0 
回复 8楼 wanglianyi1
我在想一件事:如果令贪吃蛇有两个头,那么就真的可以实现贪吃蛇吃遍全图的伟大梦想。


φ(゜▽゜*)♪
2016-09-14 09:46
ehszt
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:40
帖 子:1745
专家分:3216
注 册:2015-12-2
收藏
得分:0 
回复 楼主 zhulei1978
这个还要dosbox才能运行,而且graphis.h头件还不能直接用,很麻烦。
2016-09-14 10:14
快速回复:c写的贪吃蛇
数据加载中...
 
   



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

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