星田オステオパシー

Racketで何か 四人のキング11 通常Battle部分とりあえず完成

 前回、Battle-evalの結果をBattle-printで出力するところまで出来た。
 今回はREPLのL、戦闘の結果HPが0以下になった場合リストから外して新たなPlayerとEnemyでLoopさせて次のラウンドへ!という部分を作ろう。
 そのためにCARDインスタンスを出来てるところまでListする。Cametanさんから自動生成は不可能と教わったので(実はすごく意外でした・・プログラム内でのインスタンス自動生成が出来ないとプログラムによる自動拡張みたいなのが不可能ですよね?)、作戦を変えて
 ・字札のみのインスタンスのリストを手作り
 ・絵札のインスタンスのリストを手作り
 ・それぞれをシャッフルして(0 0 0 1 1 1 0 0 0) 的リストにマッピング
 ・その状態でCARD-NAMEでStringを取り出してマップ表示用リスト作成

 尚、♠などの記号でずれるのはこれらが全角文字だったからなのでマップの表示はすべて全角のStringにて行うようにする、と。
 これ、Linuxだと半角でも♠とかあるんですけどね。

 はい、という訳でここからは確認を兼ねて最初から流れを追ってメモしておこうかと。昨夜はバグのせいで夜中2時までかかったんですが、そこは割愛して動くようになった状態でデータの流れを追います


 戦闘の発生するカードが有効でPlayerが入り込んだ場合戦闘発生。戦闘前に戦闘を選択するとか、運試しするとかバリエーションがあるので今回はそれは置いといて戦闘が開始された場合。
 引数にenemyがあるのはBattle-read部分で既にCARD-ENEMYで敵を抽出しているから。ループ後に新たなENEMYが回ってくるのでループ後のここでENEMYを独立した引数として受け取る必要があるのだった。
 また、戦闘には「降服可能」な場合がある。戦闘開始前、各ターンの最初に降服の選択が可能なので、それもここで選べるように、と。
 戦闘が確定したらbattle-startへWORLDとenemyを連れて行く。PlayerはLoop時にWORLDに統合してあるから良いのだ!

 ちなみに降参オプションが有効なときにはこのsurrender?関数が実行される。拒否した場合は戦闘続行で同じくbattle-startへ。あ、enemyを連れてくるの忘れてるw。修正しときます!


 ここで戦闘前の情報表示。敵パーティの表示と味方パーティの表示。敵パーティにはenumerateで番号振らせてもらいました(^o^)
 そして味方パーティの敵への攻撃選択を入力するためのinput-commandを呼び出してcommand-listに格納して現在のPlayer(WORLD-PHASEによりWORLD-PLAYERSからList-refされる)が選ばれてEnemyとともに引数としてBattle-evalへと渡される


 Input-command関数。Enemyの残数から選択するためのインデックスを作成し、数がおかしかったら再入力をしてIntのリストとして返す。


 command-listと同じ形式でEnemyからの攻撃対象をrandom-listにて生成。その2つを用いてbattle-map関数で敵味方の攻撃相手、一方的に攻撃される相手などを出力する。
 更にそのbattle-result-listからdamage-apply-player-mapとdamage-apply-enemy-mapで敵味方それぞれのダメージを算出してそれぞれに適用、適用後のインスタンスリストをBattle-printへ渡す。


 Random-list。実は昨夜のバグはこの単純な自作関数が原因だった!特定に3時間もかかってしまった(-_-;)


 Battle-map-zero。(car player)がEnemyのうちの何番目を攻撃するかをcommand-listから特定し、その相手が(car player)をターゲットにしていたらタイマン、別のものなら一方的、Playerが攻撃してるのと別のEnemyから攻撃されたら防戦、お互い関与してなかったらナシという判定を行う。これを・・


 Battle-mapでPlayerの数だけ回す、と。


 タイマン、一方的、防戦のそれぞれの処理はこれらの関数で。


 battle-mapで出力されるのはこのようなデータ


 Damage-applyは(car player)版を作って再帰させるMap版で管理。


 Damage-applyのEnemy版。ここでの引数battle-result-listvはbattle-result-listに(apply map listを適用して縦横を逆転したもの。


 で、上の流れでまとめたデータをBattle-printへ渡すと(間にずいぶん入ったので再掲)。この時に渡すbattle-result-listは表示しやすいように(apply appendで一つにまとめたもの。


 後は副作用を用いてナシ以外の部分をbattle-mes-printで淡々と表示。表示する部分を回し終えたら、Evalで作った引数をそのままLoopへとバトン


 battle-mes-printはただ単にCaseでの分岐


 Loop部分。敵味方それぞれHPが1以上のもののみ選別して新たなNew-player New-enemiesに束縛してどちらも全滅してなかったらBattle-read2へとLoop。

 あ〜長かった!じゃあお楽しみの実行と参りますか!

 戦闘開始!あ、敵がグループの時には「まもののむれ」と表示させるようにしよう。む?それに敵のHPだけ()に入ってるな・・Carしておかないと・・

 プレイヤーそれぞれが攻撃目標を決定すると、結果が表示されます。
 ダメージは2で基本固定なので、ここはAに二人、Bに一人、Cに一人で!

 むはは!狙い通り!残るは一匹

 ワレ、殲滅ニ成功セリ!

 とまあ、通常戦闘はこんな感じで完成しました(^o^)

 次は・・戦闘のブラッシュアップでアイテムや特殊能力を実装するかな?




 





名前:
コメント:

※文字化け等の原因になりますので顔文字の投稿はお控えください。

コメント利用規約に同意の上コメント投稿を行ってください。

 

※ブログ作成者から承認されるまでコメントは反映されません。

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

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

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