Compare commits
3 Commits
df4ffee71c
...
82a6de5fa2
Author | SHA1 | Date |
---|---|---|
Rampoina | 82a6de5fa2 | |
Rampoina | 7665f7a1d7 | |
Rampoina | e96808ab9c |
43
2048.bqn
43
2048.bqn
|
@ -1,36 +1,37 @@
|
|||
#!/usr/bin/env BQN
|
||||
# 2048 game
|
||||
# The game is controlled with the vim movement keys:
|
||||
# h: left, j: down, k: up, l: right
|
||||
# it needs a VT-100 compatible terminal
|
||||
# h: left, j: down, k: up, l: right, q: quit
|
||||
# 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
|
||||
Merge←{𝕩 0⊸≠⊸/↩ ⋄ m←<`=⟜«𝕩 ⋄ 4↑(¬»m)/𝕩×1+m}⌾⌽ # Merge a single row to the right
|
||||
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
|
||||
Spawn←{i←•rand.Range∘≠⊸⊑(0⊸= /○⥊ ↕∘≢)𝕩 ⋄ (•rand.Range∘≠⊸⊑9‿1/2‿4)⌾(i⊸⊑) 𝕩} # Spawns a 2 or a 4 (10% chance) 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 #
|
||||
•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" # Cursor to origin
|
||||
•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
|
||||
{𝕤⋄•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
|
||||
⊑key∊"hjklq"? # Valid key?
|
||||
{𝕤⋄•Out e∾"[?12l"∾e∾"[?25h"⋄ Quit 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 e∾"[H" # Cursor to origin
|
||||
•Show board
|
||||
{𝕤⋄•Out "You win!" ⋄ Quit 0}⍟Win board
|
||||
{𝕤⋄•Out "You lose!"⋄ Quit 1}⍟Lose board
|
||||
; @
|
||||
}•_While_{𝕤⋄1}@
|
||||
|
|
Loading…
Reference in New Issue