dポイントプレゼントキャンペーン実施中!

 遊び感覚でパズルを作ったのですがバグがあるのです。
(作成する前に気がついたのですが、先に本体のPGをした)

プログラム内容は

imageが16個あります(4*4)
左上から1、2、3 とindex番号をつけています。

ある場所をクリックすると 縦と横の画像が別の画像に変わります(自分自身も)
(すべてが同じ画面になると完成です)

そんなPGです。

バグがある(と思われる)のはスタートです。
現在1枚1枚乱数で裏表を決めていますが、この方法だと出来ない(100%)パターンがあるかと思います。
(その代わり65536分の1の確率でいきなり完成します(笑))

このスタートに入れるPGがうまく出来ないのです。

---------

乱数で数値を決める
その数値によりあるPGを実行する(※1)
それを*階繰り返す

としたのですがうまく出来ません。

ちなみに
※1のPGはパズルで遊ぶときのPGをそのままコピーして変数(indexから別の変数に)を変えたのでバグはないと思います。(多分)

A 回答 (5件)

あんまり人に聞くようなことではないと思いますが、それはともかく。



(A)1枚1枚乱数で・・・という方式をやめて、

(B)----------
乱数で数値を決める
その数値によるPG・・・
それを・・・

という方式に変更したい。作ってみたがうまく動かないので、どこがおかしいのでしょうかという質問ですか?

該当部分のPGを見ないと誰も回答できないと思いますよ。

この回答への補足

スタートのソース

Randomize
For i = 1 To 16
co = Int(Rnd * 2) + 1
If co = 1 Then
Image1(i).Visible = True
Else
Image1(i).Visible = False

End If
Next i

--------------------------------------------
If Index = 1 Or Index = 2 Or Index = 3 Or Index = 4 Then

If Image1(1).Visible = True Then
Image1(1).Visible = False
Else
Image1(1).Visible = True
End If

If Image1(2).Visible = True Then
Image1(2).Visible = False
Else
Image1(2).Visible = True
End If

If Image1(3).Visible = True Then
Image1(3).Visible = False
Else
Image1(3).Visible = True
End If

If Image1(4).Visible = True Then
Image1(4).Visible = False
Else
Image1(4).Visible = True
End If

End If
以下省略

補足日時:2003/03/02 01:49
    • good
    • 0

よくわかりまってませんが、推測の限りでのサンプルです。



Option Explicit
Private Const pDEF_SQARE_SIDE_SIZE As Integer = 4 '一辺のサイズ

Private Sub Form_Load()
  Dim i  As Long
  Randomize
  For i = 1 To 16
    Image1(i).Visible = (Int(Rnd * 2))
  Next i
End Sub

Private Sub Image1_Click(Index As Integer)
  Dim intRowIndex As Integer
  Dim intColIndex As Integer
  
  Dim intID1   As Integer
  Dim intID2   As Integer
  
  Dim i      As Integer
  
  '対象行を取得
  intRowIndex = (Index - 1) \ pDEF_SQARE_SIDE_SIZE
  '対象列を取得
  intColIndex = (Index - 1) Mod pDEF_SQARE_SIDE_SIZE
  
  For i = 1 To pDEF_SQARE_SIDE_SIZE
    '反転するオブジェクトIDを算出
    intID1 = (intRowIndex * pDEF_SQARE_SIDE_SIZE) + i       '//行方向で算出
    intID2 = ((i - 1) * pDEF_SQARE_SIDE_SIZE) + (intColIndex + 1) '//列方向で算出
    
    '行方向による反転
    Image1(intID1).Visible = Not (Image1(intID1).Visible)
    
    '列方向は、行方向の反転とかぶらないようにチェック
    '(かぶる = クリックしたIndex値を持つオブジェクト)
    If Not (Index = intID2) Then
      '列方向による反転
      Image1(intID2).Visible = Not (Image1(intID2).Visible)
    End If
  Next i
End Sub


それともし、このサンプル通りの動きのプログラムであれば、、、
>バグがある(と思われる)のはスタートです。
>現在1枚1枚乱数で裏表を決めていますが、この方法だと出来ない(100%)パターンがあるかと思います。
>(その代わり65536分の1の確率でいきなり完成します(笑))
というのは、仕方がないように思えます。
Win付属のゲーム[ソリティア]に至っては、解消法がある出題の方が少ないですw。
[フリーセル]も確立は違いますが、やはり解くことができない出題もあります。
大学時代の教授でフリーセル狂がいたのですが、「フリーセルはどうやっても1問だけ解けない問題がある」と言ってました。わたしの個人的見解では、もっとあるように思うのですが・・・まぁそれはそれとして、、、

「The仕様」として切り抜けましょうw
    • good
    • 0
この回答へのお礼

皆様 ご回答ありがとうございました。
解決しました(多分・・・)
後日デバック用のPG作ってみます。

お礼日時:2003/03/04 02:13

示されたプログラムは 強制に反転しているので、それだと解けないものが


できてしまうのは 当たり前かと思います。

まず、クリックした処理の関数があると思いますが、それを呼んで処理するようにしたらいいですね。

乱数で 何回クリックするか決めて それから さらに乱数で 1から16の値を
だし、その位置にクリックされたと処理してあげればいいのです。
こうすると どういう順番にクリックされたかわかるかもしれません。
その場合は、画面全体にイメージなどはり それで隠し、終わったら、
そのイメージを Visible = False してあげればいいかと思います。
    • good
    • 0

※1のプログラムとはあるindexを指定すると


自分自身と縦と横の画像が別の画像に変わるPGですね。
ということは

Randomize
For i = 1 to (繰り返し回数)
co = Int(Rnd * 16) + 1
(※1のプログラムを(co)で呼ぶ)
Next i

というようなイメージでは?

コピーしたということは、Index = co として・・・

Randomize
For i = 1 to (繰り返し回数)
Index = Int(Rnd * 16) + 1
(※1のプログラムのコピー)
Next i

ということかな?変数宣言は自分で調整してください。
    • good
    • 0

なんか プログラムが いまいち よくわからないのですが、



If Image1(1).Visible = True Then
Image1(1).Visible = False
Else
Image1(1).Visible = True
End If


If Image1(Index).Visible = True Then
Image1(Index).Visible = False
Else
Image1(Index).Visible = True
End If

に変えられると思いますよ。

あと この Indexは、どこから取得するのでしょうか?

この回答への補足

image1(1)~(16) です
※0番はありません(1からのほうが個人的には分かりやすいから)

If Image1(Index).Visible = True Then
Image1(Index).Visible = False
Else
Image1(Index).Visible = True
End If

すいません ↑はどこから出てきたのでしょうか?

※PGの関係上自分自身が元に戻ってしまいますので最後にはこのようなのが入っていますが・・。

補足日時:2003/03/02 02:12
    • good
    • 0

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