| Bytes | Lang | Time | Link |
|---|---|---|---|
| 289 | JavaScript NodeJS | 240804T041340Z | noodle p |
| 464 | Javascript+jQuery ASCII Art 571 524 491 | 140308T060752Z | Robin |
| 332 | C | 180817T133256Z | Peter Le |
| nan | Color Animation and Physics Pure JavaScript | 180622T044356Z | ei2 |
| nan | 140309T071014Z | Max Chuq | |
| 1024 | Floppy Dragon | 140213T165001Z | xem |
| 997 | Javascript + jQuery | 140213T123618Z | Michael |
JavaScript (NodeJS), 299 296 289 bytes
require('readline').emitKeypressEvents(p=process.stdin);p.setRawMode(1)
p.on('keypress',_=>v=.8)
s=x=y=v=z=0
setInterval(c=>{x=x?x-.5:y<z|y>z+2?X:(z=5+new Date%15,s++,15)
y>25?X:c.clear(y-=v-=.1)
for(i=0;i<25;i++)c.log((-~y-i?'':''+s).padEnd(x)+'| '[i>z&i<z+3].padEnd(15)+'|')},40,console)
Play by pressing any key. The process ends with an error when you fail.
If you have NodeJS installed, I encourage you to try it out! See if you can beat my high score of 14.
This is quite heavily golfed, but I bet there's one or two little tricks yet to be found here. I tried to make the physics as accurate to the original as possible, though this version is a bit more lenient with collisions.
I chose the simplest layout I could think of that still gives the impression of Flappy Bird and meets all the requirements. I have the score move up and down instead of displaying it separately, killing two birds with one stone. I think it needs to have two pipes on screen in order for the moving-horizontally effect to be sold, but the second pipe does not get its gap until you have cleared the first pipe.
Here's a GIF of me playing the game. I only got to score 3 that time.

