Visual Basic 中学校 掲示板 投稿の管理
タグのない投稿を抽出
統計
RSS
Visual Basic 中学校
投稿一覧
オリジナルゲーム
この投稿へのリンク
https://keijiban.umayadia.com/ThreadDetail.aspx?ThreadId=15547#CommentId42940
この投稿の削除
削除パスワード
削除する
コメント本文
投稿者
an
 (社会人)
投稿日時
2014/3/27 15:34:06
>> これらの意味は理解していますでしょうか?
こっちの回答はありませんでしたが、
多分意味が分かっていれば、書き方は分かると思うので、
(というか似たような事は既にやっていますが、多分意識なくやっているのだと思います。)
意味も分かっていないと推測して説明します。
> (1)各PictureBoxに割り当てられるworkのインデックスまたはwork(i)の値を保持する
まずはじめにスタートボタンの処理(Button1_Click)の最後の方で
> PictureBox1.Image = Image.FromFile(strPic(work(0)))
という処理を行っていますが、これを日本語で説明すると
手札の1枚目(PictureBox1)の画像表示部分に
シャッフルされた山の1枚目(work(0))を画像化したものをセットする
という意味になります。
これを手札の1枚目から5枚目まで処理していますが、
同時にシャッフルされた山の1枚目から5枚目も処理しています。
仮に山から1枚取得する時に使用するボタンの処理をButton2_Clickとします。
最初にButton1_Clickで処理した後にButton2_Clickを行った際に
Button1_Clickで5枚分処理したので6枚目を取得すれば良いのですが、
それを
> PictureBox6.Image = Image.FromFile(strPic(work(5)))
と書いたとします。
これではその次に山から1枚取得した場合(2回目の山から1枚取得するボタンの実行)に
同じ処理が実行されてしまい、何も起こらなくなってしまいます。
逆に考えると、例えば最初に配る枚数はやっぱり4枚にしよう!とルールを改正したら最初に引くのは5枚目になります。
要するに論理的に考えると、
最初に山から引くのはスタートボタンの処理で処理した枚数+1番目
2回目に山から引くのはスタートボタンの処理で処理した枚数+2番目
という事です。
「スタートボタンの処理で処理した枚数+n番目」というのが「workのインデックス」にあたるので、
次の処理のために「workのインデックスを保持する」必要があるという事です。
shuさんは「またはwork(i)の値を保持する」とも言っていますが、
「work(i)の値」が分かればそこから「workのインデックス」を逆引きする事は可能なので、
このような「または」と言っているのだと思います。
処理方式に合わせてどちらかを選択すれば良いのですが、
今回は「workのインデックス」をそのまま保持した方が良い(楽)と思います。
次にこれをプログラムにする場合ですが、
Button1_ClickとButton2_Clickは処理として分離しているので、
Button1_Click上の変数に保持してはButton1_Click上でしか使用できないので、
Button2_Clickでも使用(参照および設定)できる必要があります。
「Button1_Click上の変数に保持」というのは
「Private Sub ~略~」
から
「End Sub」
の間で宣言された変数を指します。
提示されたソースでいうと、「i」や「myNum」がこれに当たります。
これらはButton2_Click等では使用できません。
新たに同じ名前で変数宣言する事はできますが、保持される内容は別となります。
複数の処理で共通した値を使用したい場合はそれぞれの処理で共通した領域に値を保持する必要があります。
今回でいうとそれぞれ同じクラスにあるので、クラス直下に定義すれば行えます。
この方式は既に行われていて
提示されたソースでいうと、「strPic」や「work」がこれに当たります。
# ただしここでの宣言は「Dim」でも行えますが、通常今回のケースでいうと「Private」が正しいです。
ここに一つ「workのインデックス」を保持する変数を定義し、
Button1_Clickの最後に今の値を保持して
Button2_Clickで次を取得するために1足してから使用するようにすれば良いでしょう。
ちなみに同じ位置に「hRandom」と「intResult」が宣言されていますが、
「hRandom」については、初期時のシャッフル時にしかしようしないので、
ここには宣言せずにButton1_Click内に宣言すべきです。
「intResult」については、一切使用されていないので削除すべきです。
上記「複数の処理で共通した値を使用したい場合~」と記載しましたが、
これはあくまで「複数の処理」は「複数のメソッド」というより「複数のイベント」と考えてください。
呼び出し関係のある処理(メソッド)については、引数や戻り値により値のやりとりをしてください。
呼び出し関係のある処理間でも上記の方法を取るとバグが潜みやすくなったり
理解不能になる可能性が高くなります。
これをスパゲッティープログラムといいます。
http://ja.wikipedia.org/wiki/%E3%82%B9%E3%83%91%E3%82%B2%E3%83%86%E3%82%A3%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0#.E3.82.B9.E3.82.B3.E3.83.BC.E3.83.97.E3.81.AE.E6.8B.A1.E5.A4.A7
> (2)PictureBoxを配列にするなどしてキーで指定出来るようにする
こちらに関しては次のステップになり、
shuさんも「配列にする『など』」と、『など』という表現をしていますが、
これは「配列にするのも一つの手ですが他の手もある」と含んだ言い方をしているのだと思います。
この件に関しては他の処理に合わせて作る必要があると思います。
また他の基礎部分の理解が浅いようであれば混乱する可能性もありますので、一旦説明を保留します。
しかし、そのまま進むと必ずぶつかる壁だと思いますが、まずは今現状の理解を優先させましょう。
# 本来はそこも含めて最初に考える(設計する)べきですが、
# まずはVBという言語になれる方が優先と個人的には考えます。
根本的な話になりますが、
この辺の基礎が出来ていないと何事にもきついと思いますし、何かやろうとする度に壁にぶち当たります。
ものを作りたい気持ち、完成させたい気持ちは本当によくわかりますが、
最低限の知識は必要だと思いますので、本サイトの入門講座と初級講座は読んだ方が良いと思います。
(多少は読んでいるかもしれませんが、まだ理解が足りなそうなので・・・)
入門講座: http://homepage1.nifty.com/rucio/VBNyumon/Index_beg.htm
初級講座: http://homepage1.nifty.com/rucio/main/dotnet/shokyu/index_sta.htm
ちなみに今回説明したものの詳細は初級講座の第8回と第27回に乗っています。
http://homepage1.nifty.com/rucio/main/dotnet/shokyu/standard8.htm
http://homepage1.nifty.com/rucio/main/dotnet/shokyu/standard27.htm
上記入門講座と初級講座が理解できれば、
基本的にはその中の組み合わせである程度のものは作成できると思います。
複雑なものや効率的なものとなると、さらなる工夫が必要になるとは思いますが、
それは次のステップだと思いますので、
まずは何事にも理解に重きを置くことをお勧めします。