游戏——Flappy Bird

说明

  • 这个寒假玩了会Flappy Bird,感觉挺好玩,于是试着自己写了一个出来,希望大家喜欢!
  • 游戏中界面十分简洁,可是别看它这么简单,实际上奥妙重重!
  • 在源码中可以见到有许多宏定义,是游戏中的一些参数,后面的注释也有讲解,不同的参数配置有不同的效果,你们可以自己改一改,试一试!
  • 操控十分简单,只要按下键盘( 随意一个键 )“bird”就会往上跳
  • 要是你不幸撞到了柱子上,这一局就结束了,这时会等大概两秒,再等待你的指令,要是你这时按下”*”,就退出了,按其它的则开始新的一局。
  • 这里也给出了几个预设的参数设置,空白的位置或没写出来的意思是和程序里的默认一样
编号hestmoheiwidgaplenT说明
1100200020135325最普通
2100100040309525屏幕大一点,不过也挺难
310015002030872你能过三个算你厉害
410080040305325能过一个算你厉害
51002000203018525非常容易

实现

这个相对简单一些,我是用了变量v来记录下一个时间单位”bird”应该在纵方向移动多少,因为在抛物线中,delta(y)是呈线性的。而”bird”与屏幕的横向相对位置是不变的,所以”bird”的移动就处理好了。处理好”bird”的移动后,就是随机放柱子以及柱子的移动了,就模拟,看一看程序就知道了。不过为了让它不那么卡,就用了gotoxy(),只有要变的地方才过去变一下,要是全屏刷新就很卡了。

截图

第一个预设
要是调成这样,随随便便上一百~~↓
第五个预设

源码

点此下载可执行文件和源码

附上源代码

#include <cstdio>
#include <ctime>
#include <conio.h>
#include <windows.h>
#include <cstdlib>
#include <cstring>
using namespace std;
//==================================================================
#define hest 100            //跳的速度(点击到最高点有 (250/hest) 秒) 
#define mo 2000             //跳的高度(每次点击跳到最高多 (((1+hest)*hest+hest)/mo) 格) 
#define hei 20              //屏幕高度 
#define wid 13              //屏幕宽度 
#define det v*2-1
#define gap 5               //柱子间上下的空隙长度 
#define len 3               //柱子的宽度 
#define T  25               //柱子移动时间单位      T t移动一格
#define TT 500/T            //柱子出现频率            TT T出现一个 
//==================================================================
void color(int a)//颜色函数
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),a);
}
void gotoxy(int x,int y)//位置函数(列为x 行为y)
{
    COORD pos;
    pos.X=2*x;
    pos.Y=hei-y;
    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),pos);
}

int v,h,hx,hy,t,tt,gg,quit,score,plused,wall[hei+5][wid+len+10];
/*
    t:  时间基本单位          1t=4ms
    tt: 辅助作用                柱子每 移动T格tt++ 
    quit                        记录是否退出游戏 
    plused                      辅助用作计分 
    wall[i][j]  第 i 行第 j 列的柱子情况(0为空 1为有但还没打印 2为打印过了) 
*/ 

void reset(){
    system("cls");
    color(4);
    for (int i=0; i<=wid; i++){gotoxy(i,-1); printf("※");}
    gg=0;
    hx=5;
    hy=hei/2;
    h=hy*mo;
    t=0;
    tt=-5; 
    v=hest;
    score=0;
    memset(wall,0,sizeof(wall));
    color(14); gotoxy(hx,hy); printf("◎");
}

void move_bird(){
    h+=(v*2-1);
    if (h>hei*mo) h=hei*mo;
    if (h/mo!=hy){
        gotoxy(hx,hy); printf("  ");
        hy=h/mo;
        if (hy<0) hy=h=0;//gg=1;
        if (wall[hy][hx]) gg=1;
        gotoxy(hx,hy);
        color(14); printf("◎");
    }
}

void move_wall(){
    for (int i=0; i<=hei; i++){
        int k=0,pp=0;
        while (k<wid+5){
            color(2); 
            for (; k<=wid+5 && !wall[i][k]; k++);
            if (k+len/2==hx){
                if (!plused) plused=1, score++;
                if (!pp) color(15),pp=1;
            }
            if (k>=0 && wall[i][k]) wall[i][k-1]=1;
            k-=2; if (k<-1) k=-1;
            while (wall[i][++k]){
                if (hx==k && hy==i) gg=1;
                if (k<=wid && wall[i][k]==1){wall[i][k]=2; gotoxy(k,i); printf("█");}
            }
            wall[i][k-1]=0; gotoxy(k-1,i); printf("  ");
        }
    }
}

void new_wall(){
    srand(time(NULL));
    int dd=(rand()%(hei-gap-1)+1),uu=dd+gap+1;
    for (int i=1; i<=len; i++) wall[dd][i+wid]=1;
    for (int i=dd-1; i>=0; i--) for (int j=2; j<len; j++) wall[i][j+wid]=1;
    for (int i=1; i<=len; i++) wall[uu][i+wid]=1;
    for (int i=uu+1; i<=hei; i++) for (int j=2; j<len; j++) wall[i][j+wid]=1;
    plused=0;
}

void game(){
    while (!gg){
        v--;
        if(kbhit()) {char ch=getch(); v=hest;}
        Sleep(4); t=(t+1)%T;
        if (tt==TT) tt=0, new_wall();
        if (t==0) tt++, move_wall();
        move_bird();
        color(8);
        gotoxy(wid/2,2*hei/3);
        printf("%d",score);
    }
    gotoxy(wid/2,-3); color(15); printf("GG~");
    gotoxy(wid/2-3,-5); printf("final score: %d",score);
    gotoxy(hx,hy); color(12); printf("◎");
}

int main(){
    char ch;
    while (ch!='*'){
        reset();
        ch=getch();
        game();
        Sleep(1500);
        while (kbhit()) ch=getch();
        Sleep(1000);
        ch=getch();
    }
}
  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值