
No.2ベストアンサー
- 回答日時:
こんばんは
>心理学実験のために
すごいですね。なんだろ~?
>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でトランプ版ガチャガチャ」を立てました。
そちらの方が詳しいので、お暇でしたら寄ってください。心強いです。
No.4
- 回答日時:
>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でトランプ版ガチャガチャ」で立てました。
覗いていただけたら幸いです。どうもありがとうございました。
No.3
- 回答日時:
すいません
先ほどのサンプルですが、リストをクリアするのを忘れました。
再掲載します。
先ほどの画像は、右側はデザイナー画面の画像で、左側は実行時の画像です。
ゲームは、右の画像と左の画像が同じハートのマークの時にプレイヤーに、勝のカウントが足されます。
めったにプレイヤーが勝つことはありません。
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
お手数おかけします。
No.1
- 回答日時:
いつまでに必要なのでしょうか?
どの程度の出来を期待しているのでしょうか?
予算はどれくらいなのでしょうか?
パソコンでないとだめなのでしょうか?
プログラムの流れ自体は簡単です。
1. 初期化
ハートの枚数=0
トランプ54枚分の準備
など
2.トランプのシャフル
3.入力待ち
引くのかやめるのか
4. 3で「引く」なら、「引く」を実行
山の先頭を表示、「先頭」を次の位置へ。
ハートだったら、枚数=枚数+1
3.へ戻る
5.3で「やめる」なら終了。
枚数>=5なら勝ち
<5なら負け
終了、または、1.へ戻る
これで、プログラムのイメージすらもできない、とても急いでいる、というのなら、
○他人(業者、友人、部下、共同研究者...)に頼む。
○PCを使わずに、普通のトランプを使う
がいいでしょう。
ほとんどは、初級の知識でできます。難しいのは
・シャフル
・画面表示
だけでしょう
早速のご回答ありがとうございます。
ご回答をみて、自分がどの部分のプログラムが分からないのか知ることができました。
とはいえ色々と情報不足でしたね、すみません。
10月中には完成させたいと思っています。訳あってPCでやりたいのです。
出来は、必要最低限のもので大丈夫です。
カードの枚数を52枚だけでなく無制限にしたりとか、いろいろいじりたいので。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
「カノッサの屈辱」の原語について
-
今の早稲田卒の岸田より、成蹊...
-
岸田総理の支持率が6カ月連続で...
-
誰が岸田総理を支持しているん...
-
政治家は国民から過剰に税金を...
-
世の中変えたいと思いますか? ...
-
岸田内閣は適材適所ですね?選...
-
日本の政治がダメなのは政治家...
-
政治家は楽な仕事をして高額な...
-
自民党の河野さんの卒業大学は...
-
AIで歴史人物を再現することは...
-
非難・謝罪
-
メールアドレスのこの棒って、...
-
4つある言葉
-
習近平の学歴・学識・学力、そ...
-
オリンピック選手だった馳浩が...
-
中国に行くことは
-
ローマ字入力:マクロンの出し...
-
VIPとCIPラウンジ
-
くじ引きの方法
おすすめ情報