说明
- 这个寒假玩了会Flappy Bird,感觉挺好玩,于是试着自己写了一个出来,希望大家喜欢!
- 游戏中界面十分简洁,可是别看它这么简单,实际上奥妙重重!
- 在源码中可以见到有许多宏定义,是游戏中的一些参数,后面的注释也有讲解,不同的参数配置有不同的效果,你们可以自己改一改,试一试!
- 操控十分简单,只要按下键盘( 随意一个键 )“bird”就会往上跳
- 要是你不幸撞到了柱子上,这一局就结束了,这时会等大概两秒,再等待你的指令,要是你这时按下”*”,就退出了,按其它的则开始新的一局。
- 这里也给出了几个预设的参数设置,空白的位置或没写出来的意思是和程序里的默认一样
编号 | hest | mo | hei | wid | gap | len | T | 说明 |
---|---|---|---|---|---|---|---|---|
1 | 100 | 2000 | 20 | 13 | 5 | 3 | 25 | 最普通 |
2 | 100 | 1000 | 40 | 30 | 9 | 5 | 25 | 屏幕大一点,不过也挺难 |
3 | 100 | 1500 | 20 | 30 | 8 | 7 | 2 | 你能过三个算你厉害 |
4 | 100 | 800 | 40 | 30 | 5 | 3 | 25 | 能过一个算你厉害 |
5 | 100 | 2000 | 20 | 30 | 18 | 5 | 25 | 非常容易 |
实现
这个相对简单一些,我是用了变量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();
}
}
今天的文章类似bird alone的游戏_flappy bird 原版下载[通俗易懂]分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/58535.html