现在的位置: 首页 > 综合 > 正文

[我的早期C程序源代码]贪吃蛇

2013年12月11日 ⁄ 综合 ⁄ 共 4686字 ⁄ 字号 评论关闭

/*要求改进:用图形模式表示print()函数*/
#include <mem.h>
#include <fcntl.h>
#include <conio.h>
#include <graphics.h>
#include <io.h>

#include <stdlib.h>
#include <stdio.h>
#include <bios.h>
#include <math.h>
#define N 50
#define Time 10000
int A[N][N];
int IE=6;

int SCORE=0;
char a[]="9999";
    void *ball;
    int maxx;
    unsigned int size;

 int head=1;/*0,1,2,3*/
 int i=3,j=0,ii=0,jj=0;
 int length=3;
 int x,y;/*蛇头标志*/
 int add=1;/*食物标志*/
 int tii,tjj;/* 前蛇尾坐标 */
void start_image()
{
  setlinestyle(SOLID_LINE,1,2);
  setcolor(GREEN);
  line(39,39,39,441);
  line(39,441,441,441);
  line(441,441,441,39);
  line(441,39,39,39);

}
void draw_image(int x,int y)
{
  int i=x*400/N+40;
  int j=y*400/N+40;
  setfillstyle(1,4);
  bar(j,i,j+400/N,i+400/N);
}
void eraser_image(int x,int y)
{
  int i=x*400/N+40;
  int j=y*400/N+40;
  setfillstyle(1,0);
  bar(j,i,j+400/N,i+400/N);
}

void tu()
{/*tuxing jiemian*/
  maxx=getmaxx();
  size=imagesize(210,390,450,420);
  ball=malloc(size);
  setfillstyle(1,10);
  bar(160,170,473,253);
  setfillstyle(1,9);
  bar(163,173,470,250);
  setcolor(13);
  outtextxy(200,200,"Welcome to Greedy Snake Game");
  setcolor(14);
  outtextxy(250,220,"Developer :Wu siyuan ");
  outtextxy(290,240,"2003.5");
  outtextxy(210,390,"Press any key to contunue...");
  getimage(210,390,450,420,ball);

  while(!kbhit())
  {/* 没有键盘击键 */
     putimage(210,390,ball,XOR_PUT);
     delay(30000);
  }
  cleardevice();
}
void print()/*输出*/
{           /*要将转化成图形模式*/
int a,b;
/*start_image(); */

 for(a=0;a<N;a++)
 {   for(b=0;b<N;b++)
  {if(A[a][b]>1)draw_image(a,b);
  if(A[a][b]==0)eraser_image(a,b); }

 }
}

void snake() /*begin*/
{
 int a,b;
 for(a=0;a<N;a++)
    for(b=0;b<N;b++)
      A[a][b]=0;

      A[i][j]=5;A[i-1][j]=4;A[i-2][j]=3;A[i-3][j]=2;
}
void del_tail()/*蛇尾的操作*/
{
       int number=A[ii][jj];
       tii=ii;tjj=jj;/*记录前蛇尾*/

 while(1)
 {
  if(A[ii][jj-1]==number+1||A[ii][jj-1]==2&&number==30)
  {jj--;break;}

  if(A[ii][jj+1]==number+1||A[ii][jj+1]==2&&number==30)
  {jj++;break;}

  if(A[ii-1][jj]==number+1||A[ii-1][jj]==2&&number==30)
  {ii--;break;}

  if(A[ii+1][jj]==number+1||A[ii+1][jj]==2&&number==30)
  {ii++;break;}

 }
}

void down()
{
    head=1;
 if(A[i+1][j]>1&&A[i+1][j]!=99)
    {printf("I hit myself!");exit(1);}
 i++;
        if(IE>30)IE=2;
 A[i][j]=IE;IE++;
 del_tail();
 A[tii][tjj]=0;

}
void up()
{
 head=0;
 if(A[i-1][j]>1&&A[i-1][j]!=99)
    {printf("I hit myself!");exit(1);}
 i--;
        if(IE>30)IE=2;
 A[i][j]=IE;IE++;
 del_tail();
 A[tii][tjj]=0;

}
void left()
{
 head=2;
 if(A[i][j-1]>1&&A[i][j-1]!=99)
           {printf("I hit myself!");exit(1);}
 j--;
        if(IE>30)IE=2;
 A[i][j]=IE;IE++;
        del_tail();
 A[tii][tjj]=0;

}
void right()
{
 head=3;
 if(A[i][j+1]>1&&A[i][j+1]!=99)
           {printf("I hit myself!");exit(1);}
 j++;
        if(IE>30)IE=2;
 A[i][j]=IE;IE++;
        del_tail();
 A[tii][tjj]=0;
}

