2048/2048.bqn

37 lines
1.8 KiB
BQN
Executable File
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/usr/bin/env BQN
# The game is controlled with the vim movement keys:
# h: left, j: down, k: up, l: right
# it needs a VT-100 compatible terminal
Merge{ # Merges a row of tiles to the right
moved4 0/𝕩 # remove empty tiles to move the tiles as far as possible
m0˜(¬`=˝˘)2moved # which tiles to merge
r(){tm m1m t𝕨𝕩,(¯1𝕨)𝕩+¯1𝕨@}˜´moved # Merge tiles
4/r # Resize the result
}
Step>·Merge¨<˘ # Merges each row of the board
UpStep() # Each direction merges the board
DownStep # by rotating it to the correct orientation, merging the rows and reversing the rotation
RightStep
LeftStep(˘)
Spawn{i(•rand.Range)(0= / )𝕩 2˙(i) 𝕩} # Spawns a 2 at a random empty position
LoseLeftRightDownUp # Losing condition, no moves change the board
Win´·˝2048= # Winning condition, 2048!
boardSpawn 440
e@+27
•term.RawMode 1 #
•Out e"[?25l"e"[2J"e"[H" # Cursor to origin, hide it and clear screen
{𝕤
•Out e"[H" # Cursor to origin
•Out "Controls: h: left, j: down, k: up, l: right, q: quit"
•Show board
key•term.CharB @ # Read key
{𝕤•Out e"[?12l"e"[?25h"•Exit 0}(key='q')@ # Quit key?
move(key="hjkl")/LeftDownUpRight # Get movement function from the key
{𝕤boardSpawnMove 𝕩}(Move) board # Generate the next board if the move is valid
{𝕤•Out "You win!" •Exit 0}Win board
{𝕤•Out "You lose!" •Exit 1}Lose board
}•_While_{𝕤¬Lose board}@
•Out e"[?12l"e"[?25h" # Restore the cursor