用c语言编写贪吃蛇

本文详细介绍了如何使用C语言编程实现经典游戏——贪吃蛇。从游戏逻辑到屏幕绘制,逐步解析代码实现过程,适合初级程序员学习游戏开发。
摘要由CSDN通过智能技术生成
#include <graphics.h>
#include <conio.h>
#include <stdlib.h>
#include <dos.h>
#define NULL 0
#define UP  18432
#define DOWN 20480
#define LEFT 19200
#define RIGHT 19712
#define ESC  283
#define ENTER 7181 
struct snake
{
   int centerx;
 int centery;
 int newx;
 int newy;
 struct snake *next;
};
struct snake *head;

int grade=60;                     /*控制速度的*******/
int a,b;                        /* 背静遮的 位置*/
void *far1,*far2,*far3,*far4;             /* 蛇身指针 背静遮的指针 虫子*/
int size1,size2,size3,size4;              /* **全局变量**/
int ch=RIGHT;                     /**************存按键 开始蛇的方向为RIGHT***********/
int chy=RIGHT; 
int flag=0;                       /*********判断是否退出游戏**************/
int control=4;                     /***********判断上次方向和下次方向不冲突***/
int nextshow=1;                     /*******控制下次蛇身是否显示***************/
int scenterx;                      /***************随即矩形中心坐标***************/
int scentery;
int sx;                         /*******在a b 未改变前 得到他们的值 保证随机矩形也不在此出现*******/
int sy;                
 
/************************蛇身初始化**************************/ 
void snakede()
{
   
 struct snake *p1,*p2;
 head=p1=p2=(struct snake *)malloc(sizeof(struct snake)); 
 p1->centerx=80;
 p1->newx=80;
 p1->centery=58;
 p1->newy=58;
 p1=(struct snake *)malloc(sizeof(struct snake));
 p2->next=p1;
 p1->centerx=58;
 p1->newx=58;
 p1->centery=58;
 p1->newy=58;
 p1->next=NULL;
}
/*******************end*******************/ 
void welcome()            /*************游戏开始界面 ,可以选择 速度**********/                
{
    
 int key;
 int size;
 int x=240;
 int y=300;
 int f;
 void *buf; 
 setfillstyle(SOLID_FILL,BLUE);
 bar(98,100,112,125);
 setfillstyle(SOLID_FILL,RED);
 bar(98,112,112,114);
 setfillstyle(SOLID_FILL,GREEN);
 bar(100,100,110,125);
 size=imagesize(98,100,112,125);
 buf=malloc(size);
 getimage(98,100,112,125,buf);
 cleardevice();

 setfillstyle(SOLID_FILL,BLUE);
 bar(240,300,390,325);
 outtextxy(193,310,"speed:");
 setfillstyle(SOLID_FILL,RED);
 bar(240,312,390,314);
 setcolor(YELLOW);
 outtextxy(240,330,"DOWN");
 outtextxy(390,330,"UP");
 outtextxy(240,360,"ENTER to start..." ); 
 outtextxy(270,200,"SNAKE");
 fei(220,220);
 feiyang(280,220);
 yang(340,220); 
 putimage(x,y,buf,COPY_PUT); 
 setcolor(RED);
 rectangle(170,190,410,410);
 while(1)
 {
    if(bioskey(1))                      /********8选择速度部分************/
  key=bioskey(0);
  switch(key)
  {
     
    case ENTER:
   f=1;
   break;
    case DOWN:
    if(x>=240)
    {
    putimage(x-=2,y,buf,COPY_PUT);
   grade++;
   key=0;
   break;
    }
 case UP:
    if(x<=375)
    {
    putimage(x+=2,y,buf,COPY_PUT);
   grade--;
    key=0;
   break;
    } 
   }
   
   if (f==1)
   break; 
 }                           /********** end  ****************/ 
 

 free(buf);
 } 
 
/*************************随即矩形*****************/ 
/***********当nextshow 为1的时候才调用此函数**********/

void ran()
{
    int nx;
 int ny;
 int show;         /**********控制是否显示***********/
 int jump=0;
 struct snake *p;
 p=head;
 if(nextshow==1)      /***********是否开始随机产生***************/
  while(1)
  {
   show=1;
  randomize();
  nx=random(14);
  ny=random(14);
  scenterx=nx*22+58;
  scentery=ny*22+58;
   while(p!=NULL)
   {
   
    if(scenterx==p->centerx&&scentery==p->centery||scenterx==sx&&scentery==sy)
  {
   show=0;
  jump=1;
  break;
  }
    else
  p=p->next; 
   if(jump==1)
  break;
  }
 if(show==1)
  {
   putimage(scenterx-11,scentery-11,far3,COPY_PUT);
  nextshow=0;
  break;
  }

 }
}

/***********过关动画**************/ 
void donghua()
{
    int i;
 cleardevice();
 setbkcolor(BLACK);
 randomize();
 while(1)
 {
   for(i=0;i<=5;i++)
 {
   putpixel(random(640),random(80),13); 
  putpixel(random(640),random(80)+80,2); 
  putpixel(random(640),random(80)+160,3); 
  putpixel(random(640),random(80)+240,4);
  putpixel(random(640),random(80)+320,1);
  putpixel(random(640),random(80)+400,14);
 } 
  setcolor(YELLOW);
  settextstyle(0,0,4);
  outtextxy(130,200,"Wonderful!!");
  setfillstyle(SOLID_FILL,10);
  bar(240,398,375,420);
  feiyang(300,400);
  fei(250,400);
  yang(350,400);
  if(bioskey(1))
  if(bioskey(0)==ESC)
 {
   
      flag=1;
  break;
 }
 }
}

/*************************end************************/

/***********************初始化图形系统*********************/
void init()
{
   int a=DETECT,b;
 int i,j;
 initgraph(&a,&b,"");
}
/***************************end****************************/ 
 
/***画立体边框效果函数******/
void tline(int x1,int y1,int x2,int y2,int white,int black)
{
    setcolor(white)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

键盘小王子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值