void test()/*测试是否到达边界*/
{
    if(i<0||i>N-1||j<0||j>N-1)
    {
       printf("出界! Game over.");
       exit(1);
    }
}
void move()/*当前移动*/
{
 switch(head)
 {
 case 0:up();break;
 case 1:down();break;
 case 2:left();break;
 case 3:right();break;
 /*default:printf("方向出错!/n");*/
 }

}
int keyboard()
{
    /*判断是否有键盘输入
 // 有返回值0,1,2,3
 // int k=keyboard;
 //判断方向是否是有效方向
 //无效则什么也不做
 //若方向有效则改变head的值*/
 int a,key,h;
 for(a=0;a<2;a++)
  if(bioskey(1))break;
 key=bioskey(0);

 switch (key)
 {
    /*up*/
    case 18432:h=0;break;
    /*down*/
    case 20480:h=1;break;
    /*left*/
    case 19200:h=2;break;
    /*right*/
    case 19712:h=3;break;
    /*Esc*/
    case 283:printf("You press the Esc key!");exit(1);break;
    /*default: h=999 ;*/

 }
     return h;
}
void add_point()/* 用于产生食物 */
{

   while(1){
       x=random(100)%N;
       y=random(100)%N;
       if(A[x][y]==0)break;
    }
  A[x][y]=99;/*食物的标志是5*/

  add=0;/* 加食物标志清0*/

}
void score()
{

   setcolor(9);
   settextstyle(3,0,4);
   outtextxy(450,40,"Score:");

   setcolor(RED);
   outtextxy(450,200,"Speed:");

}
void number_char(int x)
{

int a0,a1,a2,a3;
  if(x>9999){a[0]='9';a[1]='9';a[2]='9';a[3]='9';}
  else {
     a0=x/1000;
     a[0]=a0+48;

     a1=(x-a0*1000)/100;
     a[1]=a1+48;

     a2=(x-a0*1000-a1*100)/10;
     a[2]=a2+48;

     a3=(x-a0*1000-a1*100-a2*10);
     a[3]=a3+48;
     a[4]='/0';

       }
}

void snake_get()/*吃到食物时*/
{
  if(i==x&&j==y)
  {
    length++;

    A[tii][tjj]=A[ii][jj]-1;/*蛇尾加长*/

    ii=tii;jj=tjj;/*蛇尾重新定义*/
    add=1;/*食物标志置1*/
    setfillstyle(1,BLACK);
    bar(520,100,650,140);/*clear score*/
    setcolor(3);
    number_char(SCORE+=100);
    outtextxy(550,100,a);

  }

}

void main()
{
 int get_head;/*定义键盘输入*/
 int gd=DETECT,gm;
     clrscr();

  /*regibgiobjdriver(public name)*/
   initgraph(&gd,&gm,"c://bgi");

    setbkcolor(BLACK);

 tu();
 snake();/*初始化*/
 start_image();
 score();/*定义分数界面*/

 while(1)
 {       while(bioskey(1)==0)/*是否有键盘输入*/
  {

    if(add)add_point();/*是否可以增加食物*/

    print();
    move();
    snake_get();/* 是否吃到食物  (test)*/
    test();
    delay(Time);
  }
  get_head=keyboard();
  /* choose */

  while(1){/*判断得到的坐标是否合法*/
  if(get_head==0&&head==1)break;
  if(get_head==1&&head==0)break;
  if(get_head==2&&head==3)break;
  if(get_head==3&&head==2)break;
  else {head=get_head;break;}/*合法给head赋值*/
  }

    }

}

抱歉!评论已关闭.