Add support for multiple levels

This commit is contained in:
Rampoina 2022-04-14 20:49:42 +02:00
parent c6f3c31871
commit 93b60a4e47
2 changed files with 44 additions and 30 deletions

15
levels Normal file
View File

@ -0,0 +1,15 @@
#######
#.@ # #
#$* $ #
# $ #
# .. #
# * #
#######
#######
#.@ # #
#$* $ #
# $ #
# .. #
# * #
#######

View File

@ -14,64 +14,63 @@
# ⟨ 4 ⟩ ⟨ 1 0 ⟩ ⟨ 2 0 ⟩ ⟨ 0 ⟩ ⟨ 4 ⟩ #@*.#
# ⟨ 4 ⟩ ⟨ 4 ⟩ ⟨ 4 ⟩ ⟨ 4 ⟩ ⟨ 4 ⟩ #####"
# ┘ ┘
moves00
chars" @$.+*#"
level >
"#######"
"#.@ # #"
"#$* $ #"
"# $ #"
"# .. #"
"# * #"
"#######"
moves00 # list of moves, each move is a direction, we start without moving
chars" @$.+*#" # legal characters
ll{(chars𝕩)0,10,20,3,13,23,6}¨(˝·¬2+)level
#ll←≍¨(⊢↑˝·≍⟜¬2+≢)chars⊐level # ascii to numbers, 0pad and listify
#_change←{ll↩𝔽¨⌾((ll∊≍¨𝕩)/○⥊⊢)ll} # Add 0s to the boxes and player: ⟨2⟩ -> ⟨2,0⟩
#∾⟜0 _change 1‿2 ⋄ (-≍○⊑⊢)⟜3 _change 4‿5 # change 5('*') to ⟨2,3⟩, 5('+') to ⟨1,3⟩
#Rle←(∾´∾¨)∘((+⟜(×⟜10)´ -⟜'0'∘⌽)⊸⥊⟜<¨)˜´(≠⊸⥊⟜1‿0)⊸⊔∘(1⊸↓)∘(((+`»⊸≠) '0'⊸< ∧ '9'⊸>)⊸⊔)`)))
SplitOnEmpty{𝕩˜(-˜+`׬)0=¨𝕩}
Ascii2Matrix{(chars𝕩)0,10,20,3,13,23,6}¨(˝·¬2+)
# 𝕨 C 𝕩 | 𝕩: object coordinate (3‿1) | 𝕨: direction vector (¯1‿0)
# 𝕨 Tiles 𝕩 | 𝕩: object coordinate (3‿1) | 𝕨: direction vector (¯1‿0)
# result: ⟨ ⟨ 3 1 ⟩ ⟨ 2 1 ⟩ ⟨ 1 1 ⟩ ⟩
# returns 3 tiles in the specified direction from the
Tiles{𝕩,𝕩+𝕨,𝕩+2×𝕨} # given object (including itself)
Player{/()1¨𝕩} # P 𝕩 | 𝕩:level | returns the coordinate of the [P]layer
Player{/()1¨𝕩} # Player 𝕩 | 𝕩:level | returns the coordinate of the [P]layer
# M 𝕩 | 𝕩: ⟨⟨1,0⟩,⟨0⟩⟩ (2 tiles) | result: ⟨⟨0⟩,⟨1,0⟩⟩
# [M]ove the first object in the first tile to the second tile.
# Move 𝕩 | 𝕩: ⟨⟨1,0⟩,⟨0⟩⟩ (2 tiles) | result: ⟨⟨0⟩,⟨1,0⟩⟩
# Move the first object in the first tile to the second tile.
# Only move Player/Box -> Floor/Goal
# the second tile can't be a box because we moved it previously
# if it is it means that the box was unmovable (next to a wall) so we do nothing
Move{ab:1a,(a)b}{´(1203)<¨𝕩}
# P 𝕩 | 𝕩: ⟨⟨1,0⟩,⟨2,0⟩,⟨0,0)⟩ (3 tiles) | result: ⟨⟨0⟩,⟨1,0⟩,⟨2,0)⟩
# Push 𝕩 | 𝕩: ⟨⟨1,0⟩,⟨2,0⟩,⟨0,0)⟩ (3 tiles) | result: ⟨⟨0⟩,⟨1,0⟩,⟨2,0)⟩
# Given 3 tiles try to [P]ush the second tile (possible box)
# and afterwards try to move the first one (player) if possible
PushMove(2)Move(1)
S{Push((𝕨 Tiles Player 𝕩 ))𝕩} # 𝕨 S 𝕩 | 𝕨: direction | 𝕩:level | step the game
Draw{chars˜+´¨ll S´ 𝕩} # Draw 𝕩 | 𝕩: level | Draw the game in ASCII
Draw{chars˜+´¨𝕨 S´ 𝕩} # Draw 𝕩 | 𝕩: moves | Draw the game in ASCII
W{(2¨¨𝕩) =(+´) (<23)¨𝕩} # W 𝕩 | 𝕩: level | [W]in condition
N{movesmoves<𝕩}
Undo{𝕊:moves(-1<)moves}
While {𝕨{𝕊𝔾𝔽𝕩}𝕩@}´
•term.RawMode 1
•Out "[?25l"
•Out "Press key" •Out˘ Draw moves
# Main loop
# Load file containing levels
levelsAscii2Matrix¨>¨SplitOnEmpty•FLines "levels"
currentLevel0
•term.RawMode 1 # set terminal to raw mode
•Out "[?25l" # Cursor to origin, hide it and clear screen
clear""
While {𝕤¬W ll S´moves}{𝕤
While {𝕤currentLevel<levels}{𝕤 # Loop until the user wins
•Out ""
•Out "Level: "•Repr 1+currentLevel
•Out "7"
•Out "Press key"
•Out˘ (currentLevellevels) Draw moves
key•term.CharB @
{𝕤N ("hjkl"=key)/0¯1,10,¯10,01}(key"hjkl")@
{𝕤Undo @}(key='u')@
{𝕤•Out "[?12l[?25h"•Exit 0}(key='q')@
{𝕤clear""}(((1+>(1+101))¯1+moves)key='u')@
•Out "8"
{𝕤•Out clear"Press key"}(key"hjklu")@
{𝕤•Out "Wrong key"}(¬key"hjklu")@
•Out˘ Draw moves
•Out "Moves: "{'0'+10|𝕩÷10(1+101)𝕩}¯1+moves
{𝕤•Out "Wrong key"}(¬key"hjkluq")@
•Out˘ (currentLevellevels) Draw moves
•Out "Moves: "•Repr ¯1+moves
{𝕤•Out ""currentLevelcurrentLevel+1moves00}(W (currentLevellevels) S´moves)@
}
•Out "Well played!"
•Out "Well played, you win!"
•Out "[?12l[?25h"