大一时用c语言写的贪吃蛇游戏,嘿嘿

今天整理电脑, 发现自己去年就是大一上学期快结束时写的贪吃蛇, 那时

还没有写blog, 今天拿出来晒晒啊,嘿嘿

多多交流,多多交流...... 

 

#include < stdio.h >
#include
< conio.h >
#include
< math.h >
#include
< dos.h >
#include
< stdlib.h >
#include
< graphics.h >
#include 
" welcome.c "                  /*这个是我自己写的一个汉字矩阵,  在下面的welcome函数中使用 */
/*direction*/
#define   left 1
#define   right 2
#define   up 3
#define   down 4
#define   N 40
#define  TIME 10
/*user control*/
#define  moveup    18432
#define  movedown  20480
#define  moveleft  19200
#define  moveright 19712
#define  ESC   283
#define  l 9836
#define  L 9804

struct  snake
{
        
int x;
        
int y;

}
;
/*
//N is the max length of snake, x and y mean its position
//body[0] is the head
//
*/


/*其实是结构体链表最好了 , 这里 偷个懒, 有兴趣,自己改一下, 很容易的 */
struct  snake body[N];
const   struct  snake  * p = body;
int  direct = down;
int  foodx,foody;
int  tail = 3 ;
int  foodflag = 1 ; /*judge that if can display a food*/
int  eatflag = 0 ; /*judge if snake has eat the food*/
long  mark = 0 ;
int  level = 100000000 ;
int  olddirect = down;
int  again = 1 ;
int  endflag = 0 ;


void  drawmat( char   * mat, int  matsize, int  x, int  y, int  color)
/*依次:字模指针、点阵大小、起始坐标(x,y)、颜色*/
{
    
int i,j,k,n;
    n
=(matsize-1)/8+1;
    
for(j=0;j<matsize;j++)
        
for(i=0;i<n;i++)
            
for(k=0;k<8;k++)
                
if(mat[j*n+i]&(0x80>>k))  /*测试为1的位则显示*/
                    putpixel(x
+i*8+k,y+j,color);
}



void  welcome()
{
        
/*outtextxy(200,200,"WELCOME TO THE SNAKE GAME!!!!");*/

        drawmat(huan64K,
64,200,200,10);
        drawmat(ying64K,
64,400,200,10);
        getch();
        cleardevice();
}

void  backset()
{
        
char site[20];

        cleardevice();
        setbkcolor(
1);
        rectangle(
25,25,435,435);
        outtextxy(
450,35,"score: 0");
        outtextxy(
450,55,"level: 1");
        outtextxy(
450,75,"Press "L" or "l"To ");
        outtextxy(
450,95"input  1-7   ");
        outtextxy(
450,115"for speed control!");
        outtextxy(
450,300,"Start :Enter");
        outtextxy(
450,340,"Exit  :Esc");
        sprintf(site,   
"up   : %c",24);
        outtextxy(
450,420,site);
        sprintf(site, 
"down : %c",25);
        outtextxy(
540,420,site);
        sprintf(site,   
"right: %c",26);
        outtextxy(
540,380,site);
        sprintf(site,   
"left : %c",27);
        outtextxy(
450,380,site);


}

void  initialize()
{
        
int i,j;
        
for(i=0;i < N;i++ )
        
{
                body[i].x
=0;
                body[i].y
=0;
        }

        
/*snake has four at beginning.*/

        body[
0].x=35; body[0].y=65;
        body[
1].x=35; body[1].y=55;
        body[
2].x=35; body[2].y=45;
        body[
3].x=35; body[3].y=35;

        direct
=down;
        tail
=3;
        foodflag
=1;/*judge that if can display a food*/
        eatflag
=0;/*judge if snake has eat the food*/
        mark
=0;
        level
=100000000;
        olddirect
=down;
        again
=1;
        endflag
=0;



}

void  draw()
{
        
int i=1;

        setfillstyle(
1,4);
        
/**/
        bar((p
->x)-5,(p->y)-5,(p->x)+5,(p->y)+5);
        setfillstyle(
9,4);
        
do
        
{
          bar(((p
+i)->x)-5,((p+i)->y)-5,((p+i)->x)+5,((p+i)->y)+5);
          i
++;

        }
while((p+i)->!= 0);

}


void  rubber()
{
        
int i=0;

        setfillstyle(
1,1);

        
/**/
        
do
        
{
          bar(((p
+i)->x)-5,((p+i)->y)-5,((p+i)->x)+5,((p+i)->y)+5);
          i
++;

        }
while((p+i)->!= 0);

}

