きょういく ユースフル! ~ 僕は触媒になりたい ~

全て | カテゴリ未分類 | 生活をよくする | 本の紹介 | 共に生き、共に育つ | たのしいべんきょう | 個人的な日記 | 体育 | 音楽♪ | 道徳 等 | 問題解決 | 考え方 | 話し合い・話す・聞く | 特別支援教育 | 小学校 | 阪神間 地域情報 | PC・デジタル関係 | 教材・教具 | 食育(自立生活・家庭科)・園芸 | 仕事術 | 旅行(温泉含む) | 英語学習 | 環境保護・エコ | 作文・書くこと・漢字 | よのなか(社会) | いのち | 人間関係・コミュニケーション | 子育て | 地震・防災 | 算数 | 心理・カウンセリング・セラピー | 読む・音読・朗読 | エクセルでのプログラミング | 北播丹波 地域情報 | 教員免許 | 教育改革 | 休校期間お役立ち情報 | 映画 等 | 創造性をはぐくむ | プレゼン | 通級 | 健康 | ゲーム
2018.07.25
XML
​​​ 【Excelプログラミング講座】第6回です。

この講座では、 エクセル野球シミュレーション「ダイナミックベースボール」 のプログラム実物を材料として、エクセルでのプログラミングを初心者向けに解説していきます。

Dynamic Baseball

ダイナミック・ベースボールのページ

過去記事をまとめたサイト↓
▼​ エクセルプログラミング講座


前回は、 「条件分岐のプログラミングは、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 入門講座)

では、次回はバッターの「ちから」数値が低くてホームランにならなかったとき以降の、「飛球判定」プログラムの続きを参照します。​





お気に入りの記事を「いいね!」で応援しよう

Last updated  2018.07.25 21:00:13
コメント(0) | コメントを書く


【毎日開催】
15記事にいいね!で1ポイント
10秒滞在
いいね! -- / --
おめでとうございます!
ミッションを達成しました。
※「ポイントを獲得する」ボタンを押すと広告が表示されます。
x

PR

Profile

にかとま

にかとま

Keyword Search

▼キーワード検索

Calendar

Archives

2024.09

© Rakuten Group, Inc.

Design a Mobile Website
スマートフォン版を閲覧 | PC版を閲覧
Share by: