カテゴリ:エクセルでのプログラミング
【Excelプログラミング講座】第6回です。
この講座では、エクセル野球シミュレーション「ダイナミックベースボール」のプログラム実物を材料として、エクセルでのプログラミングを初心者向けに解説していきます。 ▼ダイナミック・ベースボールのページ 過去記事をまとめたサイト↓ ▼エクセルプログラミング講座 前回は、「条件分岐のプログラミングは、IF構文を使う」という話をしました。 もし A なら → こうする もし B なら → こうする もし、AでもBでもないなら → こうする もし の話は、おわり! というような構文のことです。 プログラミングではいろんなところで登場するこういった記述法。 プログラミング初心者の方は、ぜひ、慣れてくださいね! 今回は、前回のつづき。 「投球プログラム」の後に、打球が飛んだ後の処理をする「飛球判定」のプログラム、その中身です。 実現すべき内容は、以下の通りでしたね。 ======================== (2)バッターが球を打った場合、フェアー判定をする。 サイコロを2つふれ。 打球ダイス(ダイス2個) ・ゾロ目(両方同じ数) → ホームラン判定 ・和が偶数(たしたら偶数) → とったアウト! ・和が奇数(たしたら奇数) → うったヒット! 出典:ダイスでできるスリリングな野球ゲーム「ダイサブル・ベースボール」 ======================== では、エクセルの「ダイナミックベースボール」のプログラム実物を開ける方は、次のようにクリックしてください。 Module1 → Declarations → 飛球判定 以下、飛球判定プログラムの中身の前半です。 前回同様、本質的でないところは、飛ばします。 ========================== Sub 飛球判定() Select Case BN(0) '0=偶数、1=奇数、3=飛球判定のスキップ ’Select Caseというのを今度は使っていますね。 IF構文と同じようなことができますが、 こちらのほうが人によっては分かりやすいかもしれません。 BN(0)という変数は、このプログラムに来るまでに、2つのダイスの目を足して2で割ったあまりが入るようになっています。つまり、0ならダイスの目の和が偶数、1ならダイスの目の和が奇数と言えます。 Case 0 ’ダイスの目の和が偶数の場合の条件分岐。ぞろ目の場合は和は必ず偶数になるので、このケースに当てはまります。 If Dice1 = Dice2 Then 'ぞろ目のとき If Dice1 <= Range("I8") Then ’Range("I8")は、そのセル番地を見てもらうと分かりますが、何が入っていますか? バッターの「ちから」ですね。 力持ちのバッターほど、ホームランの確率が上がるように、ぞろ目のときのダイスの目とバッターの「ちから」の数値を比べています。 Range("E12") = "H" Range("G12") = "O" Range("I12") = "M" Range("K12") = "E" Range("M12") = "R" Range("O12") = "U" Range("Q12") = "N" Range("S12") = "!" ’こちらのエクセルのセルの番地は、表示される文字を全部追っていくと・・・ 「HOMERUN!」になりますね! ’さて、以降は、ホームランを打った場合にしなければならない処理が続きます。 一言で「ホームランを打った」と言っても、いろいろな状況が考えられるわけです。 さて、プログラム処理的に、何をしないといけないでしょうか? Score1 = Score1 + 1 ’点数は最低でも1点入るはずですので、まずは1点を内部的に持ちます。 HitIn ’ヒット扱いですので、ヒットを打ったときの処理もします。 HitInは、チームのトータルヒットカウントの表示を増やすプログラム。 Call SeisekiB(Range("H6"), 14) Call SeisekiB(Range("H6"), 16) Call SeisekiB(Range("H6"), 20) Call SeisekiP(Range("O6"), 20) ’打者成績への反映。(4つめのみ、投手成績への反映。) チームデータファイルから該当選手名を探し出し、 その後、14番目とか16番目といった数字の列の数字を1つ増やします。 つまり、チームデータファイルの14番目はN列の「本塁打数」。 同じく16番目はP列の「打点数」ということになります。 If R3 > 0 Then ’R3は3塁走者の走力なので、これが0より上ということは、つまり走者がいた場合、となります。 ランナーの処理は、3塁ランナーから順番に処理していきます。 Score1 = Score1 + 1: R3 = 0 Range("N10:N11").Value = "" '3塁走者消す MsgBox "3塁ランナーホームイン!!", , "ホームラン!" Call SeisekiB(Range("H6"), 16) Call SeisekiP(Range("O6"), 20) ScoreIn ’3塁走者が帰ってきたことにより、得点はさらに+1。 打点などの成績反映も追加されます。 End If ’以下、2塁走者、1塁走者がいた場合も、同様に順に処理します。 If R2 > 0 Then Score1 = Score1 + 1: R2 = 0 Range("O9:O10").Value = "" '2塁走者消す MsgBox "2塁ランナーホームイン!!", , "ホームラン!" Call SeisekiB(Range("H6"), 16) Call SeisekiP(Range("O6"), 20) ScoreIn End If If R1 > 0 Then Score1 = Score1 + 1: R1 = 0 Range("P10:P11").Value = "" '1塁走者消す MsgBox "1塁ランナーホームイン!!", , "ホームラン!" Call SeisekiB(Range("H6"), 16) Call SeisekiP(Range("O6"), 20) ScoreIn End If Call ScoreIn ’ScoreInが何度も出てきます。別の箇所に書いてある得点処理プログラムです。 得点処理プログラム「ScoreIn」は、サヨナラの場合にはゲームが終わってしまうので、 ゲーム終了までに必要な処理がすべて終わっているのかが重要です。 (実はここに、今でも取り切れていないバグがまだ潜んでいます・・・。) Range("E12:S12") = "" 'ホームランと書いた文字を消す。 ElseIf Dice1 = 6 Then <以下、次回!> ========================== 長くなるので、次回に続きます。 ホームランかどうかが野球ドラマでは一番大事ですので、一番最初にそれが書いてありました。(笑) ホームランを打ったときのランナーの有無が、得点に関係します。 得点が変われば、打者成績の打点数も変わってきますし、投手の自責点も変わってきます。 そういうわけで、単純に「ホームラン!」と表示させるだけではなく、それに付随するプログラムがいろいろとくっついてくるのです。 今回、メインプログラムのエクセルファイルとは違う、選手データのエクセルファイルをさわるプログラムが書いてありました。こんなふうに、実行ファイルとは違うエクセルファイルの中身を参照したり、数値を変更させたりすることができます。これこそ、エクセル野球シミュレーション「ダイナミックベースボール」の醍醐味です。 これを応用すると、いろいろなプログラムが作れそうですね。 【今日のまとめ】 ホームランの時のプログラムは 走者数に応じて得点処理をする「得点処理」の詳細は今回参照していませんが、少し書いたように、得点処理プログラムの際に、もしそれがサヨナラであればそこでゲームが終了するというイレギュラーなことが待っている可能性があります。実は「飛球判定プログラム」を書いた際にこれがちゃんと想定し切れていなかったので、今でも残っているバグがあるのです。前回から「条件分岐」についてふれていますが、分岐が増えれば増えるほど、いろいろなケースが生じてくるため、想定し切れていないケースでエラーを起こすということがあります。プログラムは長くなればなるほど、分岐が分岐を呼び、エラーを起こしやすくなるのです。そのため、デバッグしやすい(エラー箇所を見つけやすい)プログラムを書く、ということも重要になってきます。 (※現在残っているバグはゲームが止まるほどの重大なものではありません。普通に遊ぶ分にはほぼ問題ありません。) 最後に、前回同様、他の方が作られた「Excel VBA 入門講座」にリンクを張らせていただきます。 今回は前回の続きに書かれている、「Select Case~ステートメント」です。 ▼Select Case~ステートメント(Excel VBA 入門講座) では、次回はバッターの「ちから」数値が低くてホームランにならなかったとき以降の、「飛球判定」プログラムの続きを参照します。 お気に入りの記事を「いいね!」で応援しよう
最終更新日
2018年07月25日 21時00分13秒
コメント(0) | コメントを書く
[エクセルでのプログラミング] カテゴリの最新記事
|
|