- 締切済み
VBAの授業でナンプレを制作しているのですが
初めまして、VBA使用暦数ヶ月の超初心者です。学校の課題でVBAにて数独(ナンプレ)を作成しています。時間をかけて数字のランダム化にやっと成功した次第(それでも遅いのと偶にランダム化しきれないので不満は多々ありますが、そこまでのスキルを持っていないので断念せざるをえませんが)です。以降のステップとして、 1.セルに表示されている数字を幾つか消去か見えないようにしてパズルとしての体裁を整えること(個人的にはセルに直接入力してほしいので消去の方が望ましいです) 2.難易度のレベルを3段階作成すること(見えないセルを増やすことにより) 3.ゲームスタートのボタンを押した際に、別のワークシートに回答が表示されていること(セルの数字を消去することが可能であれば) 4.(可能であれば)回答ボタンを押した際に幾つ間違いがあるのか表示できること と担当教師に指導されました。 これをVBAで作成せねばならないのですが、はっきり言って自分の手にはもう負えません。何方かマクロを作っていただけないでしょうか。参考書やゲーム作成用の教材も彼方此方で借りて読んだり、PC関係に強い友人達に尋ねたりしてはいるのですが遅々として進まないのが現状です。もう頼る当ても無く、最後の望みを賭けてこの知恵袋に投稿した次第です。年末の忙しいこの時期にお手数だとは重々承知をしておりますが、何卒よろしくお願いいたします。
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- tk0123
- ベストアンサー率0% (0/0)
質問投稿日時から随分経過しましたが… 質問への回答ではありませんが、以下参考までに。 (1) 板上の81個のマスに1~9の数字を埋める (数字の配置はランダムだが数独のルールに従うものとする) (2) (1)で作成した板からマスの数字を一定個数削除する (削除するマスの位置はランダム) (3) (2)をプログラムで実際に解いてみる 解けた場合 → 問題完成 解けない場合 → (2)に戻って削除するマスの位置を変更 ⇒ (2)(3)を解ける問題が出来上がるまで繰り返し (注:「解けない場合」とは以下のどちらか。 ・唯一解が存在するが実装している処理では解けない ・複数解存在しパズルとして不適切) となっていれば数独の問題作成プログラムとして用を成します。 質問者さんは(3)の「問題を解く処理」を実装されていないのでは ないでしょうか? これがないと「もしかしたら唯一解な問題」を出題する意地悪仕様な プログラムとなってしまいます。 とはいえ、初心者向けのVBAの授業ということですから、 授業の主たる目的はVBAに慣れ親しむということだと思われます。 授業の範囲内で出来る所までやり、 最後に実装したプログラムについて考察・課題点を挙げるなどして 終わりで良いと個人的には思いますが。 さて、前書きが長くなりましたが、自前の問題作成プログラムを 上記(1)(2)(3)の処理をするように変更して、以下のような実験をして みました。 (Excel+VBAではなく、処理系はPerlで入出力はテキストです) 【実験内容】 ・ 予め81個のマスに数字を埋めた板を100種類用意する。 ・ 板から一定個数のマスの数字を削除する。 これを板一枚につき100通り用意する。 ・ 上記で作成した問題をプログラムで解いてみて、 解ける問題が出現する確立を調べる。 【実験結果】 05個: 99.99[%] 208.75[s] 10個: 99.90[%] 209.72[s] 15個: 98.97[%] 233.20[s] 20個: 96.55[%] 247.41[s] 25個: 91.34[%] 256.73[s] 30個: 80.49[%] 288.45[s] 35個: 64.45[%] 366.17[s] 40個: 39.82[%] 484.95[s] 45個: 14.86[%] 701.30[s] 50個: 2.13[%] 949.00[s] 55個: 0.01[%] 887.80[s] 60個: 0.00[%] 718.97[s] 1列目:削除したマスの個数 2列目:解ける問題の出現確立 [%] 3列目:問題の作成と問題を解くのに要した時間の合計 [秒] 2列目はあくまでも計測に使用した解法の範囲で解ける問題の 出現確立です。 使用した解法: Naked Single, Hidden Single, Locked Candidates(Type1,2) Naked Pair, Hidden Pair (「超難問」とかが付かない懸賞付きパズル雑誌の ★4つくらいの問題が解けるレベルでしょうか。大雑把ですが) 結果を見ると、問題を解く処理を実装してある場合は 50個くらいまで削除しても大丈夫そうです。 50回に1回解ける問題が出来そうなので、問題を提示するまでに 要する時間も数秒程度で済みます (私のプログラムで、私の大して速くも無いPCでの場合ですが。 ちなみにOS:WinXP Pro SP3、CPU:AMD Ath64 3000+) 問題を解く処理を実装していない場合は、25個辺りから 確立がどんどん下がり、35個~40個くらいで 2回に1回解ける問題が出てくることになりそうです。 (削除するマスを増やすと解ける問題に出会える確立が下がる という意味で難易度が上がりそうです) 以上、長文で失礼しました。
- Wendy02
- ベストアンサー率57% (3570/6232)
こんばんは。 担当教師の方がお考えになっているものを想定してみました。 出来る範囲での完成をおっしゃっているので、乱数?で、数独を作るなんていうのは、ありえませんね。数独自体を作ったり解いたりするのは、大学院レベルの数学の問題になってしまいます。ご質問者さんが、そういう立場なら、そういう質問は出ないと思います。 担当教師の方も、それなりのレベルでお話になっているものとして考えます。難しいアルゴリズムが、どうとかおっしゃっているようではないようです。 たぶん、担当教師の方はお調べになった上で言っていることも想像付きます。私は、良いアドバイスをしていらっしゃるようです。 ご質問者さんは、最初の部分をどうするか、考えていたのでしょうか? 先生は、こんな風にお考えになっていると思います。 それは、まず、解答を適当な数だけ最初に用意しておくことです。その解答は、どう作るかは、何を使ってもよいと思います。 数十種類の解答を用意すればよいと思います。その元の解答は、どこに隠すかは、技術はありますが、ワークシートをひとつ、隠しシートにすればよいです。 名前登録しておくと、解答が呼び出しやすいです。Q1,Q2,Q3 ... とか、します。 その乱数で、1~81(9×9)の乱数で、選んだりします。 VBAのRnd() 関数やワークシート関数のRANDBETWEEN あたりを使っても良いと思います。 乱数で、重複を出さない方法もありますが、重複があっても、この場合はかまわないと思います。 片方が隠しシート 1,2 For j = 1 To 10 '←10, 20, 30 とか、で難易度が決まります。数がどのぐらいかは、私は分かりません。 i =Int(Rnd() * 81) + 1 'i = Evaluate("RANDBETWEEN(1, 81)") Worksheets("Sheet1").Range("A1:I9").Cells(i).Value = Worksheets("隠しシート").Range("A1:I9").Cells(i).Value 'ワークシートに貼り付ける Next j で、i に数字を入れれば、ランダムで数値を入れられます。 数字の入っていないセルで、他の解答が成り立つかどうかをチェックするのは、無理ですから、入れる数字を増やせばよいと思います。 ------------------------------------------- 3は、そのまま、 Worksheets("隠し").Range("A1:I9").Copy Worksheets("Sheet2").Range("A1") ------------------------------------------- 4.は、色をつければよいと思います。 Set rng1 = Worksheets("Sheet1").Range("A1:I9") Set rng2 = Worksheets("隠しシート").Range("A1:I9") For i = 1 To 81 If rng1.Cells(i).Value <> rng1.Cells(i).Value rng1.Cells(i).Interior.ColorIndex = 3 End If Next i
- nac03056
- ベストアンサー率48% (203/419)
そこまで追い詰められているのであれば、「なぜ最初に難解であることを見切らずに始めたか」を今更指摘しても無意味かと思いますので、現状打破の案です。 是非はともかく、課題さえ出せればいいということであれば、プログラミングの出来る人に金を払って作ってもらえばいいのです。そこそこの実力があれば学生課題の品質程度なら数時間でできるでしょう。情報系の大学生あたりに誰か知り合いを探してもらって、ン万円程度も払えば喜んでやってくれると思います。(もちろん先生は質問者氏の実力を承知しているでしょうから完成度が高すぎるとばれますのでその点は注意が必要です) 現実的なおすすめの方向としては、先生に頻繁に相談し、半完成を覚悟であくまで自作することです。もちろん未完成なりの評価しかもらえませんが、熱心に何度も質問することで「まじめに取り組んでるからまぁいいか」とう情に訴えることは可能です。ただ、愚問を繰り返してはダメですよ。それじゃぁただのウルサイだけの甘えたバカになり「自分で考えろ」と突き放されてしまいます。 (単純に考えて、答えを別シートに用意しておくとのことですが、数字を幾つか消去することで、他の答えが発生してしまう可能性とかはないのでしょうか?もしそうなら、数字1つ消去するごとに他の解答が発生しないかチェックする必要があるような気がします。大変そうですが面白そうですね。)
- bin-chan
- ベストアンサー率33% (1403/4213)
情報処理試験 H20年春期 ソフ開午後IIの問題に目を通すといいことがあるかも。 IPAさんのWebページ 平成20年度春期試験 http://www.jitec.ipa.go.jp/1_04hanni_sukiru/mondai_kaitou_2008h20.html#20haru 解法のアルゴリズムだけど、値の持ち方等参考になると思いますよ。