commit af85ad5920805a59fca3462633f57a655b6e1140 Author: Rampoina Date: Tue Jan 3 20:46:46 2023 +0100 First version of 2048 in BQN diff --git a/2048.bqn b/2048.bqn new file mode 100755 index 0000000..ecf54b6 --- /dev/null +++ b/2048.bqn @@ -0,0 +1,36 @@ +#!/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 + moved←4⊸↑⌾⌽ 0⊸≠⊸/𝕩 # remove empty tiles to move the tiles as far as possible + m←⌽0∾˜(¬⊸∧`=˝˘)⌾⌽2↕moved # which tiles to merge + r←(⟨∞⟩){t←⊑m ⋄ m↩1↓m ⋄ t◶⟨𝕨∾𝕩,(¯1↓𝕨)∾𝕩+¯1⊑𝕨⟩@}˜´moved # Merge tiles + 4⊸↑⌾⌽⌽∞⊸≠⊸/r # Resize the result +} +Step←>·Merge¨<˘ # Merges each row of the board +Up←Step⌾(⌽⍉∘⌽) # Each direction merges the board +Down←Step⌾⍉ # by rotating it to the correct orientation, merging the rows and reversing the rotation +Right←Step +Left←Step⌾(⌽˘) +Spawn←{i←(•rand.Range∘≠⊑⊢)(0⊸= /○⥊ ↕∘≢)𝕩 ⋄ 2˙⌾(i⊸⊑) 𝕩} # Spawns a 2 at a random empty position +Lose←Left∘Right∘Down∘Up⊸≡ # Losing condition, no moves change the board +Win←∨´·∨˝2048⊸= # Winning condition, 2048! + +board←Spawn 4‿4⥊0 +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")/Left‿Down‿Up‿Right # Get movement function from the key + {𝕤⋄board↩Spawn∘Move 𝕩}⍟(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