ClojureのQuilでflappy bird。第2回

2023-04-19

「Nature of Code -Processingではじめる自然現象のシミュレーション」という本を入手して、1章完了まで進めたので、おさらいに、フラッピーバードを作成中。
Clojureを勉強中なので、こうした方がいいよとかあれば、ツッコミお願いします。

前回は、プロジェクトを作成しました。今回は、自機を移動させる処理を作成します。

ベクトルの演算を作る

Nature of Code にならって、移動に関する値はベクトルとして扱おうと思います。

本家Processingにはベクトルを表すPVectorをいうクラスがあり、ベクトルの加算などのメソッドも用意されています。

でも、Quilには、なぜかベクトルに関する関数は用意されていないので、まずベクトルの演算関数を作ります。
データは既存のベクタを使い、第一要素をx、第二要素をyとして扱います。

まず先に、テストを作るので、testフォルダを作成し、その中にqvector_test.cljを作成。

;qvector_test.clj
(ns flappy-bird.qvector-test
  (:require [clojure.test :as t]
            [flappy-bird.qvector :as qv]))

(t/deftest qvector-test
  (t/testing "足し算"
    (t/is (= [5 10] (qv/add [1 2] [4 8])))))

srcフォルダにqvector.cljを作成して、空のadd関数を作ります。

(ns flappy-bird.qvector)

(defn add [v1 v2])

テストを実行してみて、失敗を確認

clj꞉qvector-test꞉> 
(clojure.test/run-tests)

Testing qvector-test

FAIL in (qvector-test) (qvector_test.clj:7)
足し算
expected: (= [5 10] (qv/add [1 2] [4 8]))
  actual: (not (= [5 10] nil))

Ran 1 tests containing 1 assertions.
1 failures, 0 errors.
{:test 1, :pass 0, :fail 1, :error 0, :type :summary}

add関数の中身を作成してテスト。引き算、掛け算、割り算も作成しておきます。本家Processingでも何もしてないようなので、0除算については対応なし。

テストを実行して結果を確認します。

;; qvector_test.clj
(t/deftest qvector-test
  (t/testing "足し算"
    (t/is (= [5 10] (qv/add [1 2] [4 8])))))
  (t/testing "引き算"
    (t/is (= [3 6] (qv/sub [4 8] [1 2]))))
  (t/testing "掛け算"
    (t/is (= [3 12] (qv/mult [1 4] 3))))
  (t/testing "割り算"
    (t/is (= [4 1] (qv/div [8 2] 2)))))
(ns flappy-bird.qvector)

(defn add [v1 v2]
  (map #(+ %1 %2) v1 v2))

(defn sub [v1 v2]
  (map #(- %1 %2) v1 v2))

(defn mult [v n]
  (map #(* % n) v))

(defn div [v n]
  (map #(/ % n) v))

テストを実行

clj꞉qvector-test꞉> 
(clojure.test/run-tests)

Testing qvector-test

Ran 1 tests containing 4 assertions.
0 failures, 0 errors.
{:test 1, :pass 4, :fail 0, :error 0, :type :summary}

自機を動かす

テストが成功したので、update-stateを変更して、birdに下向きのベクトルを加算した値を返すように変更します。

(defn update-state [status]
  status)     ;;何もしない

;; ↓変更

(defn update-state [{:keys [bird]}]  ;;分配束縛でbirdにベクタを束縛
  {:bird (qv/add bird [0 1])})     ;;下向きのベクトルを加算して返す

写真ではわからないけど、等速で下に移動するようになりました。

まとめ

今回は、今後のためにベクトルの演算する関数を作成しました。

次回は、落下を作成します。