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

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

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

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

Dynamic Baseball

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

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


前回は、ホームランになる場合の判定プログラムを見ながら、
「条件分岐のプログラミングは、Select Case も使えるという話をしました。

もし 1 なら → こうする

もし 2 なら → こうする

もし、1でも2でもないなら → こうする

もし の話は、おわり!

というような構文のことです。
(おっと、IF構文とめっちゃ似てますね。)

僕の場合は、Select Case の中に、IFを入れ子構造にしていました。
IF構文の中にIF構文を入れるよりも、Select Case の中にIF構文を入れるほうが、見やすくなるかな?

今回は、前回のつづき。
ホームランにならなかったとき以降の、「飛球判定」プログラムの続きを参照します。
例によって、一部はしょって、お送りします。

==========================
Sub 飛球判定()
     
Select Case BN(0) '0=偶数、1=奇数、3=飛球判定のスキップ
 
Case 0
    If Dice1 = Dice2 Then    'ぞろ目のとき
           
​            If Dice1 <= Range("I8") Then ​​’ホームラン(詳細前回)
               
​            ElseIf Dice1 = 6 Then

​’6のぞろ目のときは、ホームランでなければダブルプレーになります。
 ただし、ダブルプレーになるためには、ランナーが1人はいないとだめですね。
 また、すでにツーアウトのときも、ダブルプレーはありえません。
 そういうことを、次に書いています。

​               ​ If R1 + R2 + R3 > 0 And Out < 2 Then​​​

                    MsgBox "あっ~と! いい当たりでしたが、野手の真正面!" & Chr(13) _ & " Wプレー!!", vbExclamation, "とられた!"

​’vbExclamationというのは、エクスクラメーションマークを出すメッセージボックス。
 つまり、このマークですね。
 エクセルさんが出してくるメッセージウインドウにも種類があるので、
 その種類をこうやって指定することができます。

                    Out = Out + 2
                    Range("l5:m5") = "●"
                    Range("l5:m5").Font.ColorIndex = 3

​’ダブルプレーなので強制的にアウトカウントの表示を●●とアウト2つ分表示させました。
                   
                    '※塁走者のアウト処理
                    If Range("N10") <> "" Then

​’<>は、ノットイコールということ。上の記述の意味は、N10番地のセルが空白でないなら、という意味になります。つまり、3塁走者を表示させるマスですね。3塁走者がいた場合、というのを、こんなふうに書いています。

プログラム的に、「~~でないなら」という書き方を採用するときがあるので、こういう言い方にも慣れておいた方がいいですね。自分がやりたいことを別の言い方で言い換えるとか、別のやり方に置き換えるとか、そういう能力は、プログラミングをしていると、鍛えられるかもしれません。

                        Range("N10:N11") = "" '3塁走者
                        R3 = 0

​’3塁走者がいた場合にダブルプレーになったので、3塁走者を消しています。””は空白を表します。

                    ElseIf Range("O9") <> "" Then
                        Range("O9:O10") = "" '2塁走者
                        R2 = 0

​’2塁走者がいた場合も同様

                    ElseIf Range("P10") <> "" Then
                        Range("P10:P11") = "" '1塁走者
                        R1 = 0

​’1塁走者がいた場合も同様

                    End If
                   
​​              If Out = 2 And AR = True And R1 + R2 + R3 > 0 Then

​​’いっぺん「IF」第1弾を終えた後、また「IF」です。
 ダブルプレーの処理をした後にさらに走者が残っていた場合、トリプルプレーの可能性があります。
 
AR は、エンドランを表す変数です。つまりエンドランを仕掛けていた場合。この場合、ランナーが飛び出していて戻れないので、トリプルプレーになります。


                            MsgBox "ランナーとびだしている!矢のような送球!アウト!" & Chr(13) & _
                                    "なんとトリプルプレー!", , "トリプルプレー!"

​​                    End If
​​

                Else

