DrRacketのScheme(Lisp)のゲーム

この記事で説明されているプログラムを実行するには、 DrRacketを使用できます。 最初に、有限状態マシンとゲームプレイの間の接続を検討します。 ゲーム内の制御オブジェクトは、有限状態マシンとして表すことができます。 信号機をシミュレートするプログラムを検討してください。 この例は、 以前の記事で説明されています



別の安定状態への移行は、交通信号の切り替えです。 状態図は次のように表すことができます。



画像






信号機を作成するには、空のシーンの中心に円を描きます。



#lang racket (require picturing-programs) (define (DOT s) (circle 100 "solid" s))
      
      





sは色変数です。 別の状態への移行が想像できる

次の構成:



 (define (traffic-light-next s) (cond [(string=? "red" s) "green"] [(string=? "green" s) "yellow"] [(string=? "yellow" s) "red"]))
      
      





信号の切り替えをシミュレートするために、ビッグバン機能を使用します。

 (big-bang "red" [on-tick traffic-light-next 1] [to-draw DOT])
      
      





これで、信号は1秒に1回次の定常状態になります。

プログラムの全文
 #lang racket (require picturing-programs) (define (DOT s) (circle 100 "solid" s)) (define (traffic-light-next s) (cond [(string=? "red" s) "green"] [(string=? "green" s) "yellow"] [(string=? "yellow" s) "red"])) (big-bang "red" [on-tick traffic-light-next 1] [to-draw DOT])
      
      







ゲームのコントロールアクションには、プラットフォーム、障害物、敵なども含まれます。 たとえば、一部のゲームでは、移動の方向で、オブジェクトが次のキャンバスに「スキップ」できます。 キャンバスの境界に近づくと、オブジェクトが消えて反対側の境界に表示されます。 遷移の条件(「スキップ」)は、オブジェクトの座標とキャンバスの端を比較することによって決定されます。



  [(> (+ x DELTA) WIDTH) 0]
      
      





条件が満たされない場合、同じ画面に残ります。



 (cond [(> (+ x dx) WIDTH) 0] [else (+ x dx)] )
      
      





移動は、DELTAをx座標に増分することによって決定されます。 プログラム全体を作成します。



 #lang racket (require 2htdp/image) (require 2htdp/universe) (define WIDTH 100) (define DELTA 1) (define BALL (circle 5 "solid" "red")) (define MT (empty-scene WIDTH 10)) (define (main x0) (big-bang x0 [to-draw render] [on-tick bounce])) (define (bounce x) (cond [(> (+ x DELTA) WIDTH) 0] [else (+ x DELTA)] )) (define (render x) (place-image BALL x 5 MT)) (main 50)
      
      





このページでは、ビッグバンを使用したプログラムの例を示します 。 プログラムは、必要なパッケージを追加することにより、「初心者学生」モードで起動できます。



次に、オブジェクトを制御するプログラムを書きます

左右のキー。



ここでは、キーを処理する関数が必要です。



 #lang racket (require 2htdp/image) (require 2htdp/universe) (define BACKGROUND (empty-scene 100 100)) (define DOT (circle 10 "solid" "red")) (define (place-dot-at x) (place-image DOT x 50 BACKGROUND)) (define (change-func pk) ;   (cond [(string=? "left" k) (- p 5)] [(string=? "right" k) (+ p 5)] [else p])) ( big-bang 50 [to-draw place-dot-at] [on-key change-func] )
      
      





「上」、「下」のキーストロークも処理する必要がある場合は、オブジェクトの座標をフォームの構造に保存する必要があります。



 (define-struct posn (xy)) (define INIT-WORLD (make-posn 100 100))
      
      





オブジェクトが水平および垂直に移動できるプログラムを作成します。



 #lang racket (require picturing-programs) (define WIDTH 200) (define HEIGHT 200) (define BACKGROUND (empty-scene WIDTH HEIGHT)) (define obj1 (circle 10 "solid" "red")) (define-struct posn (xy)) ;  (define INIT-WORLD (make-posn 100 100) ) (define (change-current-world-key current-world a-key-event) ; ""  (cond [(key=? a-key-event "up") (make-posn (posn-x current-world) (- (posn-y current-world) 5))] [(key=? a-key-event "down") (make-posn (posn-x current-world) (+ (posn-y current-world) 5))] [(key=? a-key-event "left") (make-posn (-(posn-x current-world)5) (posn-y current-world) )] [(key=? a-key-event "right") (make-posn (+(posn-x current-world)5) (posn-y current-world) )] [else current-world])) (define (redraw current-world) (place-image obj1 (posn-x current-world) (posn-y current-world) BACKGROUND)) (big-bang INIT-WORLD (on-key change-current-world-key) (on-draw redraw) )
      
      





はい、ただし通常ゲームにはいくつかのオブジェクトがあります。 2つのオブジェクトがあるプログラムを作成します。 worldとposnの2つの構造を使用します。



 #lang racket (require picturing-programs) (define WIDTH 300) (define HEIGHT 300) (define BACKGROUND (empty-scene WIDTH HEIGHT)) (define obj1 (circle 10 "solid" "red")) (define obj2 (circle 10 "solid" "green")) (define-struct posn (xy)) (define-struct world [obj1 obj2]) ;     world (define INIT-WORLD (make-world (make-posn 100 100) (make-posn 200 100))) (define (draw-game world) (place-image obj1 (posn-x (world-obj1 world)) (posn-y (world-obj1 world)) (place-image obj2 (posn-x (world-obj2 world)) (posn-y (world-obj2 world)) BACKGROUND))) (big-bang INIT-WORLD [to-draw draw-game])
      
      





次に、オブジェクトの1つを制御するために、キーを処理するための関数を追加します。



 #lang racket (require picturing-programs) (define WIDTH 300) (define HEIGHT 300) (define BACKGROUND (empty-scene WIDTH HEIGHT)) (define obj1 (circle 10 "solid" "red")) (define obj2 (circle 10 "solid" "green")) (define-struct posn (xy)) (define-struct world [obj1 obj2]) (define INIT-WORLD (make-world (make-posn 50 150) (make-posn 250 150))) (define (change-current-world-key current-world a-key-event) (make-world (change-obj1 (world-obj1 current-world) a-key-event) (world-obj2 current-world))) (define (change-obj1 a-posn a-key-event) (cond [(key=? a-key-event "up") (make-posn (posn-x a-posn) (- (posn-y a-posn) 5))] [(key=? a-key-event "down") (make-posn (posn-x a-posn) (+ (posn-y a-posn) 5))] [(key=? a-key-event "left") (make-posn (-(posn-x a-posn) 5) (posn-y a-posn) )] [(key=? a-key-event "right") (make-posn (+(posn-x a-posn)5) (posn-y a-posn) )] [else a-posn])) (define (draw-game world) (place-image obj1 (posn-x (world-obj1 world)) (posn-y (world-obj1 world)) (place-image obj2 (posn-x (world-obj2 world)) (posn-y (world-obj2 world)) BACKGROUND))) (big-bang INIT-WORLD (on-key change-current-world-key) [to-draw draw-game] )
      
      





ゲームの作成の詳細については、「 ワールドをデザインする方法」を参照してください。



All Articles