2048: Difference between revisions
Content added Content deleted
Line 8,135: | Line 8,135: | ||
Loop</syntaxhighlight> |
Loop</syntaxhighlight> |
||
=={{header|FutureBasic}}== |
|||
<syntaxhighlight lang="futurebasic"> |
|||
begin enum 123 |
|||
_lf |
|||
_rt |
|||
_dn |
|||
_up |
|||
_new |
|||
_end |
|||
end enum |
|||
str63 bd |
|||
colorref color(11) |
|||
byte zs |
|||
void local fn initialize |
|||
subclass window 1, @"2048",(0,0,438,438) |
|||
fn WindowSetBackgroundColor( 1, fn ColorBlack ) |
|||
color(0) = fn ColorDarkGray |
|||
color(1) = fn ColorGray |
|||
color(2) = fn ColorLightGray |
|||
color(3) = fn ColorBrown |
|||
color(4) = fn ColorBlue |
|||
color(5) = fn ColorCyan |
|||
color(6) = fn ColorGreen |
|||
color(7) = fn ColorMagenta |
|||
color(8) = fn ColorOrange |
|||
color(9) = fn ColorPurple |
|||
color(10) = fn ColorYellow |
|||
color(11) = fn ColorRed |
|||
end fn |
|||
void local fn drawBoard |
|||
int x, y,r = 1, add |
|||
for y = 320 to 20 step -100 |
|||
for x = 20 to 320 step 100 |
|||
rect fill (x,y,98,98),color( bd[r] ) |
|||
select bd[r] |
|||
case < 4 : add = 40 |
|||
case < 7 : add = 30 |
|||
case < 10 : add = 20 |
|||
case else : add = 6 |
|||
end select |
|||
if bd[r] then print %(x+add, y+25)2^bd[r] |
|||
r++ |
|||
next |
|||
next |
|||
end fn |
|||
local fn finish( won as bool ) |
|||
CFStringRef s = @"GAME OVER" |
|||
CGRect r = fn windowContentRect( 1 ) |
|||
r.origin.y += r.size.height - 20 |
|||
r.size.height = 100 |
|||
window 2,,r,NSwindowStyleMaskBorderless |
|||
if won |
|||
fn windowSetBackgroundColor( 2, color(11) ) |
|||
s = @"CONGRATULATIONS—YOU DID IT!!" |
|||
text,24,fn ColorBlack,,NSTextAlignmentCenter |
|||
else |
|||
fn windowSetBackgroundColor( 2, fn ColorBlack ) |
|||
text,24,fn ColorWhite,,NSTextAlignmentCenter |
|||
end if |
|||
print s |
|||
button _new,,,@"New Game", (229,20,100,32) |
|||
button _end,,,@"Quit", (109,20,100,32) |
|||
end fn |
|||
void local fn newGame |
|||
int r |
|||
text @"Arial bold", 36, fn ColorBlack, fn ColorClear |
|||
bd = chr$(0) |
|||
for r = 1 to 4 |
|||
bd += bd |
|||
next |
|||
bd[rnd(16)] ++ |
|||
do |
|||
r = rnd(16) |
|||
until bd[r] == 0 |
|||
bd[r]++ |
|||
zs = 14 |
|||
fn drawBoard |
|||
end fn |
|||
local fn play( st as short, rd as short, cd as short ) |
|||
short a, b, c, t, moved = 0 |
|||
// SHIFT |
|||
for a = st to st + rd * 3 step rd |
|||
t = a |
|||
for b = a to a + cd * 3 step cd |
|||
if bd[b] |
|||
if t <> b then swap bd[t], bd[b] : moved ++ |
|||
t += cd |
|||
end if |
|||
next |
|||
next |
|||
// MERGE |
|||
for a = st to st + rd * 3 step rd |
|||
for b = a to a + cd * 2 step cd |
|||
if bd[b] > 0 && bd[b] == bd[b+cd] |
|||
bd[b]++ : c = b + cd |
|||
// FILL IN |
|||
while c <> a+cd*3 |
|||
bd[c] = bd[c+cd] : c += cd |
|||
wend |
|||
bd[c] = 0 |
|||
if bd[b] == 19 then fn drawBoard : fn finish( yes ) : exit fn |
|||
zs ++ : moved ++ |
|||
end if |
|||
next |
|||
next |
|||
if moved == 0 then exit fn |
|||
// GROW |
|||
b = 0 : c = rnd(zs) |
|||
while c |
|||
b ++ |
|||
if bd[b] == 0 then c-- |
|||
wend |
|||
if rnd(10) - 1 then bd[b]++ else bd[b] = 2 |
|||
zs-- |
|||
fn drawBoard |
|||
if zs then exit fn |
|||
// IS GAME OVER? |
|||
for a = 1 to 12 |
|||
if bd[a] == bd[a+4] then exit fn |
|||
next |
|||
for a = 1 to 13 step 4 |
|||
if bd[a] == bd[a+1] || bd[a+1] == bd[a+2] || bd[a+2] == bd[a+3]¬ |
|||
then exit fn |
|||
next |
|||
fn finish( no ) |
|||
end fn |
|||
local fn doDialog(ev as long,tag as long, wnd as long) |
|||
select ev |
|||
case _windowKeyDown : if window() == 2 then exit fn |
|||
select fn EventKeyCode |
|||
case _up : fn play(13, 1, -4) |
|||
case _dn : fn play( 1, 1, 4) |
|||
case _lf : fn play( 1, 4, 1) |
|||
case _rt : fn play( 4, 4, -1) |
|||
case else : exit fn |
|||
end select |
|||
DialogEventSetBool(yes) |
|||
case _btnClick : window close 2 |
|||
if tag == _end then end |
|||
fn newGame |
|||
case _windowWillClose : if wnd == 1 then end |
|||
end select |
|||
end fn |
|||
fn initialize |
|||
fn newGame |
|||
on dialog fn doDialog |
|||
handleevents |
|||
</syntaxhighlight> |
|||
{{out}} |
|||
[[File:2048 Game Window.png]] |
|||
=={{header|Go}}== |
=={{header|Go}}== |