RustのCrosstermでテトリスもどきの作成は終わったので、とっとと次のターゲットに行くぜ!
ターゲットは子供の頃に遊びたかったけど(お金がなくて)遊べなかった「トランキライザーガン」で。プレイしてるところを背後に突っ立ってずっと見てたのでルールはだいたい分かってる。
まあ、こういう固定画面方式のゲームでプレイヤーはゾウ、ライオン、ゴリラ、ヘビの4種の動物を麻酔銃で眠らせてサファリカーまで運ぶ・・という内容。
・画面の密林部分にはプレイヤーは侵入不可。
・動物は密林部分も道路部分も自由に移動できて、密林に入ってるときには不可視
・動物ごとに麻酔銃に対する耐性が異なる(ゾウはたしか5発だったかと)
・画面の周囲は全部道路扱いで、サファリカーに乗って移動出来る。眠らせた動物はこの車に運び入れないといずれ目を覚ましてしまう(曖昧)
・ゴリラは車に接触することで、檻を開けて捕らえていた動物を全部逃してしまう
ルールはこんな感じだったと思う。不明な点は・・
・どうやったらクリアか(面クリア方式なのか、ひたすら捕らえ続けるのか)?
・一度に同じ種類の動物が複数出てくるのか?
・車でヘビを轢き殺せるという噂が当時あったような・・(でも、殺したら意味がないのでデマだと思う)
こんな感じかな?これをキャラクタベースのRust、Crosstermで作ろうという(僕にとっては)壮大な計画なのだ!
今回、ターゲットの動物が複数種類出てくるので「オブジェクト指向」プログラミングにうってつけな気がする。気がするだけだが。
データ構造の基本的な部分だけは聞いておいたほうが良いと思ったので質問(後で大きな間違いに気づく)
なぬ!トレイト・・いきなり今まで避けて来た概念を使うことになるのか・・
えーと、トレイトでMonsterを作る。ここに設定されてるメソッドはMonsterを採用するStructでは全部実装しないといけない、と。Trait定義内ではメソッド名と引数、返り値の型だけで良いのか・・。
で、上のメソッドで使われてる型を定義してるのか。Position型を定義して・・うわ〜ややこしい
MonsterShapeは分かる。けど、Basemonsterは・・構造体の入れ子やめて欲しいなぁ
うう・・全く使いこなせる気がしない
出たなEnum。選択肢みたいなもんだと思っておけば良いのか
うーん・・Snake型に対して、Newメソッドを作るときに水平状態のMonsterShapeを作っておいて、BaseMonsterとDirectionを備えたSnakeを返す・・と?
んで、こっからがSnakeに対するTraitで、必須のメソッドをそれぞれ書いていくと・・
これらは全部必須のメソッドってわけで・・現時点ではうっすらって感じ。まあ、これを理解するために今回の挑戦があるわけですしね
GameがいわゆるWorld構造体になるのかな?要素が少ない気がするが・・
なるほど、とりあえずモンスターの管理って感じか?と思ったらRenderメソッドもあるのか・・RenderはMainから呼び出す独立した関数でやれば良いのでは?と言う気がするが
これ、トレイト使うんだったら一度もっとシンプルなサンプルを作るところから始めないと駄目だな
テトリスでは半角英数字だったので表現力に限界があったけど、全角も使えるようだと話が違ってくるぞ?と思って質問。まあ、出来るっぽい
Claude先生が考えた全角を使っての例。いや・・w こーゆーことではないのだが。まあでも、Vecを入れ子にすることで2行表示も可能になるのか・・との発見はあったかな
あ、Renderってこういう使い方をするつもりで書かれてたのか。うーん・・でも実際どうすんだろか。キャラ無しのマップ部分だけのと、キャラだけのって二層構造にして、まずキャラを描画してその後からキャラ無しを上書きして表示する感じかな?
いやもう、全然分からん
ここで「絵文字」の可能性を示唆される。あ、その手があったか〜!これなら表示は文字列ってことで統一出来るなぁ。向きは無視することになるけど
なんかいつの間にか、正解と思われるコードをどんどんと出してもらってしまったが、これって学習にならないのでは?オブジェクト指向については全然経験が無いが、それでも自分である程度やってみて汚いコードを書いた上で理想的なコードを示してもらってエラードリブンで学習するのが良いのか、最初から正解のコードを示してもらって写経スタイルでやるのが良いのか・・
答えがこちら。なるほど!
よし、この流れで行こう!と決めた。
ついでに、オブジェクト指向で登場してる不定個のキャラクターをそれぞれ動かすってどういう仕組みなのかのイメージが欲しい。
うーん、なるほど。Game構造体の中にMonstersベクター(モンスター構造体のリスト)を入れておき、メソッドで更新させて破壊的に変更する?わけか?
こっちはIDを使うわけだけど・・IDの生成とかってどうすんのか・・生成のための関数を書くということなのか?
やっぱり1つ目の例の方が理解しやすいかなぁ
なるほど、全体的な流れはなんとなく・・これも何個か動くものを作らないと身につかんわと今は諦めておく
はぁ・・まあ例によって「とりあえず始める」ところからやるしか無いなぁ
続く