![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?c9bd177)
遊び感覚でパズルを作ったのですがバグがあるのです。
(作成する前に気がついたのですが、先に本体のPGをした)
プログラム内容は
imageが16個あります(4*4)
左上から1、2、3 とindex番号をつけています。
ある場所をクリックすると 縦と横の画像が別の画像に変わります(自分自身も)
(すべてが同じ画面になると完成です)
そんなPGです。
バグがある(と思われる)のはスタートです。
現在1枚1枚乱数で裏表を決めていますが、この方法だと出来ない(100%)パターンがあるかと思います。
(その代わり65536分の1の確率でいきなり完成します(笑))
このスタートに入れるPGがうまく出来ないのです。
---------
乱数で数値を決める
その数値によりあるPGを実行する(※1)
それを*階繰り返す
としたのですがうまく出来ません。
ちなみに
※1のPGはパズルで遊ぶときのPGをそのままコピーして変数(indexから別の変数に)を変えたのでバグはないと思います。(多分)
No.1ベストアンサー
- 回答日時:
あんまり人に聞くようなことではないと思いますが、それはともかく。
(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
以下省略
No.5
- 回答日時:
よくわかりまってませんが、推測の限りでのサンプルです。
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
No.4
- 回答日時:
示されたプログラムは 強制に反転しているので、それだと解けないものが
できてしまうのは 当たり前かと思います。
まず、クリックした処理の関数があると思いますが、それを呼んで処理するようにしたらいいですね。
乱数で 何回クリックするか決めて それから さらに乱数で 1から16の値を
だし、その位置にクリックされたと処理してあげればいいのです。
こうすると どういう順番にクリックされたかわかるかもしれません。
その場合は、画面全体にイメージなどはり それで隠し、終わったら、
そのイメージを Visible = False してあげればいいかと思います。
No.3
- 回答日時:
※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
ということかな?変数宣言は自分で調整してください。
No.2
- 回答日時:
なんか プログラムが いまいち よくわからないのですが、
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の関係上自分自身が元に戻ってしまいますので最後にはこのようなのが入っていますが・・。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- ビデオカード・サウンドカード 1つのマザボでAMD&NVIDIAを同時使用できますか? 3 2022/04/22 14:36
- Java Java 石取りゲーム 3 2023/02/02 15:46
- Visual Basic(VBA) エクセルマクロでアニメを作る方法を教えてください。 1 2023/02/07 14:27
- HTML・CSS WEBサイトの構築。表示データとWEBデザインを分離する考え方を専門用語・業界用語では何と言うか? 8 2022/09/27 09:16
- アクセサリ・腕時計 パテック フィリップの時計 2 2022/04/16 15:26
- 確定申告 【白色申告】1月に引越したがe-taxでの納付先は新住所でいいのか? 2 2023/02/26 01:47
- Excel(エクセル) エクセルでエラーを無視して一番左側のセルの値を返したい 2 2023/07/27 13:06
- 数学 『◯と●の帰納法』 2 2023/04/19 20:57
- SQL Server これをSQL文で出来るでしょうか? 1 2023/03/26 02:16
- その他(Microsoft Office) 複数の写真を1枚に印刷 5 2023/05/05 22:41
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
vba listviewにおけるtextのAli...
-
COBOLのS9タイプからXタイプへ...
-
openGLで物体を半透明にして表...
-
VBコンソールアプリ(.NET Frame...
-
無限ループ中にある任意のキー...
-
ルーチンとライブラリについて。
-
Arduino nano(アルドゥイーノ ...
-
Visual C++でDESを使って文字列...
-
Directshowのサンプルを利用して
-
C++ Builder6 をふたたび動か...
-
VBAにてTIFFから画像を取込みた...
-
Excelオートメーションについて
-
指定したフォルダーを最前面表...
-
10個の実数に対する降順ソート...
-
ポーティングって?
-
お掃除ロボットのソースコード
-
c言語のサイコロを100回振って...
-
C言語→MATLABへの変換で、困っ...
-
gccでスタックオーバーフローの...
-
マイコンからプログラムを読み...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
vba listviewにおけるtextのAli...
-
Webプログラムってネイティブア...
-
プロダクションコードとは?
-
指定したフォルダーを最前面表...
-
VBA
-
初級者の質問――time_tについて
-
Arduino nano(アルドゥイーノ ...
-
世界一美しいソースコード
-
2値化した画像の黒い部分のピク...
-
C言語primeについて
-
COBOLのS9タイプからXタイプへ...
-
無限ループ中にある任意のキー...
-
マイコンからプログラムを読み...
-
processingで雪が積もるような...
-
Excel VBA で、データベースフ...
-
openGLで物体を半透明にして表...
-
C言語→MATLABへの変換で、困っ...
-
三次元のグラフを書きたいので...
-
コンパイルエラーの意味
-
プログラムってコードに性格っ...
おすすめ情報