星田オステオパシー

プログラミング学習日記 2023/02/22〜

2023/03/14 DD&Dメニューのマルチウィンドウ実験
 次回からのメニュー表示からアイテムや魔法の使用のための実験を行おう、と。Big-bangから別のBig-bangを呼べばOn-keyの被り問題を解決できるはずなので・・

 こういう感じで簡易的なのを作りまして・・

 On-key内にmキーでmenuを呼び出すようにすれば・・

 オッケイ出ました!今度はこのMenuのOn-keyに色々と書いていけば良いわけだな?環境変数は使い回すので、結局データを保存するためのスロットをまた追加しないといけないだろうなぁ・・スロットに入れるデータも構造体にすればスマートになるだろうけど・・・とりあえずは必要なデータが全部揃ってから清書って感じかな?

 ついでなのでアイテム構造体と魔法構造体も仮で作ってインスタンスも

 これをHEROのItemとSkillにセットしまして・・明日の宿直で作っていくぜ〜



2023/03/11 やっぱりOn-tickが怪しい
Big-bang、何かキーを押さないと描画が更新できないなんて絶対におかしい・・ということでお茶の水女子大の浅井先生の弟子であろう対馬って方が書かれた記事を再読。やっぱりOn-tickに渡して動かせるようなのだが・・肝心のコード置き場へのリンクがすでに切れてしまってるので確認出来ず。たった7年前の記事なのに・・

 例えばヒットエフェクトをすぐさま消すってのならコレで行けるのでは?とやってみたがエラー。なんでコレで型が崩れてしまうのかなぁ・・On-key内でやっても大丈夫なのに?

 もしかしてBATTLE全部返さないといけないのか?と思ってやってみたが・これでもやっぱり型違いとなる

 無条件でやってみるか?と試すと・・エラーの起きる場所は変わったが、結局更新したところでエラー。うーん・・普通は条件分けで#fになってる時には評価されないところでエラーが発生している・・この違いはちょっとヒントになるかもな

 Realm of Racketの中で蛇の穴ゲームだけはOn-tickを利用しているのを発見。呼び出されるnext-pitはどのようなコードなのか

 pit->pitとなってるから(これすごく親切!)、構造体をそのまま返すようにして良いはずなんだよなぁ・・あっ!


 そうか、set-...の破壊的変更を行っていたからか!普通にBATTLE構造体のE-ZAHYOに#fを返したら・・ちゃんと一瞬ヒットマークが表示されて消えるようになった!なるほどなるほど・・じゃあ、このSet-on-tickに条件分けでENEMYが先頭に来てる場合を書けば敵の行動を自動処理できそうだ!よっしゃ!


 あ、ついでにBig-bang自体を関数に入れ込む実験。まあ、普通に出来ました。これで複数のBig-bangを作って、CLIのアドベンチャーから戦闘シーンとして呼び出して使うことが出来るのは確定した(^o^)


