- ベストアンサー
Visual Basic でトランプを引くゲーム
心理学実験のために、 「シャッフルされたトランプの山から1回100円で 1枚ずつ引いていき、ハートのカードが5枚揃った時点でプレイヤーの勝ち!」 というゲームをVisualBasic2010Expressで作りたいですが、プログラムが分かりません。 VBは初心者です。 Dimの意味がなんとなく分かるくらい・・・ どなたかご指導お願いいたします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
こんばんは >心理学実験のために すごいですね。なんだろ~? >Dimの意味がなんとなく分かるくらい・・・ 最初はみ~んな同じです。 私は、まだDimの意味の意味はわかりません。 最初はコピペでもいいと思います。 そのうち慣れればわかるようになります。 ゲームの内容、ルールはよくわかりませんが、適当にサンプルを作成しましたので参考にしてください。 (正直言って、私はゲームは1回も作成したことがありません。 よっておかしなところがあると思います。) >ハートのカードが5枚揃った時点でプレイヤーの勝ち! めったに勝てません! トランプのファイル名は ハートの1ならなら「h1.png」 ハートの5ならなら「h5.png」 スペードの1なら「s1.png」 スペードの6なら「s6.png」 のように設定してください。 testフォルダーの中にトランプの画像ファイルを入れてください。 Public Class Form1 Const DIR_NAME As String = "C:\test" 'フォルダーパス Dim rndm As New Random 'Randomのインスタンス Dim ar As New List(Of String) 'トランプをリストにする ' Dim ar() As String Dim tranpcount As Integer 'トランプの枚数 Dim victry As Integer 'ハートのカードが揃ったときのカウンター Dim bank As Integer = 500 '持ち点 Dim playercount As Integer 'プレイヤーの得点 Dim comptcount As Integer 'コンピューターの得点 Private Sub f1() Handles MyBase.Shown Button1.Enabled = True Dim ofolder As New IO.DirectoryInfo(DIR_NAME) Dim ofile As IO.FileInfo 'ループでファイル名をリストにAddする() For Each ofile In ofolder.GetFiles("*", IO.SearchOption.AllDirectories) ar.Add(ofile.Name) Next End Sub 'Clickイベント Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click tranpcount = ar.Count 'トランプの枚数の枚数を数える 'PictureBoxに描画するサイズの設定 PictureBox1.SizeMode = PictureBoxSizeMode.Zoom PictureBox2.SizeMode = PictureBoxSizeMode.Zoom Dim rndm1 As Integer Dim rndm2 As Integer 'コンピューターの選んだカードとプレイヤーが選んだカードが同じ場合はループを繰り返す Do '0からtranpcount-1までのランダムな数字を取得 rndm1 = rndm.Next(tranpcount) rndm2 = rndm.Next(tranpcount) '上記で取得した値からPictureBoxに描画 PictureBox1.Image = Image.FromFile(DIR_NAME & "\" & ar(rndm1)) PictureBox2.Image = Image.FromFile(DIR_NAME & "\" & ar(rndm2)) 'コンピューターの選んだカードとプレイヤーが選んだカードがが違う時はループを抜ける If ar(rndm1) <> ar(rndm2) AndAlso ar.Contains(ar(rndm1)) AndAlso ar.Contains(ar(rndm2)) Then Exit Do End If Loop Dim head1 As String Dim head2 As String 'ファイル名の先頭の文字を取得 head1 = ar(rndm1).Substring(0, 1) head2 = ar(rndm2).Substring(0, 1) If head1 = "h" AndAlso head2 = "h" Then victry += 1 '先頭の文字が同一であればカウントする playercount += 100 bank += 100 Else 'それ以外にカウントする playercount -= 100 comptcount += 100 bank -= 100 End If '1度使ったトランプは削除 If rndm2 > rndm1 Then ar.RemoveAt(rndm1) ar.RemoveAt(rndm2 - 1) Else ar.RemoveAt(rndm1) ar.RemoveAt(rndm2) End If '各ラベルに表示 Label3.Text = comptcount Label4.Text = playercount Label6.Text = bank If victry = 5 Then MsgBox("プレイヤーの勝ち!") End If If tranpcount < 3 Then MsgBox("トランプがありません、終了です。") Button1.Enabled = False End If End Sub '初期化 Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click f1() victry = 0 bank = 500 playercount = 0 comptcount = 0 Label3.Text = 0 Label4.Text = 0 Label6.Text = 500 End Sub End Class わからないときは、また質問してね。
その他の回答 (3)
- hallo-2007
- ベストアンサー率41% (888/2115)
>VBは初心者です。 ほかの言語などでのプログラムの経験は? とりあえず、エクセルを使って超簡単なプログラムを作ってみました。 1、新規ブックを開く 2、Sheet1のA列に ハート1 ハート2 ・・・ スペード1 スペード2 ・・ とカードを準備する(ハートマーク等を使ってもよいでしょう) 3、シート2の名前のタブを右クリック、コードの表示をクリックすると VBエディターが起動するので Dim x As Integer Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) Cells(x + 5, Target.Column).Value = Sheets("sheet1").Range("D" & x).Value x = x + 1 End Sub Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean) With Sheets("Sheet1") For i = 1 To 100 If .Range("A" & i).Value = "" Then Exit For .Range("B" & i).Value = Rnd() .Range("C" & i).FormulaR1C1 = "=RANK(RC[-1],C[-1])" .Range("D" & i).FormulaR1C1 = "=INDEX(C[-3],RC[-1])" Next End With x = 1 Rows("6:100").Value = Clear End Sub 貼り付けて閉じます 右クリックでシャッフルと初期化 適当な列のセルをダブルクリックすることで カードを引くになります。 あいているセルに =COUNTIF(A6:A100,"ハ*") とでも関数を入れておけば ハートの数が表示されますので、5になったら 勝ちとでも表示させてください。 使っているコードは はずか10行ほどで Range と cellsだけですので、 VBA Rnage とでも入れて Webで検索すればいくつでも説明してくれているサイトが あります。 コードの意味を勉強してご希望の動作に編集してください。 VBAもVBも兄弟みたいなものですから、VBへの移行の際にも参考になるかと思います。
お礼
ご回答ありがとうございます。私がやりたかったことに非常に近いです。 恥ずかしながらRangeの意味が分からなかったので、説明サイトで勉強します。 また、私がイメージしてるプログラムの画像があった方が答えていただきやすいと思ったので、 同じ質問を別スレ「VBでトランプ版ガチャガチャ」で立てました。 覗いていただけたら幸いです。どうもありがとうございました。
- 田中 裕之(@bybalsendercase)
- ベストアンサー率88% (56/63)
すいません 先ほどのサンプルですが、リストをクリアするのを忘れました。 再掲載します。 先ほどの画像は、右側はデザイナー画面の画像で、左側は実行時の画像です。 ゲームは、右の画像と左の画像が同じハートのマークの時にプレイヤーに、勝のカウントが足されます。 めったにプレイヤーが勝つことはありません。 Public Class Form1 Const DIR_NAME As String = "C:\test" 'フォルダーパス Dim rndm As New Random 'Randomのインスタンス Dim ar As New List(Of String) 'トランプをリストにする ' Dim ar() As String Dim tranpcount As Integer 'トランプの枚数 Dim victry As Integer 'ハートのカードが揃ったときのカウンター Dim bank As Integer = 500 '持ち点 Dim playercount As Integer 'プレイヤーの得点 Dim comptcount As Integer 'コンピューターの得点 Private Sub f1() Handles MyBase.Shown Button1.Enabled = True Dim ofolder As New IO.DirectoryInfo(DIR_NAME) Dim ofile As IO.FileInfo 'ループでファイル名をリストにAddする() For Each ofile In ofolder.GetFiles("*", IO.SearchOption.AllDirectories) ar.Add(ofile.Name) Next End Sub 'Clickイベント Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click tranpcount = ar.Count 'トランプの枚数の枚数を数える 'PictureBoxに描画するサイズの設定 PictureBox1.SizeMode = PictureBoxSizeMode.Zoom PictureBox2.SizeMode = PictureBoxSizeMode.Zoom Dim rndm1 As Integer Dim rndm2 As Integer 'コンピューターの選んだカードとプレイヤーが選んだカードが同じ場合はループを繰り返す Do '0からtranpcount-1までのランダムな数字を取得 rndm1 = rndm.Next(tranpcount) rndm2 = rndm.Next(tranpcount) '上記で取得した値からPictureBoxに描画 PictureBox1.Image = Image.FromFile(DIR_NAME & "\" & ar(rndm1)) PictureBox2.Image = Image.FromFile(DIR_NAME & "\" & ar(rndm2)) 'コンピューターの選んだカードとプレイヤーが選んだカードがが違う時はループを抜ける If ar(rndm1) <> ar(rndm2) AndAlso ar.Contains(ar(rndm1)) AndAlso ar.Contains(ar(rndm2)) Then Exit Do End If Loop Dim head1 As String Dim head2 As String 'ファイル名の先頭の文字を取得 head1 = ar(rndm1).Substring(0, 1) head2 = ar(rndm2).Substring(0, 1) If head1 = "h" AndAlso head2 = "h" Then victry += 1 '先頭の文字が同一であればカウントする playercount += 100 bank += 100 Else 'それ以外にカウントする playercount -= 100 comptcount += 100 bank -= 100 End If '1度使ったトランプは削除 If rndm2 > rndm1 Then ar.RemoveAt(rndm1) ar.RemoveAt(rndm2 - 1) Else ar.RemoveAt(rndm1) ar.RemoveAt(rndm2) End If '各ラベルに表示 Label3.Text = comptcount Label4.Text = playercount Label6.Text = bank If victry = 5 Then MsgBox("プレイヤーの勝ち!") End If If tranpcount < 3 Then MsgBox("トランプがありません、終了です。") Button1.Enabled = False ar.Clear() 'リストをクリアする End If End Sub '初期化 Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click f1() victry = 0 bank = 500 playercount = 0 comptcount = 0 Label3.Text = 0 Label4.Text = 0 Label6.Text = 500 End Sub End Class お手数おかけします。
- kmee
- ベストアンサー率55% (1857/3366)
いつまでに必要なのでしょうか? どの程度の出来を期待しているのでしょうか? 予算はどれくらいなのでしょうか? パソコンでないとだめなのでしょうか? プログラムの流れ自体は簡単です。 1. 初期化 ハートの枚数=0 トランプ54枚分の準備 など 2.トランプのシャフル 3.入力待ち 引くのかやめるのか 4. 3で「引く」なら、「引く」を実行 山の先頭を表示、「先頭」を次の位置へ。 ハートだったら、枚数=枚数+1 3.へ戻る 5.3で「やめる」なら終了。 枚数>=5なら勝ち <5なら負け 終了、または、1.へ戻る これで、プログラムのイメージすらもできない、とても急いでいる、というのなら、 ○他人(業者、友人、部下、共同研究者...)に頼む。 ○PCを使わずに、普通のトランプを使う がいいでしょう。 ほとんどは、初級の知識でできます。難しいのは ・シャフル ・画面表示 だけでしょう
お礼
早速のご回答ありがとうございます。 ご回答をみて、自分がどの部分のプログラムが分からないのか知ることができました。 とはいえ色々と情報不足でしたね、すみません。 10月中には完成させたいと思っています。訳あってPCでやりたいのです。 出来は、必要最低限のもので大丈夫です。 カードの枚数を52枚だけでなく無制限にしたりとか、いろいろいじりたいので。
お礼
非常に詳しいご回答、ありがとうございます!お時間いただいて恐縮です。 ただお恥ずかしいことにフォルダーパスやインスタンスといった言葉が分からず、解読に時間がかかっております。 画像を拝見すると、すごく私のイメージに近いです。 画像あったほうがいいのか、と思ったので、イメージ画像つきで同じ質問「Visual Basicでトランプ版ガチャガチャ」を立てました。 そちらの方が詳しいので、お暇でしたら寄ってください。心強いです。