プロが教える店舗&オフィスのセキュリティ対策術

心理学実験のために、
「シャッフルされたトランプの山から1回100円で
1枚ずつ引いていき、ハートのカードが5枚揃った時点でプレイヤーの勝ち!」

というゲームをVisualBasic2010Expressで作りたいですが、プログラムが分かりません。

VBは初心者です。
Dimの意味がなんとなく分かるくらい・・・

どなたかご指導お願いいたします。

教えて!goo グレード

A 回答 (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


わからないときは、また質問してね。
「Visual Basic でトランプを引」の回答画像2
    • good
    • 0
この回答へのお礼

非常に詳しいご回答、ありがとうございます!お時間いただいて恐縮です。
ただお恥ずかしいことにフォルダーパスやインスタンスといった言葉が分からず、解読に時間がかかっております。
画像を拝見すると、すごく私のイメージに近いです。
画像あったほうがいいのか、と思ったので、イメージ画像つきで同じ質問「Visual Basicでトランプ版ガチャガチャ」を立てました。
そちらの方が詳しいので、お暇でしたら寄ってください。心強いです。

お礼日時:2012/09/30 22:57

>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への移行の際にも参考になるかと思います。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。私がやりたかったことに非常に近いです。
恥ずかしながらRangeの意味が分からなかったので、説明サイトで勉強します。
また、私がイメージしてるプログラムの画像があった方が答えていただきやすいと思ったので、
同じ質問を別スレ「VBでトランプ版ガチャガチャ」で立てました。
覗いていただけたら幸いです。どうもありがとうございました。

お礼日時:2012/09/30 22:52

すいません



先ほどのサンプルですが、リストをクリアするのを忘れました。
再掲載します。

先ほどの画像は、右側はデザイナー画面の画像で、左側は実行時の画像です。

ゲームは、右の画像と左の画像が同じハートのマークの時にプレイヤーに、勝のカウントが足されます。
めったにプレイヤーが勝つことはありません。


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


お手数おかけします。
    • good
    • 0

いつまでに必要なのでしょうか?


どの程度の出来を期待しているのでしょうか?
予算はどれくらいなのでしょうか?
パソコンでないとだめなのでしょうか?

プログラムの流れ自体は簡単です。
1. 初期化
ハートの枚数=0
トランプ54枚分の準備
など

2.トランプのシャフル

3.入力待ち
引くのかやめるのか

4. 3で「引く」なら、「引く」を実行
山の先頭を表示、「先頭」を次の位置へ。
ハートだったら、枚数=枚数+1
3.へ戻る

5.3で「やめる」なら終了。
枚数>=5なら勝ち
<5なら負け
終了、または、1.へ戻る


これで、プログラムのイメージすらもできない、とても急いでいる、というのなら、
○他人(業者、友人、部下、共同研究者...)に頼む。
○PCを使わずに、普通のトランプを使う
がいいでしょう。

ほとんどは、初級の知識でできます。難しいのは
・シャフル
・画面表示
だけでしょう
    • good
    • 0
この回答へのお礼

早速のご回答ありがとうございます。
ご回答をみて、自分がどの部分のプログラムが分からないのか知ることができました。

とはいえ色々と情報不足でしたね、すみません。
10月中には完成させたいと思っています。訳あってPCでやりたいのです。
出来は、必要最低限のもので大丈夫です。
カードの枚数を52枚だけでなく無制限にしたりとか、いろいろいじりたいので。

お礼日時:2012/09/30 22:09

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

教えて!goo グレード

人気Q&Aランキング