zoukankan      html  css  js  c++  java
  • [Clojure] A Room-Escape game, playing with telnet and pure-text commands

    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.


  • 相关阅读:
    NetBeans 时事通讯(刊号 # 147 May 18, 2011)
    NetBeans 时事通讯(刊号 # 146 May 13, 2011)
    准备入职支付宝
    NetBeans 时事通讯(刊号 # 145 May 05, 2011)
    GAE 博客——B3log Solo 0.2.6 正式版发布了!
    用C语言实现一个简单的HTTP客户端(HTTP Client)
    Grack Ruby/Rack Git SmartHTTP Server Handler
    Cpy
    pyhttp 用Python演示Web服务器/客户端对HTTP协议的解析
    用C语法来写Python代码
  • 原文地址:https://www.cnblogs.com/gcczhongduan/p/5045390.html
Copyright © 2011-2022 走看看