全21件 (21件中 1-21件目)
1
5月9日の日記で書いていたエクセル入力フォームを作ってみたのゲームファイルが、ようやくVectorで公開されました。▼自作ゲーム「脳内野球」のサイト http://hp.vector.co.jp/authors/VA029485/NounaiYakyuu.htmlVectorでダウロードして開くと、僕の環境では以下の画面が出てびっくり!上の画面写真内にも書き込んでいますが、システムに影響を与えるようなことは一切していないので、安心して開いてください。システムにインストールするゲームではなく、単純に複数のファイルを1つに圧縮しているファイルです。ゲームのタイトル画面が、以前と少しだけ変わっています。「オリジナルチームを作る」というボタンが加わっています!たとえば、「チーム情報」というボタンをその後の画面で押すと、次のような入力フォームが出てきます。「登録」を押すと、表示されている情報にエクセルデータが差し変わるようになっています。初期入力情報で「安心タイガース」と書いてあるのは、今年は阪神が好調なのでちょっと遊んでみました。実際には、自分の好きなチーム名を入力してください。↓たとえば、僕はこんなふうに入れてみました。選手一人一人も、登録できます。選手の番号を指定すると、その選手番号のデータが差し変わります。↓その後、「試合に行く」を押すと、選手の顔画像を設定する画面に飛ぶのですが、エクセルのセル内に好きな顔を描くのは少々難しいので、何もせずに試合に行けばいいと思います。自分が入力した内容が反映されているだけで、なんだかワクワクします。これを機会に、自分で考えてエクセル上に反映させる楽しみをいろんな人に体験してほしいなあ。(関連する過去記事)▼エクセル入力フォームを作ってみた(2021年5月9日の日記)
2021.05.21
コメント(0)
昨日、無事通算2000回目の記事をアップすることができました。アップした後で「全2000件」と表示されたのを感慨深く見ておりました。 ↓これです。(^0^)さて、1999回目のときに予告していたエクセルゲーム「脳内野球」の最新バージョン2.1が、Vectorの審査を通り、本日、無事公開されました。1週間くらいかかると思っていたら、今回はかなり審査が早かったです。Vectorのサイトでダウンロードできますので、ぜひダウンロードしてみてください! ▼▼▼「脳内野球」のダウンロードページを直で開く!!!2000回のときの「今後に向けて」で書いたコラボレーションについてもいろいろやっていけそうなゲームになっています。「ゲーム内のデータを部分的に置き換えることで、 オリジナルの要素を少しずつ追加していく」という遊び方を推奨しています。自分のアイデアだけで最初から最後まで埋め尽くすのは、かなり時間と手間がかかります。だからこそ、「プログラムの中の一部分の要素だけを置き換える」これからは、そういう 参加→体験→創造のゲームの時代が来ると思っています。そして、「自分なら、こうした!」という、あなたなりの反映結果を、ぜひ知らせてもらえたら、うれしいです!(関連する過去記事)▼野球好きな子が学習用語をいつのまにか覚えるかもしれないゲーム「脳内野球」 (2021/01/23の日記)
2021.03.31
コメント(0)
昨日の続きです。エクセルで画像をデータベースから呼び出す方法 その2!実は、昨日のやり方だと、僕の以前作ったエクセルゲームが、なかなかうまく動かなかったのです。僕の作ったゲームは、エクセルのデータファイルとゲームファイルが別になっています。これは、なかなか画期的。(笑)他のファイルのデータを参照しに行くので、その分複雑になります。で、野球ゲームなので先攻・後攻で参照するチームが変わるなど、どのチームの誰を表示させるのかというのが、番号だとこんがらがってきて、頭から煙が出てきました。プログラムがうまく動作しなくて「ウキーー」とサルになって暴れ出しました。複雑なことを処理するにはVBAというプログラム上でコードを記述するしかないのですが、VBA上だとR1C1参照形式で書かないといけないので、それもさらに混乱の原因に。そういうわけで、精神的安定を取り戻すため、別の方法を探ることにしました。探してみたら、わりとすぐに見つかりました。どんなことにでも別の方法というものは、あるものです。それが、こちら!▼数式を使って「画像」を表示させる(その2)(ブログ「事務作業の省力化や資料作成に役立つ、Excelの使い方を紹介」様)結論としては、こちらを採用して、うまくいきました!VBAをさわらずに実現できました。セルに名前を付けることで、その名前がどこにあろうと参照しに行くことができます。うーむ、便利!図のリンク貼り付けについては、こちらの基礎解説も参考にさせていただきました。▼図のリンク貼り付け (「なんだ!カンタン!Excel塾」様)画像以外でも、複数データの入った範囲を「図として」参照するということができるので、応用範囲は広そうです。というか、なんでこんなことができるんだエクセル。すごすぎる!ちなみに、画像を置いたセルに名前をつけた後、「リンクされた図の貼り付け」をするのは、右クリックメニューからもできました。ただ、別のエクセルファイル間では同じ名前が共有されないようだったので、キャラクター画像のデータベースは、チームデータファイル上ではなく、ゲームファイル上に持っていきました。また、セルに付ける名前にはルールがあって、記号がことごとく「_」に変換されてしまいました。打者と投手の画像の向きを分けるために、選手名の始めに打者は「B:」、投手は「P:」と表示させたかったのですが、ほかの記号に変えてもうまくいかないので、ここでまた「ムキーーー」となってしまいました。調べたら割と早く「記号はアンダーバーしか使えない」ことが分かったのですけどね。(^^;)最終的に、打者は「B_」、投手は「P_」をつけて表示させることで、やりたかったことは実装できました。ちなみに、あるセルの文字列に他の文字列をガッチャンコする数式は、 ="B_"&A1(セルの番地)のようになります。こういうのは、なにげにたまに使うワザですね。最後に、上のリンク先サイト様でちゃんと解説していただいているのですが、「参照が正しくありません」と言われるエラーが頻発してずいぶん困らされました。INDIRECT関数の参照先が空白だとエラーになるので、空白を避けなくてはいけません。エラーになるとなかなか抜けられなくてアリジゴクみたいでした。Esc(エスケープ)キーを押して脱出できましたが、それに気づくまで10分くらいかかりました。 ※※※サンプルチームデータ製作協力者募集※※※ エクセル野球シミュレーションゲーム「脳内野球」は、 現在バージョン2.0に向けて改善作業中です。 このゲームに登場するチームデータを作ってくださる方を募集します。 メールで連絡いただければ、作成途中のプログラムを送付します。 キャラクターの名前やワザの名前、能力値、横向きの画像を入れて ご返却ください。(画像は自分で描くかフリー画像を利用ください) 作成自体は、非常にカンタンです。技術はいりません。 締め切りは2月22日です。 面白いアイデアはバージョン2.0の初期チームに入れさせていただきます。 (ただし、他人の著作権や肖像権に引っかかるものは採用できません。 実在の野球選手はNGなので、歴史上の人物や動物、植物、鉱物、国などの擬人化でお願いします。(個人的には、ネコのチームを作ってほしいにゃん) メール:nikka★joy.email.ne.jp(★を@に変えてください。) 件名を「脳内野球バージョン2に協力します」にしてください。▼エクセル野球シミュレーション「脳内野球」のホームページ
2021.02.17
コメント(0)
エクセルで画像をデータベースから検索表示できるワザがあります。なんと、数式の入力で実現できるのです。びっくり!3日前に、ネット上でこのやり方を発見したときは、小躍りしました。これはいろいろと使えそうだな、と思ってワクワクしました。↓それが、これです!▼画像をVLOOKUP関数のように表示させるテクニック (Excel業務カイゼンブログ様)上の記事の中では、INDEX関数とMATCH関数を使って、VLOOKUP関数と同じようなことを実現しています。VLOOKUP関数というのは、データベースの範囲内から検索して見つけてくる関数です。INDEX関数とMATCH関数というのは・・・僕はすっかり忘れていたので、同じExcel業務カイゼンブログ様の違うページで解説を読みました。(^^;)▼INDEX関数とMATCH関数 (Excel業務カイゼンブログ様)ちょっと難しくて分からなかったのですが(^^;)=INDEX(実際に求める値の範囲,MATCH(検索値,検索する値の範囲,0))という使い方で、VLOOKUP関数と同じようなことができるようです。理屈は分かっていなくても、範囲のところを自分のエクセルファイルで指定し直せば、やりたいことは実現できるので、結果オーライです。昨日は振替休日で時間があったので、このワザを使って、僕が作ったエクセルゲーム「脳内野球」のバージョンアップを図りました。↓こんな感じです!ゲームとして実装するにはもう少し時間がかかりそうですが、キャラクターの名前に合致する画像を読み込んでくることで、より一層見た目に楽しいプログラムが作れそうです。昨日は結局まる1日費やしてエクセル上のゲーム作りをしていました。その中で、「エクセルで画像をデータベースから呼び出す方法」には、上のやり方とは別のやり方があることも判明しました。別のやり方については、また明日の記事で書きます!あと、上の画面写真で少し見えていますが、全都道府県に顔を付けてキャラクター化するということを昨日行ないました。後日、全キャラを紹介する予定です。都道府県の形に顔を描いてキャラクターっぽくする作業が、意外に面白くて、笑いながらやっていました。
2021.02.16
コメント(0)
昨年このブログ内で連載していた【Excelプログラミング講座】を、加筆修正して電子書籍にまとめました。Amazon Kindleにてご覧いただけます。よろしければ、ぜひお読みいただければと思います。(Kindle Unlimited会員は、無料です!)エクセルで作ったゲームを解説してみた。 〜プログラミングのしくみとゲーム作り〜 Kindle版========================・ゲームを作ってみたい人のために、実際のゲーム作りの指針を伝授!・エクセル野球シミュレーションゲーム「ダイナミック・ベースボール」が題材!・同ゲームのプログラミング実物を引用しながら、コードの意味を解説!========================なお、電子書籍化に際しては、次の本を参考にさせていただきました。『AmazonのKindleで自分の本を出す方法』(山崎潤一郎、ソフトバンク クリエイティブ、2013、約1300円)AmazonのKindleで自分の本を出す方法【電子書籍】[ 山崎 潤一郎 ]これで、「本を出す」という夢が、かないました。電子書籍出版は、思ったより、カンタンでした。次も、出そうかな。ちなみに、プログラミングと言えば、現在、HSPプログラミングを少しずつ勉強中です。エクセル野球ゲームの次は、将棋の新ルールゲームアプリをiOSで遊べるものを出したいな~と思っています。応援いただければ、幸いです。
2019.02.03
コメント(0)
【Excelプログラミング講座】第13回です。 この講座では、エクセル野球シミュレーション「ダイナミックベースボール」のゲームプログラムを材料として、エクセルVBAでのプログラミングを解説していきました。今回が最終回です。 ▼ダイナミック・ベースボールのページ 過去記事をまとめたサイト↓ ▼エクセルプログラミング講座 連載を真面目に読んでくださった方、長々とお付き合いいただきありがとうございました。最後の「未解決バグに挑戦」は「こうか?ああか?」と右往左往してすっきりしない記事になりました。大変申し訳ないです。あまりにもわけが分からない内容につき、即刻記事を削除して「なかったこと」にしようかと思いましたが、若気の至りということで、一応置いておきます。まだ僕も若かったんだなあ。としみじみとしております。連載記事の今後ですが、全体をもう少しすっきりさせて、kindle電子書籍の形でまとめようかと思っています。そのうち、と言ってもいつになるかわかりませんが、年内を予定にがんばってみます。その際には書き下ろしのおまけ記事も追加する予定です。今のところ、「ゲーム中毒のカラクリ」という見出しで、ゲームがやめられなくなる仕掛けについての考察を入れる予定です。これはもしかしたら門外不出の超ヒミツかもしれない、と思っています。完成したらまた読んでもらえたら幸いです。では、ここまでの連載内容を振り返ってみましょう。==========================開催予告 2018.6.4第1回 エクセルにマッチするゲームとは 2018.6.20第2回 プログラミング成功のためのカギとは 2018.6.27第3回「ゲーム」を作ると、頭がよくなる! 2018.7.4 第4回 ゲームとしての核心部分を追求しよう! 2018.7.11 第5回 条件分岐のプログラミング2018.7.18 第6回 ホームランの時のプログラム 2018.7.25 第7回 「もし」の話が続いたら、どうなるか?2018.8.1 第8回 場合の数を「一目瞭然」にしよう 2018.8.8公開 第9回 デバッグをしよう!2018.8.22 第10回 未解決バグに挑戦!(その1)2018.8.29 第11回 未解決バグに挑戦!(その2)2018.9.5 第12回未解決バグに挑戦!(その3) 2018.9.12==========================さて、この連載が、「エクセルでゲームを作るときのプログラミングがわかる」というねらいに沿ったものだったかどうか?みなさんの評価はどうでしょうか?「プログラミング」という言葉が指し示す範囲はあまりに広範囲です。世の中にはいろいろなプログラミング言語があり、使用できるソフトウェアも様々です。その中から、「エクセル」では何ができるか、何をやりやすいか、というのを最初の方に書きました。( 第1回エクセルにマッチするゲームとは)簡単に言うと、「データ管理ができるので、データを生かすゲームが作りやすい」ということですね。次に、ゲームプログラムの全体構造を概観しました。画面に表示するのが「フォーム」、こういうときにはこうしなさいという命令が「コード」です。プログラムとは一般に、プログラムコードを指すことが多いですね。ちなみに、フォームもコードもひっくるめたプログラム全体を、エクセルVBAでは「プロジェクト」と言います。かっこいいですね、プロジェクト。エクセルでプログラムを組んだら、あなたも立派なプロジェクトリーダーです。そのうち「プロジェクトX」にも出られるかもしれません。いいですね。プログラムの中ではいろいろな「変数」を使用します。XでもYでも何でもいいんですが、その中に入る内容が、場合によって変わるのが、変数です。一つ前のプログラムコードでユーザーが何をしたかを格納したりする等、いろいろな使い方があります。変数は基本的に、それがどういう型のどういうものであるかを「宣言」する必要がありました。たとえば・Dice1:サイコロその1 が出す、ダイスの目 ・Dice2:サイコロその2 が出す、ダイスの目というのが、モデルにしたゲーム内の代表的な「変数」でした。ランダム変数を使えば、「1から6までのランダムな整数」などの設定もできます。そうです、プログラム上で、実際にサイコロを振ったのと全く同じことができるのです。逆を言えば、プログラミングさせたいことを実物のサイコロを振ってゲームプログラムと同じことができます。つまり、コンピュータに頼らないアナログゲームとしてサイコロを使うゲームをまず考えて、それをゲーム化することが初心者向きです。これは本当におすすめです。頭の中だけでゲームを考えるのは、とてもハードルが高いのです。第3回「ゲーム」を作ると、頭がよくなる!では、エクセルのことに全く触れずに、「プログラミング的思考」の重要性について語りました。ゲームを作ることは、決してプログラミングをすることではありません。紙と鉛筆でゲームを作ることもできるし、発想次第、思考次第です。第4回では、プログラミング関係なしに、「ゲーム」を作る上での重要ポイントを書きました。すべてのものづくりに通じるかもしれませんが・・・そのゲームのウリを焦点化し、それ以外の部分を思い切って捨てることです。初心者にありがちなのは、なんでもかんでも詰め込みすぎてしまうことです。ゲームとしてのオリジナリティを出すために、積極的に魅力を特化しましょう。第5回以降はやっと具体的なエクセルVBAプログラム解説講座っぽく具体的になっていきます。ただ、第5回以降、ほとんど「条件分岐」の話しかしていません。何しろモデルになったゲームが全てが条件分岐でできているようなゲームですので・・・。そういうわけで、かなり偏った記事だったかと思いますが、もしかしてほんのちょっとでもお役に立っていたら、幸いです。コメントお寄せください。待っています。では、また!(毎週水曜21時の「エクセルプログラミング講座」は、ひとまずこれにて終了!)
2018.09.19
コメント(1)
【Excelプログラミング講座】第12回です。 この講座では、エクセル野球シミュレーション「ダイナミックベースボール」のゲームプログラムを材料として、エクセルVBAでのプログラミングを解説していきます。 ▼ダイナミック・ベースボールのページ 過去記事をまとめたサイト↓ ▼エクセルプログラミング講座 前々回から、未解決のまま放置していたバグの解決に乗り出しています。 簡単に言うと、「サヨナラで途中終了すると、成績反映がされずに終わっちまうときもある」というバグです。原因は、設計段階で「サヨナラで途中終了する場合」のことを想定していなかったことにあります。前回までで、「打点」と「安打数」の成績反映はできそうな見通しが立ちました。今回はいよいよ「打数」の反映の入れ込みです。 道筋としては、「打数のカウントを最初にして、送りバントの場合のみ、例外的にカウントを戻す、というやり方」をとろうとしています。 今回は、そのつづき! 果たして今まで放置していたバグが解決できるか? 打数の成績反映のコマンドは、 Call SeisekiB(Range("H6"), 22)でした。現在の打数反映コマンドがどの場所にあるか、まず調べておきましょう。Crtlキーを押しながら”F"で、「検索」でしたね。検索窓に、「Call SeisekiB(Range("H6"), 22)」を貼り付けます。このとき、検索条件を指定できます。今回は、ゲームプログラム全体から検索したいので、「カレントプロジェクト」を選びます。もしも、1つのサブルーチンとか、あるプロシージャの中だけを探すときは「カレントプロシージャ」、今いる「Module1」などのモジュール全体の中から探すときは「カレントモジュール」を選びます。右側に「置換」もありますね。Wordでもそうですが、検索と置換はうまく使うとかなり便利です。今まで使いこなしていない人には、超おすすめの便利機能ですよ。で、検索すると、該当箇所が反転表示されて、見つかります。もう一度検索すると、別の該当場所に移動します。確認すると、該当箇所は2つ。「HR(ホームラン)ねらい」と「飛球判定」の最後。いずれも、その打席が終わって、次の打者に切り替わるか、チェンジを迎える直前に打数の成績反映がされています。ん?今回のエラー、「ホームランの時は記録されるのに」と報告されていましたが、この2カ所しかないということは、サヨナラホームランの場合もやはり打数は記録されないようです。そうなると、話は早い!前回、「サヨナラの処理」のところだけに入れれば話が済むんじゃないか、と言っていた理屈が、通るようになります。そんなわけで、Sub「ScoreIn」の「Call SeisekiP」の下に、打数の成績反映も付け足します。=========================== 'サヨナラの処理 If Range("O3") <> "" And Range("Q3") > Range("Q2") Then Call SeisekiP(Range("O6"), 22) Call SeisekiB(Range("H6"), 22) Y = 3 'Y=3でwinningを処理 MIDIstop Winning End End If===========================これで、エラー改善ができたはず!以下、確認作業です。これまでの修正箇所を、7回制変更プログラムにも反映させ、7回制の試合で実際にサヨナラ処理を起こさせて、結果を見てみます。エクセルのスコアボードは、実は自由に数値入力できるので(!)得点は自由に操作しながら、7回裏まで試合を進行させます。ヒットやホームランを打つかどうかは運任せですが、相手投手をヘボ投手に選手交代し、少しでも確率を上げます。ちなみに、「勝負!」ボタンだけはマウスでクリックしなければなりませんが、ダイアログボックスはキーボードのEnterキーで次に進むので、急いでいるときはEnterキー押しまくりでかなり高速進行できます。再現に挑戦した1回目。おっと、サヨナラホームランになってしまいました。サヨナラホームランの打者成績反映はやはり完璧であることを確認する結果となりました。(--;)気を取り直して2回目。今度は、サヨナラ2ベース。さっそく打者成績を見に行くと、おっと打点が入っていない。そういえばこの連載記事の中ではちゃんと打点の反映方法に触れていませんでした。(打点の反映方法は、バグ報告へのコメントの回答欄に以前書いていたのでした。)そちらも反映し、見事、バグ取り、完成です。バグ取りが本当に出来たかどうかの確認のため試合をしないといけないのは面倒ですが、これは大事なところ。本当に直ったかどうか、まず自分で確認することは大事です。そんなわけで、未解決バグは、見事解決されました!解決済みバージョン3.3は近いうちに公開します!(^0^)
2018.09.12
コメント(0)
【Excelプログラミング講座】第11回です。 この講座では、エクセル野球シミュレーション「ダイナミックベースボール」のゲームプログラムを材料として、エクセルVBAでのプログラミングを解説していきます。 ▼ダイナミック・ベースボールのページ 過去記事をまとめたサイト↓ ▼エクセルプログラミング講座 前回から、なかなかやっかいなバグの解決に乗り出しています。簡単に言うと、「サヨナラで途中終了すると、成績反映がされずに終わっちまうときもある」というバグです。原因は、なんと設計段階でサヨナラで途中終了する場合のことを想定していなかった!そういうわけで「今更どうやって入れ込むよ」という状態なのですが、強引になんとか解決を図りたいと思います。道筋としては、「打数と安打数のカウントを最初にして、送りバントの場合のみ、例外的にカウントを戻す、というやり方」をとろうとしています。今回は、そのつづき!果たして今まで放置していたバグが解決できるか?前回は「打数」のカウントのみにまず着目しましたね。そこで、今日は「安打数」のカウントについても、そのタイミングを調べておきましょう。安打数をカウントする命令は Call SeisekiB(Range("H6"), 20)でした。Call SeisekiB(Range("H6")までが、打者成績のカウント命令に共通する部分で、その後の数字が「20」なら安打数なのでした。この「20」は目的のセルの列番号を表しているのでした。たとえばヒットを打ったときなら、=========================== MsgBox "うまく打ちました!ヒット!", , "ヒット!" Call 走者判定HIT HitIn Call SeisekiB(Range("H6"), 20)===========================となっています。検索(Ctrl+”F”)で調べましたが、どこも「HitIn」とセットになっていますね。この「HitIn」、怪しいけど、その中身は?「HitIn」のサブルーチンを見てみると、意外にも、非常に短いプログラム。===========================Sub HitIn() If N Mod 2 = 0 Then '表のとき Range("R2") = Range("R2") + 1 Else '裏のとき Range("R3") = Range("R3") + 1 End IfEnd Sub===========================これは、スコアボードの各チームの「累計ヒット数」のカウントをプラスするプログラムですね。今回の成績処理には関係ありません。なあんだ。「サヨナラの処理」があるのは、「ScoreIn」、つまり得点が入ったときのサブルーチン。ずばり、そうでしょう。「ScoreIn」を見てみると、ありました。次のところです。=========================== 'サヨナラの処理 If Range("O3") <> "" And Range("Q3") > Range("Q2") Then Call SeisekiP(Range("O6"), 22) Y = 3 'Y=3でwinningを処理 MIDIstop Winning End End If===========================サヨナラヒットの場合は打数と安打数のカウントがされないということだったので、「だったら、ここにカウントするプログラムを追加するだけで済むんじゃねえの?」と思われる方もいるでしょうが・・・問題は、「ホームランの時はカウントされる」というところ。ある条件だけで発生するバグへの対応なのに、得点処理ScoreInに書いてしまうと、すべての条件でカウントがされてしまい、別ルートをたどってきた条件では二重処理がされてしまうリスクがあります。そんなわけで、面倒がらずにそれぞれのルートを確認します。ホームランの時のサヨナラ処理がたどるルートは・・・たとえば3塁ランナーがいた場合だと、=========================== MsgBox "3塁ランナーホームイン!!", , "ホームラン!" Call SeisekiB(Range("H6"), 16) Call SeisekiP(Range("O6"), 20) ScoreIn=========================== と書いてあります。うん。ちゃんと打者成績処理(打点)が 「ScoreIn」の前に来ています。ここからさかのぼってランナー条件を見る以前に戻ると、ホームランだと表示させたときにすでに=========================== HitIn Call SeisekiB(Range("H6"), 14) Call SeisekiB(Range("H6"), 16) Call SeisekiB(Range("H6"), 20) Call SeisekiP(Range("O6"), 20)=========================== という打者成績処理もしています。SeisekiB(Range("H6"), 16)の打点処理は、ランナーが帰ってくるたびにプラスしているので、この表記で、合っていますね。では、ホームラン以外の場合はどうか。ホームラン以外の場合は、走者がホームインしたかどうかを読み取らないといけません。この分岐は、「Module Runnner」にあります。おや。この場合もホームランのときと同じですね。打者成績処理は、数字が16。16は打点です。なんと。違いは見いだせず!サブルーチン処理に違いがないので、分岐前の「飛球判定」に戻ってきてからの処理を見てみます。ホームランの場合は「ScoreIn」の前に、「 Call SeisekiB(Range("H6"), 20)」(安打数のカウント)が、ありました。ホームラン以外の場合は、「ScoreIn」は「走者判定」に含まれるので、打者成績処理が「走者判定」の前にないといけないのですが・・・たとえば3塁打の場合、=========================== Call 走者判定3B HitIn Call SeisekiB(Range("H6"), 20)=========================== おっと、思いっきり、逆でした。これは単純に順序の入れ替えでいけそうです。「安打数のカウント」については、以下の対応でクリアできると思います。「 Call 走者判定○○」の前に、「Call SeisekiB(Range("H6"), 20)」を持ってくる。場所は「Module1」の「飛球判定」の中です。該当箇所の「Call SeisekiB(Range("H6"), 20)」を切り取り、「 Call 走者判定○○」の前に挿入し、「 Call 走者判定○○」を切り取って「Call SeisekiB(Range("H6"), 20)」が合った場所に移します。切り取りのキーボードショートカットはOKですか?コピーはCtrl+”C”でしたが、切り取りはCtrl+”X”ですね。念のため。キーボードでサクサク修正作業を進められないとまどろっこしくてしょうがないので、自由自在にできるようになっておきましょう。なにしろ同じような修正箇所が多いですから・・・。ちなみに「HitIn」とは順序が前後しても構いませんよね。すでに見たように、「HitIn」はスコアボードのヒット数表示だけに関わるプログラム。そのため、カットペーストを繰り返すのが面倒なら、「 Call 走者判定○○」のみを切り取って、「Call SeisekiB(Range("H6"), 20)」の後に移し替えるだけでもOKです。これで、安打数のカウントに関してはクリアできました。まだ完全にバグ対応が終わっていませんが・・・またまた長くなったので、続きはまた次回!なお、デバッグにおいては、何をどこまで作業したのかを記録しておくことが重要です。今回の場合、修正したファイルの「情報」タブに、以下のような追記をして、まだ途中だという意味を込めて赤字で目立たせておきました。これは自分用のメモですが、修正版を公開したときにもこういったバグ修正情報は必要なので、体裁を整えて情報を残すようにします。↑自分用のメモ。今はまだ僕の自宅PCのファイルでしか見られない。それではまた来週!次回こそ、修正バージョン完成か!?
2018.09.05
コメント(0)
【Excelプログラミング講座】第10回です。 この講座では、エクセル野球シミュレーション「ダイナミックベースボール」のゲームプログラムを材料として、エクセルVBAでのプログラミングを解説していきます。 ▼ダイナミック・ベースボールのページ 過去記事をまとめたサイト↓ ▼エクセルプログラミング講座 前回は、デバッグの手順について。(1)再現を試みる (2)原因を突き止める (3)プログラムを修正する (4)動作確認という話をしました。 今回は、前回の続きです。未解決だったバグの改善に挑みます!前回参照したブログのコメント欄に寄せられたバグ報告のうち、未解決だったバグがあります。【エラー内容】 ・サヨナラ勝ちの場合、ホームランの時はその打者に打点と安打がカウントされるが、サヨナラヒットの時には、打者に打点、打数、安打が反映されない。この連載もついに第10回を迎えたので、最後の大仕事として、このバグの改善に挑みます!なお、リンク先のコメント欄を見てもらうと分かると思いますが、僕は「打点のカウント」だけされるところまで改善できたものの、その後の対処ができずに、投げ出していました。ブログ記事を書きながらプログラム構造をだいぶ読み返すことが出来たので、今こそ再挑戦です。【エラー報告を受けた直後の思考と対応】 ・ホームランの時は、例えば Call SeisekiB(Range("H6"), 16) Call SeisekiP(Range("O6"), 20) ScoreInのように、成績反映 が、ScoreIn(得点処理)より先になっているのに比べて、他のケースが逆になっているからだと思う。・プログラムコード表示画面において、Ctrlキーを押しながらFキーを押して「検索」画面を表示し、「ScoreIn」を検索して、怪しいところの順番を変えて、対処しよう。バグの原因を予測し、プログラム処理の順序に着目して、順序を入れ替えることで解決できるという見通しを持っています。その基本方針自体はいいと思うのですが・・・。さて、バグ改善をする前に、このバグに関係するプログラムコードの情報を確認しておきます。打者成績のワークシートにおけるそれぞれのデータの場所(セルの番地)です。以下の画像は、セルの番地を示す番号を、打点や安打数などの数字としてそれぞれ入力したものです。すなわち、本塁打=14(左から14番目の場所) 打点=16 盗塁数=18 安打数=20 打数=22がそれぞれのデータの位置情報です。上の写真では「V6」というセルの番地が選択されていますが、これをプログラム上で表記すると、「V」というのは左から22番目なので、こういう指定の仕方をするわけです。「V」という列番号を数字で表したのが「22」です。つまり、プログラムコードにおけるCall SeisekiB(Range("H6"), 16)は、打点に対応しています。同様に、Call SeisekiB(Range("H6"), 20)なら安打数。Call SeisekiB(Range("H6"), 22)なら打席数です。さて、打点の場合はうまく順序を入れ替えたものの、安打数と打数のカウントについては僕は以前あきらめています。その理由は、「打数と安打数のカウントが今の仕様だとサヨナラで途中終了する場所と完全に離れているので、打数と安打数がカウントできない」というものでした。プログラムを書いたときには、ヒットを判定する分岐(サブルーチン)に飛んで、そのままサヨナラヒットで試合終了する場合を想定できていなかったということです。こうなるとなかなか難しいものがあります。しかし、落ち着いて考えれば何とかなるかもしれません。難しいケースは、小分けにして考えなければいけません。一気に解決を図るのではなく、小分けにして各個撃破を狙います。まず、「打数」のカウント。「打数のカウント」は、新打者がバッターになってすぐにカウントするぐらい前の方に持ってくればよさそうですが・・・実は打数にカウントされない例外的な場合があるので、それに気をつけないといけません。例外的な場合とは、「送りバント」の場合です。野球に詳しい方はご存じですが、送りバントに成功した場合、打数にも安打数にも記録されません。つまり、ユーザーがいつ「バント」ボタンを押すかどうか分からないので、打数のカウントを最初に行ってしまうわけにはいかなかったのです。実際のプログラムを見てみましょう。バントの場合のサブルーチンは、「Module3」の場所にあります。「Module3」の「バント」のプログラムを見ると、セーフティバントの時のみ、打数と安打数を反映する記述があります。~~~~~~~~~~~~~~~~~~~~~~~~BantSafe: MsgBox ("1塁送球~セーフ!!"), , "バント!" Call SeisekiB(Range("H6"), 22) Call SeisekiB(Range("H6"), 20) '※バント後自分が生きたら、特別にヒットとみなす。 (略) GoTo Nextbatter Exit Sub BantOut: MsgBox ("1塁送球~アウト!!"), , "バント!" If Dice2 = 3 Then Call SeisekiB(Range("H6"), 22) '※セーフティバントのとき、打数をカウントする。 End If~~~~~~~~~~~~~~~~~~~~~~~~ バントのところはできればいじりたくないですが・・・そうなると、「打数と安打数のカウントが今の仕様だとサヨナラで途中終了する場所と完全に離れているので、打数と安打数がカウントできない」の罠にはまってしまいます。そこで・・・逆転の発想で、打数と安打数のカウントを最後の最後から最初の最初に移し、バントの場合のみ例外的にカウントを戻す、というやり方で、なんとか実現したいと思います。長くなりましたので、この続きは、また次回!次回には、バグが直っているかな~??P.S.今回この連載講座の更新が約30分遅れましたことをお詫びします。 (予定では水曜21時の予定だったのですが、、、21:30になってしまいました。)
2018.08.29
コメント(0)
【Excelプログラミング講座】第9回です。 この講座では、エクセル野球シミュレーション「ダイナミックベースボール」のゲームプログラムを材料として、エクセルVBAでのプログラミングを初心者向けに解説していきます。 ▼ダイナミック・ベースボールのページ 過去記事をまとめたサイト↓ ▼エクセルプログラミング講座 前回は、条件分岐が複雑化すると何がどうなっているか分かりにくくなるので、 「ノートにすべての場合を書き出し、一目瞭然にしておく」という話をしました。お盆休みをはさんだので、もう忘れてますか?そんなときは、前回をもう1度見に行ってください。(この連載記事にどれだけの需要があるのかは分かりませんが・・・) さて、そんなふうにすべての場合を想定してプログラムを組んだとしても、人間のやることですから、分岐によってはうまく作動せず、エラーになることが多いです。エジソンも言いました。失敗は成功の元。プログラムのエラーは、あって当たり前。そのエラーをすべて見つけて、ことごとく修正していくことによって、完成していくのです。「ダイナミックベースボール」は公開後10年以上経ちますが、いまだにエラーが発見されます。エラーを見つけることをデバッグ(バグとり)といいます。ゲーム会社では、デバッグ専用の人たちが日夜テストプレイに明け暮れます。一般ユーザーがどんな操作をするか分からないので、ありとあらゆることをやってみて、プログラムが誤作動しないかチェックするのです。で、今回はそうやって見つかったバグ(エラー)をどう修正するか、を実例で紹介します。「にかとまは、実は野球ゲームを作っています 」という僕のブログ記事に寄せられた実際のバグ報告を元に、紹介します。【エラー内容】・セーフティバントをした打者がアウトになった場合に 打数が2増えてしまいます。【エラー報告を聞いたときの思考】・打者成績の細かいところまでよく見てくれてる!・打数が1増えるべきところを2増えていると言うことは、二重に処理されているかな?・セーフティバントをした後のプログラムの処理を順に追っていこう。【デバッグの実際】(1)再現を試みるエラー報告のとおりに自分もやって、同じことが起きるかどうか、確認します。今回のエラーの発生条件は、「セーフティバントをしたとき」なので、再現が容易です。セーフティバントをして、すぐに打者成績のワークシートを見てみると、確かに、打数が2増えていました。(2)原因を突き止める「バント」ボタンを押したときのプログラムは、標準モジュール3 の 「バント」のところに書いてあります。バント処理の最初の条件分岐は、ランナーの有無が条件。セーフティバントとはランナーがない状態のバントなので、記述をず~っと下に行くと、以下の箇所があります。~~~~~~~~~~~~~~~~~~~~~~~~ MsgBox ("なんとセーフティバント~!!"), , "バント!" Call SeisekiB(Range("H6"), 22)~~~~~~~~~~~~~~~~~~~~~~~~Call SeisekiB(Range("H6"), 22) の意味は、 バッター成績反映のサブルーチン(SeisekiB)を呼び出し DB_main.xlsの”H6"番地のセル=選手名を、 DB_teamdata.xlsで検索し、22番目の列=「打数」を1増やすすなわち、ここでいったん打数が1増えています。その語の記述を追っていくと、やはり!Call SeisekiB(Range("H6"), 22)という、打数を1増やす命令がまた出てきました。二重処理がめだたく見つかりました。あとは、どちらかを削除すればいいわけです。さて、どっちをとるか?どっちをとってもいいのですが、条件分岐の中の処理をとるよりも、条件分岐する前の処理をとったほうがわかりやすいので、最初のをとることにします。(3)プログラムを修正する~~~~~~~~~~~~~~~~~~~~~~~~ MsgBox ("なんとセーフティバント~!!"), , "バント!" Call SeisekiB(Range("H6"), 22)~~~~~~~~~~~~~~~~~~~~~~~~ここの、最初の Call SeisekiB(Range("H6"), 22)というのを、消します。これで、めだたくデバッグ終了!(4)動作確認本当にエラーが直っているかどうか、確認しなければいけません。実際に「バント」ボタンを押し、セーフティバントを敢行して、打者成績への反映具合をチェックします。直っていると、ほっとします。(^0^)【今日のまとめ】 デバッグの手順 (1)再現を試みる(2)原因を突き止める(3)プログラムを修正する(4)動作確認 完璧主義の人は、こういうバグ取りにすんごい熱意を燃やして、バグがとれるたびに歓喜に打ち震えます。そして、デバッグの苦労が大きければ大きいほど、「完成した!」と思えたときの喜びも大きくなります。テストプレイはとっても大事ですので、もちろん自分でも何度もプレイしてチェックするのですが、同じ人がデバッグすることには、限界があります。その人が考えもつかないことをやってくれることもありますので、なるべく他の多くの人にデバッグしてもらうようにしましょう。身近にそういう人がいない場合は、未完成版の時点でネット公開し、デバッグ報告を多数の方から受け付けるのも一つの方法です。さあ、あなたも、レッツ、デバッグ♪
2018.08.22
コメント(0)
【Excelプログラミング講座】第8回です。 この講座では、エクセル野球シミュレーション「ダイナミックベースボール」のプログラム実物を材料として、エクセルVBAでのプログラミングを初心者向けに解説していきます。 ▼ダイナミック・ベースボールのページ 過去記事をまとめたサイト↓ ▼エクセルプログラミング講座 前回は、バッターがボールを打った後の飛球判定プログラムを見ながら、 「もし~なら の連発で わけが分からなくなっていく」という話をしました。日常会話で考えても、そうですね。「もし君がイワシ好きならば、もし大阪に行って、もしイワシが売っているのを見たら、もしそのイワシの値段が200円未満なら、そのイワシを買いなさい。もしイワシが200円以上なら、もしタイが500円未満なら、タイを買いなさい。もし~~」こんな会話するやつはいない。こんな会話はいやだ。(^^;)しかし、プログラムというやつは、すべての状況を想定して、「この場合はこうしなさい」と言っておかないと、エラーになって止まってしまうのです。だから、「もし」の話をしだすと、「そうでない場合」も言っておかないといけないので、必然的に長くなってしまうのです。ただ、そういったことがとめどなく書いてあるプログラムを順番に見ていくのは、本当にいやになります。そこで今回は、「それってつまり、シンプルに言うと、どういうこと?」というのを掘り下げたいと思います。 前回、大学時代に書いたプログラミングのノートをお見せしました。これもまた、分かりにくいねえ、という話をしました。ただ、1カ所、「ここは分かりやすい」というところを見つけました。どこだか、分かりますか? はい、この部分です。これは、今は小6で習うことになっている「場合の数」をすべて書き出した表です。ダイス2個を振って出た組み合わせと、それによって導き出される結果(例えば「本」は「本塁打」、「O」はアウト)というのが、一目瞭然です。こういうのは、分かりやすいですね。プログラムを組む際のメモとしては、こういう表などを書いて、「場合の数」を「見れば分かる」状態にしておくといいです。手元にその表があれば、プログラムがそのすべての場合に対応しているか調べていく際にも、便利です。ランダム変数というのはいくらでも作れるわけですが、ゲーム作りの初心者のうちは、ダイスで再現可能な1~6の整数値を使うのがおすすめ。エクセルVBAでは、僕は「Dice1 = Int(6 * Rnd) + 1」と書いていましたね。ランダム変数についての詳しいことは、例によって他の方が詳しく書かれたサイトに勉強しに行ってください。▼Excel VBAで範囲を指定して乱数を生成する:Rnd,Int 上のサイト様では、最後に「今夜の夕食をランダムに選ぶプログラム」を作っています。こんなふうに、ランダム変数を使ったごく簡単なプログラムを作ると、それだけでも、けっこう面白いです。【今日のまとめ】 いろんな場合の結果を想定しないといけないときは 一目瞭然な表を作る 全部の場合の数を書き出して、想定の抜けがないかチェックするのはとっても大事です。僕は「場合の数」や「確率・統計」はとっても好きでしたが、こういった方面の勉強は、エクセルVBAでプログラムを組む際に、とっても役に立ちます。しっかり勉強しておきましょう。(^0^) さて、毎週水曜21時に公開しているこの連載記事ですが、8/15はお盆休みをいただきます。次回の公開は、8/22(水)になります。
2018.08.08
コメント(0)
【Excelプログラミング講座】第7回です。 この講座では、エクセル野球シミュレーション「ダイナミックベースボール」のプログラム実物を材料として、エクセルでのプログラミングを初心者向けに解説していきます。 ▼ダイナミック・ベースボールのページ 過去記事をまとめたサイト↓ ▼エクセルプログラミング講座 前回は、ホームランになる場合の判定プログラムを見ながら、 「条件分岐のプログラミングは、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だったので、行番号がメモってあります。 なつかしい。(>_<) 次回はこんなわけの分からない世界からはおさらばしたいと思いつつ、今回はこれでおわり! 次回、誰も読んでくれなかったらどうしよう。。。(^^;) 約束します。 次回は単純な話をします!!
2018.08.01
コメント(0)
【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
コメント(0)
【Excelプログラミング講座】第5回です。 この講座では、エクセル野球シミュレーション「ダイナミックベースボール」のプログラム実物を材料として、エクセルでのプログラミングを初心者向けに解説していきます。 ▼ダイナミック・ベースボールのページ 過去記事をまとめたサイト↓▼エクセルプログラミング講座(ダイナミックベースボールのページ内) 前回は、「焦点を当てた部分に特化する」という話をしました。特に初心者のうちは、「あれもしたい、これもしたい」では、ゲーム自体がなかなか完成しない。プログラミング内容も複雑になり、結局途中であきらめて「もうやらない」ということに・・・。ですからまず、一番やりたいことに絞って、そのプログラムを完成させ、実行させましょう。「思い通りに動いた!」という感動が、きっとあなたのエネルギーになりますよ。ではいよいよ、「野球ゲーム」としてのコアプログラムの実際に迫っていきます。前回、野球ゲームとしての本質部分は「打てるか、打てないか」にある、と書きました。単純に言うと、「Aか?Bか?」の条件分岐がこのプログラムの本質、と見なせるかと思います。では、その「Aか?Bか?」の条件分岐を具体的にどう実現していくのでしょうか?その部分、コンピュータゲーム化する前の、サイコロをふるアナログゲームでは、次のようなルールにしていました。========================(1)バッターが球を打ったか、それとも三振かの判定をする。 サイコロを1つふれ。 投球ダイス(ダイス1個) → 1~4なら 三振 (ただし、打力が投手能力よりも大きければもう一度ダイスをふれる) 5・6なら打った → フェアー判定へ (2)バッターが球を打った場合、フェアー判定をする。 サイコロを2つふれ。 打球ダイス(ダイス2個) ・ゾロ目(両方同じ数) → ホームラン判定 ・和が偶数(たしたら偶数) → とったアウト! ・和が奇数(たしたら奇数) → うったヒット!出典:ダイスでできるスリリングな野球ゲーム「ダイサブル・ベースボール」========================上のリンク先の「ダイサブル・ベースボール」は、ゲームプログラムの根幹ですので、今後も随時参照していきます。できればそのページを印刷して手元に置いておき、実際のプログラムと見比べていってください。なお、今後は「ダイサブル・ベースボール」を「ダイス版」と略記します。さあ、このダイス版の条件処理をエクセルプログラムで表すと、どうなるか?実物のプログラムより簡略化して提示していきます。========================Sub 投球()’Subはプログラムにつける名前。「投球プログラム」ということですね。このプログラムは投球とその直後に発生する分岐のみ担当します。 WavePath = ActiveWorkbook.Path & "\pitch.wav" PlaySound WavePath, 0, SND_SYNC’wavファイルは音ファイルです。効果音を鳴らします。投げる音。けっこう大事。 MsgBox Range("O6") & " 投げた!", , "投げた!"’MsgBox はメッセージボックスを出す命令。Range("O6")は投手名が入っているセルの番地です。こんな風に、セルの番地を参照すれば、各セルに表示されているデータを引っ張ってこれます。"O6"は昔の番地指定のやり方なので、今は変わっていると思います。ただ、僕は昔の慣れている指定方法の方がいいので、ずっと、これでした。 Dice1 = Int(6 * Rnd) + 1 Range("J12") = Dice1’出ました。「Dice1」。これが「投球ダイス」ですね。ランダム変数です。Int(6 * Rnd) + 1と書くと、「1~6」の整数をランダムで返します。ランダム値が何を返してきたかをデバッグのときに知りたいので、一応エクセルのセル上にも隠し表示として表示させるようにしています。If Dice1 < 5 Then WavePath = ActiveWorkbook.Path & "\strike2.wav" PlaySound WavePath, 0, SND_SYNC MsgBox " ストライク!", , "打てない!" S = S + 1 ’ダイス版の「1~4なら 三振(ただし、打力が投手能力よりも大きければもう一度ダイスをふれる)」の部分。ここは、プログラミングにあたり、さらに細かく分解しています。とにかくストライクなので、最初に「ストライク」を表示。三振かどうかは、その次に判定します。 If S = 2 Or Range("G8") <= Range("N8") Then WavePath = ActiveWorkbook.Path & "\strikeout.wav" PlaySound WavePath, 0, SND_SYNC MsgBox "バッターアウト!", , "三振!" Out = Out + 1 Cells(5, 11 + Out) = "●" S = 0’三振になったらすぐにストライクカウントを0に戻します。前の数値が次の打者に持ち越されてしまうとエラーの元なので、忘れないうちにすぐ内部数値をリセットしておきます。 Else Exit Sub’「Else」で、IFの条件に当てはまらないときの処理を書きます。ここでは、三振に当てはまらない場合は、プログラムを終了させています。ストライクだけとられて、まだ次の投球にチャンスがあるよ、という状況の場合ですね。 End If Else’こっちのElseは、投球ダイスが1~4ではない場合の分岐。IFが入れ子構造になっているので分かりにくいですが、こういう構造をこのゲームはよく使っています。 WavePath = ActiveWorkbook.Path & "\hit.wav" PlaySound WavePath, 0, SND_SYNC’とりあえず、ヒットを打ったときの音を再生。 S = 0 Dice1 = Int(6 * Rnd) + 1 Range("J12") = Dice1 Dice2 = Int(6 * Rnd) + 1 Range("L12") = Dice2 BN(0) = (Dice1 + Dice2) Mod 2 'ダイス合計が偶数か奇数か(0か1を持つ)’サイコロを2つ振ったところ。BN(0) は、分かりにくいですが、ダイス合計が偶数か奇数かのみを示す受け渡し変数です。 MsgBox Range("H6") & " 打った!", , "当たった!" Call 飛球判定’「打った!/当たった!」とだけ表示させて、肝心の結果は、「飛球判定」へと続きます。 End If Exit SubEnd If End Sub========================次回は、「飛球判定」のプログラムを参照します。これでもだいぶ抜粋して載せたのですが、ついてこれましたか?エクセルのプログラムを初めて目にする人は、目が回っちゃったんじゃないか、と思います。大丈夫。今は、なんとなく理解できるだけで、OKです。 【今日のまとめ】 Aか?Bか?の条件分岐は IF(もしも)を使う ほかのやり方もあると思います。僕はBASICや英語で「IF ~~ then ~~ else ~~」になじんでいたので、ずっとこの書き方を使っていますが、多分、今のプログラミング的には、ほかの書き方の方が、スリムだと思います。ま、それはそれ、これはこれ、ということで。 なお、今回のプログラム実物は、「IF~~(もし~~なら)」が分からないと、さっぱり分からなかったと思います。他の方が作られた「Excel VBA 入門講座」にリンクを張らせていただきますので、基本的な構造を知るために、見てみるのもいいかと思います。▼If~ElseIfステートメント(Excel VBA 入門講座)※今回、更新予定時刻の21時よりも更新が15分ほど遅くなってしまいました。 21時をねらって見にきてくださった方には大変申し訳ありませんでした。
2018.07.18
コメント(0)
【Excelプログラミング講座】第4回です。 この講座では、エクセル野球シミュレーション「ダイナミックベースボール」のプログラム実物を材料として、エクセルでのプログラミングを初心者向けに解説していきます。(と言いつつ、前回からエクセルでのプログラミングの話が、まったく出てきていません・・・(^^;)) ▼ダイナミック・ベースボールのページ 過去記事はこちら↓ ▼【Excelプログラミング講座】1 エクセルにマッチするゲームとは ▼【Excelプログラミング講座】2 プログラミング成功のためのカギとは ▼【Excelプログラミング講座】3 「ゲーム」を作ると、頭がよくなる!前回は、「ゲームの世界は幅広い!」という話をしました。コンピュータを使ったプログラミングをする以前に、アナログなゲーム作りなどを通じて、「プログラミング的思考」を身に着けることが大事です。では、それを踏まえたうえで、今回はいよいよ、「野球ゲーム」としての核心に迫っていきましょう。あなたは、「野球ゲーム」の本質は、何だと思いますか?僕が思うに、「野球ゲーム」の本質は、「打つか、打たれるか」です。これは、野球漫画のクライマックスなどからも、一目瞭然。(笑)ボクシングと同じです!ただ、野球は、将棋のように、手番が決まっています。攻撃側になったときのみ、点が入る可能性があります。つまり、攻撃側から見たときの「野球ゲーム」としての本質は、「打てるか、打てないか」にあります。「打てる」には、ヒットや2塁打、3塁打、ホームランがあります。ポテンヒットでも、ヒットはヒットです。「打てない」には、三振をはじめ、ゴロやフライ、ダブルプレーなどがあります。それ以外の選択肢として、実際の野球には「フォアボール」や振り逃げがありますが・・・なんと、「ダイナミックベースボール」では、フォアボールや振り逃げは本質的でないとして、「ない」ことになっています。野球シミュレーションとは思えない、というか、この時点で野球シミュレーションを名乗る資格がないような気がしますが・・・ただ、ゲームを成立させる上では、「あり」だと思っています。先ほどから書いている「野球ゲーム」の本質というのは、あくまでも僕個人の解釈です。ただ、ゲームを作るにあたって、「ここが本質だ!」と作り手が思うのであれば、それ以外の部分は、思い切って切り捨ててもいいのです。それによって、ゲームとしての特徴が際立ちます。「フォアボール」がないことによって、現実の野球からは遠いものとなりました。しかし、「打つか、三振か」それしかない、ということによって、野球ドラマの進行をテンポよく進めることができる、というメリットもあるのです。僕は、「ボール」の概念がない、というのは、画期的な仕様だけれど、これはこれでよかった、と思っています。また、「ストライク」も、本来ならば「ストライク3つ」で三振ですが、このゲームでは「早ければストライク1つで三振」という仕様です。これも、野球ドラマの進行をテンポよく進めるためです。昔、同じような野球データシミュレーションゲームがファミコンでありました。好きな野球選手の打率や防御率、本塁打数や打点などの数字が試合を重ねるうちに動いていき、ライバルたちと数字の競り合いをするのが、面白かったです。そして、それが一番の楽しみになると、実際の野球ゲームの進行に時間がかかると、まどろっこしくてしかたなくなり、早送り進行で試合をどんどん進めていました。そのときに思ったことが、僕の野球ゲームには、如実に反映されています。データを楽しむ野球シミュレーションゲームで最も大事なことは、テンポである、と。さて、今回は、僕の「野球シミュレーションゲーム」が、「シミュレーション」とは名ばかりで、実際の野球のある部分をかなり大胆にカットし、ゲームとして再構成しなおしたものであることが明らかになりました。それで、いいのです。ゲームとは、楽しめるものでなければならない。何を楽しむのか、焦点を当てた部分に特化することにより、捨てる部分は、当然出てくる。それでなければ、ゲームとして面白いものになりにくいのです。【今日のまとめ】 面白いゲームを作るために、必要なこと・・・ すべて詰め込んだゲームを、つくらない 異論は当然あろうかと思います。そのあたりも含めて、コメント等いただけると、幸いです。 それではまた次回、来週水曜のこの時間(21時)にお会いしましょう!そろそろ、「プログラミングの実際」に踏み込みたいところですが、何しろその時の気分で書いているので、次回もどうなることやら・・・。 (時間になってもブログ記事が更新されない場合、キーボードの「F5」キーなどを押して、「画面の更新」をしてみてください。) ※本記事内の野球選手の写真は、以下のアドレスで紹介されていたパブリックドメインの写真素材です。 http://gahag.net/007818-baseball-batter/
2018.07.11
コメント(0)
【Excelプログラミング講座】第3回です。 この講座では、エクセル野球シミュレーション「ダイナミックベースボール」のプログラム実物を材料として、エクセルでのプログラミングを初心者向けに解説していきます。 ▼ダイナミック・ベースボールのページ 過去記事はこちら↓ ▼【Excelプログラミング講座】1 エクセルにマッチするゲームとは ▼【Excelプログラミング講座】2 プログラミング成功のためのカギとは前回は、「プログラミングを組む前に、まず手作りでプロトタイプを作れ!」という話をしました。 これ、けっこう大事だと思うんですよね。そういうわけで、今回、「プログラミングをしないゲーム作り」の話です。はい、Excelプログラミング講座なのに、エクセルの話、いっさいナシです。 2020年施行の学習指導要領で小学校教育にプログラミング教育が導入されます。しかし、これの中身は、「プログラミングを教えるものではない」とされています。?????僕はこの点がわからなくて、詳しい方に質問したりしました。プログラミングというのは、前回紹介したプログラミング言語「エクセルVBA」などを使った具体的な技術になります。しかし、小学校で習得を目指すのは「プログラミング的思考」。プログラミング的思考とは何か?文部科学省「小学校段階におけるプログラミング教育の在り方について(議論の取りまとめ)」では次のように示されています。「自分が意図する一連の活動を実現するために、どのような動きの組合せが必要であり、ひとつひとつの動きに対応した記号をどのように組合せたらよいのか、記号の組合せをどのように改善していけばより意図した活動に近づくのか、といったことを論理的に考えていく力」(一般向け参考サイト)▼自由度の高さを前向きにとらえる!〜新学習指導要領案でのプログラミングの位置付けを検証 (ICT tool BOX 2017/3/19)▼2020年から小学校教育で「プログラミング」が必修化!気になるその内容は? (第一ゼミナール 2018/1/26)ゲーム作りの話に戻ります。僕は、ゲームを作るというのはとてもいい「学習」になると思っています。むっちゃ、頭を使います。ゲームをするだけなら、そんなに頭を使わないかもしれませんが、ゲームを作るとなると、それこそ、とんでもなく、頭を使います。1つのゲームを完成させることができれば、めっちゃかしこくなっていることは請け負います!ゲーム作りはなぜ頭を使うのか。1つは、「プログラミング的思考」が必要だからです。頭の中に思い描いたイメージを、誰にでもわかるような客観的な記述に落とし込まないといけません。コンピュータがわかるように命令するということは、誰にでもわかる客観的な指示・命令でなくてはならないからです。また、ユーザーがとりうるすべての可能性を想定し、それに備えなければなりません。算数・数学で「場合の数」という学習がありますが、これがむっちゃ重要です。ユーザーがとりうる行動のうち、想定していなかった行動があれば、そこでゲームが止まってしまいます。ゲーム作りの初期は、そんなことだらけです。プログラムを動かして、ある程度ゲームをしたら、すぐに止まります。「あ~。ここ、考えてなかった!」そして修正。その繰り返し。「プログラミング的思考」は、文科省が言うように、他の活動や、仕事についても、必要となる力だと思います。ただ、これを楽しんで身に着けるには、ゲームを作るのが最適だと思っています。文科省はゲームを作れ、とは言っていませんが。そして、ゲームを作るのは、なにもコンピュータがなくても、できるのです。プログラミングソフトがなくてもできるのです。むしろ、そっちを先にしておいたほうがいい、と僕は思います。具体的には、ゲームブックやすごろく、ボードゲームやカードゲームを作ることです。ゲームブックというのは、「道が分かれています。 右へ行くなら、 3へすすめ 左へ行くなら、 8へすすめ」というようなことが書かれている本のこと。僕が子どものころに、はやりました。今でも、兵庫県の城崎温泉に行くと、城崎を歩き回りながらゲームブックを進めていくという『演劇クエスト』という試みがあり、現地ではそのゲームブックを無料で手に入れることができます。▼(PDF)『演劇クエスト』で世界を さまよう (『viewpoint』 No.72)ちなみに僕は子どものころ、ゲームブックの発想をアレンジして、「紙芝居ゲーム」というのを作りました。途中で挫折しましたが、発想としては面白かったと思います。いわゆるアドベンチャーゲームの画面のような紙芝居で、ユーザーの選んだ選択肢によって、めくる枚数を変える、というものです。手作りゲームはいろいろ作ってきましたので、当然、すごろくも作りました。今はすごろくをする子どもが少なくなりましたが、僕の子どものころ、ゲームといえば、すごろくが基本でした。(そうか?)すごろくは手作りをする際のハードルが低いので、最初に作るゲームとしては最適です。「このマスに止まったら、こっちにワープする」とか考えると、かなり自由度の高いものになります。ボードゲームやカードゲームは海外製の良質のものがたくさんありますね。どんなものがあるかを紹介したマンガもあるので、読んでみるといいと思います。▼『放課後さいころ倶楽部』[ 中道裕大 ]ゲームは、勉強の敵みたいに悪者にされることがありますが、いろいろなゲームに触れ、自由な発想で「今度は自分もゲームを作ってみたい!」と思うことは、とてもいいことだと思っています。コンピュータゲーム以外でもいろんなゲームが世界にはあるので、ゲームの持つ本質的な面白さにぜひふれてもらいたい、と思います。そしてそのうえで、ゲーム作りの情熱がふつふつと湧いてきたら、取り組みやすいところから始めて、ぜひ、形にしていきましょう!「ゲームを作りたい」というすべての人を、応援しています。【今日のまとめ】 ゲームを作りたいあなたに知ってほしいこと・・・ ゲームの世界は、幅広い 「ゲーム」というのは、実は、学問の一領域になるほど、幅広いものです。コンピュータゲームソフトの世界だけしか知らずにゲームを作ることは、あまりにもったいない。ゲームを考えるときに養われる「プログラミング的思考」は、今から、そして明日から、とっても役立つのです。いろんなゲームを作った「考え方」にふれ、それに触発され、感化されることで、あなたもぜひ、新しいゲームを生み出してください! 長くなったので、今日はここまで! それではまた次回、来週水曜のこの時間(21時)にお会いしましょう! (時間になってもブログ記事が更新されない場合、キーボードの「F5」キーなどを押して、「画面の更新」をしてみてください。)
2018.07.04
コメント(0)
【Excelプログラミング講座】第2回です。この講座では、エクセル野球シミュレーション「ダイナミックベースボール」のプログラム実物を材料として、エクセルでのプログラミングを初心者向けに解説していきます。 ▼ダイナミック・ベースボールのページ第1回はこちら↓▼【Excelプログラミング講座】1 エクセルにマッチするゲームとは 前回は、「データをたくさん扱うなら、エクセルだよ!」という話をしました。はい、そんなことは、当たり前ですね。今回は、実際のエクセルVBAの中身を、具体的に見ていきたいと思います。今回から、VBE(Visual Basic Editor)を使います。僕はエクセル画面の最上部から常にアクセスできるように常時表示しています。プログラムの中身を見るために必要です!そんなボタン見たことないという人も、なんとかして、出しちゃってください。出し方は、前回講座の「どうやって始めるのか」のリンク先などを見てください。「ダイナミックベースボール」のゲーム起動後に、エディターを開きますと、以下の画面が出ます。これが、ゲームの全体像です。本で言うと、目次。・DB_main.xls (ゲーム実行ファイル)・DB_teamdata.xls (野球選手のデータファイル)2種類のエクセルファイルがありますが、プログラムのほとんどは、「DB_main.xls」の方に入っています。最初に表示されているのは、ワークシートの一覧。このゲームで何度も遊んだことがある人なら、見慣れていると思います。まだ遊んでないという人は、まず遊んでください。ここからの解説は、どんなゲームか分かっていないと、たぶん、分からないことだらけです。せめて5~6回ぐらいは試合してね。(^^)続いて、フォームの一覧。エクセル画面上にバーンと出てきて、「○○しますか?」とか聞いてきたりする、看板みたいなやつです。ゲーム起動時に出てくるのが、「SplashForm」ですね。タイトル画面の代わりに出しています。「BatterChange」というのは、打者交代を指示したときに出てくるウインドウ。それぞれ、名前をダブルクリックすると、どんなフォームなのか、右に表示されます。「何度もゲームしているのにこんなフォームは出たことない」というものも、あると思います。まあ、そういうことは、よくあることです。プログラムの中身を見ると、出現頻度が極端に低いレアなものとか、実際には使われなかったものとか、使う予定で、眠ったままのものとか、そういうのも、見つかります。それがプログラムをのぞき見する醍醐味だったりもします。(^^;)あまりに使われていない期間が長いと、作者ですら、そんなものを作って入れておいたことを忘れてしまいます。忘れないうちに自動でプログラミングを組んでくれるプログラムがあったらいいのに。(笑)はい、次に行きます。次がプログラムの本体です。「標準モジュール」というやつです。最初は隠れていますけど、「+」マークをクリックすると開きます。「Module1,2,3,4,5」というのは、もっと意味のある名前にした方が、後で「あれ、どこだったかな~」と探し回らなくていいので、いいと思います。でも、面倒なので、ちゃんとした名前を付けていません。(^^;)こういう、きちんとした性格かどうかも、プログラミングをのぞき見されると、バレます。だから、ほんとは、ばらしたくなかった・・・。ダブルクリックすると、中身が見れます。右側に、どーん と出ます。右上のはしっこの「Declarations」という表示から、さらにそのModuleの中の、それぞれのプログラムパートに飛べます。「Declarations」というのは「宣言」という意味です。プログラミングでは、この「宣言」が大切なのです。実際のプログラムの中身を見てみても、「なんかいろいろ宣言してるなー」ということが、分かっていただけるかもしれません。この「宣言」がプログラミングのキモ。※「変数宣言」についてのきまりは、例によってほかの詳しいサイトなどをご覧ください。▼ここ とか。(「PC独習室:Excel VBA 入門」様 サイト内記事 )長くなりますが、最初に書いてある変数宣言、一つずつ確認しておきます。とはいえ、プログラムは英語みたいなプログラミング言語で書いてあるので、どれが何の意味だったか、書いた本人も忘れちゃいます。そのため、日本語でコメントを付加できるようになっています。' より右側の日本語がそれです。' をつけるとそれ以降の文字はプログラム実行時には無視されます。便利です。では、日本語コメントを見て僕も思い出しながら、書いていきます。(^^;)============================「ダイナミックベースボール」で使用する主な変数・Dice1:サイコロその1 が出す、ダイスの目・Dice2:サイコロその2 が出す、ダイスの目・OUT: アウトカウント・BN(0): 先発ピッチャーチーム受け渡し&飛球判定でのセレクト&代打&代走時の一時変数・BN(1):先攻チーム打順 、 BN(2) :後攻チーム打順・ R1 : 1塁走者の走力・ R2 : 2塁走者の走力・ R3 : 3塁走者の走力・Score1 :そのイニングの点数・N :イニング数・PN1 :先攻側の現在のピッチャーが投げているイニング数・PN2 :後攻側の現在のピッチャーが投げているイニング数・S :ストライクカウント(野球ルール以外の、ダイナミックベースボールだけの特殊仕様)・M:見切り・SB :必殺打法かどうか・SP:必殺投法かどうか・AR:エンドランかどうか・X 使いまわし変数:チーム判断、X座標、コンピュータ判断分岐・Y 使いまわし変数:勝ちパターンの判断、Y座標、守備判定時の乱数============================初めて目にする情報が多いと、いやになりますよね。どんな変数を用意しておかないとゲームプログラミングが回っていかないか、というのは、けっこう大事なことなのですが、初めてゲームを作るときには、「何が必要なのか分からない」というのが、実情だと思います。そこでおすすめしたいのは、コンピュータに頼らない、アナログのゲームとしてまず成立させて、何度も遊んでみる、ということです。「ダイナミックベースボール」は最初からコンピュータゲームとしてあったわけではなく、最初は 紙と鉛筆とサイコロで遊ぶ、アナログなゲームでした。▼だいさぶる・ベースボール(紙と鉛筆とサイコロで遊ぼう!)だから、プログラミング初心者の僕でも、コンピュータゲームにできたわけです。「Dice1」「Dice2」というのは、まんま、サイコロの代わりにランダム変数を使っているというだけのことなんですね。コンピュータというのは、人がやることを代わりにやってくれるだけのものです。処理速度が驚異的に速いので、人がやるよりも自動でハイスピードでやってくれるメリットがあるだけです。だから、プロトタイプ(最初の原型)のゲームは、紙と鉛筆だったり、ジオラマ模型だったり、アナログな、手作りのもので用意するのが、おすすめです。それで成立していないものは、コンピュータゲームとして成立するわけがありません。まあ、イメージ力が強ければ、最初からコンピュータで組むことは可能でしょうけど・・・。【今日のまとめ】 コンピュータゲーム作り成功のカギは・・・ コンピュータに頼らずにまずゲームを成立させること プログラミングでは変数宣言が重要です。どんな変数が必要なのかは、アナログで自分の手元で何度もやりながら確かめるのが一番。プログラミングとはイメージを具体化し、自動化すること。イメージできていないものは、作れません! 長くなったので、今日はここまで! それではまた次回、来週水曜のこの時間(21時)にお会いしましょう! (時間になってもブログ記事が更新されない場合、キーボードの「F5」キーなどを押して、「画面の更新」をしてみてください。)
2018.06.27
コメント(0)
【Excelプログラミング講座】第1回です。2020年から小学校教育にプログラミング教育が新しく導入されます。それを機に、エクセルでのプログラミングを学びたい人も増えるのでは、と推測し、本講座開催の運びとなりました。この講座では、エクセル野球シミュレーション「ダイナミックベースボール」のプログラム実物を材料として、エクセルでのプログラミングを初心者向けに解説していきます。 ▼ダイナミック・ベースボールのページ なるべく分かりやすく書こうと思いますが、エクセルとプログラミングをある程度触ったことがある人でないと、実際には難しいかもしれません。小学生にはちと厳しいと思っています。ただ、今後、小学生でも、十分プログラミングに触れた経験がある子どもが出てくれば、その限りではないかもしれません。また、学校の教員は仕事でエクセルを使い慣れている人がほとんどだと思うので、教師に「エクセルでこんなことができるんだ!」と知ってもらうだけでも、意味があるかも、と思っています。ご意見ございましたら、コメント欄でぜひ、お願いします。さて、僕の場合、エクセルでプログラミングを組むまでに、以下の経験がありました。・高校時代、電子研究部というパソコンをさわる部活に入り、BASICで自作ゲームのプログラミングを組んでいた。・エクセルの操作に、ある程度習熟していた。 (会社でも仕事でさわっていました。)BASIC(ベーシック)というのは、昔からある、初心者向けの、プログラミング言語。簡単に言うと、英語で命令すればコンピュータが指示を聞いてくれる簡易的なプログラムです。「CIRCLE」と書けば、円を描く命令ができたり、「CDEFGAB」と書けば、「ドレミファソラシド」と鳴らしたりできました。(かなりカンタンに書きすぎているので、ちゃんとBASICをやりたい人は、もっと厳密に調べてください。これを初めて知ったときは、本当に感動しました。まるで魔法だと思いました!)エクセルに使われている「VBA」もBASIC言語の流れをくんだ一派です。(一派?)なにしろ、VBAは「Microsoft Visual Basic for あぷり」の略ですからね。そういうわけで、エクセルのプログラミングも、プログラミングの中では、とっつきやすい方だと思います。VBAとは何か、とか、どうやって始めるのか、といったことは、すでにネットなどに情報がたくさんありますので、そちらをご覧ください。下のリンクは、検索で上位に出てきたタカハシさんのサイトです。動画解説もあり、分かりやすいです。(^^)▼エクセルVBA超入門!たった10分でスタート地点に立つための方法(動画は「いつも隣にITのお仕事」さんが作成されたものです。 僕個人とは何の関係もありません。)さて、僕は僕でしか解説できない内容をなるべく書こうと思います。僕が実際に作ったゲームの構造とかを使った解説ですね。さっそくいきます。まず、プログラムで実現することと、エクセルの相性について。ご存じのように(?)、僕が作った野球ゲームは、バッターとかピッチャーのデータを一覧から取得したり、成績表に反映させたりする、野球シミュレーションゲームです。こういうのは、エクセルが大得意なんですね。世の中には多くのプログラミング言語がありますが、多くのデータを扱うもの、特に、いままでのデータがエクセルで管理されているものについては、エクセルでプログラミングを組むメリットが非常に高いです。ジャンルで言うと、アクションゲームとかより、データシミュレーションゲームが、非常に相性がよいと言えます。実際のゲーム画面を使いながら、解説します。「ダイナミックベースボール」は、ゲーム実行ファイルと、野球選手のデータファイルを別々のファイルで分けて管理しています。・DB_main.xls (ゲーム実行ファイル)と・DB_teamdata.xls (野球選手のデータファイル)です。※このゲームを作った時期がかなり前なので、拡張子が.xlsになっています。 なつかしいですねー。 今だと、プログラムつきのファイル拡張子は.xlsm(僕は「エクセルマクロ」と読む) になると思います。 一応、過去のエクセルファイルと今のエクセルソフトは互換性があるので、 問題なく開けるはずです。ゲームを開始するには、DB_main.xlsを開きます。すると、DB_teamdata.xlsも同時に開くようになっています。僕の環境だと、以下の画面がまず、出ます。「ほかのデータソースへのリンク」というのが、DB_teamdata.xls のことですね。このダイアログボックスでは、「更新する」を選ばないと、データがきちんと反映されません。これはエクセルの標準機能です。エクセルで、データの参照先がエラーのときに、「#DIV/0!」というのが出たりします。プログラムを組まなくても、普通にエクセルの計算式で、参照先のデータから計算できないときに出ます。字面から「0で割る割り算はできないよ!」と強く訴えている気がします。例えば、打率計算で、打数が0だと、当然、打率計算ができないので、こうなるわけです。打率というのは、 安打数 ÷ 打数 ですね。 念のため。5打数 2安打 なら、5回に2回打っていて、打率4割、ということになります。そういうデータを、すべて DB_teamdata.xls の該当選手データから拾ってくるわけです。エクセルは、データの格納庫がたくさんあります。番地を指定すれば、違うシートのデータも参照してきて、そのまま表示したり、変化させて表示したり、計算させたり出来ます。これがエクセルの最大のメリットです。プログラムが参照したい仮データだけれどユーザーには見えなくしたい場合、そのセル表示を隠したり、文字色を白色にして見えなくしたりする方法もあります。実際、ゲーム画面上でも、実は白字で表示させている途中データがあるんですよ。(白字にしているだけなら、ドラッグ操作で反転表示させると見れます。)【今日のまとめ】 エクセルにマッチするゲームとは・・・ 多くのデータを扱うものそういうわけで、あなたが作りたいゲームが、データをたくさん扱うものなら、エクセルでプログラムを組む意味があると言えるでしょう。ゲームじゃなくても、データ整理を短時間でこなせる便利なツールを作りたい!というニーズも、かなりあろうかと思います。もちろん、それもエクセルVBAで可能です。長くなったので、今日はここまで!それではまた次回、来週水曜のこの時間(21時)にお会いしましょう!(時間になってもブログ記事が更新されない場合、キーボードの「F5」キーなどを押して、「画面の更新」をしてみてください。)
2018.06.20
コメント(0)
2018/6/4の記事「エクセル プログラミング講座」開催予告でお知らせした内容の連載記事を、本ブログに書いていこうと思います。その関係で、本ブログ内の記事カテゴリを久しぶりに新設しました。カテゴリ 欄の最後に、エクセルでのプログラミングというのが追加されていると思います。そして、関連する過去記事2件の記事内容のトップにも、開催に関する内容を追加しました。「エクセル プログラミング講座」は、このブログ内の記事という形をとりながら、 2018/6/20(水) 6/27(水) 7/4(水) 7/11(水) 7/18(水) 各日、 21:00の時点で、本ブログに掲載予定です!これまでの日記は、不定期掲載で、結局なかなか書かなかったりしたのに・・・期日を予告してしまって、大丈夫か!?大いに、不安です。とはいえ、期日を決めないと、書くのがのびのびになってしまいますので。幸い、ちょっと前から楽天ブログの機能が更新されて、予約投稿ができるようになっています。水曜21時に間に合うよう、それまでに時間をとって記事を書こうと思います。そんなにたくさん書く気力はないと思いますが、エクセルでのプログラミング のほんの入り口程度、なんとなくざっくりしたイメージだけでも、お伝えできればと思っています。さてさてどうなりますやら・・・。なお、リクエストがあれば引き続きコメント欄でおききしたいと思います。よろしくお願いします。
2018.06.16
コメント(0)
(2018/6/16更新)「エクセル プログラミング講座」 2018/6/20(水) 6/27(水) 7/4(水) 7/11(水) 7/18(水) 21:00の時点で、本ブログに掲載予定!少し前から、僕が以前作ったエクセル上で動くゲームの改善要望を、このブログでいただいていました。(▼ にかとまは、実は野球ゲームを作っています (コメント欄))その返信という形で、ブログのコメント機能を利用して、プログラムコードを一部引用しながら、「ここをこう変えると、これが実現できる」といったことを少しだけ、書かせてもらっていました。プログラミング教育については、小学校で2020年から必修化されます。それに先行して、子どもでもとっつきやすいビジュアルプログラミングがネット上でたくさん紹介されています。コードを記述しなくても、イラストアイコンのドラッグ操作などで視覚的にプログラミングを実現するもので、多くのものはインストール不要、無料で、ブラウザ上で行えます。その手軽さは、非常に敷居が低く、今後、どんどん普及していくことが見込まれます。(参考リンク)▼子供が使える!ビジュアルプログラミングソフト5選(TechAcademyマガジン)また、タブレット学習などを展開している大手企業も、プログラミング学習を取り入れだしています。僕は、自分が民間のプログラミング教育レベルを知るため、この4月から自分の子に「スマイルゼミ」をさせはじめました。それまではうちの子は進研ゼミでしたが・・・。スマイルゼミはプログラミング講座が標準でタブレットに配信されるため、「いったい、どんなもんか、自分でさわってみたい」と思ったからです。やってみて思ったのは、「かなり、よくできている」ということ。自然な感じで、初歩の初歩から、スモールステップでプログラミングに慣れ親しませるようにできています。「さすが!」と思いました。ついこの間から、学研も、新しいプログラミング学習をやりはじめましたね。▼ポコタス★Doこちらはまだやっていませんが、これもまた、よくできていそうな感じです。WindowsPCでも、iPadでも動くようです。こんな感じで、プログラミングをやってみたい子どもにとっても、大人にとっても、手を出しやすい環境がめちゃめちゃ整ってきた!というのが、実感です。そういう状況を踏まえると、「エクセルでプログラミングしたい!」という需要も、もしかしたら今後増えてくるのかもしれません。そういったニーズにお応えする形で、自分が過去に作ったゲームのプログラムをもとに、解説講座みたいなものを、このブログ上で開けたら、と思っています。 ~計画案~・本ブログ「きょういくユースフル」内の日記の形で、3~5回程度掲載・期日は、 2018年 6月20日(水)~・エクセル野球シミュレーションゲーム「ダイナミック・ベースボール」サイト上から各記事にリンク・同ゲームのプログラミング実物を引用しながら、コードの意味を解説。・「ここをこう変えると、こんなことができる」ということを紹介する。皆さんからのご意見・ご要望も、お聞きしたいと思います。お気軽に、コメントをお寄せください。(^^)▼ダイナミック・ベースボールのページ
2018.06.04
コメント(2)
(2018/6/16更新)この記事のコメント欄で、プログラムの修正に関するやりとりがあり、 「エクセル プログラミング講座」 を開催するきっかけとなりました。もうすでにご存じの方も多いと思いますが、僕は「エクセル」で動く野球ゲームを作って公開しています。ここ最近、ずっとほったからかしで、野球ゲーム配布サイトの掲示板も全然見ていませんでした。今日、ゲームを代わりにバージョンアップしてくださったという奇特な方からメールがあり、うれしくなってサイトを久々に覗いてみました。全然書き込みがなかった掲示板に、2件の投稿が!こうやって、過去に作ったものについてコメントがもらえるのは、うれしいかぎりです。ましてや、プログラムをいじって改良してもらえるなんて・・・。作者が言うのも何ですが、いろいろ想像力を働かせて設定を変えたり作戦を変えたりできるのでなかなかおもしろいと思っています。もしご存じなかった方はぜひ見てみてください。そして、おもしろいと思われたら、宣伝してやってください。▼ダイナミック・ベースボールのページ
2011.06.25
コメント(13)
全21件 (21件中 1-21件目)
1