2023/03/10 DD&Dで実験
 全快の宿直で破壊的変更によってようやく他のスロットに介入できるようなったわけですが・・本当にそれしか方法がなかったのか?ということで、もう少し粘ってみました。

 本当はこういう感じでスロットを更新できれば良いんですよね。やってみましたけど、やっぱり駄目だった・・うーん・・やっぱりSet!しかないかなぁ

 あと、何もキー入力をしない間に自動で動かすためには・・ってところだけど、このelse部分がキーじゃないか?と思ったんですよね。で、色々とここに書いてみたけど駄目でした。
 けど、前にRacketを使ったゲームの記事があってフロッガーみたいなゲームをやってたからキー入力がない時に画面が更新されて判定も発生するプログラムは書けるはずなんだよなぁ・・。残念ながら記事にあったソースへのリンク先が既に消えてて確認できず。
 もしかしてon-tick部分に書くのか?と思ったけど、これはフレームレートの設定をしてるだけっぽいしなぁ

 気分を変えて出来るところだけやっていくか・・HEROの行動から敵全滅はα版が完成したので、ENEMYにも同じ処理を割り当てる。すると当然HERO全滅ENDの場合も必要なのでちょっと改造。end判定をこうしまして

 メッセージ表示を場合分けして。まあ、ここらへんは大丈夫ですね


 続いて戦闘メッセージとかステータスの表示ということで・・キャラクター部分は前ので良いから、それをバックグラウンドにしてテキストレイヤーで呼び出すと変更

 読みづらい!けどまあ、文字は出た。こっからのレイアウトと座標合わせが面倒だなぁ

 画面がちょっと狭かったので拡大

 移動力Moveは消費されていってPhase終了で元の数値に復帰するんだけど、元の数値をどこに格納しておくか?というのを解決してなかった。スロット追加も面倒だなぁと思ってて、前にCametanさんがFoldで連想リストの片方をデータ保存に利用されてたのを思い出した。あ、HPにも使えるな!ということで改造。連想リスト良いっすねぇ〜

 テスト用のデータはこんな感じで。結局ENEMYもHEROと同じ戦闘処理をしてしまってるので(本来のTRPGルールでは正しい)、武器鎧などを持たせてます。が、うーん、実際問題ENEMYのACとかは直接数値を入れて作りたいなぁ・・面倒だしとか。あ、でも「戦技」で武器落としとかあるみたいだし、それを実行するにはこのままの方が良いか・・とか。

 とりあえず、キー入力とは独立して更新する方法を探していこうと思います。Realms of Racketに載ってると思うんだけど・・


2023/03/05 DD&Dの移動先判定の関数化で・・

あ〜・・折角の宿直時間を無駄に使ってしまったかも知れない。
前回まででENEMYの半自動(何かキーだけは押さないとけない)追尾動作が書けたので、今夜は戦闘関数だ!と思ってたんですが

 そう言えば、半自動行動時に移動先がENEMYだった場合、石だった場合の処理を考えてなかった・・と思い出して処理を書いてました。関数化は後で良いか・・と、何も考えずに書き始めたところ・・
 気づいたらこんな長大な判定処理に(-_-;) 
 これで動かなかったらもう二度と書くことは出来ないぞ!と思ってたんですが奇跡的にちゃんと動いたのでギリギリセーフ。

 もう、このまま戦闘判定行くか?と思ったんですが、関数化することにしました


 繰り返されてるパターン部分を抜き出して引数を設定したら


 本体こんだけで済んでしまった。最初の判定部分を書いた時点で、そのまま使い回せると気づいても良さそうだったけど・・いや、書いてみないと気づかなかっただろうな。ま、学習になりました。
 そして当然、まだ圧縮出来ますよねコレ・・

 と思ってやってみたが・・
 
 移動先がENEMYか石の場合の判定を述語にまとめてみたが・・

 大して圧縮にならなかった・・書き方が悪いんだろうけど、同じ箇所が2箇所だと独立させても旨味が無いなぁ・・。


2023/02/28まで
話題その1 マクロ関連とか

 えーっ!じゃあ答えがそのまま載っていたのか・・読み方も謎の記号|#1#|の意味もしっかりと教えていただいたので・・これは・・なんか書けるようになりそうな気がする!ありがとうございます(^o^)

 以下、syntax-rulesあれこれのページを拝見しつつ手を動かしてみる。まず、名前付きLetの動作。確かに同じだ・・

 展開後の形を読んで、idの後の...っている?とか思ったり(要るよ!)、Letrecの事を忘れててまた読み返したり

 展開語の形で動きを確かめたり・・あ、クロージャーを詰め込んでるって事か、とか。

 なるほどなるほど・・と言うか、結局展開後の形の基本がしっかりと出来てれば何とかなるって事か〜

 予定山盛りだけど、この際Common Lispのマクロ移植トレーニングは是非やってみよう、と。この五箇条を貼り付けとこう

 あ、継続もだな〜

 Simple-loopのページにお邪魔してしてCall/ccの部分を拝見。こちらもいずれ大域脱出以外の使い方もちゃんとやろう


