• 締切済み

VB6.0で製作中の「もぐらたたきゲーム」について(補足版)

昨日しました質問が要領を得ていなくて、回答してくださった皆様すいません。 ランダムで4種類の画像が同時に16個のImageにランダムに表示するようにしています。が、ランダムに表示するなかでも画像がかぶってしまい3種類、もしくは2種類しか表示されなくなってしまっています。どうしたら4種類とも表示できるでしょうか? <コード> Private Sub Form_Load() Randomize End Sub Private Sub Timer1_Timer() n = n + 1 If n <= 20 Then i = Int(Rnd * 16) f = Int(Rnd * 16) s = Int(Rnd * 16) b = Int(Rnd * 16) Image1(i0) = Image4 Image1(f0) = Image4 Image1(s0) = Image4 Image1(b0) = Image4 Image1(i) = Image2 Image1(f) = Image2 Image1(s) = Image5 Image1(b) = Image7 Label1.Caption = " バイキンマンの数 = " & (2 * n) Label3.Caption = " ドキンちゃんの数 = " & n i0 = i s0 = s b0 = b f0 = f Else Timer1.Enabled = False Command1.Caption = " 再度トライ " End If End Sub もっとコードが必要でしたら公開します。

みんなの回答

  • ebn
  • ベストアンサー率29% (7/24)
回答No.3

設定した数を確実に入れるには テーブルを準備して、必要な絵を必要個数順番にいれます。 その後でループを(ランダム回数)まわして、入れ替え(元と先はランダム)を行います。 順番が変わるだけなので、設定した絵が出るかと...

  • kiki_s
  • ベストアンサー率59% (147/248)
回答No.2

