野球シミュレータの開発(4)【完成】
この記事は野球シミュレータの開発(3)の続きです。
野球シミュレータを完成させる
野球シミュレータの軸になる『打者』と『走塁』が無事完成したので、後は仕上げとして、この2つを呼び出すための関数『試合』を作成します。関数『試合』は以下のような働きをします。
- 試合をするための準備をする(アウトカウントやランナー、スコアボード等の初期化)
- 乱数を引数として、関数『打者』を実行し、イベントを出力してもらう。
- 現在のアウトカウントとランナー、『打者』が出力したイベントを引数として、関数『走塁』を実行し、イベント後のアウトカウントとランナー、(イベント前後で発生した)得点を出力してもらう。
- 3アウトになるまで、2と3を繰り返す。
- 3アウトになったら、スコアボードに得点を記録して、アウトカウントとランナーを初期化する。
- 9イニング分、2~5を繰り返す。
他にもちょこちょこ必要な処理はありますが、ざっくり書くとこのような流れになります。関数『試合』が完成したので、とりあえず野球シミュレータが完成したことになります。なるべく現実に近づくような試合ができるよう、頑張ってプログラミングしましたが、残念ながら実装できなかった部分もいくつかありました。
- エラーによる出塁は実装できたものの、エラーの頻度を変更することはできない(守備力が一定)
- 走力が一定
- 塁上のランナーが打撃結果以外で進塁したり、アウトになったりすることがない(盗塁や牽制死、ワイルドピッチ等がない)
- バントがない
- 凡打の中の比率は変更できない(ゴロを打ちやすい選手、フライを上げやすい選手などの区別はできない)
- 点差を考えて戦略が変わることはない
この辺は、できる範囲で少しずつ改善していけたらと思います。では、最後に1試合分動かしてみたいと思います。
開幕戦
野球シミュレータでは味方の打撃結果が、相手の打撃結果の影響を全く受けないため(戦略等の概念がない)、対戦相手を用意する必要がありません。投手は用意する必要があるかもしれませんが、味方の打撃成績 = 相手の投球成績と考えられるので、打撃成績を入力すれば同時に相手投手の投球成績も入力できているものととらえることにします。
今回は2018年NPBの平均的な打者のデータを入力して実行しました。
試合開始です。
1回、記念すべき先頭打者は凡打(bonda)でした。その直下の行には凡打による状態遷移が書かれています(0アウトランナーなしから1アウトランナーなしへ)。その後、四死球(bb)でチャンスを作りますが、5番バッターは凡打に倒れます。アウトカウントが0になっているので、チェンジと判定され、スコアボードに0が刻まれます(元々0が入っているので、見た目上は変化がありません)。そして一応イニング間は、スラッシュ(/)で区切っています。
2回は見せ場なく三者凡退。
3回、2アウトランナー1塁からツーランホームラン(hr)が出ました。スコアボードにも2が刻まれます。
みたいな感じで9回まで動かした結果、この試合では3点をとりました。
まとめと今後やりたいこと
野球シミュレータがとりあえず形になりました。とんでもない点数を叩き出したり、ありえない遷移をしたりといったバグを想定していましたが、比較的スムーズにいきました。
シミュレータが完成したことで、今後、様々な条件を設定し、膨大な試合数をシミュレートすることで、いろいろな検証ができるようになるかと思います。今後としては、
- 得点期待値表を打撃成績から求められるような関数を作成し(近似)、采配を最適化してみる(ある局面でバントをすべきかしないか等)。
- 運に左右されずに確実に勝つためにはどれくらいの実力差が必要なのか。
- 現実のプロ野球チームを用いて、打順の最適化を行う(平均得点が最大になる打順を導く)。
みたいなことをぼちぼちやっていきたいと思います。
が、その前にまだ1試合しかシミュレーションしていないので、まずは「シミュレーションが妥当な結果を導き出しているか」、の確認を次回は行います。
<<野球シミュレータの開発(3) 野球シミュレータの開発(5)>>