話題その2 DD&Dのキー入力部分の関数化
 とりあえず動いてるので、抜き出して関数名をつけて・・引数はえらく多くなるけどしょうがないか・・。on-keyで使われてる変数名そのままで引数名にしてコピペ。可変部分はxとyの数値だけなので、そこだけ本編で入れれば良かろう

 という訳でかなりスッキリ。
 Phase終了はEnterキーにして、他の1キーでは動かさないようにと。

 明日の宿直ではワクワクのENEMY行動部分を書くことになるであろう。



2023/02/24
話題その1 Cametanさんの記事
 なるほど!常に意識しておくようにしてみます

 マクロの記事を探して以前の投稿も拝見してたのですが、今から読み返してようやく「なるほどなぁ」と思ったり

 お題が「型判定」じゃなくて「型判定しての動作(typecase)」だと判明したり

 してるうちに・・あ・・「syntax-rulesあれこれ」で、そのものズバリtypecaseの例が出されていたのを発見してしまった(^_^;)

話題その2 マクロ学習
 else部分ってもしかして無くても動くのかな?とか実験。
 type?は分かるけどtype0?って何だ?とか関数のクセが抜けなくて最初混乱したけど(←今ソコで混乱する?)、ようやく理解が追いついてきた。

 で、とりあえず自分で書き直してみて

 formってどんなのが使えるのかな?という実験をして

 型判定で参照リストを述語オンリーでやったらと思ったけど・・やっぱり手抜きだと無理か〜とか

 で、ここでようやくお題のvariantライブラリを使ったtypecaseを作ってみる。
 こんな感じでしょうか!

 おかげさまでマクロの面白さがちょっと分かった気がしました!いやもう、呆れるほど全然分かってなかった・・・(^_^;)



