- ベストアンサー
パズルのバグ
遊び感覚でパズルを作ったのですがバグがあるのです。 (作成する前に気がついたのですが、先に本体のPGをした) プログラム内容は imageが16個あります(4*4) 左上から1、2、3 とindex番号をつけています。 ある場所をクリックすると 縦と横の画像が別の画像に変わります(自分自身も) (すべてが同じ画面になると完成です) そんなPGです。 バグがある(と思われる)のはスタートです。 現在1枚1枚乱数で裏表を決めていますが、この方法だと出来ない(100%)パターンがあるかと思います。 (その代わり65536分の1の確率でいきなり完成します(笑)) このスタートに入れるPGがうまく出来ないのです。 --------- 乱数で数値を決める その数値によりあるPGを実行する(※1) それを*階繰り返す としたのですがうまく出来ません。 ちなみに ※1のPGはパズルで遊ぶときのPGをそのままコピーして変数(indexから別の変数に)を変えたのでバグはないと思います。(多分)
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
あんまり人に聞くようなことではないと思いますが、それはともかく。 (A)1枚1枚乱数で・・・という方式をやめて、 (B)---------- 乱数で数値を決める その数値によるPG・・・ それを・・・ という方式に変更したい。作ってみたがうまく動かないので、どこがおかしいのでしょうかという質問ですか? 該当部分のPGを見ないと誰も回答できないと思いますよ。
その他の回答 (4)
- TAGOSAKU7
- ベストアンサー率65% (276/422)
よくわかりまってませんが、推測の限りでのサンプルです。 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
お礼
皆様 ご回答ありがとうございました。 解決しました(多分・・・) 後日デバック用のPG作ってみます。
- taknt
- ベストアンサー率19% (1556/7783)
示されたプログラムは 強制に反転しているので、それだと解けないものが できてしまうのは 当たり前かと思います。 まず、クリックした処理の関数があると思いますが、それを呼んで処理するようにしたらいいですね。 乱数で 何回クリックするか決めて それから さらに乱数で 1から16の値を だし、その位置にクリックされたと処理してあげればいいのです。 こうすると どういう順番にクリックされたかわかるかもしれません。 その場合は、画面全体にイメージなどはり それで隠し、終わったら、 そのイメージを Visible = False してあげればいいかと思います。
- driverII
- ベストアンサー率27% (248/913)
※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 ということかな?変数宣言は自分で調整してください。
- taknt
- ベストアンサー率19% (1556/7783)
なんか プログラムが いまいち よくわからないのですが、 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の関係上自分自身が元に戻ってしまいますので最後にはこのようなのが入っていますが・・。
補足
スタートのソース 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 以下省略