Javascript+jQuery (ASCII Art) - 571 524 491 464
l=$('[id$=52] h4~pre').click(()=>{m=1}),o=[],d=0,e=4,m=1;setInterval(()=>{t=Array(153);s=~~(d/10-0.99);d++;d%10?0:o[d+20]=~~(Math.random()*5)+1;for(i=-1;k=o[i+d],i<17;i++)if(k--)for(j=-1;c=j==k||j-k==4?'-':j-k>0&&j-k<4?0:'|',j<9;j++)i>-1?t[j*17+i]=c:0,i<16?t[j*17+i+1]=c:0;m-=.2;e-=m;if(e<0||e>10||t[~~e*17+8])e=4,m=1,d=0,o=[];t[~~e*17+8]='>';r='|-------['+s+']-------';for(i=0;z=t[i]||' ',i<153;i++)i%17?r+=z:r+='|\n|'+z;r+='|\n|-----------------|';l.html(r);},150)
Demo
Open the dev tools console (F12) and run the above code in this page to use the below demo (right now, go ahead!):
|-------[5]-------| | || -- | | || | | || | | -- | | -- | | || | | || | | -- > || | | || || | |-----------------|
Known minor bugs:
If you get a double-digit score, it messes up the layout
It is NOT easy!!! (but the original wasn't either)
There's a tradeoff between efficiency and golfedness
Feel free to comment with your highscore.
Also, this is my first Code Golf post, so suggestions on compression, etc. will be welcomed
C, 386 351 347 341 bytes (Windows, MinGW), 332 with a terminal emulator
Certainly not the prettiest entry, but it captures the core mechanics of flappy bird: The bird accelerates downwards, pressing a key makes him jump up, touching the pipes or the edges of the screen ends the game, score is the number of cleared pipes.
#import<windows.h>
#define T(x)P[v*10+x]=
char P[71];X,Y,W,s;main(v){srand(time(0));for(float y=1,t=0;!(v<0|v>6|(v<Y|v>=Y+W)&X>0&X<3);Sleep(99)){y+=t=kbhit()?getch(),-.9:t+.3;--X<0?X=8,Y=rand()%3+1,W=rand()%2+2:X-1||++s;memset(P,32,70);for(v=0;v<7;T(9)10,T(X)v<Y|v++>=Y+W?35:32);v=y;T(1)79;T(2)62;system("cls");printf("%s\nSCORE: %d",P,s);}}
It can be shortened to 333 bytes, if a POSIX terminal emulator is used (like Cmder):
#import<windows.h>
#define T(x)P[v*10+x]=
char P[71];X,Y,W,s;main(v){srand(time(0));for(float y=1,t=0;!(v<0|v>6|(v<Y|v>=Y+W)&X>0&X<3);Sleep(99)){y+=t=kbhit()?getch(),-.9:t+.3;--X<0?X=8,Y=rand()%3+1,W=rand()%2+2:X-1||++s;memset(P,32,70);for(v=0;v<7;T(9)10,T(X)v<Y|v++>=Y+W?35:32);v=y;T(1)79;T(2)62;printf("\033c%s\nSCORE: %d",P,s);}}
Color Animation and Physics; Pure JavaScript, 457 (335) bytes
This is my first post in this forum; I made this code and retrospectively found this thread to post it in.
Here's the code encapsulated in HTML, ready to be copy/pasted in to an html file:
<body><script>A=120;B=280;d=document;y=180;x=v=n=s=0;f=140;c=d.createElement('canvas');p=c.getContext('2d');c.width=B;c.height=400;c.onclick=()=>{v-=6};p.font='50px Arial';d.body.appendChild(c);r=(h,t,k=0,i='#0f0',w=40)=>{p.fillStyle=i;p.fillRect(h,k,w,t)};b=setInterval(()=>{if(x==0){n=f;f=Math.floor(B*Math.random());x=160}x--;v+=.1;y+=v;r(0,400,0,'#08f',B);r(20,40,y,'#fc0');r(x-40,n);r(x+A,f);r(x-40,B-n,n+A);r(x+A,B-f,f+A);if(x==60)s++;p.strokeText(s,A,80);if(x>20&&x<100&&(y<n||y>n+80)){clearInterval(b);location.reload()}},15)</script><br>Made by Thomas Kaldahl</body>
It has pixel perfect collisions, accurate quadratic physics, and smooth color animations, all in 457 bytes worth of purely independent offline Javascript code, shown ungolfed here in greater detail and explanation:
<!--entire HTML shell is omitted in golf-->
<body>
<script>
//common numbers and the document are assigned shortcut letters
A = 120;
B = 280;
d = document;
y = 180; //y position of the top of the bird
x = //x position of scrolling for pipes
v = //vertical velocity of bird
n = //y position of the top of the nearest pipe opening
s = 0; //score
f = 140; //y position of the top of the farther pipe opening
c = d.createElement('canvas'); //canvas
p = c.getContext('2d'); //canvas context
//set canvas dimensions
c.width = B;
c.height = 400;
c.onclick = () => { v -= 6 }; //apply jump velocity to bird when clicked
p.font = '50px Arial'; //font for scoring (omitted in golf)
d.body.appendChild(c); //add canvas to html page
//draw a rectangle on the canvas
r = (h, t, k = 0, i = '#0f0', w = 40) => {
p.fillStyle = i;
p.fillRect(h, k, w, t)
};
//main loop (not assigned to b in golf)
b = setInterval( () => {
if (x == 0) { //the x position is a countdown. when it hits 0:
n = f; //the far pipe is now the near pipe, overwriting the old near pipe
f = B * Math.random() //assign the far pipe a new vertical location
x = 160; //restart the countdown back at 160
//(score increments here in golf)
}
x--; //count down
v += .1; // apply gravity to velocity
y += v; // apply velocity to bird
r(0, 400, 0, '#08f', B); //draw background
r(20, 40, y, '#fc0'); //draw bird (non-default color is omitted in golf)
r(x - 40, n); //draw first pipe upper half
r(x + A, f); //draw second pipe upper half
r(x - 40, B - n, n + A); //draw first pipe lower half
r(x + A, B - f, f + A); //draw second pipe lower half
if (x == 60)
s++; //(this is done earlier on golf)
p.strokeText(s, A, 80); //draw score
// if the bird is in range of the pipes horizontally,
// and is not in between the pipes,
if (x > 20 && x < 100 && (y < n || y > n + 80)) {
clearInterval(b); location.reload() //omit interval clear in golf
}
}, 15) //(reduced the frame delay to 9, a 1 digit number, in golf)
</script><br>
Made by Thomas Kaldahl <!-- GG -->
</body>
For fun, here's a 1066 byte version with fancier graphics:
<body style='margin:0'><script>var y=180,x=v=n=s=0,f=140,c=document.createElement('canvas'),p=c.getContext('2d');c.width=280;c.height=400;c.onclick=function(){v-=6};c.style='width:68vh;height:97vh';document.body.appendChild(c);p.font="50px Arial";p.shadowColor='#444';p.shadowBlur=9;p.shadowOffsetX=p.shadowOffsetY=5;function r(h,t,k=0,i='#0f0',j='#0a0',u=0,l=0,w=40){var g=p.createLinearGradient(h,l,h+40,u);g.addColorStop(0,i);g.addColorStop(1,j);p.fillStyle=g;p.fillRect(h,k,w,t);}b=setInterval(function(){if(x==0){n=f;f=Math.floor(280*Math.random());}x=x==0?159:x-1;v+=.1;y+=v;r(0,400,0,'#08c','#0cf',280,0,280);r(20,40,y,'#ff0','#fa0',y+40,y);r(x-40,n);r(x-50,20,n-20,'#0f0','#0a0',n+20,n,60);r(x+120,f);r(x+110,20,f-20,'#0f0','#0a0',f+20,f,60);r(x-40,280-n,n+120);r(x-50,20,n+120,'#0f0','#0a0',n+140,n+100,60);r(x+120,280-f,f+120);r(x+110,20,f+120,'#0f0','#0a0',f+140,f+100,60);if(x==60){s++;}p.fillStyle='#fff';p.fillText(s,120,80);if(x>20&&x<100&&(y<n||y>n+80)||y<0||y>360){clearInterval(b);location.reload();}},15);</script><br>Made by Thomas Kaldahl</body>
Also, is it cheating to use a compression system like DEFLATE?
Below is the ASCII85 code for a DEFLATEd version of the code:
By the way, compressed it is 335 bytes total.
Gapon95_Wi'Kf'c(i##6'h,+cM\JZeFO<h;$W'#A1',RqNigBH02C'#R$m]<i<X#6GR`2pE<Ri5mu-n%cVPrsJe:*R^pnr9bI@[DAZnPP02A^!.$MN/@`U7l5gm!!Vr4>A;P?u[Pk8]jCnOP%dIu?`fWql>"tuO4/KbIWgK;7/iJN'f2,hnFg8e.^SO*t\*`,3JBn6j(f`O#],M0;5Sa35Zc@*XaBs@N%]k\M76qa[.ie7n(^*Z5G-lfhUZ3F#'%,X17Pj1u]L)LjpO6XbIl%N3tJhTsab8oV1T(?MC$9mT;90VMmnfBNKEY(^'UV4c?SW':X(!4,*WCY+f;19eQ?`FK0I"(uDe:f&XV&^Rc+'SWRIbd8Lj9bG.l(MRUc1G8HoUsn#H\V(8"Y$/TT(^kATb(OreGfWH7uIf
Objective C - ungolfed
Possibly the worst code I have ever written.

You can download the binary here: AsciiBird Download Binary
Tap the control key frantically to keep the bird in the air!
This was compiled by Xcode and run in Terminal. It has colors! Protip: Resize your terminal's window so you don't see a backlog of screen refreshes.
main.m:
#import <Foundation/Foundation.h>
#import "ABManager.h"
void drawScreen(int counter)
{
__block struct ABPoint thisPoint;
thisPoint.x = 0;
thisPoint.y = 0;
__block ABManager *man = [ABManager sharedManager];
[man.screen enumerateObjectsUsingBlock:^(NSString *c, NSUInteger idx, BOOL *stop)
{
NSString *c2 = c;
NSMutableArray *newObstacles = [[NSMutableArray alloc] init];
for (NSValue *s in man.obstacles)
{
struct ABPoint o;
[s getValue:&o];
if (thisPoint.x == o.x)
{
if (thisPoint.y != o.y && thisPoint.y != (o.y + 1) && thisPoint.y != (o.y - 1))
{
c2 = @"\033[1;33m|\033[0m";
}
else
{
if (counter == 0 && thisPoint.y < o.y)
{
o.x = o.x - 1;
if (o.x < 0)
{
o.x = 49;
o.y = (arc4random() % 11) + 1;
}
if (man.charPos.x == o.x)
{
man.score = man.score + 1;
}
}
}
}
[newObstacles addObject:[NSValue valueWithBytes:&o objCType:@encode(struct ABPoint)]];
}
man.obstacles = [[NSMutableArray alloc] initWithArray: newObstacles];
if (thisPoint.x == man.charPos.x && thisPoint.y == man.charPos.y)
{
printf("\033[1;35m>\033[0m");
if ([c2 isEqualToString:@"\033[1;33m|\033[0m"])
{
man.shouldExit = TRUE;
}
}
else
{
printf("%s", [c2 UTF8String]);
}
if (idx % 50 == 49)
{
printf("\n");
thisPoint.y = thisPoint.y + 1;
thisPoint.x = 0;
}
else
{
thisPoint.x = thisPoint.x + 1;
}
}];
}
int main(int argc, const char * argv[])
{
@autoreleasepool {
ABManager *man = [ABManager sharedManager];
int count = 0;
BOOL ignoreKeypress = FALSE;
while (TRUE)
{
if (CGEventSourceKeyState(kCGEventSourceStateCombinedSessionState,59) && !ignoreKeypress)
{
ignoreKeypress = TRUE;
struct ABPoint p = man.charPos;
p.y = p.y - 2;
man.charPos = p;
}
else
{
ignoreKeypress = CGEventSourceKeyState(kCGEventSourceStateCombinedSessionState,59);
if (count > 3)
{
count = 0;
struct ABPoint p = man.charPos;
p.y = p.y + 1;
man.charPos = p;
}
else
{
count = count + 1;
}
}
if (man.charPos.y < -1 || man.charPos.y > 11 || man.shouldExit)
{
exit(1);
}
printf("\n\n\n\n\n");
printf("\033[1;36m[\033[0m\033[1;30mHacky Bird\033[0m\033[1;36m]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\033[0m\n");
drawScreen(count);
printf("\033[1;32m[\033[0m\033[1;31mScore: %li\033[0m\033[1;32m]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\033[0m\n", (long)man.score);
[NSThread sleepForTimeInterval:0.0157];
}
}
}
ABManager.h
#import <Foundation/Foundation.h>
#import <CoreGraphics/CoreGraphics.h>
struct ABPoint {
NSInteger x;
NSInteger y;
};
@interface ABManager : NSObject
{
}
@property (nonatomic, readwrite) NSMutableArray *screen;
@property (nonatomic, readwrite) NSMutableArray *obstacles;
@property (nonatomic, readwrite) struct ABPoint charPos;
@property (nonatomic, readwrite) NSInteger score;
@property (nonatomic, readwrite) BOOL shouldExit;;
+ (id)sharedManager;
@end
ABManager.m
#import "ABManager.h"
@implementation ABManager
+ (id)sharedManager {
static ABManager *sharedMyManager = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
sharedMyManager = [[self alloc] init];
});
return sharedMyManager;
}
- (id)init
{
if (self = [super init]) {
self.screen = [[NSMutableArray alloc] init];
for (NSUInteger i=0; i < 600; i++)
{
[self.screen addObject:@" "];
}
self.score = 0;
self.shouldExit = FALSE;
struct ABPoint p;
p.x = 5;
p.y = 0;
self.charPos = p;
struct ABPoint o;
o.x = 10;
o.y = 5;
struct ABPoint o2;
o2.x = 30;
o2.y = 5;
self.obstacles = [[NSMutableArray alloc] initWithArray:@[[NSValue valueWithBytes:&o objCType:@encode(struct ABPoint)],[NSValue valueWithBytes:&o2 objCType:@encode(struct ABPoint)]]];
}
return self;
}
@end
Floppy Dragon, JavaScript, 1024b
I'm making this game for the current js1k compo ( http://js1k.com )
Play: http://js1k.com/2014-dragons/demo/1704
_='c.scale(, ;ontouchH=onmousedown=onkeydowif(e){ }else h=45,d=1};(Eq";Rect(0,0,^,^9Q"-k,0Q+N),0()-k,2E3980-(+3)N(+3)),Y(p="fEFf&{{~_=,;=vviJ.jfVi/.OoyizyhkhEwf74)\\n$fwwuvtU`"+(10<h?"iZ[*)yj:*im**y|Ktdww54#5Dy\\iz[Kzi[Jiijk[e@1!":"zl]LfU{\\lKtBUh{zzU66iigig5\\n&iiyz{vfwwiyDfwiiE"0"v=i-e,w=(j-=h)-eG in p)y=8>>4),z=16&15),Iv+=e?y:z,w+=e?-z:y(dW(h-=6dW!eW(k+=Q,^<kW(k-=^)!dXeX(k+280)%8X(f++,Q<lWl--if(q>jX9q<jX!((k+3)%8)W(j<qXj>2q))e=40;fff";c.font="6em Arial";dWf1,5dX"#FloppyDragon"11,5eW"score"4,4e?"reH":d?"":"H"5,6setTimeout(n,l)})()I40*o-k,a.width/()/2-30* d=e=f=h=0;g=[];G=0;Y>o;o++)=g[o+Y]=8*Math.random()|0;i=j=3;k=Q;l=qc.fill;c.beginPath(c.moveTo(Style="#G=2E3;o--;)o%Q?,a.height/Y1*g[Q*~~(k/8)+Q]+);g[o]-2*(p.charCodeAt(o)Text(00n=function(){4*):(,1*Gfor(oHstartIc.lineTo(N),-4,1*Q20W&&X||Y1E3^4E4q50';for(Y in $='q^YXWQNIHG ')with(_.split($[Y]))_=join(pop());eval(_)
All feedbacks and new ideas are welcome!
Javascript + jQuery (997)
Tested on Chrome 32, Firefox 27, IE9
Open Console (F12) from this page and copy/paste the following code.
scroll(0,0);h=1/30;p=[];r=320;n=0;w=80;f=2.5;o=80;t=setInterval;$('#question').children().hide().end().append('<p id="m"></p>').append('<p id="s"></p>').click(function(){v=100});$('#s').css({position:'relative',margin:'auto',border:'2px solid',width:200,height:r}).append('<img id="b" src="//i.imgur.com/4w6Vgud.gif"/>');$('<style>.p{width:1px;border:1px solid;position:absolute}</style>').appendTo('head');function u(){$('#m').text('score '+m+' (max '+n+')')}function i(){x=r/2;v=0;m=0;p.length=0;u()}i();t("v-=h*100;x+=h*v;if(x<0||x>r)i();$('.p').remove();for(j=0;j<p.length;j++){p[j].r+=h*w;if(p[j].r>200){p.shift();j--;m++;if(m>n)n=m;u();}else if((p[j].r>165&&p[j].r<185)&&(x<p[j].h||x>p[j].h+o))i();else{$('<div class=p></div>').appendTo('#s').css({bottom:0,right:p[j].r,height:p[j].h});$('<div class=p></div>').appendTo('#s').css({bottom:p[j].h+o,right:p[j].r,height:320-p[j].h-o})}}$('#b').css({position:'absolute',left:0,bottom:x-25})",h*1e3);t("p.push({h:Math.random()*(r-o),r:0})",f*1e3)
The game replace the question block of this page.
You have to click on the game frame to make the bird fly.
Ungolfed and commented version :
$('#question').children().hide();
$('#question').append('<div id="score"></div>');
$('#question').append('<div id="scene"></div>');
$('#scene').css({position:'relative',margin:'auto',border:'2px solid black',width:'200',height:'320'});
$('#scene').append('<img id="bird" src="http://fc01.deviantart.net/fs71/f/2014/037/d/0/pixel_art___flappy_bird_by_hipsterli-d75dkyr.gif"></img>');
$('#bird').css({display:'block',position:'absolute',left:0,'pointer-events':'none',margin:'0 auto'});
$(window).scrollTop(0);
//CONFIGURATION
var dt=1/30, //delta timestep (typically 30Hz)
pipevel=80, //pipe velocity (in pixels per second)
pipefreq=2.5, //pipe spawn frequency (in second)
holesize=80, //hole size (in pixels)
gravity=-100, //gravity (in pixels per square second)
punchvel=100; //velocity punch when clicked (in pixels per second)
var x, y, pipes=[], roof=$('#scene').height(), score, maxscore=0;
function updateScore() {
$('#score').text('Score : '+score+' (max : '+maxscore+')');
}
function init() {
x=roof/2; //position
v=0; //velocity
score=0;
pipes.length=0;
updateScore();
}
function step() {
//euler integration
v+=dt*gravity;
x+=dt*v;
if (x<0 || x>roof) init();
//pipes
$('.pipe').remove();
for (i=0; i<pipes.length; i++) {
pipes[i].rightpos += dt*pipevel;
if (pipes[i].rightpos > 200) {
pipes.shift();
i--;
score++;
if (score>maxscore) maxscore=score;
updateScore();
} else if ((pipes[i].rightpos > 165 && pipes[i].rightpos < 185) && (x < pipes[i].holepos || x > pipes[i].holepos+holesize)) {
//collision
init();
} else {
$('#scene').append('<div class="pipe" style="background-color:#000; width:1px;border:1px solid #000; position:absolute; bottom:0; right:'+Math.floor(pipes[i].rightpos)+'px; height:'+pipes[i].holepos+'px"></div>');
$('#scene').append('<div class="pipe" style="background-color:#000; width:1px;border:1px solid #000; position:absolute; bottom:'+(pipes[i].holepos+holesize)+'; right:'+Math.floor(pipes[i].rightpos)+'px; height:'+(320-(pipes[i].holepos+holesize))+'px"></div>');
}
}
$('#bird').css({bottom:Math.floor(x)-25});
setTimeout(step, dt*1000);
}
$('#question').click(function() {
v=punchvel;
});
function addPipe() {
pipes.push({holepos:Math.random()*(roof-holesize),rightpos:0});
setTimeout(addPipe, pipefreq*1000);
}
init();
setTimeout(step, dt*1000);
setTimeout(addPipe, pipefreq*1000);
You can easily modify the configuration (gravity, pipe velocity...), have a look at commented version.


