/**
* 作者:Kola
* 链接:http://www.zhihu.com/question/22715390/answer/34294761
* 来源:知乎
* 著作权归作者所有,转载请联系作者获得授权。
*/
#include"stdio.h"
#include"windows.h"
#include"string.h"
#include"conio.h"
#include"time.h"
typedef struct pipe
{
int x;
int y;
struct pipe *next;
}PIPE;
char backGround[14][80]={0};
int Time=0;
unsigned int Score=0;
void HideCursor()
{
CONSOLE_CURSOR_INFO cursor_info={1,0};
SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE),&cursor_info);
}
void gotoxy(int x, int y)
{
COORD coord;
coord.X=x;
coord.Y=y;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),coord);
}
void Getready()
{
int i=0, j=0;
for(i=0; i<11; i++)
for(j=0;j<80;j++)
backGround[i][j]=' ';
for(i=0; i<8; i++)
strcat(backGround," ┌┐ ");
for(i=0; i<8; i++)
strcat(backGround,"┌┤│ ");
for(i=0; i<8; i++)
strcat(backGround,"││├┐ ");
puts(backGround);
gotoxy(30, 3);
printf("G e t R e a d y");
gotoxy(0, 14);
for(i=0; i < 40; i++)
printf("▁");
for(i=0; i < 11; i++)
printf(" ╱╱ ");
gotoxy(0, 16);
for(i=0; i < 40; i++)
printf("▔");
gotoxy(18, 3);
printf("*@>");
getch();
gotoxy(30, 3);
printf(" ");
}
PIPE *Pipefun(PIPE *h)
{
int i=0, j=0;
PIPE *p;
for(p=h,i=0;i<6; i++)
{
for(j=0; j<14; j++)
{
if( j==p->y-1 || j==p->y || j==p->y+1 )
continue;
else
{
if(p->x >= 0 && p->x < 80)
gotoxy(p->x, j),printf("■");
if(p->x+2>=0 && p->x+2<80)
gotoxy(p->x+2, j),printf("■");
if(p->x+4>=0 && p->x+4<80)
gotoxy(p->x+4, j), printf("%c%c",backGround[j][p->x+4],backGround[j][p->x+5]);
}
}
p->x=p->x-2;
p=p->next ;
}
if(h->x < -4)
{
h->x=78+12;
h->y=rand()%9+3;
h=h->next;
}
return h;
}
void Bird()
{
int i=0,bird=3,temp=0;
char ch='0';
PIPE *h,*p,*q;
p=h=q=(PIPE *)malloc(sizeof(PIPE));
for(i=0; i<5; i++)
{
p->x=78+16*i;
p->y=rand()%9+3;
q=(PIPE *)malloc(sizeof(PIPE));
p->next=q;
q->next=NULL;
p=q;
}
p->x=78+16*i;
p->y=rand()%13+1;
q->next=h;
while(1)
{
Time++;
temp = bird;
if(kbhit())
ch=getch();
ch==' '?bird--:bird++;
ch = '0';
if(bird<0 || bird>=14)
break;
gotoxy(18, temp);
printf(" %c%c", backGround[temp][20], backGround[temp][21]);
gotoxy(18, bird);
printf("*@>");
if(Time%3==1)
h=Pipefun(h);
for(p=h,i=0; i<6; i++,p=p->next)
if(p->x==18 && p->y-1!=bird && p->y!=bird && p->y+1!=bird)
break;
if(p->x==18 && p->y-1!=bird && p->y!=bird && p->y+1!=bird)
break;
Sleep(300);
}//end of while
}//end of Bird
void Gameover()
{
Score=(Time-88)/24<0?0:(Time-88)/24;
gotoxy(28, 5);
printf("┌──────────┐");
gotoxy(28, 6);
printf("│ G A M E O V E R │");
gotoxy(28, 7);
printf("│ │");
gotoxy(28, 8);
printf("│ %4d │",Score);
gotoxy(28, 9);
printf("└──────────┘");
}//end of Gameover
int main()
{
HideCursor();
system("title Flappy Bird for c");
system("mode con cols=80 lines=20");
srand((unsigned)time(NULL));
Getready();
Bird();
Gameover();
getch();
}