void  gameover()
{
        
char ch;
        endflag
=1;
        outtextxy(
200,200,"GAMEOVER!");
        outtextxy(
200,250,"Try again? Y/N:");
        ch
=getch();
        
while(1)
        
{
            
if(ch=='y'|| ch=='Y')
            
{
                again
=1;
                
break;
            }

            
else if(ch == 'N' || ch == 'n')
            
{
                again
=0;
                
break;
            }

            ch 
= getch();
        }



}

void  judge()
{
        
int i;
        
if(p->< 35 ) gameover();
        
if(p->> 425) gameover();
        
if(p->< 35)  gameover();
        
if(p->> 425) gameover();
        
for(i=1;i<=tail;i++)
        
{
            
if((p->== (p+i)->x) && (p->y==(p+i)->y))
                    gameover();
        }



}

void  move( int  towards)
{
        
int endp;
        delay(TIME
*level);


       
/* at first ,rubber the old snake*/
        rubber();
        
/* let the after hold the before one'position*/


        
for(endp=tail;endp>=1;endp--)
            
{
                (p
+endp)->= (p+endp-1)->x;
                (p
+endp)->= (p+endp-1)->y;
            }



        
switch(towards) /*change the head body[0]*/
        
{
             
case left :
                          body[
0].x-=10;break;

             
case right:   
                          body[
0].x+=10;break;

             
case up:      
                          body[
0].y-=10;break;

             
case down:    
                          body[
0].y+=10;break;

             
defaultbreak;


        }

         
        draw();
        judge();
/**//*this fun decide if gameover?*/
         


}

void  food()
{
        
int i;
        
int disflag=1;
        
if(foodflag)
        
{
            
do
            
{
                disflag
=1;
                foodx
=random(42)*10+5;
                foody
=random(42)*10+5;
                
for(i=0;i< N;i++)
                
{
                    
if(foodx==body[i].x)
                    
{
                        disflag
=0;
                    }

                }

            }
while(!(foodx>=35 && foody>=35 && disflag==1));
             
            setfillstyle(
1,15);

            bar(foodx
-5,foody-5,foodx+5,foody+5);

            foodflag
=0;


        }

}

void  score()
{
        
char ventor[30];
        mark
+=10;
        
/*here add function for display score!*/
        setfillstyle(
1,1);
        sprintf(ventor,
"%ld",mark);
        bar(
500,35,550,42);
        outtextxy(
500,35,ventor);
        
if(mark==(N-4)*10)
        
{
            outtextxy(
200,200,"YON WIN !");
            getch();
            getch();

            exit(
0);
        }



}

void  eatjudge()
{
        
if(body[1].x==foodx && body[1].y==foody)
        
{
            eatflag
=1;
            foodflag 
= 1;
            score();
        }

        
/*else
         eatflag=0;
*/

}
       
void  grade_up()
{
        
/*here realize the level*/
        
int grade;
        
char r;
        setfillstyle(
1,1);
        bar(
500,55,550,62);
        grade
=(int)getch()-48;
        sprintf(
&r,"%d",grade);
        outtextxy(
500,55,&r);
        level
=pow(10,9-grade);
        
        
/*display*/
}

void  addlen()
{

        
if(eatflag)
        
{
            tail
++;
            
if(tail >= N)   grade_up();
            (p
+tail)->=8888;
            (p
+tail)->= 1;

            eatflag 
= 0;


        }


}


void  run()
{
        
static int ch = movedown;

        
/*int endp=tail;*/
        
while(1)
        
{
                
if(endflag) break;
                
if( kbhit())
                
{
                     ch
=bioskey(0);
                     olddirect
=direct;
                     
switch(ch)
                     
{
                        
case moveleft:  if(olddirect!=right)
                                        direct
=left;break;
                        
case moveright :if(olddirect!=left)
                                        direct
=right;break;
                        
case moveup :   if(olddirect!=down)
                                        direct
=up;break;
                        
case movedown : if(olddirect!=up)
                                        direct
=down;break;
                        
case L:

                        
case l: grade_up();break;

                        
case ESC :outtextxy(200,200,"BYE bye!");
                                  getch();
                                  getch();
                                  exit(
0);

                        
defaultbreak;
                     }


                }


               move(direct);

               food();

               eatjudge();

               addlen();


        }

}


int  main()
{
        
int gd,gm;
        gd
=DETECT;
        registerbgidriver(EGAVGA_driver);
        initgraph(
&gd, &gm, "");

        welcome();
/*the start action*/

        
while(again==1)
        
{
            endflag
=0;

            backset();
/*the set of background*/

            initialize();

            draw();

            run();

        }


        
return 0;
}

