#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#include<bios.h>
#define KEY_UP 0x48
#define KEY_LEFT 0x4B
#define KEY_RIGHT 0x4D
#define KEY_DOWN 0x50
#define ESC 0x011b
const int gamespeed=90000 ;/*遊戲速度自己調整*/
struct point
{
int x ;
int y ;
}
p[100];
struct point fd;
void p_frame() /*邊界*/
{
int i ;
printf("\n\t\t");
for(i=0;i<41;i++)
printf("=");
printf("\n");
for(i=0;i<20;i++)
printf("\t\t|\t\t\t\t\t|\n");
printf("\t\t");
for(i=0;i<41;i++)
printf("=");
}
void print(int n)/*輸出蛇*/
{
int i ;
clrscr();
p_frame();
gotoxy(fd.x,fd.y);
printf("@");
for(i=0;i<=n;i++)
{
gotoxy(p[i].x,p[i].y);
printf("*");
}
}
int gameover(int n)/*是否咬到自己了*/
{
int i;
for(i=0;i<n-1;i++)
if(p[i].x==p[n].x && p[i].y==p[n].y )
return 1;
return 0;
}
void slp() /*這是我自己加的畫面*/
{
int a=40,b=20,i,t,x,y;
x=16;
y=2;
for(t=0;t<50;t++)
{
if(t%4==0) {
for(i=0;i<a;i++){
gotoxy(x++,y);
printf("*");
}
a--;
}
else
if(t%4==1){
for(i=0;i<b;i++){
gotoxy(x,y++);
printf("*");
}
b--;
}
else
if(t%4==2){
for(i=0;i<a;i++){
gotoxy(x--,y);
printf("*");
}
a--;
}
else
if(t%4==3){
for(i=0;i<b;i++){
gotoxy(x,y--);
printf("*");
}
b--;
}
delay(gamespeed);
}
}
void prover(int n)/*結束時的輸出*/
{
slp();/*落幕*/
clrscr();
p_frame();
gotoxy(23,8);
printf("Game Over T_T. You have got %d",n+1);
gotoxy(23,9);
printf("Go On?(y/n)");
}
void calculate(int *px,int *py,int *pn)/*計算更新每個節點的位子*/
{
int i,n,tx,ty;
n=*pn;
tx=*px;
ty=*py;
if(tx<17) tx=57;
else if(tx>56) tx=17;
if(ty<=1) ty=22;
else if(ty>22) ty=2;
if(tx==fd.x&&ty==fd.y)
{
n++;
p[n].x=fd.x ;
p[n].y=fd.y ;
printf("\a");
fd.x=rand()%39+18 ;
fd.y=rand()%20+3 ;
}
else
{
for(i=0;i<n;i++)
{
p[i].x=p[i+1].x ;
p[i].y=p[i+1].y ;
}
p[n].x=tx;
p[n].y=ty;
}
*pn=n;
*px=tx;
*py=ty;
}
void main()
{
int n,tx,ty,f=1,flag,game; /*當前蛇的長度,x,y記錄更改的蛇頭部*/
int *pn,*px,*py;
char key ;
pn=&n ;
px=&tx;
py=&ty;
n=1; /*蛇身體0~n*/
fd.x=rand()%20+17 ;/*初始狀太*/
fd.y=rand()%17+3 ;
p[0].x=20 ;
p[0].y=3 ;
tx=p[1].x=21 ;
ty=p[1].y=3 ;
flag=0; /*記錄無效的反向按鍵*/
while(1)
{
while(!kbhit())/*無鍵盤消息*/
{
switch(f)
{
case 1 :
ty++;
break ;
case 2 :
ty--;
break ;
case 3 :
tx--;
break ;
case 4 :
tx++;
break ;
}
calculate(px,py,pn);
print(n);
sleep(1);
}/*有消息出現*/
flag=0;
key=getch();/*key=bioskey(0);接收按鍵*/
switch(key)
{
case KEY_DOWN :
if(f!=2){
f=1 ;
ty++;
flag=1;
}
break ;
case KEY_UP :
if(f!=1){
f=2 ;
ty--;
flag=1;
}
break ;
case KEY_LEFT :
if(f!=4){
f=3 ;
tx--;
flag=1;
}
break ;
case KEY_RIGHT :
if(f!=3){
f=4 ;
tx++;
flag=1;
}
break ;
}
if(key==' ')break ;
if(flag) /*按鍵有效*/
{
calculate(px,py,pn);
print(n);
delay(gamespeed);
}
/*game*/
if(gameover(n))
{
prover(n);
key=getch();
if(key=='n')
break;
else /*重玩*/
{
n=1;
ty=p[1].y;
tx=p[1].x;
}
}
}
}
源文章地址:
/sulipol/blog/item/514443b6b39612f830add16c.html