2023/02/23 型判定マクロ作成
 DD&Dの気がかりも無くなったし(ありがとうございます!)、ココでCametanさんからのお題「型判定マクロ」に挑戦してみよう!と。

 まずはアドバイス通りDescribeのページを見る・・・うーん、型の種類くらいしか意味が分からない(^_^;)

 まず考えたのは、どんな値に対してもCarをかける。するとエラーが出るので、そのエラーを捉えて、エラーメッセージから情報を抜き出せないか?というもの。が、実際にエラーを見ると値そのままを表示してるだけだったか(型のインスタンスの時には#<CHARACTER>とか出るのでみんな出ると思ってた)

 返らない

 とりあえずsyntax-rulesを使うだけは使って・・Caseの条件式にnumber?とか使えるかと思ったら具体的な値しか無理だったのでCaseボツ

 結局Ifによるカスケードフィルター方式(適当に命名)に・・
 そして型がStructの場合が問題だ・・・どうやってインスタンスの型名を出すか・・。ここでエラー補足からの具体的な書き方を調べようと思ったが

 このメッセージを捉えたいのだけど分からんw

 tawa型を作って・・

 Variantと一緒に自作マクロ(?)Varvariantを試すと・・struct?が補足できてない。何故だ

 ドキュメントの検索(検索は本当に素晴らしい)でstruct-まで打ってそれっぽいのを片っ端から試すが・・無いなぁ・・インスタンスの任意番目のスロットにアクセスするってのが無い。
 スロット名やアクセサでのアクセス方法はあるんだけど、その0番目(アクセサ名?コンストラクタ名?)をこっちが知りたいんだっての

 そもそもstruct?で補足できないのはなぜか・・そう言えば以前Cametanさんが何かの操作の時にtransparentしてないとうまく動かなかったと書かれてたな・・と思いだして書いてみると・・補足成功!

 なんとかしてインスタンスの中身を書き出すものは無いかと探すとstruct->vectorが使えそう。ここからrefで0番目を抜き出せば・・

 後は文字列にして余計なところを切り離してまたシンボルに戻して・・と言う操作をすれば・・出力は本家Variantと同じに出来た


 そしてマクロVarivariantに組み込めば・・
 (あ、述語の優先順位はListとかPairとかを最上位に持っていっておかないといけないですね)

 無事に型判定が出来るようになった!

 ・・・ただ・・これマクロって言えるのか(笑)?ってね。
 多分「いやw こーゆー事じゃないんだけど・・」って結果だと思うんですよねぇ。
 というわけで、明日からはちょっとOn Lisp読んでマクロにする必要のある書き方を考えます(^o^)


2023/02/22 
話題その1 昼間
 夜は宿直でDD&Dの創造的?作業を進めたいので昼間のうちに雑用的なことを終えておこう!ということで
 BATTLE構造体のC-LISTに敵味方全部まとめてリストする仕様に加えて、連想リストで座標を持たせる計画を進める。欲しい形になるように逆クォートで試行錯誤しましてw

 無事にリストに出来ました。後は、このリストを出来ればここでSortしたいと思ったわけ

 うーん・・普通の構造体リストだったらなんとかなったけど、ドットリスト状態ではどうやって良いのかサッパリ・・

 このように当てずっぽうの涙ぐましい努力をしましたが(^_^;) 無理〜
 ま、でも予め敵味方構造体のみでSortしてC-LISTに入れる時にそれぞれ座標を割り振るようにしてドットリストにして格納すれば出来ないことは無いw
 一応解決出来たと考えて先に進めよう

 そして新たな構造体の形を取り入れてon-key部分を書き換えて(多分、(cons (cons...のところは逆クォートでスマートに出来るはず)

 表示できて

 eキーでキャラを変更して動かせるところまで済ませておく。宿直では味方は自分で、敵は自動でMoveの数だけ動いて敵に接触して同じ座標へ入力したら戦闘処理発生・・ってのをなんとか荒削りにでも作り始めたいな〜・・とか考えつつバイトへGO!

話題その2 夜
 Cametanさんからの超絶重要アドバイスをいただく!
 え? いや、確かにこのページ見たんですけど意味分からん・・とスルーしてたんですよね(-_-;)

 クロージャー・・Lambdaの使用は実は考えたんですけど、リストが前にあったもんで(^_^;)

 なんだこの形は!? これは大事な話な気がするのでちょっと調べてみる。

 こうなるわけですよね・・・

 出来てる! え〜っ!?いや例文で


 こうなってたけど順番が謎だぞ?と

 あっ!場所がここでも行ける。ってことは・・Keyオプションは続く引数?が1つだけ適用されるということ、Sortの他の引数の途中にあっても干渉しあわないということか・・?

 Carはクロージャーを返すという事?Lambdaで書くとこうなるが・・確かに同じように動いている

 クロージャがボンヤリだったのでWikiかなんかの解説を読む。うーん、上の例で言うと#:Keyが(lambda () ...の部分で、()の中に更に(lambda (x) (case..が入ってるということかな、Sortの場合は。

 そして使用用途の部分にまさしく今回のSortのパターンが記されていてちょっと感動した

 ちなみにオプションでのCarの役割を全く勘違いしていたのも発覚した

 ()を外すためだったのかw 各単語の一文字目をKeyにしてると思ってた

 だからこうすればオッケイと。ん!?ということは・・・

 昼間諦めていたドットリストで座標を備えた構造体のリストのSort問題、こうやって書けば・・

 ちゃんと出来た、スゲーッ!

 いや・・・Cametanさんのおかげで今夜はちょっとLisp系の凄さが分かって来た気がしますよ・・・(゚A゚;)ゴクリ

 
  • Xでシェアする
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

最近の「プログラミング」カテゴリーもっと見る

最近の記事
バックナンバー
人気記事