整个程序不是太长,因为写的功能相对简单,也没有什么特效,

下面是哪个上面文件需要包含的welcome.c

 

char  ying64K[] = {
/* 以下是 '迎' 的 64点阵楷体_GB2312 字模,512 byte */
  
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  
0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,
  
0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x00,
  
0x00,0x00,0x00,0x00,0x1E,0x00,0x00,0x00,
  
0x00,0x00,0x00,0x00,0x3E,0x00,0x00,0x00,
  
0x00,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,
  
0x00,0x30,0x00,0x00,0x70,0x00,0x00,0x00,
  
0x00,0x3C,0x00,0x00,0xE0,0x00,0x00,0x00,
  
0x00,0x1E,0x00,0x01,0xC0,0x00,0x00,0x00,
  
0x00,0x1F,0x00,0x03,0x00,0x00,0x00,0x00,
  
0x00,0x0F,0x80,0x06,0x00,0x01,0xF0,0x00,
  
0x00,0x07,0x80,0x18,0x00,0x07,0xF8,0x00,
  
0x00,0x03,0x01,0xF0,0x07,0xFF,0xFC,0x00,
  
0x00,0x00,0x00,0xC0,0x03,0xE0,0x38,0x00,
  
0x00,0x00,0x00,0xC0,0x03,0x00,0x38,0x00,
  
0x00,0x00,0x00,0xC0,0x03,0x00,0x38,0x00,
  
0x00,0x00,0x00,0x40,0x03,0x00,0x30,0x00,
  
0x00,0x00,0x00,0x40,0x03,0x00,0x30,0x00,
  
0x00,0x00,0x00,0x40,0x03,0x00,0x30,0x00,
  
0x00,0x00,0x00,0x40,0x03,0x00,0x70,0x00,
  
0x00,0x0C,0x00,0x40,0x03,0x00,0x70,0x00,
  
0x00,0x3F,0x00,0x40,0x03,0x00,0x70,0x00,
  
0x00,0xFF,0x80,0x60,0x03,0x00,0x70,0x00,
  
0x1F,0xC7,0x80,0x60,0x43,0x00,0x70,0x00,
  
0x0E,0x07,0x00,0x60,0x83,0x0C,0xE0,0x00,
  
0x00,0x06,0x00,0x61,0x83,0x07,0xE0,0x00,
  
0x00,0x06,0x00,0x67,0x01,0x03,0xE0,0x00,
  
0x00,0x04,0x00,0x7E,0x01,0x01,0xC0,0x00,
  
0x00,0x0C,0x00,0x7C,0x01,0x01,0xC0,0x00,
  
0x00,0x0C,0x00,0x78,0x01,0x01,0x80,0x00,
  
0x00,0x08,0x00,0xF0,0x01,0x01,0x00,0x00,
  
0x00,0x04,0x00,0xE0,0x01,0x00,0x00,0x00,
  
0x00,0x04,0x00,0xE0,0x01,0x00,0x00,0x00,
  
0x00,0x04,0x00,0x40,0x01,0x00,0x00,0x00,
  
0x00,0x04,0x00,0x00,0x01,0x00,0x00,0x00,
  
0x00,0x02,0x00,0x00,0x01,0x00,0x00,0x00,
  
0x00,0x02,0x00,0x00,0x01,0x00,0x00,0x00,
  
0x00,0x02,0x00,0x00,0x01,0x00,0x00,0x00,
  
0x00,0x02,0x00,0x00,0x01,0x00,0x00,0x00,
  
0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,
  
0x00,0x3F,0x80,0x00,0x00,0x00,0x00,0x00,
  
0x1F,0xFF,0xFC,0x00,0x00,0x00,0x00,0x00,
  
0x0F,0xF0,0x7F,0xC0,0x00,0x00,0x00,0x00,
  
0x0F,0x80,0x03,0xFE,0x00,0x00,0x00,0x00,
  
0x00,0x00,0x00,0x7F,0xE0,0x00,0x00,0x00,
  
0x00,0x00,0x00,0x1F,0xFF,0x80,0x00,0x00,
  
0x00,0x00,0x00,0x03,0xFF,0xFF,0xFF,0xFE,
  
0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xF8,
  
0x00,0x00,0x00,0x00,0x1F,0xFF,0xFF,0xE0,
  
0x00,0x00,0x00,0x00,0x03,0xFF,0xFF,0x00,
  
0x00,0x00,0x00,0x00,0x00,0xFF,0xF8,0x00,
  
0x00,0x00,0x00,0x00,0x00,0x1F,0x80,0x00,
  
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
}
;