​​’IF構文が入り組んでいてわけがわかりません。
ここのElseは、今回青文字にしたIFのつづきです。つまり、
​R1 + R2 + R3 > 0 And Out < 2 でないなら。
つまり、走者はいないし、アウトカウントも2アウトより小さい。
その場合、単独アウトで、ゲーム続行ですね。


                    WavePath = ActiveWorkbook.Path & "\out.wav"
                    MsgBox "とびついてとった!ファインプレー!", , "とられた!"
                    Out = Out + 1
                    Cells(5, 11 + Out).Value = "●"

                ​End If​
               
            Else

​​’青のEndIFが入ると青のIFの話が終わりましたが、赤字のIFの話が続いています。あ~、ややこしい。
 やっと、ようやく、「ぞろ目だけれど6のぞろ目じゃないとき」の話です。
 この場合、「ホームラン性の当たり」=長打として、処理します。


                If Range("K8") >= 2 Then

​​’K8番地は何があるか、見てください。
 はい。バッターの走力表示ですね。
 打ったバッターの走力が2以上なら、足が速いので3ベースにします。
 「走力」は、足が遅ければ「1」、普通なら「1.5」、速ければ「2」というようなルールで入力されています。

                    MsgBox "あわやホームランという当たり!" & Chr(13) & _
                            Range("H6") & " 速い! これは3塁まで行けそうだ!", , "3ベース!"
                    Call 走者判定3B
                    HitIn

                    R3 = Range("K8")
                    Range("N10") = Range("H6")
                    Range("N11") = R3

                Else
                    MsgBox "あわやホームランという当たり! 2ベース!", , "2ベース!"
                    Call 走者判定2B
       (略)
                End If
            End If
            'ぞろ目ここまで

​​​’やっと、ぞろ目の時の条件分岐が終わりました。
 IFの中にIFが入りまくって、わけが分からなかったですね・・・。
 このあと、「ぞろ目でないけれど、和が偶数のとき」が続きます。

    Else  'ぞろ目でなく和が偶数のとき

​​​’以下、略・・・

==========================

IFばっかりでいやになったので、これでいったん終わります。
せっかく最初の条件分岐でSelect Case を使ったのに、その中にこれだけIFを入れ子構造で入れまくると、「このElseIFはどこのElseなの?」「このEndIFはどこのIF?」とわけがわかりません。
全く悪い例です。(笑)


【今日のまとめ】 条件分岐が複雑化すると

​​​     いやになる​

​いちおう、IF構文の中にIF構文を入れるときには、文字を書くスタート位置を右にずらしているのですが、その程度の違いでは、構造が捉えにくくなってしまいました。

プログラマー自身にも捉えにくい構造は、バグの温床になります。
EndIFを入力し忘れていて、プログラマー自身は終わっていたつもりのIFの話がコンピュータにとっては終わっていなくて・・・ということがよくあります。

ほんとに、いやになるので、なるべくなら、やめましょう。

ただ、あえて挑戦するというなら・・・

​パソコン画面以外に、条件分岐をまとめて「見える化」したものを、必ず作りましょう。​

一般には​フローチャート​を使うことが多いです。
(参考リンク▼5. VBA(for Excel)とフローチャート

僕の場合はどうしてたか・・・

なんと、大学時代に書いたこのゲームのプログラミングのメモを見つけました。




汚い字です。
えんぴつで見えにくいですが、「情報処理学」と書いてあります。

そういえば、大学の「情報処理学」の授業で、このゲームの原型となるプログラムをせっせと打っていたのでした。

そのときのメモが、こちら。



まったく見やすくありません。

これまた、悪い例です。

ちなみに、エクセルのVBAではなく、BASICだったので、行番号がメモってあります。
なつかしい。(>_<)


次回はこんなわけの分からない世界からはおさらばしたいと思いつつ、今回はこれでおわり!

次回、誰も読んでくれなかったらどうしよう。。。(^^;)

約束します。
次回は単純な話をします!!





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

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


PR

Profile

にかとま

にかとま

Category

Keyword Search

▼キーワード検索

Free Space

Calendar

Archives

2024.11

Favorite Blog

米酢を加える 2024.… New! 森3087さん

Comments


© Rakuten Group, Inc.