オリジナルゲーム への返答

投稿で使用できる特殊コードの説明。(別タブで開きます。)
本名は入力しないようにしましょう。
投稿した後で削除するときに使うパスワードです。返答があった後は削除できません。
返答する人が目安にします。相手が小学生か社会人かで返答の仕方も変わります。
最初の投稿が質問の場合、質問者が解決時にチェックしてください。(以降も追加書き込み・返信は可能です。)
※「過去ログ」について書くときはその過去ログのURLも書いてください。

以下の返答は逆順(新しい順)に並んでいます。

投稿者 腐女子  (その他) 投稿日時 2014/3/27 17:02:58
anさん、返答ありがとうございます。
私のために丁寧に教えてくれてありがとうございます。
何事にも理解していけるようにがんばります。
投稿者 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

上記入門講座と初級講座が理解できれば、
基本的にはその中の組み合わせである程度のものは作成できると思います。
複雑なものや効率的なものとなると、さらなる工夫が必要になるとは思いますが、
それは次のステップだと思いますので、
まずは何事にも理解に重きを置くことをお勧めします。

投稿者 腐女子  (中学生) 投稿日時 2014/3/27 14:44:51
返答ありがとうございます。!!
すごい勉強になって有難いです。
投稿者 shu  (社会人) 投稿日時 2014/3/27 13:38:31
> なぜ、そうしなければいけないか?の所からお教え願います。 
なぜ、そうしなければいけないかの部分

①について、PictureBoxに表示されているカードが何なのか分からないから。
②について、PictureBoxの数だけ同じ処理を記述しなければならないから。


②の例
Private pics() as PictureBox

pics = {PictureBox1, PictureBox2}


①の例(②の例前提)
Private picscards() as Integer
picscards = new integer(pics.length-1) {}
・・・
picscards(idx) = work(idx2)
pics(idx).Image = Image.FromFile(picscards(idx))



投稿者 腐女子  (中学生) 投稿日時 2014/3/27 12:39:23
そうですね!!
なぜ、そうしなければいけないか?の所からお教え願います。
投稿者 an  (社会人) 投稿日時 2014/3/27 12:31:05
> (1)各PictureBoxに割り当てられるworkのインデックスまたはwork(i)の値を保持する
> (2)PictureBoxを配列にするなどしてキーで指定出来るようにする

これらの意味は理解していますでしょうか?
また、なぜそうしないといけないかは理解しているのでしょうか?

もし理解できていないのであれば、先にそっちを質問すべきかと。

いかがでしょうか?
投稿者 腐女子  (中学生) 投稿日時 2014/3/27 11:46:03
shuさんアドバイスありがとうございます。
すみません。VB勉強し始めたばかりなので、
①各PictureBoxに割り当てられるworkのインデックスまたはwork(i)の
  値を保持する
②PictureBoxを配列にするなどしてキーで指定出来るようにする
やり方をもっと教えてもらいたいのですが、教えてもらえますか?

投稿者 shu  (社会人) 投稿日時 2014/3/27 11:00:29
> Do
>     Randomize()
>     myNum = Int(Rnd() * 52)
> Loop Until myFlag(myNum) = False

既存スレでも回答していますがこのループは
ループ完了までに時間がかかるケースがあるので
やめたほうがいいです。

例)
work(0)~work(50)までに13以外の値が設定されていたとします。
work(51)に設定する13が乱数として発生するまでに何度乱数発生が
処理されるか分かりません。運が悪いと何分もかかる可能性もあります。




>       PictureBox1.Image = Image.FromFile(strPic(work(0)))
>        PictureBox2.Image = Image.FromFile(strPic(work(1)))
>        PictureBox3.Image = Image.FromFile(strPic(work(2)))
>        PictureBox4.Image = Image.FromFile(strPic(work(3)))
>        PictureBox5.Image = Image.FromFile(strPic(work(4)))
直接設定するのではなく
各PictureBoxに割り当てられるworkのインデックスまたはwork(i)の
値を保持するようにしないとこの先に進めません。
またPictureBoxを配列にするなどしてキーで指定出来るようにしないと
大変なことになります。

