[Clojure] A Room-Escape game, playing with telnet and pure-text commands - Part 3

Code Path:

https://github.com/bluesilence/Lisp/blob/master/clojure/projects/room-escape/src/room_escape/script.clj


Extract Story to TXT

In order to move the story from .clj into .txt, I leveraged Clojure's eval function. The steps are as follows:

1. Read the contents from the story's txt as string;

2. Eval each key-value pair of each room;

3. Sort the rooms by name.


This works, but is not good enough. Because there are functions defined in the story, as a story writer, you have to test your story as .clj, rather than .txt.

For example:

{:id 5
             :category 2
             :name "password-panel"
             :description {:default-check (str "There are button 0~9 on the panel. The length of the password seems to be 4. Maybe you can " (enclose "press") " the buttons...")}
             :state (atom "")
             :action [{:name "press"
                       :description (str "Press button 0~9 on the " (enclose "password-panel"))
                       :usage "pr/pre/pres/press 0~9(1 digit at a time). Eg. pr 0"
                       :hint ["press"]
                       :function
                         #(let [player-id %1
                                button (parse-int %2 -1)]
                            (if (or (> button 9) (< button 0))
                              (display "Invalid button: " %2)
                              (let [state (:state (locate-by-id player-id 5))]
                                (swap! state (comp string/join reverse (partial concat %2) reverse))
			        (if (> (count @state) 4)
				  (swap! state subs 1 5))
                                (display "You pressed button " button)
                                (if (and (= @state "2048")
                                         (not (visible? player-id 6)))
                                  (do 
                                    (set-visible player-id 6)
                                    (display (str "The bottom of the " (enclose "password-panel") " opened. A " (enclose "key") " fell down to the floor.")))))))}]}

The code above is the logic of determining whether the player has entered correct password when pressing the password-panel.

It requires the story writer to implement the complicated status transition.


Hints

From the first trial player's feedbacks, this game is not easy to play, because players may get stuck and don't know what's the next command that pushes the game forward. So I added this hint system, which bases on the definition of each action and the player's last action. The player can decide which of the options to be the next step.

For example, when the player discovers the password-panel, then type "hint" command, the server will return a message telling the player to try "press", as shown in the code above.


The next chapter will give a brief introduction of the E2E process of this game.


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值