15 puzzle game: Difference between revisions
Content added Content deleted
Tag: Manual revert |
No edit summary |
||
Line 5,195: | Line 5,195: | ||
=={{header|EasyLang}}== |
=={{header|EasyLang}}== |
||
[https://easylang. |
[https://easylang.dev/apps/15-puzzle.html Run it] |
||
<syntaxhighlight lang="text"> |
<syntaxhighlight lang="text"> |
||
Line 5,203: | Line 5,203: | ||
len f[] 16 |
len f[] 16 |
||
proc draw . . |
proc draw . . |
||
clear |
clear |
||
for i = 1 to 16 |
for i = 1 to 16 |
||
h = f[i] |
h = f[i] |
||
if h < 16 |
if h < 16 |
||
x = (i - 1) mod 4 * 24 + 3 |
x = (i - 1) mod 4 * 24 + 3 |
||
y = (i - 1) div 4 * 24 + 3 |
y = (i - 1) div 4 * 24 + 3 |
||
color 210 |
color 210 |
||
move x y |
move x y |
||
rect 22 22 |
rect 22 22 |
||
move x + 4 y + 6 |
move x + 4 y + 6 |
||
if h < 10 |
if h < 10 |
||
move x + 6 y + 6 |
move x + 6 y + 6 |
||
. |
|||
color 885 |
|||
text h |
|||
. |
. |
||
. |
|||
color 885 |
|||
text h |
|||
. |
|||
. |
|||
. |
. |
||
global done . |
global done . |
||
proc smiley . . |
|||
s = 3.5 |
|||
x = 86 |
|||
y = 86 |
|||
move x y |
|||
color 983 |
|||
circle 2.8 * s |
|||
color 000 |
|||
move x - s y - s |
|||
circle s / 3 |
|||
move x + 3.5 y - 3.5 |
|||
circle s / 3 |
|||
linewidth s / 3 |
|||
curve [ x - s y + s x y + 2 * s x + s y + s ] |
|||
. |
|||
proc init . . |
proc init . . |
||
done = 0 |
done = 0 |
||
for i = 1 to 16 |
for i = 1 to 16 |
||
f[i] = i |
f[i] = i |
||
. |
. |
||
# shuffle |
# shuffle |
||
for i = 15 downto 2 |
for i = 15 downto 2 |
||
r = random i |
r = random i |
||
swap f[r] f[i] |
swap f[r] f[i] |
||
. |
. |
||
# make it solvable |
# make it solvable |
||
inv = 0 |
inv = 0 |
||
for i = 1 to 15 |
for i = 1 to 15 |
||
for j = 1 to i - 1 |
for j = 1 to i - 1 |
||
if f[j] > f[i] |
if f[j] > f[i] |
||
inv += 1 |
inv += 1 |
||
. |
|||
. |
. |
||
. |
|||
if inv mod 2 <> 0 |
|||
. |
|||
swap f[1] f[2] |
|||
. |
|||
swap f[1] f[2] |
|||
textsize 12 |
|||
. |
|||
draw |
|||
textsize 12 |
|||
call draw |
|||
. |
. |
||
proc move_tile . . |
proc move_tile . . |
||
c = mouse_x div 25 |
c = mouse_x div 25 |
||
r = mouse_y div 25 |
r = mouse_y div 25 |
||
i = r * 4 + c + 1 |
i = r * 4 + c + 1 |
||
if c > 0 and f[i - 1] = 16 |
if c > 0 and f[i - 1] = 16 |
||
swap f[i] f[i - 1] |
swap f[i] f[i - 1] |
||
elif r > 0 and f[i - 4] = 16 |
elif r > 0 and f[i - 4] = 16 |
||
swap f[i] f[i - 4] |
swap f[i] f[i - 4] |
||
elif r < 3 and f[i + 4] = 16 |
elif r < 3 and f[i + 4] = 16 |
||
swap f[i] f[i + 4] |
swap f[i] f[i + 4] |
||
elif c < 3 and f[i + 1] = 16 |
elif c < 3 and f[i + 1] = 16 |
||
swap f[i] f[i + 1] |
swap f[i] f[i + 1] |
||
. |
. |
||
draw |
|||
for i = 1 to 15 |
|||
if f[i] > f[i + 1] |
|||
return |
|||
. |
|||
. |
|||
done = 1 |
|||
. |
|||
timer 0.5 |
|||
clear |
|||
move 10 30 |
|||
text "Well done!" |
|||
. |
|||
. |
. |
||
on mouse_down |
on mouse_down |
||
if done = |
if done = 0 |
||
move_tile |
|||
elif done = 3 |
|||
else |
|||
init |
|||
. |
. |
||
. |
|||
on timer |
|||
if done = 1 |
|||
smiley |
|||
done = 2 |
|||
timer 2 |
|||
else |
|||
done = 3 |
|||
. |
|||
. |
. |
||
init |
|||
</syntaxhighlight> |
</syntaxhighlight> |
||
Line 5,751: | Line 5,771: | ||
print |
print |
||
drawboard B()</syntaxhighlight> |
drawboard B()</syntaxhighlight> |
||
=={{header|FutureBasic}}== |
|||
<syntaxhighlight lang="futureBasic"> |
|||
// 16 Puzzle // 26 september 2023 // |
|||
begin globals |
|||
CFMutableStringRef board : board = fn MutableStringNew |
|||
end globals |
|||
void local fn buildUI |
|||
Long i, j, k = 1 // k is button number |
|||
window 1, @"16 Puzzle", ( 0, 0, 200, 200 ), 3 |
|||
for j = 3 to 0 step -1 : for i = 0 to 3 // Top to bottom, left to right |
|||
button k, Yes, 1, @"", ( 20 + 40 * i, 20 + 40 * j , 40, 40 ), , NSBezelStyleShadowlessSquare |
|||
ControlSetFont(k, fn FontSystemFontOfSize( 21 ) ) |
|||
ControlSetAlignment( k, NSTextAlignmentCenter ) |
|||
k ++ |
|||
next : next |
|||
menu 1, , 1, @"File": menu 1, 1, , @"Close", @"w" : MenuItemSetAction( 1, 1, @"performClose:" ) |
|||
editmenu 2 : menu 2, 0, No : menu 3, , , @"Level" |
|||
for i = 1 to 8 : menu 3, i, , str( i ) : next |
|||
MenuSetOneItemOnState( 3, 3 ) |
|||
end fn |
|||
void local fn newGame |
|||
CFStringRef s |
|||
Long i, m, n = 16, p = 0 // n is empty starting tile, p holds previous move |
|||
Bool ok |
|||
MutableStringSetString (board, @" 123456789ABCDEF " ) |
|||
for i = 1 to fn MenuSelectedItem( 3 )^2 // Number of shuffles is square of level |
|||
do : ok = Yes |
|||
m = n + int( 2.6 * rnd( 4 ) - 6.5 ) // Choose a random move, but |
|||
if m < 1 or m > 16 or m == p then ok = No // not of bounds or previous, |
|||
if n mod 4 = 0 and m = n + 1 then ok = No // and don't exchange eg tile 4 and 5 |
|||
if n mod 4 = 1 and m = n - 1 then ok = No // or 9 and 8 |
|||
until ok = Yes // Found a move, swap in board string |
|||
s = mid( board, m, 1 ) : mid( board, m, 1 ) = @" " : mid( board, n, 1 ) = s |
|||
p = n : n = m |
|||
next |
|||
for i = 1 to 16 // Stamp the buttons, p is unicode of board char, s is button title |
|||
p = (Long) fn StringCharacterAtIndex( board, i ) |
|||
if p > 64 then s = fn StringWithFormat ( @"%d", p - 55 ) else s = mid( board, i, 1 ) |
|||
button i, Yes, 1, s |
|||
if fn StringIsEqual( s, @" ") == Yes then button i, No |
|||
next |
|||
end fn |
|||
void local fn move ( n as Long ) |
|||
CFStringRef s |
|||
Long i, m, x = -1 // x is empty |
|||
Bool ok |
|||
for i = 1 to 4 // see if clicked button is next to empty |
|||
m = n + int( 2.6 * i - 6.5 ) // -4. -1, +1, +4 |
|||
ok = Yes |
|||
if m < 1 or m > 16 then ok = No // Not out of bounds etc |
|||
if n mod 4 = 0 and m = n + 1 then ok = No |
|||
if n mod 4 = 1 and m = n - 1 then ok = No |
|||
if ok == Yes |
|||
if fn StringIsEqual( mid( board, m, 1 ), @" " ) then x = m |
|||
end if |
|||
next |
|||
if x > -1 // Swap places in board string and button titles |
|||
s = mid( board, n, 1 ) : mid( board, n, 1 ) = @" " : mid( board, x, 1 ) = s |
|||
button x, Yes, 1 , fn ButtonTitle( n ) : button n, No, 1, @" " |
|||
end if |
|||
if fn StringIsEqual( board, @" 123456789ABCDEF " ) |
|||
alert 112, , @"Well done.", @"Another game?", @"Yes;No", Yes |
|||
end if |
|||
end fn |
|||
void local fn doMenu( mnu as Long, itm as Long ) |
|||
if mnu == 3 then MenuSetOneItemOnState( 3, itm ) : fn newGame |
|||
end fn |
|||
void local fn DoDialog( evt as Long, tag as Long ) |
|||
select evt |
|||
case _btnClick : fn move( tag ) |
|||
case _alertDidEnd : if tag == NSAlertFirstButtonReturn then fn newGame else end |
|||
end select |
|||
end fn |
|||
fn buildUI |
|||
fn newGame |
|||
on dialog fn doDialog |
|||
on menu fn doMenu |
|||
handleevents |
|||
</syntaxhighlight> |
|||
=={{header|Gambas}}== |
=={{header|Gambas}}== |