2048/2048.bqn

38 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
# 2048 game
# The game is controlled with the vim movement keys:
# h: left, j: down, k: up, l: right, q: quit
# needs a VT-100 compatible terminal
Merge{𝕩 0/ m<`=«𝕩 4(¬»m)/𝕩×1+m} # Merge a single row to the right
StepMerge˘ # 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= / )𝕩 (•rand.Range91/24)(i) 𝕩} # Spawns a 2 or a 4 (10% chance) 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
Quit{•Out e"[?12l"e"[?25h" •Exit 𝕩} # Restores the terminal and exits
•Out e"[?25l"e"[2J"e"[H" # Cursor to origin, hide it and clear screen
{𝕤
•Out e"[H"e"[2J" # Cursor to origin
•Out "Controls: h: left, j: down, k: up, l: right, q: quit"
•Show board
key•term.CharB @ # Read key
key"hjklq"? # Valid key?
{𝕤•Out e"[?12l"e"[?25h" Quit 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 e"[H" # Cursor to origin
•Show board
{𝕤•Out "You win!" Quit 0}Win board
{𝕤•Out "You lose!" Quit 1}Lose board
; @
}•_While_{𝕤1}@