投稿者 腐女子  (中学生) 投稿日時 2014/3/27 10:38:38
調べながら作ったソース↓
Public Class Form1
    Dim strPic(51) As String
    Dim work(51) As Integer
    Dim hRandom As New System.Random()
    Dim intResult As Integer

    Private Sub Form1_Load(sender As Object, e As System.EventArgs) Handles Me.Load
        'クローバー
        strPic(0) = "c01.gif"
        strPic(1) = "c02.gif"
        strPic(2) = "c03.gif"
        strPic(3) = "c04.gif"
        strPic(4) = "c05.gif"
        strPic(5) = "c06.gif"
        strPic(6) = "c07.gif"
        strPic(7) = "c08.gif"
        strPic(8) = "c09.gif"
        strPic(9) = "c10.gif"
        strPic(10) = "c11.gif"
        strPic(11) = "c12.gif"
        strPic(12) = "c13.gif"
        'ダイヤ
        strPic(13) = "d01.gif"
        strPic(14) = "d02.gif"
        strPic(15) = "d03.gif"
        strPic(16) = "d04.gif"
        strPic(17) = "d05.gif"
        strPic(18) = "d06.gif"
        strPic(19) = "d07.gif"
        strPic(20) = "d08.gif"
        strPic(21) = "d09.gif"
        strPic(22) = "d10.gif"
        strPic(23) = "d11.gif"
        strPic(24) = "d12.gif"
        strPic(25) = "d13.gif"
        'ハート
        strPic(26) = "h01.gif"
        strPic(27) = "h02.gif"
        strPic(28) = "h03.gif"
        strPic(29) = "h04.gif"
        strPic(30) = "h05.gif"
        strPic(31) = "h06.gif"
        strPic(32) = "h07.gif"
        strPic(33) = "h08.gif"
        strPic(34) = "h09.gif"
        strPic(35) = "h10.gif"
        strPic(36) = "h11.gif"
        strPic(37) = "h12.gif"
        strPic(38) = "h13.gif"
        'スペード
        strPic(39) = "s01.gif"
        strPic(40) = "s02.gif"
        strPic(41) = "s03.gif"
        strPic(42) = "s04.gif"
        strPic(43) = "s05.gif"
        strPic(44) = "s06.gif"
        strPic(45) = "s07.gif"
        strPic(46) = "s08.gif"
        strPic(47) = "s09.gif"
        strPic(48) = "s10.gif"
        strPic(49) = "s11.gif"
        strPic(50) = "s12.gif"
        strPic(51) = "s13.gif"
    End Sub

    Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
        Dim i As Integer, myNum As Integer
        Dim myFlag(51) As Boolean
        For i = 0 To 51
            Do
                Randomize()
                myNum = Int(Rnd() * 52)
            Loop Until myFlag(myNum) = False
            work(i) = myNum
            myFlag(myNum) = True
        Next


        PictureBox1.Image = Image.FromFile(strPic(work(0)))
        PictureBox2.Image = Image.FromFile(strPic(work(1)))
        PictureBox3.Image = Image.FromFile(strPic(work(2)))
        PictureBox4.Image = Image.FromFile(strPic(work(3)))
        PictureBox5.Image = Image.FromFile(strPic(work(4)))
    End Sub
End Class
投稿者 腐女子  (中学生) 投稿日時 2014/3/27 10:30:37
すみません!!
今までちょっと入院していたので制作を進めたり、質問することができませんでしたm(__)m
今朝から調べながらやっていたのですが、わからないことが出てきたので質問させていただきます。
スタートボタンを押すとランダムにカードが表示させることはできたのですが、手札を引いた後の山札
の作り方と、山札をクリックすると山札の一番上のカードを表示させるやり方がわかりません
投稿者 腐女子  (中学生) 投稿日時 2014/3/11 16:13:23
anさん返事ありがとうございます。
参考になるページを教えてくれてありがとうございます。
すごい参考になりました。
今後わからない事が有ったら質問させていただきますので皆様よろしく
お願いいたします。
投稿者 an  (社会人) 投稿日時 2014/3/11 11:48:26
> 初めて書き込んでみて、こんなに色んな事を言われるとは思わなかったです(笑)

題材が投稿するタイミングとしては良くなかったみたいですね^^;

> このゲームは何回目のクリックで終われるかというゲームを作りたかったのですがダメ? 

ダメではないですが、他の方が仰っている通りゲーム性としては問題があるようなので、
完成した時に達成感が低い可能性がありますね。
とはいえ、プログラムの勉強がてらであれば、自分的にはOKだと思います。

とりあえず当初の目標通り作った後に、ゲーム性を高める仕様を追加すれば良いだけかと。
(連続して消せたら点数高いとか手札が13枚になったらゲームオーバーとか)


それはさておき、当初の質問において、

> このゲームを作ることができますか??
まぁできると思います。

> できるのであれば、一緒に作るのを手伝ってくださいよろしくお願いします!!
> 一緒に作るのをがんばりましょう

一緒に作るというよりは投稿者さんが主導となって作るべきだと思いますので、
必要に応じて具体的な質問をしてみてください。
ここで回答してくれる人は具体的な質問をすれば、いくらでも答えてくれると思います。