char  huan64K[] = {
/* 以下是 '欢' 的 64点阵楷体_GB2312 字模,512 byte */
  
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  
0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x00,
  
0x00,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,
  
0x00,0x00,0x00,0x00,0x1E,0x00,0x00,0x00,
  
0x00,0x00,0x00,0x00,0x1E,0x00,0x00,0x00,
  
0x00,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,
  
0x00,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,
  
0x00,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,
  
0x00,0x00,0x00,0x00,0x38,0x00,0x00,0x00,
  
0x00,0x00,0x00,0x00,0x38,0x00,0x00,0x00,
  
0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,
  
0x00,0x00,0x00,0x00,0x70,0x00,0x00,0x00,
  
0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x00,
  
0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x00,
  
0x00,0x00,0x08,0x00,0xC0,0x00,0x00,0x00,
  
0x00,0x00,0x3C,0x00,0xC0,0x03,0x80,0x00,
  
0x00,0x03,0xFE,0x01,0x80,0x1F,0xC0,0x00,
  
0x00,0x1F,0xFF,0x01,0x81,0xFF,0xF0,0x00,
  
0x03,0xFC,0x0F,0x03,0xFF,0xFF,0xF8,0x00,
  
0x0F,0xE0,0x0E,0x03,0xFC,0x03,0xF0,0x00,
  
0x07,0x00,0x0C,0x06,0x00,0x03,0x80,0x00,
  
0x00,0x00,0x1C,0x04,0x00,0x03,0x00,0x00,
  
0x00,0x00,0x1C,0x08,0x00,0x06,0x00,0x00,
  
0x00,0x00,0x18,0x00,0x00,0x04,0x00,0x00,
  
0x00,0x00,0x18,0x00,0x00,0x00,0x00,0x00,
  
0x00,0x40,0x38,0x00,0x30,0x00,0x00,0x00,
  
0x00,0x60,0x38,0x00,0x38,0x00,0x00,0x00,
  
0x00,0x30,0x30,0x00,0x38,0x00,0x00,0x00,
  
0x00,0x18,0x70,0x00,0x38,0x00,0x00,0x00,
  
0x00,0x0E,0x70,0x00,0x38,0x00,0x00,0x00,
  
0x00,0x07,0xE0,0x00,0x38,0x00,0x00,0x00,
  
0x00,0x07,0xE0,0x00,0x38,0x00,0x00,0x00,
  
0x00,0x03,0xC0,0x00,0x38,0x00,0x00,0x00,
  
0x00,0x01,0xE0,0x00,0x3C,0x00,0x00,0x00,
  
0x00,0x01,0xF0,0x00,0x30,0x00,0x00,0x00,
  
0x00,0x01,0xF8,0x00,0x72,0x00,0x00,0x00,
  
0x00,0x03,0xF8,0x00,0x61,0x00,0x00,0x00,
  
0x00,0x03,0x3C,0x00,0x60,0x80,0x00,0x00,
  
0x00,0x06,0x1C,0x00,0xC0,0xC0,0x00,0x00,
  
0x00,0x0E,0x0E,0x00,0xC0,0x60,0x00,0x00,
  
0x00,0x0C,0x0E,0x00,0xC0,0x70,0x00,0x00,
  
0x00,0x18,0x06,0x01,0x80,0x38,0x00,0x00,
  
0x00,0x38,0x02,0x01,0x80,0x1C,0x00,0x00,
  
0x00,0x30,0x02,0x03,0x00,0x1E,0x00,0x00,
  
0x00,0x60,0x00,0x06,0x00,0x0F,0x00,0x00,
  
0x00,0xC0,0x00,0x06,0x00,0x07,0x80,0x00,
  
0x01,0x80,0x00,0x0C,0x00,0x07,0xC0,0x00,
  
0x02,0x00,0x00,0x18,0x00,0x03,0xF0,0x00,
  
0x04,0x00,0x00,0x30,0x00,0x01,0xFC,0x00,
  
0x08,0x00,0x00,0x60,0x00,0x01,0xFF,0x00,
  
0x00,0x00,0x01,0x80,0x00,0x00,0xFF,0xE0,
  
0x00,0x00,0x02,0x00,0x00,0x00,0x7F,0xF8,
  
0x00,0x00,0x04,0x00,0x00,0x00,0x3F,0xF0,
  
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
}
;

上面的是   欢迎  两个字的点阵, 你可以用一般的点阵生成器来生成你想

要的汉字.

呵呵,欢迎交流啊,写在评论中即可.  

 

 

  • 3
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值