すでに、ANo.1さんが回答されていますが、 補足版の前に書き込みましたので、 一応責任があるかと・・・(^^;; コードの書き方は色々と考えられます。 ANo.1さんがおっしゃる通り配列を使うとか。 難しく考えるより、単純に考えた方がいい場合もあります。 下記コードはANo.1さんの内容をそのままコードにしてみました。 i = Int(Rnd * 16) Do f = Int(Rnd * 16) If f <> i Then Exit Do Loop Do s = Int(Rnd * 16) If i <> s And f <> s Then Exit Do Loop Do b = Int(Rnd * 16) If i <> b And f <> b And s <> b Then Exit Do Loop 単純に乱数の重複をチェックしているだけです。 下手にややこしいコードを書くより、 4種類の乱数程度なら、比較で十分対応出来ると思いますよ。 なお、上のコードはあくまで一例です。 動作の責任は持てませんm(__)m

  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.1

>i = Int(Rnd * 16) >f = Int(Rnd * 16) >s = Int(Rnd * 16) >b = Int(Rnd * 16) ここで乱数発生させて各変数に0~15までの値が入りますが、これだと同じ値が入る確立が結構ありますよね。 一番簡単なのは、それまでに発生させた0~15間での値がすでに変数に格納されていたらもう一度乱数を発生させればOKですよね。 ここで注意が必要なのは、再度乱数を発生させる必要があるのは1度だけではなく、重複がなくなるまで繰り返す必要があります。 Do ~ Loopを使って、ループさせてください。 また、2番目の変数なら1番目との重複をチェックするだけでいいですが、 3番目の変数の場合、1番目と2番目の両方と重複しない値を求めないといけません。 もちろん4番目なら1,2,3とすべてとの重複をチェックする必要があります。 こういった場合、うまくロジックを組むには乱数を入れる変数を配列にしたり、ループを組み合わせるといいかと。 なれないと難しいかもしれませんががんばってください。

関連するQ&A

  • VB6でスロットを作成したい

    VB6歴2ヶ月の初心者です。 フォーム上に ラベルコントロールが三つ コマンドボタンが二つ タイマーコントロールが一つ あります。 タイマーのプロパティは Enabled False Interval 10 です。 スロットを作成したいのですが、 ボタン1を一回押すごとに左からスロットが回り、 最後にボタン2で動きを止めたいのです。 一応自分でも書いてみたのですが、ここで行き詰まりました。 ウワァァァァァァヽ(`Д´)ノァァァァァァン! Private Sub Command1_Click() Timer1.Enabled = True End Sub Private Sub Command2_Click() Timer1.Enabled = False End Sub Private Sub Timer1_Timer() Dim slot As Integer slot = Int(Rnd(1) * 9 + 1) Label1.Caption = slot End Sub 思い通りに動かすにはどんなコードにしたらいいですか?

  • vb6.0のプログラム

    今こんなプログラムを作っているのですがなぜか、足りない部分があると言われて困っております。 できれば教えてください。 図 ーーーーーーーーーーーーーーーー from ーーーーーーーーーーーーーーーー 残り30秒[ーーーーラベルーーーー] 000+000=000←(3つともlabel) □-------------------□←HScrollbar max100 min0 [コマンドボタン] [タイマー]←非表示 ーーーーーーーーーーーーーーーー コード Private intCount As Integer Private intSecond As Integer Private Sub cmdStart_Click() Dim intNum1 As Integer Dim intNum2 As Integer If cmdStart.Caption = "Start" Then intCount = 0 intSecond = 30 lblResult.Caption = "" cmdStart.Caption = "OK" tmrSecond.Enabled = True ElseIf cmdStart.Caption = "OK" Then If CInt(lblAnswer.Caption) = CInt(lblNum1.Caption) + CInt(lblNum2.Caption) Then lblResult.Caption = lblResult.Caption & "○" intCount = intCount + 1 Else lblResult.Caption = lblResult.Caption & "×" End If intNum1 = Rnd() * 50 intNum2 = Rnd() * 50 lblNum1.Caption = intNum1 lblNum2.Caption = intNum2 End If End Sub Private Sub hsbAnswer_Change() lblAnswer.Caption = hsbAnswer.Value End Sub Private Sub tmrSecond_Timer() intSecond = intSecond - 1 lblTime.Caption = "残り" & intSecond & "秒" If intSecond = 0 Then tmrSecond.Enabled = False MsgBox (intCount & "問正解") cmdStart.Caption = "Start" Else End If End Sub どうぞよろしくお願いします。

  • 乱数で・・・

       ラベル10枚に1~10までを乱数を入れたいのです ただしダブらない どうすればいいのでしょうか?? 自分で考えたのですがバグがあります ※コマンドをクリック ※クローンは用意済み Private Sub Command1_Click() Dim a(0 To 9) For i = 0 To 9 a(i) = Int(Rnd * 10)+1  For b = 0 To 9   If a(i) = a(b) Then     If i <> b Then     a(i) = Int(Rnd * 10) + 1     End If   End If   Next b Next i For c = 0 To 9 Label1(c).Caption = a(c) Next c End Sub バグの原因はなんとなくわかるのですがどうすればいいのか分かりません 素人ですいません。

  • VB初心者です

    計算結果が"7"の時に限り、「当たり!」と表示される、ちょっと意味不明な計算機を作っています。 現在、下記のように書いてますが、何故かうまくいきません。(当たりが表示されない 何故でしょうか?お助けください。。m(_ _)m Private Sub Command1_Click() Label1.Caption = Str(Val(Text1.Text) + Val(Text2.Text)) Label3.Caption = "+" Label4.Visible = False '画像を隠す。 'いずれかの数字が「7」のとき、メッセージを表示する。 If Label1.Caption = "7" Then Label4.Visible = True End If End Sub Private Sub Command2_Click() End End Sub Private Sub Command3_Click() Label1.Caption = Str(Val(Text1.Text) * Val(Text2.Text)) Label3.Caption = "*" End Sub Private Sub Command4_Click() Label1.Caption = Str(Val(Text1.Text) - Val(Text2.Text)) Label3.Caption = "-" End Sub Private Sub Command5_Click() Label1.Caption = Str(Val(Text1.Text) / Val(Text2.Text)) Label3.Caption = "/" End Sub

  • VBでの質問です

    VBでの質問です 5分を計るタイマーを作っていて5分たつと止まるプログラムを作っていて、コンマ以下のケタが長くて、しかも止まらない( Label1.Text = n5.Subtract(Now).ToStringをLabel1.Text = n5.Subtract(Now).TotalMinutesにしてIf Label1.Text = "00:00:00" ThenをIf Label1.Text = "0" Thenにした時は止まりました)ので止まるようにするにはどこを変えればいいですか? 教えてください 以下コードです Public Class Form1 Dim n5 As DatePrivate Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load n5 = Now.AddMinutes(5) Timer1.Interval = 1000 Timer1.Start() End Sub Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick Label1.Text = n5.Subtract(Now).ToString If Label1.Text = "00:00:00" Then MsgBox("時間になりました。") Timer1.Stop() End If End Sub 長文ですいません

  • Paintpicture描画時のクリックイベント

    お知恵を貸してください! ただいま「ランダムな場所にImageを描画して、そのイメージをクリックするとイベントが起きる」という プログラムを組んでいます。 Paintpictureを使って、ランダムに描画することはできたのですが、 描画したイメージをクリックしてもイベントの動作を行ってくれません。 使用しているのはVB6.0です。 プログラムは以下のとおりです。 Imageは透過GIF(Image1)と保険にマスクイメージ(Image2)を使用しております。 ------- ・描画プログラム Private Sub Command1_Click() End End Sub Private Sub Timer1_Timer() x = Int(rnd * Form1.Width) - (Image1.Width \ 2) y = Int(rnd * Form1.Height) - (Image1.Height \ 2) Form1.Refresh Form1.PaintPicture Image2, x, y, , , , , , , vbSrcAnd Form1.PaintPicture Image1, x, y, , , , , , , vbSrcPaint End Sub ------- ・行動プログラム Private Sub Image1_Click() MsgBox "Score gat" End Sub ------- アドバイス、ご指摘お願いいたします。

  • もぐらたたきのプログラミング

    大至急返答お願いします。 学校の自由実験で、VB2008でもぐらたたきを作っているのですが、以下のソースでデバッグし、ゲームを開始するボタンを押すとすると変なバグが表示されます。 Private Sub PictureBox_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Static Hit As Integer 'もぐらを叩いた時 Me.Controls.Remove(sender) 'もぐらが消える Hit += 1 'Hitが1加算される Point = 0 + Hit 'Pointは 0+ Hit で表わされる Label5.Text = Format(Point, "000") End Sub Private Sub Timer4_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer4.Tick Dim X, Y As Integer '座標指定 Dim mole1 As System.Windows.Forms.PictureBox '表示されるモグラ For Each mole1 In Me.Controls mole1.Tag -= 1 'もぐらの出現している時間のカウント If mole1.Tag < 0 Then Me.Controls.Remove(mole1) 'カウントが0になったらもぐらが消える End If Next If Rnd() * 4 < 1 Then mole1 = New System.Windows.Forms.PictureBox '1/4の確率でもぐらを表示 mole1.Size = New Size(100, 100) 'もぐらのサイズは100*100 X = Rnd() * (Me.ClientSize.Width - 100) Y = Rnd() * (Me.ClientSize.Height - 100) mole1.Location = New Point(X, Y) 'もぐらはX,Yの場所に表示される mole1.Image = My.Resources.Mole mole1.Tag = Int(Rnd() * 9) + 7 'もぐらの停滞している時間のカウント AddHandler mole1.Click, AddressOf PictureBox_Click Me.Controls.Add(mole1) End If End Sub もぐらを表示させるためのTimerのソースはこれなのですが、デバッグしてゲームスタートボタンを押すと InvalidCastExceptionはハンドルされませんでした。 型 'System.Windows.Forms.Label' のオブジェクトを型 'System.Windows.Forms.PictureBox' にキャストできません。 という意味深な文章が表示されてしまいます。 まだ初心者なので、よく分からないことが結構あります。 自己解決しようと努力してきましたが結局できず、終了期間間際になってしまいました。 是非御返答の程よろしくお願いします。

  • Rnd関数の戻り値

    ボタンのクリックでRnd関数の戻り値をLabelのCaptionに表示させるという シンプルな事をしていたのですが不定期に0~0.9999....以外の数値(?)が 帰ってきます。 例えば 5.244088E-02 等です。 発生に規則性は見当たりませんが、必ず1以上の数で最後にE-02が付きます。 書式は Private Sub Command1_Click()   Label1.caption = Rnd End Sub これだけです。 何かご存知の方がいらっしゃいましたらレスをお願い致します。

  • ExcelのVBでタイピングゲームもどきを製作中なのですが・・・

    はじめまして。 ExcelのVBでタイピングゲームもどきを作っているのですが、 どうしてもうまくできません。 いろいろ調べたのですが、解決できませんでした。 まだ途中なのですがこれができないと先に勧めません。 Sheet2からランダムに文章を選び表示し、 入力した文字が正しければ文字を下のテキストボックスに 落していくみたいな感じに作ろうとしています。 解決方法、直したほうがいいとこがりましたら回答のほう お願いします。 まるまるプログラムを変えたほうがいいような感じのときは どのようなプログラムにしたらいいのかお願いします。 Private Sub CommandButton1_Click() Dim n As Long Dim k As Long Dim L As Variant Dim X As Long Dim O As Variant Dim WrkRow As Long Dim WrkCol As Long Dim WrkRange As Variant With Sheets("Sheet2") WrkRow = .Cells(Rows.Count, 1).End(xlUp).Row WrkCol = .Cells(1, Columns.Count).End(xlToLeft).Column WrkRange = .Range("A1").Resize(WrkRow, WrkCol) End With L = "" TextBox1 = "" Randomize n = Int(Rnd() * 10) k = n + 1 TextBox1 = WrkRange(k, 1) TextBox2 = WrkRange(k, 2) O = k L = WrkRange(k, 2) X = 0 End Sub Private Sub CommandButton1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, _ ByVal shift As Integer) If X > 6 Then Exit Sub KC = KeyCode If Chr(KC) = X Then X = X + 1 TextBox2 = Right(L, 7 - X) TextBox3 = Left(L, X) End If End Sub

  • PICNICのVB制御プログラム

    お世話になります。 VBでPICNICボード(トライステート社製http://www.tristate.ne.jp/)の制御ソフトを作っているのですがコンパイルエラーがでて、プログラムの実行ができません。(VB初心者です) (1)接点入力、アナログデータは取り込みできます。 (2)パラレルポートのピン方向制御はできます。 (3)パラレルポートのピン方向状態は読み込みできます。 (4)接点出力(I/O pinのLow,High)制御、液晶制御、RS232送信制御ができません。 問題ありソース Dim retvalue As Variant Dim n, m As Integer Dim nameb As String Dim rez As Integer Dim status(0 To 3) As Boolean Dim current As Integer Dim data(100000) As Integer Dim datab(100000) As Boolean Private Sub Command1_Click() data(current) = PICOCX1.ADinp(PortA, 4) Label1.Caption = "温度:" & Format(data(current) / 10.23 * 5, "#0.0℃") retvalue = PICOCX1.Dirp(PortB, 4, pinOutput) End Sub Private Sub Command2_Click() Unload Me End Sub Private Sub Timer1_Timer() Call check End Sub Private Sub check() n = 0 m = 0 nameb = "tanaka" data(current) = PICOCX1.ADinp(PortA, 0) Label2.Caption = "温度:" & Format(data(current) / 102.3 * 5, "#0.0℃") data(current) = PICOCX1.ADinp(PortA, 1) Label3.Caption = "湿度1:" & Format(data(current) / 10.23 * 5, "#0.0%") data(current) = PICOCX1.ADinp(PortA, 2) Label4.Caption = "湿度2:" & Format(data(current) / 10.23 * 5, "#0.0%") data(current) = PICOCX1.ADinp(PortA, 3) Label5.Caption = "空き:" & Format(data(current) / 10.23 * 5, "#0.0") data(current) = PICOCX1.ADinp(PortA, 5) Label6.Caption = "温度:" & Format(data(current) / 10.23 * 5, "#0.0℃") 'ポートRA5の値 基板側のミス? data(current) = PICOCX1.ADinp(PortA, 4) Label1.Caption = "温度:" & Format(data(current) / 10.23 * 5, "#0.0℃") ' 文法テスト datab(10000) = PICOCX1.ADinp(PortA, 4) '接点入力状態 status(0) = PICOCX1.Inp(PortB, 0) If status(0) = True Then Label7(0).Caption = "扉閉状態" Else Label7(0).Caption = "扉開状態" End If status(1) = PICOCX1.Inp(PortB, 1) If status(1) = True Then Label7(1).Caption = "扉施錠状態" Else Label7(1).Caption = "扉解除状態" End If status(2) = PICOCX1.Inp(PortB, 2) If status(2) = True Then Label7(2).Caption = "  " Else Label7(2).Caption = "人検知" End If status(3) = PICOCX1.Inp(PortB, 3) If status(3) = True Then Label7(3).Caption = "High" Else Label7(3).Caption = "Low" End If 'パラレルポート入出力状態 retvalue = PICOCX1.GetDirp(PortB, 4) 'パラレルポート入出力方向制御 'retvalue = PICOCX1.Dirp(PortB, 4, pinInput) ' retvalue = PICOCX1.Dirp(PortB, 4, pinOutput) '接点出力制御 'data(current) = PICOCX1.Outp(PortB, 4, High) 'void = PICOCX1.Outp(PortB, 4, High) 'retvalue = PICOCX1.Outp(PortB, 4, 0) retvalue = PICOCX1.Outp(PortB, 4, High) '液晶の制御 ' retvalue = PICOCX1.LcdClear これはサポートされていなとのメッセージ 'retvalue = PICOCX1.ClearLcd '型の不一致エラー ' retvalue = PICOCX1.PutLcd(n, m, nameb) 'retvalue = PICOCX1.SetPos(n, m) 'retvalue = PICOCX1.PutLcd(n, m, nameb) 'シリアルI/F制御 'retvalue = PICOCX1.Transmit(nameb) retvalue = PICOCX1.Receive '文法エラーでなく誰かがすでに使用しているとのメッセージ End Sub エラー内容及び疑問 (1) 接点出力制御 retvalue = PICOCX1.Outp(PortB, 4, High)   コンパイルエラー 型が一致しません。 とのエラーがでます。基本的文法ミスですか? retvalue を全種10種に型に変更しても変わりません。 (2) retvalue = PICOCX1.Outp(PortB, ・・とエディターで入力時、ADinp命令入力時みたいに入力支援メニュで型宣言がありません。型指定不要ですか? 以上 初歩的質問ですが、悩んでおります。 お忙しいところ申し訳ありませんが誰か教えてください。