なお、るきおさんの作ってくれたババ抜きがカードゲームの基本処理が含まれていると思いますので、
参考にすると良いと思います。
http://rucio.cloudapp.net/ThreadDetail.aspx?ThreadId=15549

その上で質問してみてください。
投稿者 腐女子  (中学生) 投稿日時 2014/3/11 11:15:41
すみません。返信遅れました。
初めて書き込んでみて、こんなに色んな事を言われるとは思わなかったです(笑)
このゲームは何回目のクリックで終われるかというゲームを作りたかったのですがダメ?
投稿者 戸田  (社会人) 投稿日時 2014/3/9 12:38:26
問題点

1. クリック連打またはスタート以外クリックする必要のないプログラムにすることが出来、ゲーム性が希薄
2. 初期5枚の手札に最大2組のペアができる可能性があり、開始と同時に手札1枚になる可能性がある
3. 4人のプレイヤーが居て、特定の数字のカードをそれぞれが持った場合クリア条件を満たせなくなる
投稿者 通りすがりの者  (社会人) 投稿日時 2014/3/9 11:16:03
shuさん

おお、すいません、いろんな人がババ抜き教えてほしそうだったのでVBプログラム界にババ抜きブーム到来なのか!と思ってしまいました。
勇み足でしたね。

しかしルールを読めば読むほどクリック連打してればクリアできるゲームに感じてしまう…
投稿者 戸田  (社会人) 投稿日時 2014/3/8 13:28:55

とりあえず開始から終了までのフローチャート書いて見たらどうですか?
投稿者 shu  (社会人) 投稿日時 2014/3/8 12:35:15
通りすがりの者さん

このスレはババ抜きのスレではないですよ。

また、山札から1枚引いて捨てるのはババ抜きと関係ないです。
投稿者 通りすがりの者  (小学生) 投稿日時 2014/3/7 17:39:09
通りすがりの者です。

最近のやりとりをみていますと、どうしてもババ抜きを作りたい!っていう意志が感じられますよね?
そこで提案なのですが、たとえばババ抜きを題材にして作成講座、みたいなのを作ってはどうでしょう?

もちろん一朝一夕にできるものではないので、そうですね、1年くらいかけてゆっくりじっくり、とかどうです?

3月になったばかりですから、まずはカードのクラスの考え方
4月にそれをフォームに表示(後半で4人ぶんとかのループのしかた)
5月に山札から1枚引いて、
6月に捨てる
7月に他の人(CPUの思考ルーチン)に順番がわたって
あ、その前にカードをデザインしてそれをグラフィックで表示したりもしたいですね

そういうのも面白いんじゃないかな~と思った次第です。

スレ汚し失礼しました。
投稿者 shu  (社会人) 投稿日時 2014/3/7 17:25:45
そのゲームの内容について

手札5枚と合うカードは山札の中に全て揃っているのだから
必ずなくなってしまうので、変化のない必ずクリア出来る
ゲームになってしまいゲームとして面白さがないです。

ゲームのルール部分をもう少し考慮された方がよいかと思います。
投稿者 たかし  (社会人) 投稿日時 2014/3/7 17:03:25
お、また名前変えたんですね。
ババ抜きのカードが揃った時の動作がわからないなら
素直に自分の書いたコードを載せてどこが悪いのか聞けばいいのに^^;

ちなみにそのゲーム
めくったカードが手札のどれとも一致しなかった場合めくったカードはどこ行くんですか?
投稿者 腐女子  (中学生) 投稿日時 2014/3/7 13:37:45
はじめまして!!よろしくお願いします
今VB2010でオリジナルのトランプゲームを作っています。
よろしければ手伝ってもらえませんか??

ゲームの内容は↓
①手札をランダムに5枚配る
②山札を1枚めくる。もしめくったカードと同じ数字のカードが手札にあったら手札のカードを消す。
  これを手札がなくなるまで繰り返す。そして、手札のカードがなくなったらゲームクリアです
このゲームを作ることができますか??
できるのであれば、一緒に作るのを手伝ってくださいよろしくお願いします!!


ゲームの流れ
①スタートボタンを押すとランダムに手札が配られる(ピクチャーボックス1~5で表示させる)
②山札をクリックする(山札はピクチャーボックス6)
③山札をクリックすると画像が表示される(表示される場所はピクチャーボックス7)
④ピクチャーボックス7に表示させたカードと手札のカードと比較し
  同じ数字だったら手札のカードを消すこの繰り返しす
⑤すべて手札が消えたらクリア

一緒に作るのをがんばりましょう