
前回、このような形で戦闘結果のデータを出力できるようになりました。次はこれを元にしてPlayerとEnemyを変更したインスタンスのリストを作ってBattle-loopに回して死亡判定をする・・と。まずは各キャラクターのダメージ合計を計算しないといけないので・・・

まずはプレイヤーの側。単品版を作ってグループ版に送り込む。ま、これは簡単だったんですよね

同じ形で書こうと思ってなんか引数が合わないな?と思ってようやく気づいた、Enemyは各リストの同じインデックスが同一のEnemyインスタンスなんだった!まあ、このへんは学習日記で書きましたので。まさか(apply map list ...)で出来るとはねぇ・・。
けどとりあえず自分でひねり出す過程が大事だろうということで。記念に自作版を使っておこう。これで元のリストをx軸y軸を逆転させたリストを作って・・

Playerと同様にダメージを反映させたEnemyのリストを作る関数。これをWORLDの再生成の際にEnemiesのところに入れれば良いわけだな。

出力時は今みたいにプレイヤーごとのリストに分けておく必要がないので、ここは一つ
((()()()())(()()()())...)ってのを
(()()()()...)って形にしてから処理を進めたい
つまり、やりすぎないFlattenって感じ。Flattenだと全部の要素がバラバラになってしまうので。まあ、簡単に思いつく方法としてはFlattenでバラバラにして要素数5ごとにまとめるというmapの時にやった方法でもいいけど、そこはちゃんと再帰で考えてみよう

で、完成。いや〜大変だった・・こんなに複雑になるのか・・・なかなかappendを思い出さなくてConsでやってたから大変でしたよもう〜
ん?append・・まさか・・

ぐへぇ!applyで一発じゃないか!いや、applyも試してたんです!けどconsとlistしか思いつかなかったんで(^_^;) applyすげぇ!

んで、Battle-evalから送られてきたデータを出力する部分。なんか更に別関数に分けてしまった。うーん、Battle-loopへと送る部分も入ってるのでBattle-printに統合して飛ばす部分はBattle-printから直接視認できるようにしておくべきだったかな?
戦闘結果battle-result-listをFlat-listで変換して再帰で一気に処理。表示部分は完全副作用なので書いててなんか不思議な気分だったなあ

メッセージ表示部分。ようやく出番が来たな、Match-lambda!使わないと忘れるからなぁ。ま、今回も書き方完全に忘れてましたけど。Voidも初めて使うかな?便利!

では実際のデータを読み込ませて実行してみよう!完璧だー!今回実験用に大ネズミのパラメータを無茶苦茶上げてるので一方的にやられてます。
後はLoopでキャラクターの死亡判定をして、どちらかが生き残ってる場合はRead2へとBattle-loop。それとBattle-pirnt部分の装飾とかなんやかんやをやったら戦闘部分は概ね完成かな!