作ってみたいけど難しそうです。みんなで考えてみませんか?
詰みになる状況を見つけたら爆弾の位置を変更すればいいのかね。
3 :
1:2007/05/09(水) 10:40:58
>>2 おぉ!なるほど!それは考えてなかった・・・。
ゲーム開始の時点で詰み(←どうしようもない2択状態とかのことだよね)にならないような爆弾の配置をすることで頭がいっぱいだったよ。
とりあえず、どういう条件で詰みになるのか、紙と鉛筆で試行錯誤中・・・
地雷をひとつも入れなければいい。
その程度のこと考えるまでもないだろ。
5 :
1:2007/05/09(水) 10:42:14
昔、おれ作ったよ。クリックも自動でやっくれる奴。たまにクリックミスするけど、上級で数秒くらい。
今やったら上級で最高2秒で解いた。
7 :
1:2007/05/09(水) 11:34:21
違う。おれのはハッカーらしく、もっとクールだ。
9 :
1:2007/05/09(水) 12:21:25
と言いますと???
11 :
1:2007/05/09(水) 14:49:17
>>10 何気におもしろい!アシスト機能とか楽しく遊ばせてもらいました。
自動でクリアさせたらいきなり1秒でクリアしちゃって、オイラの最高記録が強制的に消えちゃったのがちょっと悲しかったけど、まあ自分のは大した記録じゃなかったから、まあいーや。
ちなみに今考えているマインスイーパは、最初から最後まで100%論理のみでクリアできるようなマインスイーパなんだけど、それって不可能なのかなぁ?
昔どこかのサイトで、マインスイーパもどきで
ちょっとルールが変わってるヤツを見たことがあるな
金を消費して、爆弾があるかどうか分からないところも解けてしまう。但し乱用すると金欠に。
13 :
1:2007/05/09(水) 15:28:32
>>12 そういうのもあるんだw
金の他にも、例えばHP(ヒットポイント)をつけて、地雷をふんだらダメージを受ける、みたいなのもありかもね。
そうすると、少なくとも、2択に陥って失敗して全てが水の泡になって泣きそうになる状況だけはなくなるし。
>>10 運でしか解けないパターンは限られてるから、
爆弾をランダムに配置したあと、そのパターンがあったら
いくつか爆弾を移動してやればいいんでないかな
17 :
1:2007/05/09(水) 17:38:09
>>14 レスどうも。確かに一度ランダムで並べてしまうってのも1つの手だね。
それで、運でしか解けないパターンってのをどうやって検出するかって部分が、やっぱり難しい・・・。
どういう地雷の配置だと詰まるのかを考えるのは難しそうだから、まずは逆にどういう地雷(または数字)の配置だと詰まらず先に進めるのかでも考えてみようかな?
18 :
1:2007/05/09(水) 17:42:45
>>16 物っすかwww
まず目的物のアルゴリズムがわかってから実装かなぁって思ってたんだけど、どうしよう?
作るとしたら言語は何がいいかな。
WinのプログラムはC言語でSDKしかまともにやったことなくて・・・。
C#をちょっと触った感触では、色々なことが楽にできそうって印象はあったけど、.NET必須??
もしくはJavaで作ったらWindows以外のプラットフォームでも動くかなぁとか思ったり。
>18
そういうのは、自分がやりやすい環境でやるのが一番
SDKの経験がそれなりにあるなら、SDKでやるよろし
C#が楽そうなら、C#でやるよろし
いきなり不慣れな環境で始めると、作るより先に
その環境に慣れることから始まるから時間掛かりすぎる
詰みにならない状況とは何か、を洗ってみるのが重要だと思うなあ。
21 :
1:2007/05/09(水) 19:52:19
>>19 たしかに・・・。
とりあえず後でどうするかはわからないけど、HTML+JavaScriptで簡単なテストプログラムを作ってみてます。
右クリックとかできないのがツライけど。
22 :
1:2007/05/09(水) 19:55:52
>>20 詰みにならない状況ですか。
今のところ、確実に左クリックで開くことができるマスか確実に右クリックで旗を立てられるマスが一つもない状況のことかと思っとります。
でも、よく考えたら、ゲーム開始したばかりの状態はある意味で詰みだよなぁ。
確かにきちんと考えてみる必要がありそうかも。
>>22 >でも、よく考えたら、ゲーム開始したばかりの状態はある意味で詰みだよなぁ。
それはどこか自動的に開くようにしたらいいと思う。
あるいは、最初クリックした地点に地雷があったら、
それを詰みにならないところに移動させるとか。
待てよ? 例えば最初クリックした地点が数字だった場合って、これも詰みだよな?
開ける地点によって詰みか詰みじゃないかが変わってくるのか。
付属のマインスイーパって絶対に一発目は地雷にはならないよね?
だから、1クリック目で問題が決まってると思ってたんだけど。
“必ず解ける”とは全く別の事になるけど、
・確実に安全だけど開いていない場所
・確実に地雷だけど旗を立てていない場所
・地雷があるかどうか分からないのに旗が立っている場所
地雷を踏んだ時にこれらの数に応じて、時間にペナルティを与えるとか。
つまり、最初にクリックした地点の周りには地雷がないようにする、ということか。
28 :
1:2007/05/09(水) 21:37:56
>>23-25 Windows標準のやつみたいに、一発目は絶対に地雷にならないようなものにしたいとこだね
>>26 それも実装としては面白いかもしれない。
方針そのものを変えるって点では、
>>12とか
>>13に近いものがあるかな。
>>27 そういうことになるかも。
たぶん、最初にクリックした場所の隣8マスの中に1つでも爆弾があると、いきなり詰みになるっぽい。
地雷で囲まれた部分ができてると勘に頼る必要が出るんだっけ?
○○○○○
○●●●○
○●○●○
○●●●○ ●:地雷
○○○○○ ○:床
となってたら、ここが最後まで残れば、
地雷の数から真ん中に地雷があるかどうかが分かる。
でも、これが端っこにあると・・・
┌────
│●●●○
│●○●○
│●●●○ ●:地雷
│○○○○ ○:床
右上の4箇所のどこに床があるのか分からなくなる。
単に囲まれたってだけじゃダメっぽいな。
右上じゃないや、左上。
つまり、地雷の残り個数が0なら、
数字からだけでは地雷があるかどうか分からない箇所の全てに
地雷がないということが分かる。
残り個数が0でない場合は、未定箇所の個数がその個数と等しければ、
全て地雷だということが分かる。
残り個数が0でなく、未定箇所の個数がその個数と等しくなければ、詰み。
33 :
1:2007/05/09(水) 22:25:17
>>30 何か興味深いけど、ちょっと意味がわからんとです。
実際にその地雷配置でゲームを開始して、あるところまで行ったとして、どれが確定済みで、どれが確定していないのかだけ、もうちょい詳しく書いてもらえるとありがたいかも。
34 :
デフォルトの名無しさん:2007/05/09(水) 22:27:11
>>26 とは違うペナルティ案として、時間がかかるが(数秒程度)
指定したマスに地雷があるかどうか調べる機能をつけるのも
手っ取り早くていいかも。
@ABA@
A♪♪♪A
B♪◇♪B @AB:周りの地雷の数(1、2、3)
A♪♪♪A ♪:地雷があると確定した箇所
@ABA@ ◇:印のついてないブロック
という状況になった場合、
地雷の総数が8個ということであれば、真ん中に地雷がないと分かり、
地雷の総数が9個ということであれば、真ん中に地雷があると分かる。
@ABA@○@ABA@
A♪♪♪A○A♪♪♪A
B♪◇♪B○B♪◇♪B
A♪♪♪A○A♪♪♪A
@ABA@○@ABA@
という状況になった場合、
地雷の総数が16個ということであれば、両方の真ん中に地雷がないと分かり、
地雷の総数が18個ということであれば、両方の真ん中に地雷があると分かり、
地雷の総数が17個ということであれば、どっちの真ん中に地雷があるのかが分からなくて詰み。
プログラムで実際にといてみて
解けなければ再出題すればいいじゃん。
今時のマシンならあっという間に解けるんだし。
37 :
1:2007/05/09(水) 22:45:37
>>34 たしかにそのほうが実装しやすそう。
ペナルティ系の実装はペナルティ系で、まとめておくのもいいかも。
>>35 な、なるほど・・・!
地雷の総数(or残数)から割り出せる場合は詰みにならないって、そういうことか。
ちょっとこれはあまりに混乱しそうだから、まずは地雷の総数は考慮しない場合のアルゴリズムを考えて、後から地雷の総数も考慮するように修正するほうがわかりやすいかも。
貴重な考察thx!
38 :
1:2007/05/09(水) 22:49:26
>>36 お、また新しい意見出ましたね。
何だかラスベガス法を彷彿させるアルゴリズムだけど、やってみる価値はあるかも。
今はまだ、どうやったらプログラムで解けるかってのも考え中っすorz
39 :
1:2007/05/09(水) 23:20:07
かなりいい加減ですが、ひとまずマインスイーパっぽくは見えるバージョンです。
http://2sen.dip.jp:81/cgi-bin/upgun/up1/source/up5254.zip 練習も兼ねて、実験用のプロトタイプっぽくなればいいなぁと思ってたけど、ロジックがごちゃごちゃになりすぎてダメかもw
ちなみにIEだと大丈夫だけど、Fxだと微妙に選択範囲が出てきてしまう。
たしかgetSelectionとか使ってごにょごにょやるんだった気がするけど失念orz(誰か教えてください)
操作方法
・クリック=Win版の普通のクリックの役割+「左右同時クリック」の役割を兼用
・Ctrl+クリック=Win版の右クリックの役割+「左右同時クリック」の役割を兼用
おお、ちゃんとマインスイーパしとるw
41 :
デフォルトの名無しさん:2007/05/10(木) 00:00:16
>>1 がちゃんとプログラムをアップしてきたのにビックリした age
42 :
1:2007/05/10(木) 11:27:15
>>40-41 どうもです。
まあひとまず最初の一歩って感じだけど、やっぱJavaScriptだと動作がもっさりしてるんで、C言語で高速軽快なのを作りたい気持ちが高まったかも。
えーと、それで今、ある時点で詰まらずに地雷か数字を確定することができる必要十分条件みたいのを模索してます。
>>10の作者の人に教えてもらえば一発なんですが・・・。
「縁の部分に1・2・1があったら2つの1の横に地雷を置ける」とか具体例を挙げていってもキリがないので、もっと一般的、法則的なものが欲しいとこです。
43 :
1:2007/05/10(木) 11:39:55
一人で考えてても埒があかないので、ちょっとしばらく独り言を書き込むんで、つっこみがあったらよろしくお願いします。
まず、ある数字のマス1つだけに着目したとすると、確定できるものといったら、
そのマスの周りでまだ開いてないマスの数 = 表示されてる数字から、そのマスの周りで確定した地雷(=旗)の数を引いたもの ・・・・・・(1)
であるときに、その「まだ開いていないマス」ってのが、全部地雷であることが確定するわけです。
何か当たり前のこと言ってるだけなのに、言葉にすると妙に長くなるなぁ・・・。
44 :
1:2007/05/10(木) 11:43:52
たぶんマインスイーパをある程度やったことがある人なら、(1)の右辺にある
「表示されてる数字から、そのマスの周りで確定した地雷(=旗)の数を引いたもの」
というのが、プレイ中つねに念頭におくべき重要な数であるってのはある意味常識かな?と思ったり思わなかったり。
何かこの数字に名前つけてやろうかな?
どっかのマインスイーパ解説サイトには「実質的な値」って言い方してた気がするので、とりあえず「実質値」とでも呼んでおくか。
45 :
1:2007/05/10(木) 11:45:09
そうすると、
まだ開いてないマスの数 = 実質値 ・・・・・・(2)
であるならば、まだ開いてないマスは全部地雷だよ。ってことで、ちょっとすっきりかな。
46 :
1:2007/05/10(木) 11:48:25
さて次はもっと重要な、2つの隣接するマスに表示された数字・・・じゃなかった、2つの「実質値」の関係から、確定できるものを考える。
えーと、どうやって考えたらいいんだろう?
とりあえず2つのマスを X 、Y とおいて、実は今まで自分なりに考えてきた中で、このXとYの「差」が、確定できる地雷の秘密を握っていると、感じてきております。
47 :
1:2007/05/10(木) 11:53:00
うーん・・・例えば
????
確A@確
確確確確
ってなってたら
★??☆
確A@確
確確確確
★は地雷、☆は数字になるはず。
ちなみに、@とかAは実質値なので、実際に表示されている値とは違い、「確」の中の地雷の数を差し引いたものを表す。念のため確認。
48 :
1:2007/05/10(木) 11:55:28
何か混乱してきた・・・
やっぱ X と Y でいこう
????
確 X Y.確
確確確確
ってなってたとしたら、どうなるんだろう?
X - Y の数字は、えーと、うーんと・・・
49 :
1:2007/05/10(木) 12:00:01
こういう風に考えてみようかな?
????
? X Y.?
????
あれだ、たぶん。
XとYが共有しているマスが4マスあって、共有していないマスがX、Yのそれぞれの側に3マスずつある。
で、X−Yの値が共有している部分の数と何か関係していたら、確定できるものがでてきそう?
50 :
1:2007/05/10(木) 12:02:50
意味がわからんので、とりあえず数字を入れるかな
????
?A@?
????
うーん・・・これだと何も確定しないから、いくつかすでに確定しているものが必要なのか
51 :
1:2007/05/10(木) 12:08:14
つーか、よく考えたらこうだわな
????
確A@?
確確確?
↓
★??☆
確A@☆
確確確☆
そういやこのパターン、実践でよく使うわな。
52 :
1:2007/05/10(木) 12:09:56
連続投稿で規制くらったので、この辺にしときます。
すいませんでした。
煮詰まってきたし、もうちょい考えをまとめてから、出直してきますorz
53 :
1:2007/05/10(木) 12:39:06
重大なことに気付いたので、再び失敬します
???? → ★??☆
確A@? → 確A@☆
確確確? → 確確確☆
???? → ★??☆
?B@? → ★B@☆
確確確? → 確確確☆
???? → ★??☆
?C@? → ★C@☆
?確確? → ★確確☆
これってつまり、Xの値が増えれば、Xの側のYとは共有していない部分で確定していなければならない数が減っていくということじゃないですか!
わかった!!
たぶん、共有部分の数はどっちかって言うとどうでもいいのかも。
X−Yの値 = Xの側の非共有部分の未確定マス数
であるとき、Xの側の非共有部分の未確定マスはすべて地雷、かつ、Yの側の非共有部分の未確定マスは全て数字、ってことっぽい。
このことは、次のような場合でも成り立ちます。
???? → ?☆☆☆
??@? → ★?@☆
?C?? → ★C?☆
?確確? → ★確確?
Cの側の非共有未確定マスは左側に3マス。で、4−1=3と一致。
あー、もうこれ間違いないな。どういうパターンでやっても確実に成り立つかも。
ちょっとすっきりしたので、今度こそ立ち退きます・・・。
残り部分が全部確定解放可能な部分がないという条件の場合のみで、
たとえば最善を尽くした結果残っている1/2の選択の場合、
クリックしたほうをかならず正着にすればいいよな。
ただ、残りが確定解放可能かどうかの判断がめんどそうだ。
数字だけみた一次元解法では正着がわからなくても、
こっちにあると過程した場合の予測(二次元解法)から離れた位置までの整合性で正着が導き出せる場合もあるからで、
この解法で正着が出る残り場所がある場合は上記特例にあてはまらない
マップを生成したらコンピュータに解かせて
最後まで詰まなかったものだけを人間に出題すればいんじゃね
既出だったスマソ
右から開いた場合と左から開いた場合で違ってきたりしないかね?
>>10を試してやろうとダウンロードしてきて気が付いたんだが、XPにマインスイーパーが入ってなかったorz
60 :
デフォルトの名無しさん:2007/05/10(木) 22:47:11
>>59 [ スタート メニュー ] → [ コントロール パネル ] → [ プログラムの追加と削除 ] → ( 左側の ) [ Windows コンポーネントの追加と削除 ] → [ アクセサリとユーティリティ ] を選択して [ 詳細... ] をクリッコ → [ ゲーム ] にチェックを入れる。
61 :
1:2007/05/11(金) 02:13:44
>>55 それもけっこう良い手かも。
あと、難しいのが、「詰み」という状況が、いわゆる「最後の2択」のようなもののほかにも、序盤〜中盤でこれ以上は進めねーよ!って時にもあるから、それをどうするかだね。
って言ってて思ったけど、そういう場合にも「勘」であけた所を必ず正解(非地雷)にすればいいのかな。
ちょっと面白そうな方法かも。
62 :
1:2007/05/11(金) 02:16:13
>>56-57 今ちょうど、コンピュータに解かせる方法を考えて、その方法(
>>36)を試してみる予定。
もし上級の盤面で、地雷配置の作り直し回数が多くなりすぎないなら、使える方法だと思う。
63 :
1:2007/05/11(金) 02:18:20
>>58 ごめん、それはどういう状況での話?
一番初めのところかな?
>>59 けっこう楽しいのでお勧め!
64 :
1:2007/05/11(金) 02:29:34
実は
>>10をやっていて気付いたんだけど、2つの数字から確定部分を推測するのって、別に隣接してなくても大丈夫なんだね。普通にプレイしていた限りでは全然気付かなかったなぁ。
確確??? → 確確?☆☆
確@?@? → 確@?@☆
確確??? → 確確?☆☆ ☆は地雷ではないことが確定の意味
とりあえずこの状況は、
>>54で割り出せそう。
あと、2つだけの関係に限らず、3つの関係から出せるものもあるな。かなり極端なのだと、
??????? → ☆☆?★?☆☆
?@?C?@? → ☆@?C?@☆
??????? → ☆☆?★?☆☆
こんなふうにほとんど確定してない状況でも、かなり沢山確定させることができるみたい。
まあこんな状況は普通にプレイしててもまず出てこないけどw
65 :
1:2007/05/11(金) 02:36:56
>>55 ごめん、後半を微妙に読み飛ばしてたw
>こっちにあると過程した場合の予測(二次元解法)から離れた位置までの整合性で正着が導き出せる場合もあるからで、
ってのがなかなか想像できないんだけど、できたら具体例みたいなの出してもらえないすか?
いちおう
>>54のやり方は、「地雷があると仮定した場合」ってのを包含しているような気がしているんですが、いかがでしょう?
これに、3つ以上の数字を含めた
>>64の後半みたいなのも加味した、もうちょい一般的な法則出せばなんとかなりそうな気はする・・・。
今日はこの辺にしときます。
それではまた明日ノシ
66 :
55:2007/05/11(金) 10:02:54
>>65 具体的にいえば、
>>54みたいなやつで、
結局完全手詰まりまで解けるルーチンを作れる、
つまり
>>10のソフトをつくれないとだめだ
今北産業。
取り敢えず、マインスイーパのオプションの紹介。ルールの基本は同一で、各オプションは組み合わせもできる。
アクション性の低いものから順に。
・露出岩
フィールド中に岩が露出しているマスがある。
そのマスには地雷がないことは確定するが、数字も出ないので岩が多数あると、泣ける。
・地雷再配置マス
そのマスを開けると地雷が(開いてないマスの中で)再配置される。
後述の移動地雷と違って、再配置マスがあることが分かったら避ければいいので(タイムアタックでもなければ)
それほど苦にならない。終盤、所謂詰みの状態で開ければ、巧いこと詰みが回避できるおまけも。
・移動地雷
開けてないマスの中を地雷が(一定時間ごとに)自由に移動する。
#飛び地の間は移動しない方がそれっぽいが、横着して自由移動で実装してしまったw
白マス(周囲に地雷がないマス)を開けたときに連鎖開きするわけだが、移動地雷があると
それも頼りにならないのでかなりきつい。おまけに、移動前にカウントダウンで音が鳴ってくれないと
移動した瞬間に開けて泣きを見ることに。
>64の後半の状況はランダム開けをしない限り発生しないね。
#タイムアタックのときは意図的にやったりするけど。
処で、以下は実践でもしばしばあるパターンけど既出だっけ?
?白白白? 壁壁壁壁壁
?一二一? ?一二一?
????? ?????
↓ ↓
○白白白○ 壁壁壁壁壁
○一二一○ ○一二一○
○★○★○ ○★○★○
68 :
55:2007/05/11(金) 11:48:06
>>67 既出かどうかはわからない。
俺はパターン化はしてないが、
実践で出現すればすぐ解ける
69 :
55:2007/05/11(金) 11:55:23
あと、残りマスが少ない状況で爆弾も残り数個って場合は、
その残り爆弾個数による解法もあるよな。
70 :
1:2007/05/11(金) 12:50:15
>>66 うーん、なるほど。
とりあえず今は
>>10相当の処理ができるよう、頑張ってみようと思います。
>>67 なんかそのルール楽しそうw
それは、実装済みとかってこと?
もしよければ公開キボンヌです。
1・2・1に関しては
>>42で触れたつもりでいたんだけど、実際には「1・2」の部分に
>>54を適用して2段階で同様に進めるから、単に「コンピュータに解かせる」って話ならそれでオッケーかなぁと。
>>69 トータルの地雷数から割り出せるっていう話に関しては、
>>30-33,35,37あたりでちょこっと触れたんだけど、同時に考えると頭がパンクしそうなので、また後ほど考えるという方針でお願いしますw
71 :
55:2007/05/11(金) 13:16:11
初心者用機能として、
何かのキーを押すと、解法が存在するマスを色つき表示するとか楽しいかもな
壁壁壁壁壁
?一二一?
?????
たとえば前述のこれだったら?のマスが黄色くなるとか
72 :
67:2007/05/11(金) 13:19:52
>>70 元は仕事場にあったSolaris1(Sun-OS4)の時代のSunのEWS用だから、
Linuxでも(XLibが使えるから)コンパイルできる筈なんだけど……
流石に転職とメディアの都合で復元は難しいだろうな。
アイデア自体はMac版を参考にしたからMacOS7時代のゲーム集にはありそうだ。
#国産じゃないけど。
そっちの方も、現在手元にMacがないから見ることもできないな。
なんかこう、アシスト機能つけたの思い出して懐かしくなってきているんだけど、
改めて作るほどの気力は今一起きないなぁ。
で、そのアシスト機能は>67で書いた1-2-1みたいな(比較的単純な)パターンに対して
旗を立てたり勝手に開けたりする程度の機能なんで、(論理的には詰みじゃなくても)
自分の知らないパターンは放置する軟弱仕様だったな。
で、更に思い出したのだけど基本ルールがマインスイーパと違う、似たようなパターンの
ゲームも幾つか作ってた。それは更に古くてPC-8001のbasicだったりしたはず。
#そっちに至っては20年前か……
これはもう、あれだ
3次元マインスイーパーを作るしかないな。
74 :
55:2007/05/11(金) 13:23:31
見下ろし型3次元テトリスとか?
76 :
1:2007/05/11(金) 19:46:43
>>71 それいいね。
とりあえずコンピュータに解かせる処理がうまくいけば、そういうオプションをつけることもできそう。
>>72 なるほどー。
何気にマインスイーパって歴史深いのかな?
>>67みたいなアイデアは今まで見たことも考えたこともなかったので、斬新でおもしろかったです。
>>73 ググったらけっこう出るねw
Linux版だとかっちょいい概観の3D版があるみたいだけど、手元にLinux環境がないorz(3ヶ月前にLinux入れてたマシンのマザボが爆発したw)
Flash版でBombSweeper3Dやってみたら、ちょっと面白かったよ。
でもさすがに、3D版の自作はしんどそうだ・・・
77 :
1:2007/05/12(土) 02:39:01
>>64みたいな複数マスの数字から割り出す、地雷か数字かの確定方法の一般法則らしきものができたので、書いておこうと思います。
数学でいう「集合」で出てくる記法を使っていますが、ちょっとだけ辛抱してください。
集合を使った理由は、マスの「共有」とか「除外」とかを、積集合や差集合でストレートに表現できるからです。
あ、その前に、これまでのレスで勝手に命名してしまった言葉がいくつかあるので、あらかじめ確認しておきます。
・確定マス = 左クリック等で開いた数字マス or 地雷であると判明して旗を立てたマス or 壁
・未確定マス = まだ触ってない、初期状態のマス
・実質値 = 表示されている数字から、周囲の確定マス内の地雷数を差し引いた数値
(注:数字マスには
>>67でいう「白」のマスも含まれる。「0」という数字であると解釈できるため)
ということで、以下は「ある瞬間において詰みにならないための必要条件」の1つです。
でも最終的には十分条件がほしいんだよなぁ・・・
(下書きしたので、一気に書き込みます)
78 :
1:2007/05/12(土) 02:39:55
αを任意の非地雷マスとし、
・N(α) = マスαの実質値(「Number」の頭文字のつもり)
・Q(α) = マスαの周囲8マス中で未確定なものの集合(何が来るかわからないマスなので、「Questionable」の頭文字)
とする。
オブジェクト指向のプログラミングに慣れてる人は、α.getNumber()とか、α.getQuestionableSquares()みたいに考えるとわかりやすいかも。
それで、そうすると、
N(α) - ΣN(β) = | Q(α) - ∪Q(β) |
という関係が成り立つ場合に、Q(α) - ∪Q(β) に属するマスは全て地雷、∪Q(β) - Q(α) に属するマスは全て非地雷、ということが確定する。
(注:絶対値の記号は、その集合に属する個数を表す。あと、集合の引き算は差集合、すなわち除外を表す)
(続く)
79 :
1:2007/05/12(土) 02:40:26
ただし、ここでβというのは、1つ以上の未確定マスをαと共有するマス(つまりβというのは複数個ある)とし、
・ΣN(β) = 「βの実質値」を全部合計した数値
・∪Q(β) = 「βの周りの未確定マス」全部の和集合
とする。(本当はΣとか∪はもっと巨大に書きたいとこだけど、雰囲気でご理解ください)
もう少し精確に書くと、
・S(α) = {β (≠α) | Q(α)∩Q(β)≠φ} (ここのφは空集合のこと)
としたとき、上記の「Σ」と「∪」は、それぞれのβ∈S(α)に対して全部の「和」および「和集合」って感じ。
ちなみに S(α) = φ の場合、αの数字だけを考慮することになり、
「N(α) = |Q(α)| ならば、Q(α) は全て地雷」
というシンプルな状況(
>>45あたり)になる。
それと
>>54前半は、|S(α)| = 1 の場合。
80 :
1:2007/05/12(土) 02:40:57
数式だけだと、「何のこっちゃい?」って感じだと思うので、以下は具体例。まず通常はありえないけど、
>>64を題材とすると、
□□□□□□□
□@□C□@□
□□□□□□□
□は、まだ開いていないツルツルの未確定マス(「?」は見づらいのでやめましたw)。
Cをα、左側の@をβ、右側の@をγすると、S(α) = {β, γ}で、N(α) = 4、N(β) = 1、N(γ) = 1、ってのは問題なさそう。
で、Q(α)はCの周り8マス、Q(β)は左の@の周り8マス、Q(γ)は右の@の周り8マスのこと。
そうすると、N(α) - {N(β) + N(γ)} = 4 - (1 + 1) = 2 になる。
そして、Q(α) - {Q(β) ∪ Q(γ)}ってのは、Cの周り8マスから、2つの@の周り8マスと重複しているものを除外したマス、すなわちCの上下2マスだけになる。
つまり、| Q(α) - {Q(β) ∪ Q(γ)} | = 2 となり、上の N(α) - {N(β) + N(γ)} の値と一致する。
ということは、Cの上下2マスは両方とも地雷で、なおかつ、@の周辺だけどCの周辺ではないような部分は全て非地雷であることがわかる。
81 :
1:2007/05/12(土) 02:41:32
というわけで、
☆☆□★□☆☆
☆@□C□@☆ ★は確実に地雷
☆☆□★□☆☆ ☆は確実に非地雷
という結果になる。
あと、
>>55で思い出したんだけど、地雷の「存在を仮定」して進める方法は戦略として重要なので、もう一言追加。
N(α)からN(β)やN(γ)を引き算するということは、αとβの共有部分やαとγの共有部分に、N(β)個、N(γ)個の地雷が存在すると仮定することに相当する。
で、Q(α) - Q(β) ∪ Q(γ) の個数と比較することで、その仮定を検証していることになる。
両者の数値が一致した場合には、仮定が正しいことになり、非共有部分の地雷or非地雷が完全に決定する、という仕組みになっている。
さて、この辺で一段落ということにします。
週末中には、
>>36,56の実装ができあがりそうです。
なんか難しくてよくわからないけど、
背理法+バックトラッキングでも、十分高速だと重。
^1.後から開いた数字とその周囲を優先、
^ (未確定マスー実質値)の絶対値の小さいもの優先で、数字を一個選択
^2.その周囲に★を仮に置いてみる。同時に☆が仮に決定
^3.それを再帰的に繰り返す
^ ↓
^ a.矛盾(=2で★や☆の数が超過で置けない)したら
^ 一つ前に戻って別の場所に置く
^ ↓
^ 全部の場所、ケースで矛盾すれば、はじめに置いた★が☆に決定
^ それを開いて1へ
^ そうでなければ、1で別の数字を選択
^4.全部の数字で矛盾が発見できなければ、解は不定。失敗
^ 未確定マスがゼロなら、解有り。成功
効率は1のところの選択アルゴリズムの性能次第だけど、
判定に時間かかるなら、その問題は捨ればいいし
ごめん。
(未確定マスー実質値)の絶対値の小さい
↓
Min((未確定マスー実質値),実質値)のなるだけ小さいもの
ですた。
84 :
1:2007/05/13(日) 11:47:13
>>82 なるほど、地雷があるのを仮定して進めるのをストレートにやるってことかな。
基本的に「確定」みたいなことをせず、最後まで仮定だけで試してみて、詰みがあるかどうかだけを見つける感じ?
それと、最初の「優先度の選択」のところがちょっと理解しきれなかったんだけど、俺のやりかたより断然シンプルな形でできそうだね。
いちおう今は
>>78に近い方針で実装を試みてるんだけど、破綻しそうな予感もしてるので、参考にさせてもらう可能性大です。
85 :
1:2007/05/13(日) 11:55:25
86 :
1:2007/05/13(日) 12:03:46
いくつかわかったのは、
・上級でも、「2つのマスから推論」を使うだけでクリアできる確率は何気に高い(チェックボックスに全部チェックを入れて解いてみてください)。
・初級や中級なら、「推論」を使わなくても大抵解ける。
・一方で、1回解くだけでも結構時間がかかる。
って感じかな。
まあ時間がかかるのは、JavaScriptだからってのもあるし、あと書いたアルゴリズムを大して見直してなくて、「とりこぼし」がないようにするために、かなり余分にチェックしすぎてる面があるかもしれないためだと思われます。
87 :
1:2007/05/13(日) 12:25:06
うわ、
>>78で検出できないケースがありましたorz
×××× → ××××
□@×× → □@××
□A@× → □A@×
□□□× → ☆□□×
×・・・数字or旗or壁(確定マス)
□・・・初期状態(未確定マス)
☆・・・地雷ではないことが判明
やっぱこれが、「詰みにならない必要条件」に過ぎない故の欠陥ですね。
「詰みにならない十分条件」(=「詰みになる必要条件」)を見つけないと、ちゃんとしたものにはならないか・・・
あぁ、
>>82のおかげで、必要十分条件見つけました。
もっとシンプルに考えればよかったんだorz
俺のバカバカバカ!
ある未確定マスに対して、★や☆を仮定してみて、どこか別の場所に矛盾が起こるかどうかを探せばいいんだ。
まず、ある一つの未確定マスに対して、
・「★だと矛盾」かつ「☆だと矛盾しない」なら、当然そのマスは☆に確定
・「★だと矛盾しない」かつ「☆だと矛盾」なら、当然そのマスは★に確定
・どっちも矛盾しないなら、とりあえずそのマスはどちらもあり得る
・ちなみに両方矛盾することは、絶対にありえない
で、同じことを全ての未確定マスに対して繰り返して、1つでも確定するなら詰みじゃないし、1つも確定しないなら詰み。
うーん、そうすると、パフォーマンスを意識するなら
>>82の優先順位みたいなやつをうまくつけていく必要がありそう。
まあでも、JavaScriptでやってるおかげで、色々修正するのはけっこう楽かも。
89 :
1:2007/05/13(日) 13:24:30
おっと失礼、88は俺です。名前欄入れ忘れでした
90 :
1:2007/05/14(月) 02:14:56
やっぱ違うなぁ・・・
>>88も色々と穴があるっぽい。
□□□□ ★□□☆
□DA□ → ★DA☆
□□□□ ★□□☆
これは
>>88じゃ検出できないや。
とりあえず別の方針として、ゲーム理論とかに出てくるCSP(制約充足問題)も検討してみようかと思ってます。
なんか実装が難しそうだなぁ・・・
91 :
1:2007/05/14(月) 02:21:46
すいません、たまにはageます。
Janeで見てると上がってるとか下がってるとか全然気にならないから忘れてたorz
最初の一個目は、運にのみ支配されている
よって 必ず解けるとはいかない
よってスレ終了w
これは ひどい
逆説 開始後 最低でも二個運で踏まなきゃならない
→ 必ず解けるは無理w
踏んでから生成するんだっつーの
96 :
1:2007/05/14(月) 05:49:50
というわけで、コンピュータに解かせて、解けなければ地雷を配置しなおすバージョンです。
http://2sen.dip.jp:81/cgi-bin/upgun/up1/source/up5350.zip ・初級は問題なし
・中級はちょっと遅いけど、せいぜい3〜4回のやり直しでうまくいく
・上級は何十回やり直しても見つからない時があるw
まあとりあえず、今の段階では「もっと頑張れば解ける」ような盤面も、「解けない」と結論してる部分もあるから、改良の余地はあるかも。
あと、解くのが遅いのは、アルゴリズムがテキトーだからですorz
一応、中級はけっこう遊べると思う。
やっぱり「論理だけで確実に解ける」地雷配置は、プレイしてて気持ちがいい!
97 :
1:2007/05/14(月) 05:52:15
>>92 えーと、それに関しては
>>22-28あたりを参照してください。
今現在の状況としては、
・一番初めの状態では、地雷を配置しない
・最初にクリックした瞬間に、そのマスおよびその周辺を避けて地雷を配置
・あとオプションで、コンピュータに解かせて行き詰ったら配置し直しってやつを実装できたとこ
ってな感じになってる。
98 :
デフォルトの名無しさん:2007/05/14(月) 06:00:41
99 :
1:2007/05/14(月) 06:10:08
スマソ。眠くてぼーっとしてたw
まあ途中経過を整理するのにちょうどよかったので、利用させてもらいました、ってことで。
100 :
1:2007/05/14(月) 10:10:40
1のせいでマインスイーパ久しぶりにはまって時間無駄にした。
>>26 速いひとは旗立てないから
そのポイント方式はまずい
103 :
55:2007/05/14(月) 13:18:48
>>102 旗たてて左右両クリックで一気に開くほうがはやくない?
なら ・確実に安全だけど開いていない場所 だけでw
105 :
67:2007/05/14(月) 13:24:38
あー、見るの忘れてた。
複数の拠点で2chを見ている関係でたまに取りこぼしがあるですよ。
で、私もタイムアタックのときは旗を立てないので、旗をクリア条件にしている
マインスイーパにはえらくストレス溜めさせられますね。
ってことで、旗でペナルティは勘弁。
#まぁ、旗立ゲームと思えばありなんですが。
処で>100のスクリプト、自動展開も自動旗立ても(勿論自動推論も)チェックしていないのに
どんどん展開していきますけどこれって、こちらの環境の問題でしょうか。
今使っているのはこれですが。
--
Mozilla 1.7.12
Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.7.12) Gecko/20060130 Red Hat/1.7.12-1.1.3.4
106 :
67:2007/05/14(月) 13:28:48
>>103 WinMineだと、初級中級とも旗立てない方が速く解けますよ。
私でも初級で2秒で中級で46秒。
#初級の場合、解くと言うよりも反射で運よく開けたって気もしますがw
>105
ウチはWin環境でIE/Firefox/Operaで試したが
どうやらIE用に作られてるみたいで、FirefoxやOperaだと上手く動かんかったりする。
まぁ、まだ試作品だから仕方ねーなと思うしか。
多くの場面で左右両クリックのが速いけど、それを超える記録を出すには
旗立てないで、かつ配置の運が必要
109 :
1:2007/05/15(火) 00:35:43
>>101 それは失礼www
>>105,107
すんません、とりあえずWin+IEじゃないと動かないかも。
いちおうFirefoxで、Ctrl+クリックすると選択範囲がでてきちゃう問題は直したつもりなんだけど、まだ一瞬だけ選択範囲が見えちゃうかも。
でもFirefoxは、それ以外は動くんじゃないかな、とは思ったけど、もう一回見直してみます。
Operaは全然わからないんで、ちょっと対応予定ないっす。すいません。
何かonpropertychangeがIEにしかなかったり、onchangeがどのタイミングで呼ばれるかよく理解してなかったりで、イマイチどうしたらいいかわからないんで、詳しい人plzです!
(Web製作板でヘルプ頼もうかな・・・)
最終的にはwinmine.exeみたいな、Win用の実行ファイル単体で作りたいと思います。
あ、でも
>>67はLinuxですか。どうしようw
110 :
1:2007/05/15(火) 00:42:23
旗立ての話で盛り上がってるみたいだけど、旗を立てないほうが速いってのは初耳だったかも。
マインスイーパも極めるとそうなっていくのか・・・
ちなみに俺はマインスイーパ自体のレベルは全然高くなくって、とにかく暇つぶしにマインスイーパをやるのが好きなだけ。
たいていストレスがたまったときとかに、何気なくやるのがマインスイーパなんだけど、
上級だと自力でクリアできる確率があまり高くないし、運でしか突破できないところまできて地雷を踏むのは余計にストレスになる。
そんなわけで、もっと気持ちよく遊べるマインスイーパが欲しいと思ったわけです。
111 :
67:2007/05/15(火) 00:44:24
大丈夫、Winもある。勿論、ちゃんと動いた。
#で、MozillaOnRedHatでは残りの個数もちゃんと出てなかったことに今気付いたw
112 :
デフォルトの名無しさん:2007/05/15(火) 00:48:28
>>110 お前さんが用意してくれたページで各種機能をオンにして何度か遊んでみたけど、
確かに上級をクリアする為にはかなり運に依存するみたいだな。
判断ミスがゼロでもクリアできる確立は10〜20%ぐらいなんじゃねぇの?
113 :
1:2007/05/15(火) 00:58:29
>>111 おぉ、それなら安心。
つーかメジャーなブラウザ全部に対応するのって難しいなぁ。
>>112 そんな感じかもね。
今のとこ、クリアできる地雷配置になるまでコンピュータに解かせるのは、上級だとやや非現実的な解決法なのかなぁとも思いつつある。
こういうこと言うと元も子もないんだろうけど
ランダムに地雷置いてから解けるかどうか判断するんじゃなくて
1個ずつ順番に解ける位置に置いていくっていうのはどうなの?
115 :
デフォルトの名無しさん:2007/05/15(火) 01:12:03
>>114 それがこのスレの趣旨じゃなかったのか?
116 :
1:2007/05/15(火) 01:34:19
>>114,115
実は、それができたらベストです。
っていうかそれがやりたいんです。
でもいくら考えてもできないから、とりあえず
>>36を参考に、ランダムに置いてみる方法を試してみてるとこ。
やっべ
中級クリアしたら寝ようと思ったのが12時10分w
意外と難しいもんなんだな
俺自身はプログラミング齧った程度だから具体的なコードは書けないけど
普段解く時『地雷が判明したら、周囲の数値から1引く』
って考えてるんだけど、何かに使えるかな。例えば
□□A
□※A
□CB
□□□
※の部分が地雷だと判明したら、周囲の数値を
A→@、B→A、C→B
要は、数値を『判明してる分を除いてあといくつ地雷が残っているか』と読む。
で、差し引いた結果、数値が:
ゼロになった → 周囲の地雷以外のマスは全てオープンできる
周囲の地雷以外の残ったマス数と一致 → それらも全て地雷が確定
そーすると、残りのマス・数値のパターンは割と限定される。
@AA@、@A@、A@などの
定石パターンに持ち込めればしめたもの。
今北
マインスイーパってやっぱ途中で博打しなきゃいかんのね
少ししかやったことないから見付からないときは自分が悪いと思ってた
>>1には頑張って欲しい
121 :
1:2007/05/15(火) 08:33:51
122 :
1:2007/05/15(火) 08:48:14
>>119 今まで使ってた記法を使わせてもらうと、こんな感じのやつのことかな。
□□□□□ □□□□□ ☆★☆★☆
□ABA□ = □@A@□ → ☆@A@☆
□A※A□ □×××□ ☆×××☆
□・・・未確定マス(初期状態)
※・・・旗
×・・・確定マス(数字or空白or旗or壁のどれか、という意味)
★・・・地雷であると判明
☆・・・地雷ではないと判明
いちおう、表示された数値から、旗の数を差し引いた値を、「実質値」という呼び方して使ってる。
今実装できてるやつは、表示されてる数字ではなく、実質値から割り出して計算させてるよ。
(実際のコードの中では、cell.remainderって名前にしちゃってるけど)
123 :
1:2007/05/15(火) 08:49:25
>>120 応援ありがとう!
なんか今いいアイデア浮かんだので、実装してみます。
124 :
55:2007/05/15(火) 10:50:31
>>119 厳密にいえばおれもそれが基本だが、
いちいち1を引く、とかじゃなくて、視覚的に判断している。
たとえば2の数字のまわりに1個地雷確定箇所があったら残りどっかに1個あるってのを、
いちいち2−1=1とか考えないよな。
3このリンゴをみて、1,2、3とか数えるわけじゃなく見た瞬間3だし、
5個のリンゴがあって3人の子供が1個づつもっていくとしたら、
計算とかしなくても頭の中に2個残ったリンゴが思い浮かぶ。
1桁の足し算、引き算とか、人間は数値計算だと頭ではとらえずに、
観念的、幾何学的に答えがでる。
ただしプログラムを作るとなると計算しなくちゃだめだろうが。
125 :
1:2007/05/15(火) 11:36:41
126 :
1:2007/05/15(火) 11:43:14
しまった・・・。
上級を自動で解かせてみたら、ちゃんと解けないorz
基本的な考え方としては、「2つのマスから推論」を一切せずに解けるように配置したつもりなんだけど、何かおかしなことになってるっぽい。
ボツだなこりゃ。
127 :
67:2007/05/15(火) 12:08:44
>>126 でーりゃぁ配置がかたよっちょるがね。自動旗立てで上級が数秒で解けてしまう。
128 :
67:2007/05/15(火) 12:15:53
自動展開、自動旗立てで、しばしば1クリックで解けてしまう。
1クリックで解けないときは、「七六四」(周囲は旗と壁)なんかができている。
それと、カウントがおかしいのか旗立てがおかしいのか、「残り5個」で地雷踏んでゲームオーバーになった。
#一応ハードコピーは取った。
で、検証したいから暫くゲームオーバーになっても旗の操作できるようにできない?
129 :
1:2007/05/15(火) 12:27:13
>>128 スマソ、もう完全にアルゴリズムが間違ってるっぽい。
ゲームオーバー状態で旗の操作はちょっと難しいな。
でもトライしてみる。
130 :
1:2007/05/15(火) 12:40:00
>>128 ゲームオーバー自体にならないようにしてみた。
131 :
67:2007/05/15(火) 13:13:36
>ゲームオーバー自体にならない
対応乙。
デバッグ終わるまでは何かと便利かと。
で、これで検証できると思ったら、残り60個でクリアしてしまったw
左上はこんな感じ。
□二♪※□□……
二五♪三□□……
♪♪♪二□□……
二三二一※□……
□□□□※□……
□□□□※※……
:
:
右下はこんな感じ
:
:
……□□□□※♪♪♪
……□□※□※♪♪♪
……□※※※※♪♪♪
……□□※♪♪♪♪♪
……□□※♪♪♪♪♪
……※□※♪♪♪♪♪
132 :
1:2007/05/15(火) 13:25:12
>>131 あー、なるへそ。
おいらのとこでも再現できました。
たしかに、まだ地雷が残ってるのにクリアになっちゃってるね。
たぶん原因はわかったかも。
そして修正困難であることもわかってしまったorz
133 :
1:2007/05/15(火) 13:53:55
>>125は失敗に終わったけど、1つ気付いたことがあった。
詰みにならないように地雷を配置していくのには、根本的に難しい点があるかも。
そもそも勘を使わずにマインスイーパを解くには、一発目にクリックした場所から、徐々に広がっていくように解いていくしかない。
そうすると、そのような解き方で詰みにならないように地雷を配置するには、やっぱり最初にクリックした位置から徐々に広がっていくように巡回しながら置いていくしかない。
その場合、本来置くべき地雷の個数に達しないうちに、全部のマスを巡回してしまった時に、バックトラックするのが非常に難しい。
何か良い解決策ないかなぁ?
ミスって爆弾を開いてしまっても、そのまま1手戻して続きができる選択もほしいな。
その場合はクリアとかタイムとか得点はないようにして。
感想戦みたいなもんだと考えて。
残り少なくなって間違った時や、操作ミスや勘違いで開けてしまった時、最後までやりたい場合がある
135 :
1:2007/05/15(火) 14:16:24
>>134 あるあるw
自動展開とかその他のオプションとの兼ね合いもあるから、すぐにできるかわからないけど、やるだけやってみる。
136 :
1:2007/05/15(火) 14:18:10
と思ったけど、さっきつけたゲームオーバーにならないオプションじゃ役不足かな?
フリーセルのように初期配置状態に番号付けておいて
同じ問題を違うところから解くとかやりたい。
138 :
1:2007/05/15(火) 14:46:34
>>137 うーん、ちょっとそれだと趣旨がズレてきちゃうかも。
あるマスを最初にクリックして解ける配置は、別のマスから始めると解けなかったりするから。
既存のマインスイーパにログ機能付けて詰まった場合のやり方から何かみえないかな?
140 :
デフォルトの名無しさん:2007/05/15(火) 21:45:37
>>1 考えれば絶対に解けるってのはなかなかやりがいがあるな。
時間を忘れて熱中してしまうわ。
頭悪いから議論には参加できそうにないけど応援してます。
マス目最大で地雷の数は最小
ワンクリック勝利
>>133 絶対詰まない配置だったら
最初の一発目クリックで全部開いて0秒でクリア出来るぞ
143 :
1:2007/05/16(水) 03:12:41
俺も密かに応援してる。
いいアイディアが無いからいつもロムってるけど。
145 :
1:2007/05/16(水) 03:16:51
今思ったけど、「解く順序」によって、詰みになるかならないかが変化する可能性があったらどうしよう・・・。
つまり「詰みになるかならないか」が、地雷を全部配置した状態の静的な性質なのか、動的に解いていくことでしかわからない性質なのか。
経験的には静的な性質だと思ってたけど、それを論証する手立てもないし、もし動的に変化しうる性質だったら、ちょっとモチベーション下がるなぁ。
>>143 いや、児童じゃなくてもそうだろ?
よく考えてみろよ
詰んでないんだから全部開かれる
147 :
1:2007/05/16(水) 03:20:51
>>144 THX!
あー早く実装したいけど、考えがまとまらない〜
>>145 南北を上下に分断する配列で地雷源があるとしよう
北から攻めたときは詰まずに最後まで行けるが
南から攻めたときは詰んでしまって先へ行けないケースは
簡単に作れると思う
149 :
1:2007/05/16(水) 03:25:54
>>146 うーん・・・ちょっとよくわからんです。
おいらの実装で、中級あたりで、「ランダム配置で解けるまでやり直す」ってやつでやってみてください。
実際やっても詰みにはならないはずだし、最初から全部開いてしまうってこともないと思います。
「詰み」という言葉自体の意味は、
>>22のような感じで使ってるけど、その辺の行き違いはないかな?
150 :
1:2007/05/16(水) 03:29:25
>>148 いちおう、「最初にクリックした場所」によって解けるか解けないかが変わるのは、認識してる。
それじゃ、「最初にクリックした場所」が同じで、解く順番が違う場合に、詰みになるかならないかに変化はあるか・・・って問題。
ちょっとワイアレスの接続状況が悪いので移動します。
あー全部開きました
すみません
153 :
1:2007/05/16(水) 05:11:57
>>151 すげー、旗を立てずにやってる。
俺もたまに旗を立てずにやることあるけど、どうしても同じとこを2回以上頭で考えてしまって遅くなるorz
ちなみに、「あれ、おかしいな、詰みにならないはずなのに詰まった」と感じた時は、「自動推論」などを付けてみると見つかる時があるかもです。
154 :
1:2007/05/16(水) 09:35:27
>>125で実装したかったものができました。
実装:
http://www.geocities.jp/ktms2ch/mine.html 地雷を「明らかに解けるように配置」というやつです。
どういうことかというと、2つ以上のマスを同時に考えないと先に進めないようなものは一切なく、常に「残りの地雷数」から旗を立てることができるようにしてあります。
簡単な話が「自動展開」と「自動旗立て」だけオンにすれば、必ず解けるような配置です。
何か地雷の配置が妙に偏ってるのは、この条件に合致させるために仕方ないことだと思われます。
バックトラックしてないので、上級でやると、たまに地雷配置に失敗しますw
155 :
1:2007/05/16(水) 09:38:47
あ、それと、
>>139に触発されて、「降参」ボタンをつけました。
本当に降参したいときに押してもいいけど、どちらかというと実際にプログラムで配置された地雷の位置を視覚的に確認するためのもの。
ランダム配置+自動オプションを3つともオンにしたときに、解けなかったものはどういう配置なのかを観察するのに役立つはず。
あと、失敗してもゲームオーバーにしないオプションをデフォルトでオンにしたので気をつけてください。
真剣勝負したい場合はオフにしてください。
156 :
1:2007/05/16(水) 09:55:50
あ、物ができた時くらいageようかな
157 :
1:2007/05/16(水) 10:25:06
おっと、忘れてた。
実は今回追加した「明らかに解けるように配置」というオプションは、終盤で残りの地雷数から割り出せるようなものも含んでます。
で、それに対応すべく、「自動完了」というオプションも付け加えました(地雷数が残り0になったら強制的に全マスを開く)。
一発目にクリックした位置から、徐々に地雷配置を広げていく方法が結構うまくいくことに気付いたので、今度は複数マスから推論できるようなものに拡張したいと思います。
それができたら、当初の目標はとりあえず達成という感じです。
(バックトラックが一番の難関かも・・・)
158 :
デフォルトの名無しさん:2007/05/16(水) 11:45:49
詰めマインスイーパとかできればいいな
エディット機能で作った盤面をそのまま保存できる。
データ文字列を読み込んでその状態にできる。
エディットでは、地雷配置と既開放マスを設定。
ベストは一個もクリックせず地雷位置を確定させるみたいな。
159 :
82:2007/05/16(水) 13:04:56
なんか思いついた
カーソルを2個づつ移動作成しながら爆弾置けるっぽい
カーソルに移動可能のフラグ立てるときに周りにカラのセルを配置すればいいっぽい
文字じゃ説明困難なんで夜に画像でも書きます
今度は
必ず解けるソリティアだな
Winについてくる、ソリティアことKlondikeSolitaire?
VegasRuleなら兎も角、Win版みたいな再利用可能なpileだと激しく面倒ですな。
#自動解きさえ難しい。
163 :
1:2007/05/16(水) 14:01:01
>>158 なるほど、おもしろそう。
盤面をシリアライズするのは、テキトーにフォーマット決めちゃえばそんなに難しくないと思うから、盤面の保存/復元みたいなのも後々やってみようかな。
>>159 おぉ!なんか掴めましたか!
縦横斜めのいずれの方向に行くにも1歩と数えて、2個ずつの距離っていうのは、俺も意味がありそうな気がしてます。
でもどうやって地雷を置いていったらいいのか検討もつかないので、画像お待ちしてます。
>>160-162 ソリティアはルールは何とかわかるけど、解けるとか解けないとかそういう議論は全然わからないorz
ソリティアをコンピュータに解かせるのって難しいの?
164 :
1:2007/05/16(水) 14:07:20
すいません、今までの推論の仕方で検出できないものが、またいくつか見つかったので、覚書です。
イマイチ法則性が見つからないなぁ・・・
□□□□ ☆□□★
□AA× → □AA×
□A×× □A××
□××× ★×××
□□□□ ★□□☆
□B@× → □B@×
□@×× □@××
□××× ☆×××
□□□□ ★□□☆
□B@□ → □B@☆
□@×□ □@×☆
□□□□ ☆☆☆□
□□□□□□ ☆□□□☆☆
□@A□@□ → ☆@A□@☆
×××××× ××××××
ソリティアってのはトランプのひとり遊びの総称で
Winのは「クロンダイク」っていう名前のソリティアだな
(最近のWinはスパイダーが入ってたりするが)
クロンダイクはその時その時のとれる行動が少ないから
クリアできる時はだいたいアッサリ解ける
どっちかっつーと頭使わずに作業して
勝敗自体は運に任せる感じだから
感覚としてはギャンブルに近いんじゃ?
運ゲーを必ず解けるように作ると
あんまり面白くないものが出来上がると思うぞ
マインスイーパの場合は微妙に頭脳ゲーだから
解けない時に理不尽さを感じる
慣れると割と運ゲーなんだけどなw
>>1 マインの場合解くことが目的じゃなくてプログラム書くことが目的になってるよな
167 :
1:2007/05/16(水) 14:29:56
>>165 そうだったんだ。勉強になりました。
マインスイーパをやりこんでる人には運ゲーになってしまうのねorz
まあでも、マインスイーパを完全な頭脳ゲー化するのが、このスレの目的であります。
>>166 そうです。プログラムを書くのが目的です。
一方で、解くことに関してある種の完全性を満たす法則を見つけないと、確実に解けるマインスイーパにすることはできないんじゃないかって気はしてるよ。
>>164 せっかくのコンピュータなんだから、
総当たり背理法をつかうといいかも?
たとえば、
>>164の最初。
あいうえ
おAA×
かA××
き×××
左上のAに着目して、「あ」に爆弾があると仮定し、
もう一個を、「い」にあると仮定する。すると、右のAから、「う」「え」は無有と判断できる。
そして「お」「か」にはないことになるが、左下のAの残り有効マスは「き」のみとなり矛盾が生じる。
つまり、「あ」には爆弾はないのでクリックおk
というような、数字表示近接マスの総当たり解放
169 :
67:2007/05/16(水) 15:14:51
クロンダイクソリティアは、手札の山から取るときは一枚ずつ、捲るときは三枚ずつなのが難点。
>162の言う、VegasRuleは山を一枚ずつ捲って空になったら即ゲームオーバーなのかな。
Winのや一般的なのは再利用できるから、使えるカードを敢えて使わない選択があるので試行錯誤が必要になります。
#それが不要なアルゴリズムがあるなら教えて欲しいw
具体的にはこんな感じ。手札を上から順に、a, b, c, d, e, fとします。
初期状態: 空 | 裏
(1)
捲る: c | 裏
c取る: b | 裏
b取る: a | 裏
a取る: 空 | 裏
捲る: f | 空
(2)
捲る: c | 裏
c取る: b | 裏
捲る: f | 空
捲る: d | 裏
d取る: b | 裏 (dが取れない場合) 捲る: f | 空(次のターンでも見えるのはdとfのみ)
b取る: a | 裏
a取る: 空 | 裏
捲る: f | 空
(1)では、a, b, cの回収はできますがd, eは見ることもできません。
(2)では、dが取れるカードならa, b, c, dの回収ができますが、やはりeは見られません。
逆に、dが取れないカードだとcしか回収できず、aもbもeも見えないことになるわけです。
これがあるので、序盤は空捲りで一巡させて三枚ごとの配置(この例ではcとf)を確認しておくことが重要になります。
#仮に、再利用可能で捲るのも一枚ずつだと……すごく、簡単です。
尤も、仮置き場の積み方も選択肢が発生するのでプログラミングでとなると厄介なことには変わりませんが。
#いずれも、選択肢故の試行錯誤(≒バックトラック)が問題なので計算量はそれほどでもないかも知れませんが。
170 :
1:2007/05/16(水) 15:21:18
>>168 確かに背理法を使う方法は
>>82にも出てきたけど、割とシンプルなアルゴリズムでできそう。
難しいのは、「どのマスをいくつ仮定するか」ってあたりかな。
「どのマス」に関しては周辺のマスの状況から何らかの優先順位をつけて、PriorityQueueとかで拾って、そこからある距離(おそらく2歩)以内とかでいいけど、「いくつ仮定するか」ってなるとかなり難しいと思う。
それに仮定する数が増えると、計算量がとんでもないことになる。
最終的には、例えば「仮定するのは3マスまで」みたいな妥協案も考えられるかもしれないね。
171 :
1:2007/05/16(水) 15:53:37
>>169 なるほど。
そうすると、クロンダイクソリティアは明らかに解く順序によって、解けるか解けないかが変わってしまうというわけだね。
それだとアルゴリズムでできるのは、飽くまで見ることのできる札から最善手を選ぶだけで、必ず解ける手を打ち出すことはできないってことなのかな・・・?
172 :
1:2007/05/16(水) 16:15:36
ヤバイ、規則性が見えてきたかも試練
□□□□□□ □□★□□☆
□□□B@□ → ☆☆□B@☆
□@□□□□ ☆@□□□☆
□□□□□□ ☆☆☆□□□
□□□□□□□□□ ☆☆□□□□□□☆
□@□AA□A@□ → ☆@□AA□A@☆
□□□□□□□□□ ☆☆□□□□□□☆
□□□××× □□□×××
□□□□C□ □□□★C★
×□□□□□ ×★□□□★
×B□B□□ → ×B□B☆□
×□□□□□ ×★□□□★
□□□□C□ □□□★C★
□□□××× □□□×××
□□□□□□ □□□☆☆☆
□□□□@□ □□□☆@☆
□□□□□□ ☆☆□□□☆
□@□C□□ → ☆@□C★□
□□□□□□ ☆☆□□□☆
□□□□@□ □□□☆@☆
□□□□□□ □□□☆☆☆
□・・・初期状態
×・・・数字or空白or旗or壁(確定マス)
★・・・どうやら地雷
☆・・・どうやら非地雷
数字は実質値(隣接する確定マス内の旗の数を引いた値)
>>170 普通に左上から右方向に周囲に未開マスがある数字表示マスをたどっていき、
>>168の用に検出できたら再度左上から・・・
さっきやった処理をまた行う無駄な検索も多くはなりそうだが、
今のコンピューターの能力を考えると大したことない処理量だと思う
自分も作ろうかなと思ってるんだけど。
この画像使っちゃだめかな??
>>173 うん、まあ仮定するターゲットを選ぶってことに関しては、全部を網羅しさえすればいいから、色々な方法があると思うけど、「いくつ仮定するか」っていう部分がちょっと大変かも。
というのも、
>>172みたいな感じで色々試してみて、少しずつわかってきたんだけど、グラフ探索アルゴリズムでCSP(制約充足問題)を解くようなやり方で、完全な答を出せるかもしれないと感じているところなので。
とりあえず、まずは完全な答を探して、もしそれが無茶であることがわかったら背理法を使ってみるよ。
>>174 画像っていうのは、Webページ上の実装に使ってるやつのことかな?
それだったら、winmine.exeからリソースハッカーで抜き取った画像だから、好きに使ってくれていいと思います。
というか、俺自身も本当は使っちゃいけないんじゃないだろうか、という不安もあるんですがw
最終的なリリース版(実行ファイル単体)では、オリジナルの画像に差し替えようかと考えとります。
あ、そうなんだ。
じゃあ自分も後で差し替えるかもしれないけどとりあえず使わせてもらう。
ありがとう。
177 :
67:2007/05/16(水) 17:14:59
私の場合、>164のようなパターンは、評価マス(数字のある場所)から順に手繰ることで確定させました。
□□□□ ☆□□★
□AA× → □AA×
□A×× □A××
□××× ★×××
「左上」マスを評価した場合、
○○○□
○AA× 「左上」から「右」に自分の調査対象範囲(○の範囲)を通知。
○A×× 同様に「左上」から「下」に自分の調査対象範囲を通知。
□×××
○二二□ 「右」は自分の対象範囲から「左上」の対象範囲を除外すると残りが一箇所であることから
二AA× 「右」から「左上」に対象範囲内の置ける個数を返答(1-2個×2箇所)。
二A×× 同様に「下」から「左上」に範囲内の置ける個数を返答(1-2個×2箇所)。
□×××
☆□□□
□AA× 「左上」は双方から少なくとも足すと二個置けると言われたので、残り箇所の☆を確定する。
□A××
□×××
って、この調子で長々と書いたのだけどどうしよう……
178 :
67:2007/05/16(水) 17:30:38
>>171 つーか、ソリティアの場合捲るか取るかの判断が悩ましいわけで、その悩ましさが売りですから。
プログラムがいんちきして、手札を全部知ってたとしても解くのは厄介でしょうねぇ。
>172のパターンも>177の応用で処理できそうですが、なんせ当時は(評価で)確定が出るたびに
再描画してたのでアニメーション的楽しさはありましたが実用性は余り……w
>>177 うん、今俺の考えてる方法も、その方法に近いです。
ちょっと自分の方法はまだ言葉で説明するのも絵で描くのも難しいですが・・・。
例えばこんな複雑怪奇なやつも、おそらく解けると思う(実用性ゼロだけどw)。
□□□□□□ □★★★□□
□□E□□□ □★E□☆☆
□□□□A□ → ☆□□□A☆
□A□□□□ ☆A□□□☆
□□□E□□ ☆☆□E★□
□□□□□□ □□★★★□
まだ隠れている地雷の位置を※とすると、実際の地雷の位置はけっこう色んなパターンになる。
□★★★□□ □★★★□□ □★★★□□ □★★★□□
□★E□☆☆ □★E※☆☆ □★E□☆☆ □★E※☆☆
☆※※□A☆ ☆□□※A☆ ☆※□※A☆ ☆※□□A☆
☆A□※※☆ ☆A※□□☆ ☆A※□※☆ ☆A□□※☆
☆☆□E★□ ☆☆※E★□ ☆☆□E★□ ☆☆※E★□
□□★★★□ □□★★★□ □□★★★□ □□★★★□
(他6パターンほどある)
180 :
1:2007/05/16(水) 19:55:07
181 :
1:2007/05/16(水) 19:56:29
基本的には、調査対象を全部グラフで結んでしまうのだけど、結べる条件がちょっと細かい。
簡単に言うと、ある2つの数字マスを結ぶための条件は、周囲の未確定マスの中で「2つの数字マスの間で共有されているマス」が、少なくとも2マスある必要がある(「なぜ」そういう条件なのかは聞かないように。試行錯誤の賜物ですw)。
例えば、それぞれのAやEの間には、2マスずつ未確定マスがあるのがわかると思う。
またグラフ内のそれぞれのエッジで、共有マス同士の重複は許されない(重複する場合はグラフを形成できない)。
これで、上図の4点を結ぶ4角形ができあがる(対角線は結べない)。
一度グラフを結んだら、全体を巡回しながら、
>>177同様に、共有部分は「地雷数のあり得る範囲」の形で整合性をチェックする。
このとき、ある種の「極端さ」が必要で、例えば上図の両方のAは、その非共有マス(グラフ内の誰とも共有していないマス)に一切地雷がなく、また両方のEは、その非共有マスが全て地雷、という風に両極端になっていると仮定する。
実際のアルゴリズムでは、両極端なノードが交互に並んでいれば良い。
その極端な仮定の下で矛盾が一つもない場合には、仮定した非共有マス部分が全て確定する。
逆に矛盾が生じた場合には、このグラフから確定できるものは一つもないということになる。
はい、言葉で説明すると意味不明でした。
またちゃんとまとまってから来ますorz
182 :
1:2007/05/16(水) 20:13:03
あ、あと実践的なパターンで、現在の実装では解けなかったものを紹介しときます。(※は旗です。)
B※BA@
@A□※A□
※A□BB□
ABA□□□
□□□□□□
まあ読みの早い人はすぐわかるかもしれないけど、コンピュータにやらせるとちょっと大変そう。
まず、これを実質値に直す。使わない数字マスと旗のマスは全部×に変える。
××××××
××□×@□
×@□AA□
×××□□□
□□□□□□
左側から順に@・A・A・@をつないでグラフを形成し、それぞれの非共有マスが、非地雷・地雷・非地雷・地雷という風に交互になっていると仮定する。(まあ、「非共有マス」を持つのは、3番目のAだけなんだけどね。)
最初の@と次のAの間にある共有2マスには、1つの地雷があるはずで、二つのAの下側の共有2マスにも1つの地雷があるはず。
後の方のAの右下は非共有マスなので、非地雷であるとすでに仮定してある。
そして、最後のA・@の右側2マスにも、1つの地雷があるはず。
これで矛盾は起こらないので、3番目のAの非共有マスが非地雷になる。
××××××
××□×@□
×@□AA□
×××□□☆
□□□□□□
というわけで、一箇所だけ非地雷確定!この1マスが救世主になったりするんだよね。
183 :
1:2007/05/16(水) 20:14:52
>>178 うぉ、そうだったんだ。
手札が全部わかってたとしても解くのが難しいんだね。
ソリティアは散々悩んだ挙句、解なしっていうのがヤなんだよな〜〜。
マインスイーパーは一か八かで解けるけど。
上は82です。よく見たら図13,14は間違ってたorz
187 :
82:2007/05/17(木) 00:14:54
爆弾ないとこ掘っていくと絵が出来るとかどうよ?
189 :
デフォルトの名無しさん:2007/05/17(木) 00:53:56
何年か前にJavaアプレットで作られたそんな感じのブロック崩しがあったな。
190 :
1:2007/05/17(木) 03:54:32
>>187 ごめん、ちょっとよくわからないかも。図6までは理解できたと思う。
図7→図8の遷移で、爆弾を置く5マスは、図7の時点でアキでもいいの?
図9→図10の遷移は、図8に行く代りにこっちに行くこともできるって意味でおkだよね?
図11→図12の遷移は、「爆弾をやっぱりアキに変える」わけだから、爆弾の個数が超過したときにやるんだと思うけど、逆にアキの個数が超過した場合には、「アキをやっぱり爆弾に変える」パターンもいるのでは?
図15→図16の遷移では、「緑の?」はせいぜい2つまでなら爆弾でもいいということ?
図17→図18の遷移は、図7〜図10と同様なオプションであると理解できました。
図19→図20の遷移は、図17のパターンを実際に適用しているのはわかるけど、「周囲が埋まっている」という意味がわからなかったです。
図21と図22は、操作としては意味がわかるんだけど(図21がどうやって実現したかはわからなかったけど・・・)、「配置を完了する条件」がなぜ図21のコメントのところに書いてあるようになるのかがわからなかったです。
というわけで、細かいとこをごちゃごちゃ書いてしまったのですが、一番重要なのが、「なぜこのアルゴリズムで詰みにならない配置になるのか」という部分にどうも釈然としきれないとこです。
たぶん色んな試行錯誤で見出したものだと思うので、基本的にどういうコンセプトでこれらのパターンが出てきたのか、というところをもうちょっと詳しくお願いします。
(もし時間が許すならば、1ステップずつ実際にパターンを適用している図とか作ってもらえれば、さらに理解が深まるかもです)
191 :
1:2007/05/17(木) 04:00:01
あ、
>>154を作ってるときにわかったんだけど、例えば中級なら幅16×高さ16の盤面に40個の地雷を並べるから、非地雷(アキ)は16×16−40=216個ってことになる。
そうすると、初めから解けるように配置していった場合には、
(1)それまでに決定した地雷数=40になったら、残りのまだ決めてないマス(?)は全て非地雷(アキ)にする
(2)それまでに決定した非地雷数=216になったら、残りのまだ決めてないマス(?)は全て地雷にする
ってことで問題ないと思うよ。
192 :
1:2007/05/17(木) 04:02:43
>>188-189 たぶん、今やってる方向から、絵が出てくるように改良するのは難しすぎるかもですorz
レイヤー作ればすぐ出来そうな気がするけど
194 :
1:2007/05/17(木) 05:15:04
>>193 ああ、普通にバックグラウンドに絵を描いておけばいいのか。
それなら簡単にできそうw
俺は絵心がないので、絵が得意な人は、画像提供お願いします。
195 :
67:2007/05/17(木) 08:02:51
開くと下に絵があるってことか。
寧ろ、地雷の配置がAAになるとかw
Ex.こんなの♪
□□□□□□□
□□●□●□□
□□□□□□□
□□□□□□□
□●□□□●□
□□●●●□□
□□□□□□□
196 :
1:2007/05/17(木) 08:05:00
ぴくろ(ry
198 :
82:2007/05/17(木) 08:42:14
>>190 A1.図7の時点でアキでもいい。(0が斜めに二つ並ぶだけ)
A2.図7〜10へ行くのは可です。
ただし爆弾数を減らす操作になるので多用できないです。
A3.アキ→爆弾は不可。というか詳しく調べてない。
たぶんアキの数字をどこかで利用すると破綻するじゃないかと。
基本、○をあまり使わなければ、爆弾数多くなるので減らす方向で。
A4.?じゃアキでなくてもいいところを適当に埋めた例。
A5.図21は間違い。直すの忘れてた。
A6.○や×を置けば爆弾かアキに確定できるから。
○の下の数字と旗の数があっているところ、
×の下の数字と(周囲の数-旗の数)があっているところから
順番に埋めればいい。
なぜかと言うのは、アキに表示される数字が確定した時点で
実際に数字を埋めればわかるかも。いや、俺が間違ってるかもしれんけど…
たとえば図8なら表示は051になっているです。
○や×はその場の最大最小値に相当なのでどこにでも書けるわけだし。
あとは夜にでも書きます。
199 :
82:2007/05/17(木) 08:46:36
いや051→052ですね
200 :
1:2007/05/17(木) 09:23:29
>>198 なるほど、それぞれの操作はだいたい把握できたかも。
解説ありがとう。
「○や×を図3や図4のように、置けるかぎり目いっぱい置く」って場合には、数字が決定できるのはたしかにその通り。
(もちろん8方向のうちで、すでにアキか爆弾か決定している場合はそこを避けて置くことになる)
ちなみにこの方法のみを使って、地雷を配置したものが
>>154の「明らかに〜」の実装です。
で、図8まで決定すると、表示値は0と5と2になるとのことだけど、図7の灰色の「?」や空白には、爆弾がある可能性もあるんだよね?
何かそこらへんがごっちゃになって、どういうふうに数字が決定していくのかが、ちとまだ難しい・・・。
201 :
67:2007/05/17(木) 10:23:30
よく考えたら(って考えるまでもないけど)>195みたいなのって要は出題型パズルなんですよね。
それこそピクロ(ry とか同様。もう少し地雷を多めにして「必ず解ける」を満たせれば
パズルとして成立できるかも。パズル作家に提案だけしてみようかなw
#あ、スタート地点候補も提示する必要があるのか。
202 :
82:2007/05/17(木) 12:38:38
>>195 201
それいいですね。一問数十バイトで記録できるんだし
iアプリとかにしたら結構流行りそう。
>>200 説明わかりにくくてすいません
よく考えたら△のあるオプション方だけでよかったです
爆弾少なくなりそうなときだけ○設置を思いとどまればいいだけか。
2つのパターンは90度回転すれば対象だから事実上パターン一個に統合できそう
また夜に画像書き直しおします
わからん。 一通り読んでみたけど、文字だけじゃ何をいってるのかさっぱりわからん。
俺の理解能力のなさに乾杯。
204 :
1:2007/05/17(木) 14:49:26
>>154を拡張して、2マスから推論のみで解けるような配置にしてみました。
実装:
http://www.geocities.jp/ktms2ch/mine.html 実はこのスレ立てた当初は、これくらいのものが実装できればいいなあと思ってました。
でも色々考えていくうちに、
>>182みたいなちょっと頑張って考えればできるやつとか、
>>164みたいなのもあっていいよなぁと思うようになってきたので、もうちょい性能アップさせたいです。
つーか、何かよく観察すると、
>>154のときにも見られた、地雷配置の偏り(妙に地雷同士が寄り添っている)があって、どうにも解消できない。
あと、何度もやってると、CとAの数字がやたら繰り返し現われて格子状に地雷が配置されてたりとか、訳がわからない。
なるべく「癖のある出題」にならないような地雷配置を目指したいところです。
205 :
1:2007/05/17(木) 14:59:35
というわけで、課題はまだまだ山積みなんだけど、JavaScriptでの実装は今回でお終いにしたいなぁと思います。
もうコードがスパゲティになりすぎてリファクタリングする気になれないw
最後に作った関数なんか、400行を超えとります。
あと、HashMapとかSetとかPriorityQueueとか基本的なADTが気軽に使えないので、精神的に限界です。
もう1から書き直したいorz
でもJavaScriptを久しぶりに書いて、すごい楽しかったなぁ。
いちおうこれからの予定としてはC++を考えてます。
Cで書こうとも思ったけど、STLの存在が頼もしくなりそうなので、C++でいきます。
ただ、GUIのプログラミングとか慣れてないので、まず取っ掛かりに時間がかかるかもしれないです。
ウィンドウってどうやって作るんだっけ?ビットマップってどうやって描画するんだっけ?とかそんなレベルです。
まあ気長に行きましょう。
バンガレ
207 :
1:2007/05/17(木) 15:07:12
>>201 自分で配置を考えるって形も、色々できて面白そうだね。
必ず解けるような地雷配置ってのが、一発目のクリック位置に依存するあたりとか、難しい問題ははらんでるけど、ちょっとずつマインスイーパの裏に潜む事実がわかってきてるから、将来的にはフレキシブルに対応できたらいいな。
>>202 アイデアはすごいおもしろいし、規則性がガッチリ見えてきたら使えそうな気がするよ。
画像のほう楽しみにしてます。
>>203 すいません、たぶん一番ダラダラ文章書いてるの俺ですw
208 :
1:2007/05/17(木) 15:07:56
209 :
82:2007/05/17(木) 22:49:18
210 :
1:2007/05/18(金) 02:26:25
>>209 ばっちりわかりました!
実は、「1つの数字のみ参照して決定」と「2つの数字から決定」を使うやり方は、
>>204で実装したものと非常によく似てるかも。
デバッグのオプションをつけたので、一番上のコンボボックスからは「初級」か「中級」、「2マス推論で解けるように配置」を選び、デバッグにチェックをつけて、適当なマスをクリックしてみてください。
http://www.geocities.jp/ktms2ch/mine.html あ、くれぐれも「上級」でデバッグにチェックしないほうがいいです。
恐ろしく時間かかりますw
「中級」もちょっと時間がかかるかもしれないので、辛抱強く待ってください。
デバッグで表示された盤面で、?は「見て」いるところで、その?から爆弾かアキが決定してるのは「次の盤面」であることに注意してください。
Expandは1つのマスだけ見てる場合を、Inferは2つのマスを見ていることを意味してます。
真っ白なマスは、最初にクリックした場所です(画像が少ないのでw)。
211 :
1:2007/05/18(金) 02:32:36
で、すごく参考になったのが、相互に反転できるグループを作るって点です。
今の俺のやり方だと、爆弾やアキの個数が最後におかしくなったときは、ランダムにむりやり変えて強行突破してます(「必ず解ける」かどうかわからなくなるので、警告メッセージが出ます)。
とりあえず、あるマスを「見る」という作業が、そのグループの相互反転をできなくする条件ってことでおkですか?
212 :
82:2007/05/18(金) 08:59:32
それでおkです。
厳密にいうと2地点参照のパターンでは、
参照位置が隣あっている必要はなく、共有部が2が本来の条件ですが
それを定義にすると同じ位置を何度も参照した場合、矛盾しそうで、
まだその辺の処理があまく、隣あっているものに制限して成立させてます。
213 :
82:2007/05/18(金) 09:07:55
携帯からなんで最新の実装はまだ見てません。
見たら改めてコメいれます
214 :
1:2007/05/18(金) 13:49:26
>>212 それじゃひとまず、地雷を配置していって最後の方で個数がおかしくなったときは、グループで反転の処理を作ってみます。
えーと、それで、2マスから推論するパターンについては、隣同士じゃないものも気にせず含めて実装しちゃってます。
基本的に問題ないっす(理屈上、大丈夫っぽい)。
あとデバッグ表示にちょっとだけ色をつけてみたよ。
赤は地雷を置く場所で、青は地雷を置かない場所になっとります。
ランダム+コンピュータに解かせてみるバージョンのやつも、デバッグ表示してみると楽しいかも。
http://www.geocities.jp/ktms2ch/mine.html のやつやってみた。(最新URLここであってる?)
初級-ランダムに地雷を配置
デバッグ:off
展開、旗立、推論、完了:on
失敗しても〜:off
×のとこでボムりました。
たしか一番左上クリックしたハズ
□□□□□□□□□
□□□□□□□□□
□1×21□122
□1♪♪2□1♪♪
123♪2□122
♪1222111□
123♪21♪1□
□1♪♪2111□
□1221□□□□
□=空いてるマス
♪=旗
>>215と同じ条件で
+------
|○1■
|12■
|■■■
○=最初のクリック
■=閉じてるセル
で、とまった。
こんな報告はいらない?
217 :
1:2007/05/18(金) 16:42:19
>>215 最新版はそこであってます。
確かに、地雷を置き過ぎて放置してしまうケースがあるみたいです。
見直してみるので、お待ちください。
>>216 ランダムに配置した場合には、そうなることもあるかと思う。
あ、でも「解けるような配置」をした場合にも、そういうケース(
>>209でいう「囲んでいるかどうかの判定))をちゃんと検出してないので、それも改善しないとです。
報告はどんな些細なものでもありがたいです。
218 :
1:2007/05/18(金) 17:50:46
>>215 すいません、バグでしたorz
直しました。
219 :
82:2007/05/18(金) 19:06:37
>>214 最新版やったけど、解けるような配置より、ランダムのが面白いみたい...
良問かどうかの評価関数いれるとか。爆弾増やすとか大変かな。
それと裏側が見えないからこその2マス推論なので、
2マス隣同士でないと共有部分をはさむことになって、結局両側を開いてしまい
ネタばれするっぽい。なんかいらないんじゃないかって気がする。
220 :
1:2007/05/19(土) 02:02:29
>>219 >最新版やったけど、解けるような配置より、ランダムのが面白いみたい...
そうなんです、そこは是非解決したいっす。
たぶん、ランダムってのは、「良問」という点では一番最適なんだと思う。
「解けるような配置」をすることで、「意図」が入り込んでしまい、出題に「傾向」が生まれてしまう・・・。
たぶん、「いかにランダム出題に近づけるか」っていう目標になっていくと思う。
評価関数を使うのは、たしかに有効な手段かもしれない。
221 :
1:2007/05/19(土) 02:05:22
>>219 >最新版やったけど、解けるような配置より、ランダムのが面白いみたい...
そうなんです、そこは是非解決したいっす。
たぶん、ランダムってのは、「良問」という点では一番最適なんだと思う。
「解けるような配置」をすることで、「意図」が入り込んでしまい、出題に「傾向」が生まれてしまう・・・。
たぶん、「いかにランダム出題に近づけるか」っていう目標になっていくと思う。
評価関数を使うのは、たしかに有効な手段かもしれない。
222 :
1:2007/05/19(土) 02:06:11
>ネタばれするっぽい。
ネタばれというのは、プレイヤーに推論させようと思って地雷配置したけど、実は推論しなくても確定できてしまう状況のことだよね。
実は「ネタばれになる条件」は、推論用に注目している2マスがその時点で共有しているマス(例えば隣同士を推論に使うなら最大4マス共有され得る)が、もっと後の決定で「全部地雷」か「全部アキ」になると、結局ネタばれしてしまう。
つまり、推論しなければ解けないようにするには、共有してるマス内の地雷数は、「中途半端」な数であってくれる必要がある。
(実はこのことが、推論するためには「共有マス」が最低2つ必要な理由になってます。
もし1マスしか共有してなかったら、地雷数は0か1という明らかに決定可能な数値にしかならないため)
一方、
>>209でも考察している通り、周囲で共有してないマスに関しては、「全部地雷」とか「全部アキ」みたいに「両極端」になる必要がある。
その点では、注目2マスが「隣か隣じゃないか」よりも、そもそも何も考えず決定範囲を広げていくことが問題なのかもしれない。
解決法の一つとしては、推論のとき(というか推論相当の地雷配置をするとき)に共有マスの地雷orアキに関しては、「微妙に決定」な状態(例えば
>>187で出してくれた中で、「△」を使うような雰囲気)にするといいかも。
後々その△マスを決定するときには、「確率」を操作することでネタばれを減らせるんじゃないかと思う。
(評価関数を使うのと、意味的には近くなるかも)
223 :
67:2007/05/19(土) 07:39:33
確かに推論版は簡単ですねぇ。偏るから当てずっぽうに開けやすいし読みやすい。
多分タイムアタックやったらランダム版よりかなり早いと思う。
224 :
1:2007/05/19(土) 08:46:36
225 :
1:2007/05/19(土) 08:49:30
>>223 たしかにその通りorz
まあ実際、ランダムの場合は「解けない場合」すらあるわけだから、「必ず解ける」ようにすると、ランダムより簡単になってしまうのは避けられないかも・・・
あ、でも、「推論でしか進めない」ような配置を意図的に増やすことができたら、もっと面白くなるかもしれない。
がんばろー
いまいじってみたけどなんか格好いいね。応援しています。
ところでこのソースぱくらせてもらってもいい?ライセンスとか決めてあるのかな。
独自アルゴリズム(まだ考えてないけど)試したくなってきた。
227 :
1:2007/05/19(土) 10:14:48
>>226 どもども。応援ありがとう。
ソースはどんどん使ってくれていいよ。
ただ、ちょっと汚くなってきたから、いじりにくいかもw
もしいい考えが出てきたら、レスくれるとありがたいです。
228 :
1:2007/05/19(土) 11:21:46
229 :
67:2007/05/19(土) 11:40:19
>>228 確かに大分よくなったかも。
処で、地雷の数を多めにしたり少なくしたりして試してみるとまた違うものが見えるかもしれない。
地雷数が今上級で20%くらいだと思うけど、25%越えるとかなり違う世界になるから。
中級くらいの広さの25%だと面白いかも。
#いや、それこそ推論で解けるケースが減るわけですが。
230 :
1:2007/05/19(土) 15:59:15
231 :
1:2007/05/19(土) 18:01:25
JavaScriptはもうおしまいの予定でしたが、まだまだお世話になりそうです。
こんなにコードが長くなるなら、最初からもっと真面目に書けばよかったorz
とりあえず、
>>222に書いた、推論させる上で必要だけど決定しないマスの確率をどうやって割り当てようかをずっと考えてるけど、全然いい考えが浮かばない。
それぞれの推論自体に関係した確率(中途半端な地雷数÷共有マス数)と、盤面全体での地雷数による確率(地雷数の合計÷(幅×高さ))をどうやって結びつけたらいいんだろう?
つまり島状に囲まれて飛び地になった場所は絶対出来ないっていう意味ですね
だけど囲まれ方が
□□□□□□□□
□●●●●●●□
□●□□□□●□
□●□□□□●□
□●□□□□●□
□●□□□□●□
□●●●●●●□
□□□□□□□□
だと中に入れないけど
□□□□□□□□
□●●●●●●□
□●□□□□●□
□□●□□□●□
□●□□□●□□
□●□□□□●□
□●●●●●●□
□□□□□□□□
こんな形なら中に入っていける可能性あるよね
概出?
234 :
82:2007/05/20(日) 01:25:34
235 :
1:2007/05/20(日) 01:55:30
>>232 えっと、一発目のクリックは一番外側ってことかな?
配置中に上の方の図の状態になったら、「囲まれた」という風に認識して、その場合には地雷の数を減らすことで、問題を解決してるよ。
ただし特例として、内側の16マスに一つも地雷がない場合(つまり地雷の総数を20個に設定した上でそのように配置した場合)には、最終的に「残り〜個」という地雷数表示から攻略できるので、「囲まれた」場合の解決はしていない。
下の方の図の状態は、「囲まれた」という風に見なさないようにしてあるよ。
236 :
1:2007/05/20(日) 01:57:28
>>233 あ、なるほど。
そういう機能もあったらいいかもね。
ちょっとつけてみようかな。
>>234 隣同士じゃない場合のネタバレ率は考えたことなかったなぁ。
そんなにネタバレしてたんだw
ちょっとJava版のほう試させてもらいます。
>>234 やってみました。
ばっちりできてるみたいだね。
これの配置アルゴリズムは、隣同士のみの推論をシミュレートするタイプ?
初心に戻って実際に解いて判定。1さんのに違いかも
2値推論で3×4枠を回しながら置けるなら同じ要領で逆に消せる
参照2値が離れているとバレるという仮説があってればその方が楽だし。
判定本体はjavaファイル上で一番下の関数だけどわかりにくいかな
239 :
1:2007/05/20(日) 10:52:07
>>238 おーなるほど。
「3×4枠を回しながら」の意味がやっとわかりました。
dr0〜dr7ってのは、順々にたどっていくことで、注目する長方形が回転するようなイメージなのかな。
thinkingメソッドの中身はちょっと変数が多くて把握しきれてないですが、基本方針は俺のとほぼ一緒だと思います。
俺のと違って、地雷がキレイにばらけてますね。
なんで俺のは、あんなに偏るんだろうw
あと、いくつか細かい違いとしては、
・注目マスを見に行く順序(おいらのはランダムでやったり優先順位つけてみたり、試行錯誤しすぎてコードがぐじゃぐじゃw)
・それと俺のは、「注目する2マスを、使えるか使えないか」というところに、「共有部分でまだ未決定なものが2つなければならない」という条件を付け加えちゃってます。
さすがにこれが俺の偏りを生む原因になっているとは思えないんですが、
>>234で書いてくれたコードも参考にしながら色々実験してみたいと思います。
240 :
1:2007/05/20(日) 11:04:17
>>238 あ、それと、「隣同士ではない2マスを使うとネタバレする」から、「そういう2マスは使わないべき」とおっしゃってますが、俺はそうしたくないんです。
ネタバレする確率が高いなら、その確率を減らすアルゴリズムを考えたいわけです。
(もし一切ネタバレせずに何とかなるようなアルゴリズムがあれば、さらに理想的)
なぜかというと、生成した地雷配置を攻略するときに、隣同士ではないものから推論できるような場面にも出会い得るような盤面にしたいからです。
さらに後には、3マス以上からしか推論できないものも積極的に入れていきたいです。
3マス以上による推論とは、例えば
>>182とか
>>164のように、「2マスだけからでは推論不可能」な配置です。
その意味では、有名な「1・2・1」は3マス推論ではなく、2マス推論と1マス推論の組み合わせです。
(1マスだったら「推論」と呼べるほどのものじゃないですが、一貫性を保つためにそう呼んでみます)
241 :
1:2007/05/20(日) 11:22:42
さて、
>>233の「人間が手作業で地雷配置」の実装をしようと思ったんですが、自分のコードの汚さに眩暈がしてきてしまったので、これから大幅にリファクタリングします。
気分的には年末の大掃除みたいな感じです。
で、大掃除を始める前に、以前から薄々やりたいなぁと思っていたものを実装してしまいました。
その名も「敏感マウスモード」!
普通はマウスを押して、離したときにクリックしたことになるわけですが、敏感モードでは押した瞬間に反応します。
これの何が良いかと言うと、なんと連続するマスをドラッグで開けたりすることができるんです!
やってみたらけっこう気持ち良いじゃないですか。
Ctrlキーを押しっぱなしでマウスをグリグリ動かすだけでも攻略できたりします。
あと、ゲームオーバー時にテキトーな場所をダブルクリックで、「スタートボタン」を押したのと同じ扱いになったり、ちょこちょこ隠し機能を加えてみました。
最新版:
http://www.geocities.jp/ktms2ch/mine.html (いつの間にかジオシティーズの広告が消えてるしw)
今見たら2方向の検査で良かったかもorz
枠が対象なの忘れてた、ま、手抜き仕事なんで許して
要は、最初から最後まで論理だけで解けるもので
2マス離れた所を見ないと絶対とけないのが見つからないから諦めたですよ
あとは間貸した眼腫って
243 :
1:2007/05/20(日) 12:56:16
>>242 >今見たら2方向の検査で良かったかもorz
>枠が対象なの忘れてた、ま、手抜き仕事なんで許して
その手のやっつけ書きは、たぶん俺も大量にやってるんで無問題ですよw
俺の方は動作がかなり重いので、相当無駄な処理が挟まってるんだと思うけど、どこがマズイのかすら見えないorz
コード整理しながら、速度の改善もできるかな・・・
244 :
デフォルトの名無しさん:2007/05/20(日) 17:10:24
盤面を大きくして地雷の数を少なく設定するとスタックオバーフローを起こしやすくなるデス。
245 :
67:2007/05/20(日) 20:33:36
敏感マウスモードで最初のクリックからずっとドラッグしつづけるごとく、
マウス移動だけで次々開くってのを思いついたですよ。
ただそれだけだと、地雷に囲まれたときに脱出できなくなるからそのときはCtrlキーでも押して
旗立てつつ移動するって感じでできそうですが。
で、ドラッグ操作と薬物に引っ掛けて、名付けてドラッグモードでどうです?w
246 :
1:2007/05/20(日) 21:59:14
>>244 マジで・・・
とりあえず再帰使いまくりだから、仕方ないとは思います。
たぶん、盤面の大きさ自体に制限加えるくらいしかできないと思うので、どれくらいの盤面でスタックオーバーフローしたか教えてもらえないですか?
>>245 つまり、マウスのボタンを押さずに、マウスをグリグリするってことすかw
それ実装してみよwww
でも、それだったら「ドラッグ」じゃなくなってる気が・・・
まだ掃除中なんで、もうちょい時間かかるかもです。
247 :
1:2007/05/20(日) 22:04:49
248 :
1:2007/05/20(日) 22:11:28
あと、マインスイーパを解くJavaでの実装も転がってました。
PGMS - Programmer's Minesweeper
http://www.ccs.neu.edu/home/ramsdell/pgms/index.html (ソースコードは、一番下の「A Zip archive of the complete sources」というとこです)
まだ動かしてみてないのでわからないですが、マインスイーパを攻略するアルゴリズムとか、参考になりそうです。
一応、そのうちアシスト機能みたいなもの(
>>10のやつとか、
>>71みたいなやり方とか)をつけたいと思ってるので、配置アルゴリズムだけでなく、攻略アルゴリズムのほうも重要になってきます。
249 :
デフォルトの名無しさん:2007/05/20(日) 22:15:08
>>246 盤面の大きさ: 40x40
地雷の数: 10
モード: 隣マス推論で解けるように配置
例えば、こんな設定で遊んでると簡単に out of memory やら stack overflow なんかが頻発するですよ。
250 :
1:2007/05/20(日) 22:37:59
>>249 本当だw
一発で再現しました。
これは俺のアルゴリズムが悪いです。すいません。
ちゃんと見直すべきですね。
たぶんすぐには直せないので、修正は実行ファイルバージョンになってからかもしれないですorz
報告、どうもありがとう。
251 :
デフォルトの名無しさん:2007/05/20(日) 23:50:52
>>250 いまさらかも知れんが、sourceforge あたりでアカウントとってバグやリクエストの管理も
やったほうがよくね?
旗が立たないってどういうこと?
Ctrl+左クリックなら旗は立つけど
一瞬で慣れた
マジか・・・
259 :
1:2007/05/21(月) 00:13:57
>>251 sourceforgeですか。
使ったことないからよくわかんないけど、後で見てみます。
当初はまさか、ちゃんとしたオプソ開発に格上げすることになるとは思ってなかったw
>>252-258 JavaScriptでコンテキストメニューを禁止したり、右クリックを判別する方法がわからなかったので、とりあえずCtrl+クリックでやってます。
261 :
1:2007/05/21(月) 01:06:52
手詰まりにさえならなければ
地雷が多かろうが少なかろうが
面積が広かろうが狭かろうが
難易度は一緒だということに気付いた
>>262 確かに・・・
作業が比例的に増えるだけになるからか
264 :
デフォルトの名無しさん:2007/05/21(月) 02:06:16
俺も実際にいろいろやってみていくつか気づいたことがある。
一か八かでやらなきゃいけない場面がなくなったらゲーム性が
落ちてしまうんじゃないかとも最初は思ってたけども、この技術が
あれば、そういう手詰まり状態をゼロにするんじゃなくて一定量に
調整することも可能だし、逆に手詰まり状態をゼロにして他の
ゲーム性を付加するのもありなんじゃないかと思うようになった。
地雷が多いと数えて旗立てるだけで
推論なしで終わってしまうから
むしろ簡単になってしまう
地雷が少なくても同じ
適度な難しさを作るのって難しいと思う
>地雷が多いと数えて旗立てるだけで
>推論なしで終わってしまうから
>むしろ簡単になってしまう
↑
これ「必ず解ける場合」の話ね
Firefoxでやると旗の残り表示が常に0になってるね。
IEでやるまで異常だとは気付かなかった(というか気にしてなかった)けど。
>>264 「一か八か」が1回以上現れる配置の場合、開ける手順によって
「一か八か」の発現場所も回数も変化するような気がするけどどうなんだろ。
(初手開けた時に、次の一手が「一か八か」にならないように再配置すると仮定して)
>>267 >「一か八か」が1回以上現れる配置の場合、開ける手順によって
>「一か八か」の発現場所も回数も変化するような気がするけどどうなんだろ。
そうかもしれんけど、素のランダムでやった場合みたいに極端なバラつきは出さんですむだろ。
>>259 嫌味じゃないけどどうせ続かないしsouceforgeとかはいいってw
あんまのせられるなw
>>270 別に続かなくっても sourceforge を利用するにこしたことはないと思うが。
お前、仕事でもバグ管理やバージョン管理とかしないタイプ?
俺はsfを個人的なメモに使ってます。ごめんなさい
274 :
1:2007/05/21(月) 10:07:37
はい、まとめて実装しましたよー
最新版:
http://www.geocities.jp/ktms2ch/mine.html 追加機能はこちら
・手作業で自由に地雷を配置(
>>233)
・秒数の表示
・右クリックによる操作(
>>252,260)
・マウス移動を右クリックとみなすオプション(
>>245)
えーっと、
>>245で出してくれたような、マウス移動だけでマスを開くことまでやってしまうと、操作が異様に難しくなるので、代わりにマウス移動を右クリック相当(旗を立てたり、Windowsの左右同時クリックの役を果たしたり)にしてみました。
あと、
>>244は原因はわかってるのですが(深さ優先探索のかわりに幅優先探索すればだいぶ解決されるはず)、いかんせん修正が容易ではないので、後回しにさせてください。
275 :
1:2007/05/21(月) 10:15:36
>>262 確かにその通りかも。
実際に配置自体はどんな面積でも同じ手順で地雷を置いていってるから、どうしても似たような難易度の配置になってしまうのかも。
>>264 「博打もマインスイーパの楽しみの一つ」っていう捕らえ方すれば、ゲーム性は失われちゃってることになるね。
「ちょっとだけ博打あり」とかは、実際にプレイヤーから見たら、あまり区別付かない気もする・・・
>>265 たぶん、地雷の個数は中くらいが一番、時間かかる配置になるかも。
色々試してみたけど、だいたい盤面の40%くらいが、必ず解ける配置的にはけっこういい感じかも。
>>267 今回はFirefoxでも動作確認してみました。
今まではIEでたまたま動いてしまっていた、うっかりミスがあったんですが、修正しました。
276 :
1:2007/05/21(月) 10:20:08
>>268 実は「3BV」の名前だけは聞いたことあったんだけど、今一度じっくり見てみました。
この数値を、生成した配置の適応度(評価関数)として使うのもありかもしれないね。
>>270 >>271 確かに、途中で飽きる可能性は大です。2週間後くらいには、完全にやめてる可能性もあったりw
まあ一先ず、Winの実行ファイル作れるくらいまでいったら、sf使ってみるって感じにしてみる。
最近は、もう面倒くさいからJavaScriptでお終いでいいかなぁとか思いつつあったりもするのでw
>>274 ありがとう
早速だけど
□□□□□□□□□□□□□□
□□□□□□□□□□□□□□
□□□□□□□□□□□□□□
□□□□●●●●●●□□□□
□□□□●□□□□●□□□□
□□□□●□□□□●□□□□
□□□□●□□□□●□□□□
□□□□●□□□□●□□□□
□□□□●●●●●●□□□□
□□□□□□□□□□□□□□
□□□□□□□□□□□□□□
□□□□□□□□□□□□□□
これって解けるんだね
ああ、個数が分かってるからか
これで解けなくなった
□□□□□□□□□□□□□□
□□□□□□□□□□□□□□
□□□□□□□□□□□□□□
□□□□●●●●●●□□□□
□□□□●□□□□●□□□□
□□□□●□●□□●□□□□
□□□□●□□□□●□□□□
□□□□●□□□□●□□□□
□□□□●●●●●●□□□□
□□□□□□□□□□□□□□
□□□□□□□□□□□□□□
□□□□□□□□□□□□□□
これは解けるけど自動で最後までいかないですね
□□□□□□□□□□□□□□
□□□□□□□□□□□□□□
□□□□□□□□□□□□□□
□□□□●●●●●●□□□□
□□□□●□□□□●□□□□
□□□□●□●□□●□□□□
□□□□●□□●□□□□□□
□□□□●□□□□●□□□□
□□□□●●●●●●□□□□
□□□□□□□□□□□□□□
□□□□□□□□□□□□□□
□□□□□□□□□□□□□□
>>274-276 毎度お疲れさまです。
こちらでもIE、Firefoxでざっとやってみたけど問題点は見つかりませんでした。
(マウスジェスチャーに負けるけどこれは仕方ないな)
ところで、winmineでもそうなんだけど
クリア時にまだ置かれていない旗を全部補完するというのは
余計な機能なんじゃないかと前から思っていたりします。
もしくは区別がつくようにしておくとか。
同様に残りの本数も自動的に0にはならなくしておくと、
「俺は旗を何本置かずにクリアしたぜ!」というのがわかるようになって
それがゲーム性にも繋がるんじゃないかと。
いやまあ、本題とはなんの関係もないですけどね。
いくつからいくつまでの3BVとなる配置のみを作る、という機能は
競技者用のマインスイーパのいかさまモード(練習モード?)
には実装されていますね。
これは自動で解けてしまった
□□□□□□□□□□□□□□
□□□□□□□□□□□□□□
□□□□□□□□□□□□□□
□□□□●●●●●●□□□□
□□□□●□□□□●□□□□
□□□□●□●□□●□□□□
□□□□●□□□□□●□□□
□□□□●□□□□●□□□□
□□□□●●●●●●□□□□
□□□□□□□□□□□□□□
□□□□□□□□□□□□□□
□□□□□□□□□□□□□□
これも解けるけど自動では最後までいかない
□□□□□□□□□□□□□□
□□□□□□□□□□□□□□
□□□□□□□□□□□□□□
□□□□●●●●●●□□□□
□□□□●□□●□●□□□□
□□□□●●●□□●□□□□
□□□□●□□□□□●□□□
□□□□●□□□□●□□□□
□□□□●●●●●●□□□□
□□□□□□□□□□□□□□
□□□□□□□□□□□□□□
□□□□□□□□□□□□□□
283 :
1:2007/05/21(月) 11:10:51
>>279 おいらも試してみました。
たぶん、自動オプションを4つともつけて、詰まったところ以降は、複数の地雷の配置が推測でき得るから、解けないと思います。
まあ、実際今の段階では、解けないものというのはいっぱいあります。
(というか、「完全に解く」のは、現実的な時間内では不可能かもしれません。それが「NP完全」という怪物です)
>>280 そうか。マウスジェスチャーつけてると、右ドラッグができないんですね・・・
Ctrl+クリックで頑張ってみてください。
クリアしたときに「立てずに済んだ旗」に関しては、すぐ実装できそうなのでやってみます。
ただ、画像の種類が多くないので、キレイにしあがらないかもしれないですが、やるだけやってみます。
3BVは計算が難しそう・・・。
頑張ってみよう。
285 :
67:2007/05/21(月) 11:20:07
タイム見てみましたが、やっぱりランダムの方が時間掛かってます。
尤も、中級程度以下だとフラグが無くても追えるからで、
上級程度の広さや地雷の多さになるとフラグを立てないときついので差が無くなる感じですが。
ドラッグスイープは、一回クリックしたら後は右ドラッグだけで開けて楽しいものですね。
なんか、旗をヒントにしてやると勝手に開けてくれるって別のゲームのようです。
#つまり、「左クリックで開ける」ゲームが「右ドラッグによる旗立てでヒントを与えて開けさせる」ゲームになったとw
あー、自動旗立て+左ドラッグも自分では開けないという点で同じような感じかも。
#自分で開けようと判断するより、自動で開くのを誘発するようにドラッグする方が早い。
>>279 の場合
自動だとここまで開きます
□□□□□□□□□□□□□□
□□□□□□□□□□□□□□
□□□ 1 2 3 3 3 3 2 1□□□
□□□ 2♪♪♪♪♪♪ 2□□□
□□□ 3♪■■■■♪ 3□□□
□□□ 3♪■■ 2 3♪ 2□□□
□□□ 3♪■■■ 3 2 2□□□
□□□ 3♪■■■ 5♪ 2□□□
□□□ 2♪♪♪♪♪♪ 2□□□
□□□ 1 2 3 3 3 3 2 1□□□
□□□□□□□□□□□□□□
□□□□□□□□□□□□□□
このとき残りはもちろん2個です
□□□□□□□□□□□□□□
□□□□□□□□□□□□□□
□□□ 1 2 3 3 3 3 2 1□□□
□□□ 2♪♪♪♪♪♪ 2□□□
□□□ 3♪■■■■♪ 3□□□
□□□ 3♪■■A 3♪ 2□□□
□□□ 3♪■■ a 3 2 2□□□
□□□ 3♪■■ b 5♪ 2□□□
□□□ 2♪♪♪♪♪♪ 2□□□
□□□ 1 2 3 3 3 3 2 1□□□
□□□□□□□□□□□□□□
□□□□□□□□□□□□□□
A, a, b に注目して、bに1個あると仮定するとAの周りにさらに2個あることになって残り2個の情報と矛盾します
287 :
67:2007/05/21(月) 11:22:54
あーなるほど、自分が何本旗を立てたかは(ふつーに解く人には)興味のある情報かも知れない。
最早私のように変な遊び方しか考えていないと気付かない点ですねw
#それにしても、誰も"?"を使う話題を出さない辺りは流石だ。
つまり、bには無いことが分かるのでそこを開くとこうなります
□□□□□□□□□□□□□□
□□□□□□□□□□□□□□
□□□ 1 2 3 3 3 3 2 1□□□
□□□ 2♪♪♪♪♪♪ 2□□□
□□□ 3♪■■ 4 5♪ 3□□□
□□□ 3♪■■ 2 3♪ 2□□□
□□□ 3♪ 4 2♪ 3 2 2□□□
□□□ 3♪ 5 4 4 5♪ 2□□□
□□□ 2♪♪♪♪♪♪ 2□□□
□□□ 1 2 3 3 3 3 2 1□□□
□□□□□□□□□□□□□□
□□□□□□□□□□□□□□
あとは残り1個なので分かりますよね
289 :
67:2007/05/21(月) 11:36:07
ふむ、
:
…□●
□□
右下隅がこういう配置で右下でスタートしたとき、
:
…□□
□一
これ以上は推論できないのね。残りは一個だから、
周囲にあることは確定で外側には無いことが判るのだけど。
>>283 参考になるかどうかわからないけど3BVの数え方は、
wikipediaに書かれていることをもう少しわかりやすく書くと、
・地雷のマスは+0
・いわゆる「0」のマス(どばっと開くマス)はどばっと開く範囲を1つの集合と見なして+1
・それ以外の数字のマスは+1
となります。
291 :
1:2007/05/21(月) 11:55:26
>>280 色つけました。
ちょっと気持ち悪い色になってしまったかも・・・
>>285 今後は、自動で生成したやつを、ランダムより難易度の高いものにできたら理想かな。
なんかドラッグスイープだと、コンピュータに自動で考えさせてる部分に頼って、自分は脳をあんまり使わずに楽しめちゃう感じがあるよ。
>>288 了解です。
292 :
1:2007/05/21(月) 11:56:24
>>289 たぶんそのケースは、「自動推論」のほうよりも、「自動完了」の得意分野です。
>>290 おぉ!そこまで噛み砕いてもらえたら、簡単に計算できそう!
表示だけしてみようかな。
293 :
1:2007/05/21(月) 12:03:41
294 :
67:2007/05/21(月) 12:35:32
>自分は脳をあんまり使わずに楽しめちゃう感じ
いや、右脳が激しく働きます。
開く動きと数字の配置のパターン認識でドラッグしてますからw
処で、数字と地雷と旗のデザインはWin版のままですよね。
大きさこれでいいならちょっと描いてみるかな。
295 :
1:2007/05/21(月) 12:44:28
>>294 おぉ!マジですか!
実は自分でグラデとか使って透明感・立体感のある画像を作りたかったんだけど、ここまでちっこい画像(16x16)だとうまく作れなくてorz
できればお願いしたいです。
あとできたら、青とか赤とか黄色とか基本的な色のハイライトがかかったバージョンも作ってもらえたらうれしいです。
アシスト機能とかで、注目してるマスが光って見える感じのが必要になってくると思うので。
□□□□□□□□□
□□□□□□□□□
□□●□●□●□□
□□□●□●□□□
□□●□●□●□□
□□□●□●□□□
□□●□●□●□□
□□□□□□□□□
□□□□□□□□□
□□□□□□□□□
□□□□□□□□□
□□●□●□●□□
□□□□●□□□□
□□●●●●●□□
□□□□●□□□□
□□●□●□●□□
□□□□□□□□□
□□□□□□□□□
299 :
280:2007/05/21(月) 22:08:11
>>291 さんくすです。
別に気持ち悪い色じゃないかな。最初見た時は驚きましたが。
ついでに「残りx個」のところがクリアしても0個ではなく
クリア時そのままの個数で表示されるよう頼めますか?
300 :
280:2007/05/21(月) 22:42:08
あ、クリアした時だけじゃなくてゲームオーバーになった時もか。
301 :
1:2007/05/21(月) 23:51:04
302 :
1:2007/05/21(月) 23:51:50
一応簡単に説明書いておくと、
3BV = 地雷配置の「出題の良さ」のこと。最低必要なクリックの回数で計算され、3BVが高いほど良問と言える。
(ちなみに、左右同時クリックみたいなのは使わない場合のクリック回数です)
3BV/s = 3BVを秒速で表現したもの。プレイヤーのクリックの速さを表す。
って感じだそうです。
>>301 おつかれさまです。
バグっぽいのを見つけました。
・3BVとクリアした時の秒数の整数部が同じ数の時に3BV/sが0.0になることがある
(3BV/sが0.95以上1未満の時かも)
・例えば初級から中級に変更したときにゲームが始まっても3BV/sの表示が消えていない
304 :
1:2007/05/22(火) 00:40:11
>>303 これは失礼しました。
適切なご指摘のお陰で、すぐ直せました。
305 :
1:2007/05/22(火) 00:47:43
うわ、もう一つ、自動でゼロ秒で解いた場合にゼロ除算してましたorz
こっちも直しました。
逆転の発想として、詰んだらその時点でクリアとする・・・とか。
307 :
67:2007/05/22(火) 11:51:55
それはそれで欲求不満が残りそうなのですよぉ。
詰みを認識したら、自動でどこか一つ安全な場所を開いてくれるとか。
できれば 0 のマスを優先的に。
何も開いていない状態でスタートボタンを押すと適当に1箇所開かれるのは仕様ですか?
ヘルプに書いてあるがな
あ、本当だ。
さんくす。
スタート前に先に旗置いてから適当に開いて、旗の位置が自動的に開いてしまうマスだった場合
その旗を消すこともできずクリア不可能になるね。
もしまだ開いていなかったとしても、その旗を消すと初級なら「残り11本」になったりする。
「きちんとクリックする」になってる状態でスタートを連打したら「ドラッグでスイープする」になる。
0のマスをダブルクリックしたらリセットされる。
1.初級で「明らかに解けるように配置」でスタート
2.左上の1マス以外すべてにフラッグを立てる → 残-70個
3.左上のマスをクリックする → 残13個
□×♪♪♪♪♪♪♪
××♪♪♪♪♪♪♪
♪♪♪♪♪♪♪♪♪
♪♪♪♪♪♪♪♪♪
♪♪♪♪♪♪♪♪♪
♪♪♪♪♪♪♪♪♪
♪♪♪♪♪♪♪♪♪
♪♪♪♪♪♪♪♪♪
♪♪♪♪♪♪♪♪♪
(□=あいてるマス、×=爆弾に×がついてるマス)
3.フラッグを解除して通常マスに戻す → 残り90個
315 :
1:2007/05/26(土) 04:40:50
316 :
1:2007/05/26(土) 04:46:02
今回の更新は、主に配置アルゴリズムです。
「ランダムに配置して解けるまでやり直す」ってやつは、今までは行き詰ったら丸ごと配置しなおしてたんですが、解けたとこまでは残しておいて、解けなかった部分だけ配置しなおすようにしました。
でも、上級でこれをやると、しょっちゅうスタックが溢れます(原因不明・・・)
あと、推論で解けるように配置するタイプは、ネタバレを意図的に少なくするようにしてみました。
そしたら、逆に偏りがもっとひどくなりましたorz
というわけで、今回の更新はいいとこ一つもなしです。
何か行き詰まりつつあるなぁ
317 :
1:2007/05/26(土) 04:51:13
>>306 詰むような配置だったらコンピュータの負けってわけですかw
中盤で詰みになったら、タイムがめちゃくちゃ良くなりそうw
>>308 何となく実装が楽だったので、おまけ機能としてつけてみました。
「 * 」ボタンを押すと、(詰みとかでなくても)安全なところを開きます。
>>309-311 ヘルプのありかがわかりづらかったですねorz
とりあえず別ファイルにしました(依然わかりやすくはなってないけどw)
318 :
1:2007/05/26(土) 04:55:51
>>312,314
今の実装だと、スタート前に旗を立てると、不都合なことがたくさん起こっちゃうんで、立てられないようにしちゃいました。
まあまだ実験バージョンなので、このへんで勘弁してください。
>>313 直しました。
ダブルクリックで勝手に「ドラッグでスイープ」できるようにしたのは、完全に自分の趣味趣向なんですがw
あと、0のマスをダブルクリックでリセットは、便利なので(というかクリア時に普段ダブルクリックしてると癖で押しちゃうので)1機能として加えたいと思います。
更新、乙。
320 :
1:2007/05/28(月) 21:51:56
>>319 こりゃどうもです。
で、また新しい配置方法を導入してみました。
最新版:
http://www.geocities.jp/ktms2ch/mine.html 「何となく良さそうなところに配置」というオプションを加えました。
まあほとんど遊びみたいなもんだけど、色々手作業で配置しているうちに、詰みを誘発しやすい配置パターンに気付いたので、それを意図的に避けながらランダム配置してみた。
基本がランダム配置と一緒なので、
・変な偏りがほとんどなく、きちんとバラけている
・ランダムとほとんど変わらないくらい高速
という利点があります。一方、
・3BVはランダムよりやや低い
・まれに解けない配置になってしまうこともある
というあたりは欠点と言えるかも。
321 :
1:2007/05/28(月) 22:05:19
ちなみに、詰みやすいパターンというのは ●○○● ってやつ(●が地雷で○は非地雷)で、これにならないようにしたら、ほとんど詰まなくなりました。
あと、4方の壁の近くは、もうちょいいじりました。
地雷配置のほかには、マウス操作などを一新しました。
デフォルトの状態はWindows版とほぼ一緒で、左右同時クリックで開くタイプです。
相変わらず何もないところをダブルクリックすると、ドラッグでどんどん開けられるモードになります。
あと、「失敗してもゲームオーバー扱いしない」ってオプションは、あまり使い心地がよくないので、やめました。
代わりにゲームオーバーのときに、失敗をもみ消すボタンをつけました(
>>134を結局つけてしまった感じ)。
それと、
>>280で出してくれた、クリア時に立てなかった旗を何とかするやつですが、画像がしっくりこなくて結局外しちゃいました。
すいません。
今後もっといいアイデア(旗を立てなかった部分の画像は「クリア時に何であるべきか」とか)出たら再導入します。
更新、乙。
323 :
1:2007/05/28(月) 22:49:29
>>322 どうもです。
えーと、今取り組んでいるのが、後方探索(地雷の残り数から割り出す)なんですが、どうもうまくいかない・・・。
アルゴリズム自体は一応把握してるつもりです。
・1マスも見ずに推論・・・残り地雷数が0なら、未確定なマスは全て非地雷(現在実装してある「自動完了」です)。
・1マスから推論・・・そのマスの実質値=残り地雷数なら、そのマスから遠いマス(2歩以上)は全て非地雷。
・2マスから推論・・・2つのマスの周辺で、間に重なってるマスの数をNとすると(Nは0から4)、2つの実質値の和−N = 残り地雷数なら、その2つのマスから遠いマスは全て非地雷(Nはゼロでもいい)。
また、実質値の和+N = 残り地雷数なら、重なってる未確定マスは全て地雷(Nは1以上)。
・3マス以上から推論・・・該当する複数マスの実質値の合計に、周辺で重なるマスの数の合計をプラスマイナスした値が、残り地雷数と等しければ地雷・非地雷が上と同様に決定。
324 :
1:2007/05/28(月) 23:05:30
で、うまくいかないところというのは、一体どのタイミングからどのマスを後方探索の候補に入れるか、というあたりです。
序盤では後方探索は成功するわけがないので、ひどくコストがかかります。
たぶん落としどころは、残り地雷数がいくつ以下になった時か、残りの開くべきマス数がいくつ以下になった時とか、その辺かと思います。
あと、候補にすべきマス(実質値が0でない数字マス。プレイ中の様子で言うと、まだ触っていないマスが1つ以上隣にあるマス)を選ぶのが難しいです。
たぶん、候補にすべきマスをずっと記録しておくしかないかなぁ。
その都度盤面全体を検索だと、完全にO(N^2)になってしまうし。
そうするとLinkedListあたりで追加・削除していくのが現実的かも。
でもどっちみち変化があるたびに、実質値を全部チェックしないといけないからO(N^2)だな・・・。
そうすると、PriorityQueueで log N で検索できれば、全体は O(N log N) になるのかな。
さらに、n個の候補の中からm個チェックするとなると、さらにnCm倍の時間がかかる。
気が遠くなってまいりました。
325 :
1:2007/05/29(火) 00:17:40
あーいかん、
>>323は完全に間違ってたorz
2マスのところ以降訂正
・2マスから推論・・・2つのマスの周辺で、間に重なってるマスの数をNとすると(Nは0から4)、2つの実質値の和−N = 残り地雷数なら、重なってる部分は全て地雷で、2つのマスから遠いマスは全て非地雷(Nはゼロでもいい)。
足し算はウソ。まるっきりウソ。
・3マス以上から(ry
・残り全ての候補マスから推論・・・まだ開いていないマスが全て候補マスのそば場合(1歩以内)、全部の実質値の和=残りの地雷数なら、重なってる部分は全て非地雷。
更新お疲れさまです。
>>320 各モードでの(初級/中級/上級)の3BVの平均値ってどれくらいになるかわかりますか?
327 :
1:2007/05/30(水) 13:10:32
>>326 えーと、3BVの平均値ですか。
たしかに気になるかも。
とりあえず、ランダム配置でスタートボタンを連打してみたら、こんな感じですw
初級・・・5〜22
中級・・・42〜82
上級・・・121〜209
たぶんもっと幅が出ると思う。
ちょっと簡単なスクリプト書いて、平均出してみようかな。
328 :
1:2007/05/30(水) 13:43:33
大変なことに気付きました。
3BVの計算にバグ発見orz
理屈上は、「神頼み」ボタンをぴったり3BV回押せばクリアになるはずなんだけど、たまに回数がちょっとズレる・・・。
「ドラッグでスイープする」が
展開だけで普通に開いてくれないのは仕様?
331 :
1:2007/05/30(水) 17:03:00
>>329 あ、すいません。バグってましたorz
修正しました。
332 :
1:2007/05/30(水) 17:09:25
>>330 本当だwマインスイーパだw
そこまでできてるんだったら、公開してみては?
> このスレまだあったのか。
最近は時間があんまりとれなくて、UI周りの改造とバグフィクスくらいしかできてないんですorz
何か、アルゴリズムで地雷を配置したら、予想以上にダメ配置にしかならないから、ちょっと気力が減退してるのもあったり。
333 :
1:2007/05/30(水) 17:23:34
よくかんがえたら、328に書いた
>理屈上は、「神頼み」ボタンをぴったり3BV回押せばクリアになるはずなんだけど、たまに回数がちょっとズレる・・・。
っていうのが間違いだったかも。
池のフチをクリックした場合は、その分クリック回数が余分に増えることを見過ごしてたorz
ということで、3BVは問題なしかな?たぶん・・・
334 :
1:2007/05/30(水) 17:46:54
というわけで、神頼みボタンを3BV回押したらクリアになるように修正してみました。
一応これで、3BVがそれなりに合理的な値になっている安心感は得られたかも。
修正乙であります!
336 :
1:2007/05/31(木) 05:21:37
>>335 はい、どうもです!
それで、3BVの平均出してみました(1000回ずつランダム配置して計算)。
初級: 平均 14.9 [3BV] (標準偏差 24.3)
中級: 平均 64.3 [3BV] (標準偏差 132.7)
上級: 平均 172.8 [3BV] (標準偏差 346.6)
バラつきすぎて、標準偏差が平均の倍を越えとりますw
でも、盤面の大きさと地雷数に応じて値が大きくなる傾向はちゃんとあるみたい。
あと、計算につかったrubyのソースです。
http://www.geocities.jp/ktms2ch/archive/mean3bv.zip
337 :
1:2007/05/31(木) 06:05:52
しまった。標準偏差ってルートするんだったorz
てことは、上で出した値は分散?かな?
あー自信なくなってきた。
ちょっと調べてきますorz
338 :
1:2007/05/31(木) 06:31:32
なんかググっても、イマイチ (Σx_i^2) / N − ((Σx_i) / N)^2 の公式で計算してる例が見つからなかったんですが・・・
これを丸ごとルートしたやつが標準偏差であっるかな?
まあとりあえずそういうことにしときます。
間違ってたら指摘してくださいm(_ _)m
初級: 平均 14.9 [3BV] (標準偏差 4.9)
中級: 平均 64.3 [3BV] (標準偏差 11.5)
上級: 平均 172.8 [3BV] (標準偏差 18.6)
でも標準偏差って、(正規分布に従うなら)平均の前後の標準偏差分に7割くらい分布しがちになるって意味じゃなかったっけ?
なんかあってるようなあってないような。
しかも標本標準偏差はN-1で割るんだったりとか色々あったような気も・・・
√((Σx2-Σx*Σx/n)/n)ですねん。母集団をn-1にするなら、
√((Σx2-Σx*Σx/n)/(n-1))ですねん。前者を変形すると、
√(Σx2/n-(Σx/n)^2)ですねん。
サンプルだけとってexcelのSTDEV()とか使っちゃえばいいじゃない
341 :
1:2007/05/31(木) 09:23:47
>>339 n-1 の式、使わせてもらいました。
mean3bv = 14.7, stdev = 4.8
mean3bv = 62.9, stdev = 11.2
mean3bv = 170.8, stdev = 19.1
まあ、数値的にはこんなとこかな。
>>340 Excelも確認のためにやってみました。
average = 14.685, stdev = 4.84306
average = 62.913, stdev = 11.17024
average = 170.831, stdev = 19.11083
まったく同じ値が出てるので、たぶんおkぽい。
336でうpしたソースに、1000個のデータのサンプルも入れて再うpしときました。
>>336 このソースを頂いて初級で20万回ほど回してみたけど、3BV=1が1回もない。
いつか実際に見る日を夢見てるのに、そんなに出にくいものだったとは。
あるよ。記録が0秒になったと思った。
344 :
1:2007/06/01(金) 05:56:05
>>342 そっか、3BVが1だと、ワンクリックでいきなりクリアできるってことなんだ。
3BVが1になるためには、全部の地雷が壁際にあるってことかな。
となると、頑張れば確率計算できそう。
>>343 すげーwww
345 :
1:2007/06/01(金) 06:07:14
意外と簡単に計算できたかも。
初級だと9×9の盤面だから、全部で81マスあって、壁際には(9−1)×4で32マスある。
10個の地雷を置く場合、81C10通りの置き方があって、壁際だけに置くのは32C10通りになる。
そうすると、32C10 / 81C10の確率で3BVが1になる。
約分すると、32P10 / 81P10 = (32・31・ … ・23) / (81・80・ … ・72) = 約3万分の1かな。
うーむ、たしかにすごい確率の低さだ。
ダイスを五個使うゲームで、4連続ぞろ目なんてことが実際にあるからねぇ。
で、端っこだけとは限らないからもっと確率高くなるし。
347 :
1:2007/06/01(金) 08:42:15
>>346 あ、そうか。
端から2番目だったら3BVが増えちゃうから端だけかと思ってたけど、3番目だったら大丈夫なのかorz
計算するのは難しそうだけど、確かに確率は上がるね。
>>345 地雷が全部壁際にあっても3BV=1にならないパターンがある気がする。
壁際限らず縦横で地雷or壁-地雷じゃない-地雷or壁の並びになっているところがあると
3BV=1にならない、なのかなあ。
349 :
1:2007/06/01(金) 11:18:05
>>348 本当だ。その通りです。見過ごしてたorz
とにかく3BVは、算出の仕方自体がちょっと複雑だから、この手の計算をやるのは難しい・・・
中高生くらいのときだったら、3BVの期待値とか、3BV=1になる確率とか、数学的に完璧に計算したりしてたかもしれないなぁ。
この年になったらそんなに脳を酷使できんorz
>>346 俺、高校のころとかTRPGやってたけど、天文学的な確立であろうが
起きる時にはバンバン起きるんだってのを身を持って体験したよ。
ぞろ目とか、人間にとってみため意味ある組み合わせにのみ着目してしまいがちだが、
どのようなバラバラな目がでようとも、その目がでる確率は極めて低かったわけで
そうそう、例えばぞろ目連荘の陰で22336が一回おきに出続けても誰も気付かないw
22336 は
23623 とか
26332 とかもありだからなぁ
>>352-353 元ネタがわからない。何ヶ月か前に騒がれてた、ヘタレな乱数のせいでゲーム性が完全失われてたゲームのこと?
いや、>352は>351に基づいて>346を受けただけ。順不同の積もりなので、>353は考慮対象外だったが。
>>336のソース使わせてもらって寝てる間に上級100万回実行してみたら
最低94の最高267だった。
そして今普通に上級やってたら269の盤面が生成されたらしい。
一生もの……なんだろうか?
357 :
1:2007/06/04(月) 00:08:24
>>350 テーブルトークRPGですか?w
昔ちょっとだけやったことあるなぁ。
俺がGMやると必ずヘボシナリオ化するという法則が出来上がってたけどw
懐かしい。
>>351-355 なんかわからんけど、麻雀の話かな?
普通じゃありえなさそうなことも、けっこう頻繁に起こるんだね。
>>356 100万回てw
しかもすごい偶然w
358 :
1:2007/06/04(月) 00:21:42
ところで、今C++を書いてみてるんだけど、改めてC++って難しいなぁと思ってるとこです。
文法とか言語仕様のコンセプトが把握しきれやしない。
あと、Rubyで3BVの計算のやつ書いたときに思ったんだけど、マインスイーパのコアな部分だけを、APIみたいな形でUIから分離しといたら、後々CUIでごにょごにょするのにも利用できそうだなぁとか考えて、いじり始めたら大混乱中。
まあでも、納期とかあるわけじゃないし、マターリ進めていきます。
>>358 C++は特に最初のうちは自分の理解できる機能だけ使ってればいいよ。
下手に欲だすと簡単に嵌るから。
360 :
1:2007/06/04(月) 00:54:54
>>359 うわ、たぶんもう嵌っちゃってるかもorz
1つのマスの周辺8マスを巡回するのに、マクロでキレイに書けなかったからiteratorで書きはじめて、わけわからなくなり、ライブラリのソースを読むハメに・・・。
でもこの部分はある程度でけた感じ。
この後も次々と敵が襲い掛かりそうな気がするので、ほどほどにしときますorz
C++ならソースを公開すると誰かがリファクタリングしてくれるよw
362 :
1:2007/06/04(月) 01:05:51
>>361 マジですかw
とりあえずまずは動くとこまでは頑張って作るかな。
363 :
1:2007/06/04(月) 01:10:47
なんかオブジェクトに対するconstの意味がよくわかんないなぁ。
C/C++ってJavaとかRubyとかみたいな参照だらけの言語と違って、変数がデータ領域そのものを指すから、変数をconstにすると、オブジェクトも微妙にconst的な感じになってしまう。
で、constオブジェクトに対して非constメソッド(≒Ruby的に言うと破壊的メソッド?)を呼び出そうとすると、警告が出るという、何とも微妙な位置づけ。
エラーじゃなくて警告なのね。
つーかむしろ、変数の領域を丸ごと破壊はしたくないからconstにするんだけど、オブジェクトの一部を変更したいことはあるから非constメソッドは呼びたい。
警告を抑制するしかない?
メンバが全部private(or protected)ならオブジェクト自体をconstにする必要ないっしょ。
どうしても気になるならconst_castって手もあるけどねぇ。
#オブジェクトを定義する関数から参照する関数を分けて、参照する関数にはconst参照を渡すって手もあるか。
365 :
1:2007/06/04(月) 01:32:31
>>364 うーん、関数の引数とか戻り値の類はほとんどconst参照にしてるから、どうしてもconstだらけになっちゃうんだよね。
参照はさすがにconstにしないと落ち着かないし、constつけたほうが早いんじゃなかったっけ?
あ、そういう場合にconst_castするってことか。
いまいちなにをどう迷ってんのかわからん。
一部分でいいから具体的にコードととも示してくれれば
どうするのがいいかアドバイスできると思うけど。
367 :
1:2007/06/04(月) 08:19:26
>>366 まだコンパイル通るとこまでもいってないんで、とりあえずテストコードでコンパイル通ったら晒してみます。
GUIはまだ全然なので、とりあえずCUIでテストしてみます。
で、よく探したらmutableというキーワードを発見!
とにかくconstオブジェクトから呼びたいメソッドは全部constメソッドに変えて、プロパティの方にmutableというキーワードをくっつければ、都合よく変更できるらしいです。
ちょっとC++が好きになりました。
368 :
1:2007/06/04(月) 08:36:03
と思いきや、最悪なことが判明。
MSDNを眺めていたら、priority_queueに、比較対象となる値を更新する仕組みがない・・・
普通はMinHeapだったら、比較対象の値を小さくすることならできるはずなのに。
priority_queueを、周囲の未確定マス数の順に並べるのに使おうと思ってたんだけど、マインスイーパで一手進めるごとに値は更新されていくから、STLのpriority_queueは使えないようだ。
ちょっとC++が嫌いになりました。
やっぱりJavaにしようかな・・・と思って、JavaのPriorityQueueを見てみたら、こっちにもないじゃん!
一気に鬱になったorz
最悪、自前で用意するしかないかも・・・
369 :
1:2007/06/04(月) 14:00:24
ひとまずコンパイルが通ったのでうpしてみました。
http://www.geocities.jp/ktms2ch/src/1180932338.zip 何の意味もないプログラム(CUI)だけど、上級のサイズで地雷をランダムに配置して3BVを計算しておしまいです。
コンパイラはBCC5.5です。
VCも持ってるには持ってるんだけど、廉価版だしEULAとか確認するの面倒だったのでBCCにしちゃいました。
よくわからなくてMakefileを手書きで書いちゃったんだけど、ずっと手書きじゃしんどいから、何か方法を探さないとなぁ。
370 :
67:2007/06/04(月) 14:16:16
bccはMakefileの省略表記できないのかな?
できるのなら依存関係だけ書けばいいし、それなら依存関係を調べるツールが使えるのだけれど。
それから、最適化オプションはコンパイル時につけないと意味がない。
で、ソース読もうと思ったけどpublicな要素があるのが判った時点でやめたw
コンパイル自体はgccでもほぼ問題なく通ったけどね。
371 :
1:2007/06/04(月) 14:39:09
どうせなので、このまえの3BVの計算と同じようなやつにしてみました。
http://www.geocities.jp/ktms2ch/src/1180934416.zip 今回は2万回やらせてるけど、ぱっと終わると思います。
>>370 なんかBCC特有の表記とかあるんですかね?
依存関係とか自動でやってくれたら楽だなぁ。
最適化オプションのほうは直しておきました。
publicにしたのは完全に手抜きですw
まあまたしょっちゅうリファクタリングしながらやると思うので、適当に直しておきます。
これからWinのAPIと格闘か。
なんかWindowのサイズを指定するときに、端っこの数ピクセルがどう考慮されてるのかがよくわからないorz
372 :
1:2007/06/04(月) 15:25:43
どうやらMakefileの先頭に
.autodepend
と書くと、ヘッダファイルの依存性だけ自動でやってくれるみたいです。
楽でいいけど、Borland製のmakeじゃないと動かない(当たり前か・・・)。
まあとりあえずはこれでやってみることにします。
ガンガレ
>>308 な方針のを C++ / GTK-- / BOOST で書いてみた。
とりあえず遊べるようになった。
複数の数字からの推理は実装したけど、残り地雷数からの推理は未実装。
全ソース1ファイルで、全要素 public だけどw
375 :
366:2007/06/04(月) 21:30:18
>>367 俺は mutable ってキーワードを書きかけたんだけど、
混乱もしくは悪習の元になると思ってぐっと堪えたんだけどなぁ。
というのを頭の片隅においといてくれ。
377 :
1:2007/06/04(月) 22:55:47
>>374 お!マジですか!
GTKは全然わからないかもしれないけど、boostはどんな感じに使ってるのか興味あるので、よかったらうpお願いします。
>>375 そうだったんだ・・・
たぶん自分自身で痛い目に合わないとmutableの悪さも見えてこないかもしれないので、ひとまずはこのままで行ってみます。
(あ、すでにコード書いちゃったから消すのが面倒ってのもあるけどw)
>>376 たぶんC++が難しいと感じるのは、日ごろスクリプト言語で生ぬるいプログラムばっか書いてるからっぽい。
結局JavaScriptで書いた自分のコードを大部分コピペしたしw
statは全然気にしてなかったorz
本番のコード書くときは気をつけます。
378 :
374:2007/06/05(火) 03:25:54
379 :
378:2007/06/05(火) 06:52:25
…綴り間違い発見。
stacked ってなんだ。
get stucked だよ… orz
380 :
1:2007/06/05(火) 08:39:57
>>378 どもども。いただきました。
実行してみたくてGTK--をインストーラ使ってインストールしてるんだけど、なんかちょっとうまくいってないぽい。
たぶんログオフしないとPathが通ってなかったり、その手の問題だと思うんで、今書いてるプログラムがある程度ひと段落したら再チャレンジしてみます。
382 :
1:2007/06/05(火) 09:06:16
>>381 ちょwww
それは、マインスイーパの背景画像に使おうって話ですかwww
なんかちょっと思ったんだけど、ゲームを進めていくと背景画像が見えてくるって話で、
旗を立てたマスに関しては最後まで画像が見えないけど、どう処理したらいいのかなぁ?
383 :
67:2007/06/05(火) 11:15:05
ゲームオーバーになったらブルドーザーがアニメーションで旗の立っているエリアを地均しするとか(ぉぃ
384 :
1:2007/06/05(火) 12:25:14
>>383 ブルドーザーすかw
なんかでも、ちょっとハデなアニメーションとかできたらおもしろそうだなぁ。
地雷を開けちゃったときに派手に爆発とか、クリアしたときに派手にファンファーレみたいなのとか。
とりあえずまだそんなとこまで全然達してないんですがw
つーかSDK面倒くせぇ。さっきからずーっとMSDNとにらめっこ。
そういや実行ファイルの名前何にしようかな?
このスレ立ってからずっと見てるので
>>1を信用したい気持ちもあるんだが
やっぱりアプリケーション実行するのは怖いです。
JavaScriptの方が気軽に遊べて良かったな
>>363 それで警告になるのはコンパイラが悪い。
規格ではだめになっていて、エラーにならなければならない。
> constつけたほうが早いんじゃなかったっけ?
迷信
387 :
381:2007/06/05(火) 20:55:09
うはwやっちまったwww
しかも話が発展してるww
>>384 >とりあえずまだそんなとこまで全然達してないんですがw
>つーかSDK面倒くせぇ。さっきからずーっとMSDNとにらめっこ。
いまさらだけど、見た目をハデにしたいんならFLASHとかHTML+JavaScriptとかのほうがやりやすいよ。
あとは思い切って C# +WFP あたりでいくか。とにかく SDK に手を出し始めると本質的じゃない部分で恐ろしく時間を喰われるぞ。
>>385 心配ならソースあるんだから、自分でコンパイルしろよw
JavaScriptやActionScriptは本質的じゃない部分で時間を喰われるので嫌いです
390 :
1:2007/06/07(木) 10:17:44
やっとでけた。長い戦いだったorz
C++版EXE単体ソース入
http://www.geocities.jp/ktms2ch/src/1181177440.zip まだ未完成な部分がたくさんあるので、遊べるような代物じゃないです。
ちなみに、Windowsのオリジナル版からパクりまくっているので、くれぐれもMicrosoftの偉い人にチクらないようにw
コンパイルする場合は、BCCに付属しているmakeでコンパイルしてください。
普段MinGWとかCygwin版使ってる人はお間違えのないように。
391 :
1:2007/06/07(木) 10:29:26
>>385 たしかに実行ファイルだと、信頼してもらうのは難しいっすねorz
とりあえず、JavaScript版だとどうしても時間がかかりすぎてしまうアルゴリズムを、C++で試してみたいっていう動機が大きいのでご了承ください。
C++でも遅かったらどうしようw
>>386 そうだったんだ。
ちょっとWeb上で調べてみたんだけど、論理的にはエラーになるのが正しいのにコンパイラが警告にしてしまうのは、歴史的な理由があるとか。
constつけたほうが早いってのはたしかにウソかもw
でもなんか、const参照だと一時ポインタみたいなのが作成されないように最適化できたり、そんな感じの話があったようななかったような(それも迷信かもw)。
>>387 とりあえず画像提供ありがとうw
392 :
1:2007/06/07(木) 10:39:48
>>388 えーと、おっしゃるとおり、SDKで本質的じゃない部分で時間とられまくりましたw
ちょっと選択を誤ったかな・・・
一番理想的なのは、グラフィックス的な部分はFlashなりなんなり、描画に特化したライブラリ使って、コテコテのアルゴリズムだけCで書くみたいな感じかな?
でも、そこまであれこれツールを使いこなせるだけのスキルがないorz
>>389 実行速度に関してはそうだよね。
つーか、それゆえに今C++で書いてるわけです。
まあ何ていうか、SDK+C++って時代を逆行するような組み合わせで作り始めちゃったわけだけど、
この面倒臭さがだんだん慣れによって気持ちよくなってくるという、マゾヒスティックな感覚を覚えましたw
でもやっぱ、できあがってみたらすごい動作が軽かった。
こんな一瞬一瞬の高速なレスポンスタイムが実現できただけでも、やった甲斐はあったかな。
今使ってるコンピュータがそんなに速いやつじゃないから、JavaScript版だと普通にプレイしてるだけで砂時計が出たりするw
393 :
1:2007/06/07(木) 10:50:02
あ、そういえばダブルクリックがうまく認識されなかったので、ホイールボタンのクリックをJS版のダブルクリックでやっていた挙動にしておきました。
どうやらWM_LBUTTONDBLCLKとかが送られてきてないみたいなんだけど、原因に心当たりある人いたら是非教えてください。
あと、タイトルバーの左隅のアイコンが変わらないのはなぜでしょう・・・?
なんか、LoadIcon()とかなんとか、裏でどうなってるのかさっぱりわからんorz
ちなみに実行ファイル名はktmine.exeにしてみました。
スレタイの必ず解けるマインスイーパの略です。
何かヒネリがないなぁ。
ウィンドウスタイルに、CS_DBLCLKSが入ってないとか?
ウィンドウじゃないや、クラススタイル
見てみたけど、入ってないね、CS_DBLCLKS。
アイコンはちゃんと出てるように見えるけど。
bccは入れてないんで、makeはしてない。
397 :
1:2007/06/07(木) 11:41:13
>>394,395
あ、何と、まさにその通りでしたorz
どうもありがとう。
こりゃ、他にも穴がありそうだなぁw
>>396 今確認したら、アイコン出てましたorz
おかしいなぁ。いつの間にw
アイコンはキャッシュするみたいで、最初のコンパイル時にアイコンつけてないと
EXEの位置変えるとかしないと出なかったりするな
399 :
1:2007/06/07(木) 17:57:17
>>398 なるほど。そういう事情があったんですか。
さて、JS版だとHTMLで色々なものをペタペタ適当に貼り付けちゃったけど、EXE版はどうしようかな?
あんまりGUIのコンポーネントをうまく作れる気がしない(というか面倒くさいw)し、見た目はシンプルなほうがいいから、設定とか全部キーボードでの操作にしちゃおうかなぁ。
402 :
1:2007/06/08(金) 10:43:36
>>400 GUIのライブラリってけっこう色々あるんだね。
ランタイムとかは必要になるのかな?
>>401 設定用のダイアログボックスはたしかにあったほうがいいかも。
RADツールみたいにコンポーネントをマウスで貼り付けて、リソーススクリプトを自動生成してくれるようなやつだったら、探せばありそうな気はする。
あと、設定の保存てどこにするのが一番いいんだろう?
やっぱレジストリに保存して、アンインストール用の削除ボタンとか用意するのがいいのかな?
INIファイルとかXMLファイルって手もありそうだけど。
403 :
67:2007/06/08(金) 11:53:10
iniファイルが簡単だと思う。つーか、レジストリは勘弁。
INIは、、、複数人で使うときの置き場所も気にしてくれればまあいいかな
XMLが一番、レジストリでもいい。iniは勘弁。
この規模でレジストリは必要ないな。
xmlでもiniでもいいが、設定ファイルとして
フォルダに置いておくのが良いと思う。
そうすりゃ、フォルダごと削除すればアンインストール完了だし。
407 :
67:2007/06/08(金) 12:41:32
>>405 iniがダメな理由は? APIがあるから横着できるし、自分で解析してもすぐだから簡単なんだが。
xmlは、何かしらのライブラリを用意しないと面倒じゃない?
で、アイコン作る暇がないからマイクロフォント版を公開w
このドットパターンを使えば、6x6のミニミニマインスイーパを作れる。
これならVGA解像度に100x80の広大な地雷原が♪
□□■□□┼□□□□□┼□□■□□┼□■■■□┼□■■■■┼□□□■□┼
□■■■□┼□□□□□┼□■■□□┼■□□□■┼□□□□■┼□■□■□┼
□■■■□┼□□□□□┼□□■□□┼□□■■□┼□□■■□┼□■□■□┼
□■■■□┼□□□□□┼□□■□□┼□■□□□┼□□□□■┼■■■■■┼
□□□□□┼□□□□□┼□■■■□┼■■■■■┼□■■■□┼□□□■□┼
┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼
■□■□■┼■■■■□┼□■■■□┼■■■■■┼□■■■□┼■■■■□┼
□■■■□┼■□□□□┼■□□□□┼■□□□■┼■□□□■┼■□□□■┼
□■■■□┼■■■■□┼■■■■□┼□□□■□┼□■■■□┼■■■■□┼
□■■■□┼□□□□■┼■□□□■┼□□■□□┼■□□□■┼■□□□□┼
■□■□■┼■■■■□┼□■■■□┼□□■□□┼□■■■□┼■□□□□┼
┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼
408 :
1:2007/06/08(金) 16:57:06
皆さん色々ですねw
レジストリは、Windowsのオリジナル版がハイスコアとかに使っているので、ハイスコアの同期みたいなこともやってみたいです。
まあデフォルトの状態では一切データを保存しない予定なので、ご安心ください。
できたら、レジストリかINIかを、好みに合わせて変更できるようにしようと思ってます。
INIファイルをユーザごとに分けるっていうのがよく理解できてないんですが、一般的にどうやるものなんですかね?
ログオンしているユーザごとにファイル名とかフォルダ名を変えればいいだけ?
それとも、ユーザごとにINIファイルが見えたり見えなかったりするべき?
409 :
1:2007/06/08(金) 16:58:20
>>407 マイクロフォント版、いただきますw
ありがたく使わせてもらいますよー
各ユーザーごとのフォルダにApplication Dataがあるのでそこに
共通なものはAll Usersになるのかな?
411 :
67:2007/06/08(金) 17:25:34
折角だからカラーで。次の行からを例えばms6.xpmというファイルに保存して、xpm対応の画像ツールで表示すればOK。
/* xpm */
static char const * const foo[] = {
"36 12 14 1",
"+ c #3f3f7f",
"# c #3f3f7f",
". c #bfbfff",
"1 c #007fff",
"2 c #00ffff",
"3 c #00ff7f",
"4 c #00ff00",
"5 c #7fff00",
"6 c #ffff00",
"7 c #ff7f00",
"8 c #ff0000",
"f c #3f003f",
"F c #ff00ff",
"B c #ff0000",
"M c #000000",
"..M..+.....+..1..+.222.+.3333+...4.+",
".MMM.+.....+.11..+2...2+....3+.4.4.+",
"MMMMM+.....+..1..+..22.+..33.+.4.4.+",
".MMM.+.....+..1..+.2...+....3+44444+",
"..M..+.....+.111.+22222+.333.+...4.+",
"++++++++++++++++++++++++++++++++++++",
"B....B5555.+.666.+77777+.888.+fFF..+",
".B.BB+5....+6....+7...7+8...8+fFFFF+",
".BBB.+5555.+6666.+...7.+.888.+fFF..+",
"..BBB+....5+6...6+..7..+8...8+f....+",
".BB.B+5555.+.666.+..7..+.888.+f....+",
"B++++B++++++++++++++++++++++++++++++",
};
412 :
1:2007/06/09(土) 00:25:06
>>410 あ、なるほど。Application Dataってそういう目的のためにあったんだw
確か環境変数みたいなやつで取得できたっけ?
>>411 なんかすごいなw
そのxpmってのよくわからなかったけど、とりあえずImageMagickで変換したら見れた。
Windowsでxpm形式をそのままプログラムに組み込むこととかできるのかな?
あれだ、xpmの特徴は……
・画素を色ではなく文字で表す
→画素に意味を持たせることができる
・文字に色を割り当てる
→要はパレットカラーだ、しかも複数の文字に同じ色でも大丈夫
・テキストだけで表現できる
→エディタで色調整ができる、htmlの色表現に馴れてる(or支援ツールが使える)なら簡単
・ソースに埋め込むことができる
→Winでは兎も角、Unix系ではたまに見かける
それはいいから、色をびしっと決めてIconファイルで寄越せとw
冗談は兎も角、流石に小さ過ぎだね。本家が16x16かな。せめて10x10は欲しいね。
414 :
1:2007/06/11(月) 11:07:01
>>413 解説どうもです。
結構便利な局面もあるみたいですね。
でもWin上で直接使うのはちょっと難しいのかな。
ちなみに今ですね、ウィンドウ内をパーツごとに分断するのに、子ウィンドウを使ってやろうと思ったのですが、Windowsにおけるウィンドウの概念がつかみきれず挫折しました。
もうCreateWindow関数なんて見たくないorz
そういうわけで、ウィンドウは一番外側のウィンドウだけぼーんと作って、中身のレイアウトは自前で座標から処理することにしました。
まあどうせそんな複雑な概観じゃないから、こっちのほうが楽かも。
415 :
1:2007/06/11(月) 11:11:20
>>411 あ、できたら、初期状態のマスと空のマス(ゼロのマス)を区別できるように、追加してもらえないですか?
あと、?マークも一応あったほうがいいです(実際に?マーク使う人ほとんどいないと思うけどw)。
SDKでやるより、Turbo C++ Explorerでやるほうが能率上がりそうじゃね。
C#とかのほうが楽だと思うけど。
今さら言うことじゃないようなw
418 :
416:2007/06/11(月) 11:30:03
419 :
1:2007/06/11(月) 11:48:33
>>416 たしかにw
何かもうローレベルの処理にうんざりしかけてるけど、まあ一回書いたものを全消去するのもツライので、もうちょい頑張りますわ。
なるべくランタイムの類をインストールせずに軽快に動作するものにしたいし。
420 :
416:2007/06/11(月) 12:13:58
>>419 たしかに一回書いたものを全消去は厳しいですよね。
がんばってくださいね。
でも、Turbo C++ならランタイムは必要ないように出来たと思います…。
421 :
1:2007/06/11(月) 12:39:08
>>420 本当だ。Turbo C++ Explorerのページをちょっと読んでみたら、ランタイム一切不要って書いてありますね。
今度時間ができたらいじってみます。
世の中いろんなライブラリがあるんだなぁw
422 :
67:2007/06/11(月) 20:21:08
>>415 あのマイクロフォントでちゃんと見分けられるか疑問だけど、後でやってみましょ。
で、>413じゃないけど小さ過ぎない? 8x8か10x10か、暇ができたらどっちか作るけど。
#大きいのは疲れるからちょっとパス。
423 :
1:2007/06/12(火) 17:19:11
424 :
1:2007/06/12(火) 17:24:52
>>422 試しにそのまま使ってみたらすごかったw
ほとんど見えないw
たぶん実際に使うときは、そのまま縦横を2倍か4倍にして大きくすると思います。
でも、とりあえず開いてるマスと開いてないマスが区別できないと、勘で見分ける必要が出てきます。
まあ忙しければこちらで適当にグレイな色をつけておきますよ。
俺も、ずーとまえにハンゲのやつを自動でやるやつをVB.ねっとでつくったな。
画面きゃぷって文字色で数字を解析し(PCのやつもそうだけど数字ごとに色茶うから解析めっちゃ楽(^-^)/)あとはWinApiでマウスを動かして自動プレイ。
でも時々、解が2つある場合があるのでそん時は無限ループに陥るという欠点が・・・
>>425 荒れるからそういうカミングアウトは止めれ。
お、面白そうやん。ログ読んでこよ♪
>>423 ちょっとVC++2005にもってって動かしてみたけど、
最初のクリックの直後に↓がずらっと出た。これでもたつくみたいだけど、それ以上は調べてない。
'kmine.exe': 'C:\WINDOWS\system32\wdmaud.drv' を読み込みました。
'kmine.exe': 'C:\WINDOWS\system32\setupapi.dll' を読み込みました。
'kmine.exe': 'C:\WINDOWS\system32\wintrust.dll' を読み込みました。
'kmine.exe': 'C:\WINDOWS\system32\crypt32.dll' を読み込みました。
'kmine.exe': 'C:\WINDOWS\system32\msasn1.dll' を読み込みました。
'kmine.exe': 'C:\WINDOWS\system32\imagehlp.dll' を読み込みました。
'kmine.exe': 'C:\WINDOWS\system32\setupapi.dll' をアンロード
'kmine.exe': 'C:\WINDOWS\system32\wdmaud.drv' をアンロード
'kmine.exe': 'C:\WINDOWS\system32\wdmaud.drv' を読み込みました。
'kmine.exe': 'C:\WINDOWS\system32\setupapi.dll' を読み込みました。
'kmine.exe': 'C:\WINDOWS\system32\setupapi.dll' をアンロード
'kmine.exe': 'C:\WINDOWS\system32\msacm32.drv' を読み込みました。
'kmine.exe': 'C:\WINDOWS\system32\msacm32.dll' を読み込みました。
'kmine.exe': 'C:\WINDOWS\system32\midimap.dll' を読み込みました。
試しにメッセージループに入る前に
sndPlaySound(NULL, SND_MEMORY | SND_ASYNC | SND_NODEFAULT);
を呼んで見たら、一応最初のクリックでもたつくことは無くなったけど、いいのかなこれで。
430 :
1:2007/06/14(木) 14:22:33
>>425 その手の外部から解析するツールって、画面の色から判別してたんだw
なんかウィンドウクラスとかごちゃごちゃいじくってハックしてるのかと思ってたよ
>>426 荒れる・・・かな?
>>427 おいらの書いた駄文や間違いも多いですが、どうぞよろしくです。
>>428-429 おぉ!!有力情報サンクス!
確かにメッセージループ前で、NULLでsndPlaySound呼び出したら、もたつかなくなりました。
1つ気になるのは、
>>428のログでドライバ関係みたいなのが、ロードとアンロードを繰り返してるとこかな。
まあプレイする上で重くならなければいいってのもあるけど、このロードとアンロードって何が引き起こしてるんだろう?
431 :
426:2007/06/14(木) 23:15:41
>>430 winmineをコンピュータに解かせるのは手でやって好記録出したとか
主張したりしない限り別にOKだと思うけど、ハンゲのマインサーチは
人対人で一番早く解けば勝ちな勝負をしてるので、そんなところに
自動で解かせて勝ったなんてやるのはチート以外の何物でもなく
決して容認される行為ではないのです。
というわけで怒る人はたくさんいると思われるのですよ。
このスレにはPCゲーム板のマインスイーパスレから流れてきてる人も
いるでしょうしね。
オレも1じゃないけど、そんなんで荒れるかな〜と思った。
対人戦だったのね、知らなかった。そりゃまずいわな。
434 :
1:2007/06/16(土) 04:32:07
やっと形になってきました。
実行ファイル+ソース(makeはbccのやつで)
http://www.geocities.jp/ktms2ch/src/1181910554.zip 色々実装したので、何が新機能か忘れましたw
でも、覚えてる限りで書くと、
・地雷の配置で、JS版(
>>320)の「何となく良さそうなところに配置」だったやつを、「行き詰まりにくいようにランダム」という名前で付け加えた
・地雷配置の編集モード(?マークは一発目に開くマスで、今回は右クリックで消去することもできるようにしました)
・各種自動化オプション(自動推論と自動先読が3マス解析できるようにパワーアップ!)
・自動先読というのは、
>>323,325に書いた後方探索のこと。命名が的を射てないけど思いつかなかったので適当・・・
(ちなみに、
>>323,325に書いてあることはめちゃくちゃ間違ってます。すいませんorz)
・真ん中のスマイリーボタンは、基本的に左クリックでF2相当(メニューの「スタート」)、右クリックでF3相当(メニューの「やり直し」)のつもり
・ちなみに「やり直し」はゲームオーバー時に失敗をもみ消すのと、編集モード中に地雷を全消去すること以外は、「スタート」と一緒(だと思う・・・)
・スマイリーボタンをホイールボタンでクリックすると、プレイ中は一時的に実質値表示に切り替え(デバッグ時以外は大して役立たないことが判明w)
・それと、編集モード中はホイールボタンで一時的に数字を表示してみた(これもあまり役立たないかも)
・というわけで、ホイールボタンは他にもっと便利な使い道があったらそっちに変わる可能性が高いかもしれません
・
>>407,411のマイクロフォントにちょっと手を加えて使わせてもらいましたm(_ _)m
・
>>428-429に教えてもらった訂正で、全然もたつかず軽快になったみたいです。本当にどうもありがとう!
あと実装したいけど、まだしていないのが、
・盤面のサイズ変更(できればウィンドウのリサイズで変更できるようにしたい)
・他の地雷配置アルゴリズム(本来はこれが目的なんだけど・・・)
・設定の記録(レジストリ/INI)と設定ダイアログ
・アシスト機能(たぶんずーっと先の話ですw)
って感じです。
435 :
1:2007/06/16(土) 04:39:18
>>431 あ、なるほど。そうでしたか。
完全に
>>432と同じ感じで考えてましたw
勝負はフェアにいかないといけませんな。
>>433 それは誰に対する罰ですかw
436 :
1:2007/06/16(土) 04:45:48
今回の自動化オプションの追加で、C++がものすごく速いってことを実感しました。
上級でも全自動の結果が一瞬で反映されると思います。
実は最初に自動先読みを3マスまで実装したとき、ちょっと遅くてがっかりしてたんですが、アルゴリズムの計算量を下げるように注意深く見直して修正したら、すごく速くなりました。
自動推論のほうもそうだけど、本当は4マス以上とか一般の場合に適用できる、汎用的なアルゴリズムを書きたかったんだけど、結局挫折して全然拡張性のない書き方をしちゃいました。
でも、今回はちゃんと紙の上で数学的に証明までできたものを採択しているので、書き間違いがなければ正しく動いてると思います。
437 :
1:2007/06/16(土) 04:54:37
で、次にやりたいのが、「ランダムに配置して解けるまでやり直し」のアルゴリズムです。
一番最初に実装したときは、解けなかったときに丸ごとランダム配置しなおしだったので、上級だと超低速で使い物になりませんでした。
そこで、
>>316で解けなかった部分だけランダム配置しなおすように修正したら、ちょっとマシになったけど、上級だと依然遅かったです。
さらに編集モードを利用して色々試行錯誤してみたら、解けなかった部分を全部取り替えなくても、解けた部分と解けなかった部分の境界にある地雷を1つ動かすだけで、かなり先に進めることがわかりました。
これでさらにC++で書けば、ナチュラルで、必ず解けて、ユーザに遅れを感じさせない高速なものになるんじゃないかと予想してます。
438 :
デフォルトの名無しさん:2007/06/18(月) 09:14:10
やっとスレタイ通りのものができあがりました!
今度こそ、100%論理だけで必ず解けるマインスイーパです。
実行ファイル+ソース(makeはbccのやつで)
http://www.geocities.jp/ktms2ch/src/1182122822.zip >>437に書いたとおりの方法です。
ランダム配置をプログラムで解いてみて、解けた部分と解けなかった部分の境界にある地雷を1つ別の場所に移動させ、最初から解きなおす、というのを繰り返します。
本当は最初、地雷を移動させた後、直前に解けたところから続行できるかと思ってたんだけど、意外とうまくいかず。
結局バックトラックが必要になってしまい、計算量的には最初から解くのと同じになってしまいます。
なので、バックトラックせず素直に解きなおすことにしてみたら、速度的に問題なさそうなので、そのまま採用しました。
実際あそんでみると、二択を強要されて死んだり、勘で連打して開ける必要がなくなったので、ものすごくすがすがしいです。
比較のために、Windows本家のマインスイーパ風の配置も、メニューから選べるようにしておきました。
かなり違いを実感できると思います。
そういう意味では、今回作ったやつは結構うまくいったんじゃないかと思います。
439 :
1:2007/06/18(月) 10:19:44
さて、ゲーム板のマインスイーパスレってやつをのぞいてみたんですけど、みんなものすごいスコア速いですねorz
それで、そこのリンクからMINESWEEPER CLONEってのをやってみたんだけど、Windows本家の画像そのまま使ってるしw
オリジナルの画像も含まれてはいるけど、ライセンス的にどうなんだろう?
もし問題ないなら、今できてるやつをSourceForgeにそのまま上げちゃってもいいのかなぁと思ってみたり。
でも確実とはいえないなら差し控えたほうがいいのだろうか。
つーか、MINESWEEPER CLONEを起動させると、JITの例外がボンボコ飛んで来て異常終了しまくるんですがw
インストールに失敗したのかな・・・?
440 :
1:2007/06/18(月) 10:22:59
あとは、ウィンドウのリサイズをどう扱うか悩みどころです。
グラフィックス系の編集ソフトによくある、グリッドに吸着みたいな感じで、ちょうどいい大きさにしかならないようなウィンドウにしたいんだけど、どうやったらいいのかさっぱりorz
MoveWindowで強制的にサイズを指定しちゃう感じなのかな?
先にアシスト機能やってみようかな・・・
えっとVC++に持ってくのに数ヶ所修正してるんだけど
共通な部分は元で直してもらってもいいかなあ
リソースにwindows.hをインクルードするのと、MIN_WIDTHの値をcppのほうで設定するのと
time()関係だけなんだけど。
あとunicodeでもコンパイルできるようにするのはtchar.hのインクルードと
sndPlaySound()の第一引数のキャストを LPCTSTRにするのとリテラル文字列を_T()マクロで囲む。
time()以外は慮方で動作すると思うが
442 :
1:2007/06/18(月) 11:41:11
>>441 あ、たしかに、VC++でもコンパイルできたほうが便利かも。
できれば、Makefileも用意したいけど、何しろVC++側のことが全然わからないので、教えてもらえると大助かりです。
とりあえず、指摘してくれた部分を直してみます。
443 :
1:2007/06/18(月) 11:57:35
>>441 うーん、unicodeでコンパイルってのが、何をどうすることなのかよくわからないんですがw
リソーススクリプト中には日本語の表記は全てShift_JISで書いてあるんだけど、これはこのままで大丈夫なの?
とりあえず_Tは、今使ってあるTEXTの代わりに使えばいいのかな。
MSDNに_Tと_TEXTが同じって書いてあったから、雰囲気的にはアンダースコアをつければいいってことなのかな・・・。
444 :
1:2007/06/18(月) 12:09:41
446 :
67:2007/06/18(月) 13:13:34
VK_1はbccの付属SDKによる拡張ではなかったかと。
#というわけで存在証明w
447 :
1:2007/06/18(月) 13:28:32
>>445 ありがとう!!
おかげで、こちらでもVC++でコンパイルできました。
ちょっと_Tの使い方を一部コンパイラに怒られたので修正、あとVK系は無理やりdefineしておきました。
warningが山のようにあるから(ほとんどがthisをメンバイニシャライザで使うなってやつかな)、後で消しておきます。
というわけで、VC++でもビルドできる版です
http://www.geocities.jp/ktms2ch/src/1182140259.zip >>446 あ、どもども。
お世話になっとりますw
VK何々って、ヘッダとかインクルードしたりしてうまくできるのかなーと思ったけど、できないもんですかね。
まあ、動けば何でもいいんですがw
>>446 今問題になってる VK_は、全部asciiじゃね?
'A'とかで良かった気が
>>439 著作権違反って親告罪だからMSが文句を言ってこない限りはセーフ。
んで、おまいさんが作ったものはWindows専用アプリなんでMS的にも Welcome だろ。
よし、Linux版を作るぞ〜って時はアウトだろうけどw
あと、SourceForgeにうpする場合は MS が嫌がるようなことはしないでねって旨の
readmeでもつけとけばいんじゃね?
安全にwinmine.exeのリソースを起動時に読み込めば良いだけだろ。
見つからない場合は自前のやつで。
それは、、、
大した数じゃないんだし、自前で書けば良いじゃん。
>>446 VK_1は文字定数のないVB用だったと思う
C/C++なら単に'1'と書けば済む話
>>443 _Tと_TEXTは同じ
TEXTは別物だけど、普通は上と同じと見なして問題ない
まあ、言うだけじゃ何だから、ちょっと描いてみるよ。
1つバグ発見
開始前に旗を立てると変になりますね。
ホントはあたしのおしっこ飲みたいくせに^^
開始してから旗立てても変になります
変ってどう変なんだ
ああぁ!変!変になっちゃううぅ!
ら、らめぇぇぇ!!1!!
464 :
1:2007/06/20(水) 02:04:11
アシスト機能できたー!
実行ファイル+ソース(VC++でビルド or BCCのmake)
http://www.geocities.jp/ktms2ch/src/1182269436.zip アシスト機能で、まだ開いていないマスの色変化は、青が安全マス、赤が地雷マスです。
あとは数字が青くなっているのは、その数字に着目して結果を出しているんだよって意味です。
アシストモードで「展開」の動作(デフォルトでは左右同時クリックかホイールクリック)をすると、赤の部分に一気に旗を立て、青の部分を一気に開きます。
個人的な理由ですが、アシスト機能ですでに安全なのか地雷なのかがわかっているのに、わざわざマウスを動かして押しに行くことにイライラしたからですw
ちなみに、ドラッグor移動でスイープできるようにしておくと、左右同時orホイールボタンを押したままドラッグすれば、マウスをめちゃくちゃに動かすだけでクリアできますw
Tabキーはアシスト機能の切り替えに変えちゃいました。
あと、スタートは一番よく押すので、Spaceキーに変えてみたりとか、コロコロ変わってますorz
まあ、まだアクセラレータの実験みたいな感じの雰囲気なんでご容赦ください。
465 :
1:2007/06/20(水) 02:05:55
それと、ついでに4マスまで解析できるようにしました!
なんとですね、
>>164の配置はもちろんのこと、
>>172の2番目以外とか、
>>179も解けてしまいます。
試してみてわかったけど、3マス解析が役立つことはかなり頻繁にあるみたいですね(別の攻略ルートからたどれば、2マス以下で十分なことも多いけど)。
でも、4マス解析が役に立つ場面は上級でも滅多にないみたいです。
編集モードでテストしたら、ちゃんと解析できていたので、バグではないと思います。
というわけで、5マス以上の解析は、あんまりいらないかなぁとか思ってます。
ちなみに、アシスト機能で、ヘリの部分の「1・2・1」や「1・2・2・1」、くぼんだ部分の「1・1・1」などは、全部を表示しません。
これらは、多段階の解析が必要なんですが、多段階の解析を全部表示してしまうと逆にわかりづらい面もあるかなぁと。
「コンピュータはこんな風に解いたけど、何がどうなってそうなったのか全然わからん」ってことになると思います。
今回のアシスト機能の基本的なコンセプトとして、「どのマスに着目すれば何がわかるのか」っていうのを視覚的に表示したかったんです。
というわけで、「1・2・1」が部分的にしか表示されないのは、仕様とさせていただきます。
466 :
1:2007/06/20(水) 02:18:53
>>455 なるほど。
Unicode以外でやるとこういうとこで問題が起こるんですね。
やばい、今のバージョンは、メニューの日本語がShift_JISだw
UTF-8に変換して無理やりコンパイルしたら全部???になっちゃったので、たぶんここで
>>441の「Unicodeでコンパイル」という作業が必要なんですかね?
>>456,457
スゴイ!!ナイスですよ。
ちょっと今回のバージョンで、WinAPIにStretchBltという関数でズームできるようになったので、100%のサイズのみリソースに込むように変えて、そのせいでディレクトリ構造がちょっと変わっちゃったんですが・・・orz
でも、前のバージョンだと、そのままファイルのコピペで動くかな?
ただ、StretchBltだと画質が落ちるし、100%以外の倍率も用意していただいたみたいなので、それぞれの画像を使ったほうが断然ベターです。
なので、また以前のように、それぞれの倍率の画像を入れる方針に戻すと思います。
できれば、もし時間あったら、赤と青と黄色のハイライト版も作ってもらいたいのですが、お願いできますか?
>>458 あ、本当だ。
旗がとなりにある場合の空白マスが自動で開いてなかったですね。
修正が楽だったので、今回のバージョンで直しておきました。
467 :
1:2007/06/20(水) 02:35:33
>>448,453
なんか、'A'とかだとリソーススクリプトのコンパイル中かなんかにエラーが出たっぽいので、0x41とかにしてしまいました。
_T は "〜" を L"〜" にかえるってことなんですが、これがどういう意味になるのかがよくわからない・・・。
ググりにくいので、苦戦してるんですが、まだまだ調べてるとこです。
>>449 なるほど、確かにそうですね。
特にマインスイーパはOSのインストールと共にデフォで入ってるものだし。
とりあえず、
>>411や
>>456で作ってもらった画像を使わせてもらおうかと思ってるんですが、オリジナルの画像も入れちゃっても大丈夫なのかな。
こういう画像の類は、いくつあってもユーザの選択肢が多いに越したことはないですからね。
>>450 それ実は、俺も最初考えましたw
あとは、音声ファイルに関しては、Windows2000からはシステムにデフォルトでインストールされてる音がけっこうあるから、それを使うって手もありかなー。
画像はソフトで作れたとしても、音声は外部音源がないので自作はツライ・・・
468 :
1:2007/06/20(水) 03:35:01
自動展開と自動旗立を付けとくと、
難しいところだけが残るから面白いな。
>>468 .\src\minesweeper\gui\res-ja.rc(20) : error RC2144 : PRIMARY LANGUAGE ID not a number
.\src\minesweeper\gui\res-ja.rc(20) : error RC2121 : BEGIN expected in menu
というリソースコンパイルエラーが。
前とそんな変わりないように見えるのですが、何ででしょうね?
>>467 ちょっと乱暴にいうと
const char *str = "ABC"; → MBCS文字列(SJIS)
const wchar_t *wstr = L"ABC"; → UNICODE(UTF16)
473 :
1:2007/06/20(水) 09:36:39
>>472 おぉ!さすが!仕事早いっすねw
さっそく使わせてもらいました。
http://www.geocities.jp/ktms2ch/src/1182297899.zip 草原のフィールドみたいなモチーフで表現してあって、面白いと思います。
もう一個のバージョンもけっこう好きだなぁ。
150%以上だと文字もついてて楽しいので、切り替えできるようにしました(アシストモードにしてないと、切り替わったかどうかわかりづらいけどorz)。
ちょっとプレイしてると、緑と茶の色がわかんなくなってくるっていうか、まだ開けてないマスが、すでに攻略済みのとこよりもうちょっと際立っててくれるとうれしいかもしれないです。
基本的にキレイな絵柄なので、デフォルトを150%にしたいとも思うんですが、1024x768な画面だと上級がキツイ気もしてしまう。
難しいとこだな・・・
ところで、黄色のハイライトの奴って何に使われてるんですか?
475 :
1:2007/06/20(水) 09:41:57
>>469 たしかにw
逆に自動推論だけつけると、やけにトリッキーなとこだけ自動で解いて、簡単なとこが残ってるから、それも面白いかも。
>>470 すいません。ヘッダがちゃんとインクルードできてない部分があったみたいです。
今度はちゃんとコンパイルできることを確認したので、大丈夫だと思います。
>>471 あ、なるほど。
UNICODEってのはUTF-16のことだったんですか。
つまりLがつくと、リテラルにASCIIで書いても、16ビットに揃えてくれるってことですかね。
あとは、コンパイルのしかたが未だにわからず・・・
BCCだとできなかったりして。
でも、VC++でビルドしてみたら、ものすごく動作が重くてちょっとショックでした。
manifestファイルとかできてるから、いつの間にかドトネト化されてる?
476 :
1:2007/06/20(水) 09:43:29
>>474 今のところは、編集モードの最初に開けるマスに使ってます。
本当は最初、通常のアシストモードで数字のとこを黄色にしようと思ってたんだけど、黄色のハイライトがうまく作れなくて諦めたという経緯もあったりしてw
>>476 あぁなるほど。編集モードでしたか。
道理で普通にプレイしてても出てこないと思った。
478 :
1:2007/06/20(水) 09:44:58
あ、475の「コンパイルのしかた」っていうのは、Unicodeでコンパイルってことです。念のため
>>478 -DUNICODE をコンパイルオプションにつけるか
ソースの一番はじめに #define UNICODE てやれば、おk
前者を強く推奨。あと、BCCの場合、UNICODE版だとリンクするモジュールを
変えてやらなきゃいけなかったハズ。
_UNICODE じゃなかったっけか。
どっちでもいいんだっけ?
サイズと地雷の数を自分で選択でるようにもできませんかね。
482 :
1:2007/06/20(水) 10:44:21
>>479 なるほど。
あとなんか、BCCだけかどうかわからないけど、-WU というオプションをつけて、WinMainのかわりに
extern "C" int APIENTRY wWinMain
にしなきゃいけないらしい。
コンパイラごとに色々分ける必要があるのかな。
それと .rc ファイルはどうやって書けばいいのかがわからないですね。
まさか SJIS のままじゃヤバイかなぁとは思ったけど、-WUでwWinMainにするだけして、そのままコンパイルしてみたら通ってしまった。
しかも日本語表示もちゃんとされているし。
Unicodeバージョンになったのかどうかはどうやって確認すればいいんでしょう?
>>480 UNICODEとか_UNICODEってBCCでもつけるべきなのかどうなのか謎ですね・・・。
とりあえず、両方defineしちゃえば万事おk?w
483 :
1:2007/06/20(水) 10:54:45
>>481 あ、えーとですね、はい、そうなんです。
入力ダイアログとかその手のGUIなものを作るのが面倒で、避けて通りまくりな現状なんですw
レイアウトとかを作るのが面倒なのもあるけど、それよりも、どのAPI関数をどうやって呼べばいいかを調べるのが面倒になってきてます。
でも、最終的には必ず、盤面のサイズと地雷数の変更はできるようにするつもりでいるので、じっくり待ってもらえるとありがたいです。
予定としては、ウィンドウをマウスでリサイズすることで、直接的にサイズ変更できたり、地雷カウンタをホイールでクルクル回して変更できるようにするつもりです。
どうしても待ちきれない場合はソースコードの数字を直接いじってくださいw
>>483 りょーかい。
というか、ソースコードの数字を直接いじるフイタw
まあウィンドウリサイズで変えるのは手間じゃないだろうけど
プレイ中のリサイズでは変えちゃあかんからなあ
本当は私のおしっこ飲みたいくせに^^
はい、飲みたいです。飲ませてください
じゃあ口をあ〜んして
あ〜ん
490 :
1:2007/06/23(土) 06:36:43
#ifndef WM_MOUSEWHEEL
#define WM_MOUSEWHEEL ......
#endif
とか自前で定義するとか。
492 :
1:2007/06/23(土) 06:48:14
他、細かい変更点はこちら
・編集モードから抜けた直後なら、まだ編集した地雷配置が消えていないように変更
・プレイ中かクリアした状態かゲームオーバー状態で編集モードに移ると、配置されている地雷をそのまま編集できるように変更
・自動オプションを全て幅優先探索に変えたので、スタックが溢れて異常終了することはなくなったと思います。
・必ず解けるように配置するとき、やっぱり最初から解きなおすのはけっこう時間かかるみたいなので、バックトラックしました。
それでも、盤面が大きすぎたり地雷が多すぎる場合には、いつになっても終わらないときがあるかも。
気が向いたら、そのうちスレッド化して中断できるようにするかもしれないです。
・ただでさえ楽チンだったクイックドラッグよりさらに楽チンなマウスモードとして、「触れるだけで展開」ってのをつけました。
アシストモードでこれを使うと、自動化オプションとほとんどかわらないですが、一応自分の手で動かしてるので、暇つぶしに持って来いです。
まあ脳ミソが疲れたとき、リフレッシュにでも使ってくださいw
・F5 で再描画をできるようにしました
システムにやらせてた再描画の類をけっこう自分でやっているので、ひどいときは画面がグジャグジャになるかもしれないです。
そんなときは、慌てずF5を押してください。
493 :
1:2007/06/23(土) 06:53:48
あ、地雷数の変更のしかたについてなんですが、
地雷カウンタ(ウィンドウ左上の数字)をホイールをクルクル回すか、左クリックで+1、右クリックで−1です。
ちなみに、カウンタ上でホイールボタンをクリックすると、盤面のサイズに対して地雷数をちょうどいい数にします。
ちょうどいいっていうのは、面積が初級以下の場合は初級と同じ密度、上級以上の場合は上級の密度、間の場合は、適度に初級・中級・上級の間くらいです。
494 :
1:2007/06/23(土) 07:02:36
>>485 何気にリサイズの処理、苦労してしまいましたorz
それで、プレイ中とかは変更できないようにしたんだけど、マウスをウィンドウの端っこに持っていくと、カーソルがリサイズ用に変わってしまいます。
いちおう、ウィンドウスタイルにWS_SIZEBOXを加えるとリサイズできて、外すとリサイズできなくなるっていうのは見つけたんですが。
つけたり外したりするとウィンドウのサイズがちょっとだけ変わってしまうので、WS_SIZEBOXはつけっぱなしにしました。
プレイ中だけ、マウスカーソルがリサイズ用にかわらないようにとかできないですかね・・・。
>>491 それでいってしまいますかw
まあとりあえず一時的に入れるだけ入れてみようかな。
495 :
1:2007/06/23(土) 07:28:45
496 :
1:2007/06/23(土) 07:30:55
そうだ、一つ言い忘れてた。
ゲームオーバーになったときに、マウスのサイドボタン(「戻る」とかに使うやつ)で、やり直しできるようにしました。
ちなみに「進む」ボタンのほうは、最初からやり直しです。
497 :
67:2007/06/23(土) 08:29:42
うぁはは、マイクロフォントで1280x1024の全画面にまで拡げると爽快爽快(ぉぃ
来週暇があったら会社で2800x1024(1600x1200+1280x1024)まで拡げてみよう。
で、幾つか感想を。
・自由にマインの数を設定できるので、マインの残数表示をn/mにして欲しい。
・流石にホイールでマイン数を500とか600とかにするのは疲れるので数値入力もできた方が。
・自由にフィールドのサイズを設定できるので、枡の個数をどこかに表示して欲しい。
・流石に広大になるとかなり自動処理に時間が掛かるので、自動処理中の時間も計上していいような。
……ゴメン、枝葉末節な指摘ばかりで。
498 :
1:2007/06/23(土) 09:09:54
>>497 うわ、本当だw
巨大な盤面にするとインパクトがすごいw
たしかに各種の数値をどこかに表示してないと、いろいろ変更中に何だか心許ない気分になりますね。
うーん、この手の表示に向いてて一番楽なのは、ステータスバーだとは思うんだけど、意外とつけるのが大変そうで敬遠しとりました。
3BVの表示とかもすっかり忘れてたなぁ。
手入力も確かに必要ですね。
大きい盤面も去ることながら、小さい盤面の方もウィンドウのリサイズの制限のせいで 3x3 まで縮められなかったりってのもあるし。
手動で入力となると、脅威のダイアログボックスか・・・。
マイン数だけじゃなくて、
マイン率と連動して調整できるといいかも?
>>482 リソースは、少なくともEXE/DLLに埋め込んだ状態では既にUnicodeになっている
ソースコードがどうなっているかとは無関係
UNICODEは、<windows.h>用で、_UNICODEは、printfなどのCRT関数用
<tchar.h>をインクルードすると_UNICODEの有無で_tprintf→printf/wprintfのように展開されるマクロが使える
(だからC++標準ライブラリでは特に恩恵がない)
_tWinMain→WinMain/wWinMainや_tmain→main/wmainもある
VC++/BCCほかWindowsのコンパイラなら共通に使えるはず
普通UNICODEと_UNICODEのどちらか一方だけを定義しないということはやらず、
両方共に定義する・しないというふうに使う
>>490 ホイールは、Windows 98/NT4からなんで、ただ<windows.h>をインクルードするだけではだめで、
#define _WIN32_WINDIWS 0x0410あたりを書かないと使えない
501 :
1:2007/06/24(日) 08:53:46
ステータスバーできた!
実行ファイル込+makeするならBCCで
http://www.geocities.jp/ktms2ch/src/1182641170.zip VC++でビルドする場合は、手動で comctl32.lib をリンクしてください(ちなみに未確認ですw)
>>445の作ってくれたvcprojファイルなんだけど、こっちの書き方も調べてみようかな。
>>497 残数の表示をn/mにするのはちょっとしんどくて、ステータスバーに地雷総数を表示したので、それで我慢してください。
数値入力はまだできないけど、マウスの左ボタンか右ボタンを押しっぱなしにすると、どんどん早く地雷が増減するようにしたので、大きな数字もすぐできると思います。
カウンター上で操作もできるけど、ステータスバー上でも同様にマイン数を調整できるようにしました。
処理中の時間っていうのは、経過時間?予想時間?
まあ、いずれにしろ、まだそっち方面はいじってないですw
あ、でもアルゴリズムの中でQueueを使ってるんだけど、Queueの中に突っ込むとき重複しないように変更したら、ちょっとだけ軽くなったかも。
502 :
1:2007/06/24(日) 09:00:47
>>499 リサイズしたときの地雷数を、密度が一定になるように変化させてみました。
たしかに、こっちのほうが便利かも。
まあ普通にプレイする場合は、ホイールボタンで21%(上級の割合)にするのが、難易度的に妥当かなぁって感じはします。
ちなみに40%くらいにすると、地雷を配置するのに時間がかかりやすくなるみたい。
もうちょっと効率化できないかなぁ。
>>500 おぉ!詳しい説明サンクス!
お陰で色々意味がわかりました m(_ _)m
あ、でも wsprintf に対応する、_tsprintf はないって言われてしまった。
仕方ないので、今のところは wsprintf のままです。
あと、Unicode版だとコンパイルは通るんだけど、実行できないという謎の減少が・・・。
原因究明中であります。
>>502 wsprintf はWindows API だからもともと _t* な仕様になってるよ。
より詳細に言うと wsprintfA って言うMBSC(ASCII)版と
wsprintfW って言うUNICODE(WideCharString)版があって
wsprintf は確か
#ifndef UNICODE
#define wsprintf wsprintfA
#else
#define wsprintf wsprintfW
#endif
こんな感じで定義されてる。その他の Windows API も
概ねこんな感じでMBSC版とUNICODE版が用意されてるよ。
504 :
1:2007/06/24(日) 12:40:40
>>503 あ、なるほど。フォローサンクス!
そういえば、MessageBoxA とか MessageBoxW って見たことあったのを思い出した。
勉強になりました。
ところで、こんなもの見つけてしまいました。
http://www.chiark.greenend.org.uk/~sgtatham/puzzles/ 真ん中へんにある mines.exe ってやつ、「Ensure solubility」っていうオプションがあります(デフォルトでオン)。
これって必ず解けるって意味じゃないですかw
とっくの昔に先を越されてましたorz
ちなみにこの人(Simon Tatham)、PuTTY の作者らしいです。
wikipediaにも
また一部のプラットフォームでは、論理的な推論が全く成り立たず運任せになってしまうような地雷配列パターンを避けるように設定されている。
って書かれてるからねえ。
ま、いいんじゃね?
日本語だし。
507 :
1:2007/06/24(日) 14:32:33
下はひどいなw
509 :
67:2007/06/24(日) 14:45:43
ま、いいんじゃね?
いろんな機能もついてる(≒つけさせられている?w)し。
上でほとんど開かない状態でずっと進めていく感じになるのか。
なかなかハードで面白そうだな。
×上で
○上は
512 :
1:2007/06/24(日) 15:14:59
>>508 相手側がひどく見えるように勝負してみたwww
まあでも、配置アルゴリズムはけっこう練って作っているつもりだし、まだまだ改良しようと思ってます。
>>509 最終目標は、自分自身が普段使うマインスイーパを置き換えることなので、楽しんでやってますよー。
もちろん人に使ってもらってフィードバックをもらえるのが一番うれしいことだけど。
基本的には、とことんダラけた状態で、マウス片手に遊べるようにしたいから、どうすればもっと楽ができるかは追求していきたいかな。
あと、動作の軽快さは常に最重要項目。
と思いきや、今の最新版が十分サクサク動くから錯覚してたけど、上級のサイズでメモリ10Mも使ってましたw
今動かしてる全プロセス中で、ブラウザに次いでメモリ無駄遣い量が第2位orz
513 :
1:2007/06/24(日) 15:22:10
>>510 そうなるね。
地雷の数に対して、見えてる数字が少ないから、複数マスから推論したり、かなり頭を使うと思う。
最近は難しい場面に出くわすと、すぐアシストモードを使う癖がついてきたw
10MBで2位なのか。
そのくらい使ってるのうち20個以上あるぞ。
……Firefox650MBとか使ってるなあ。
VS2005を7個立ち上げたときがやばかったな。
メモリ使用量はチェックしなかったが、スワップしまくりで
目に見えてパフォーマンスがガタ落ちした。
Firefoxは、大きなFlash再生中なら100MB超えることあるけど
さすがに650MBはないw
Minesweeper Cloneは200MB近く行くんだよなあ。
マインスイーパーって、手詰まりになって掛けに出るのを楽しむゲームだと思ってた。
論理だけでは解けない所に、生死を掛けた英雄的決断が生じるのが劇的で楽しいみたいなね。
色んな楽しみ方があるものなんだね。
>>517 Windowsについてくるマインスイーパーは理論的な読みを一切間違えてなくても
その賭けをやらなきゃならない場面が多いせいでクリアできる確率が低すぎるのが問題。
全く間違わなければ上級でも1/3以上の確率でクリアできるはずだけどな。
半分切ってたら低いという考え方もあるか。
>>520 自動で解かせたらそれくらいだったけどなあ。
ん? 俺も自動で解かせた結果だが?
>>517 確定できない場所でも、確率を推定してより安全な場所を選ぶとか、
無事にひらいた場合に他を確定させるのに有利な場所を選ぶとか、
タイムアタックだけじゃないじっくり考える要素もあるよな。
久しぶりに来たがこれ良いわ
必ず解ける配置ってどんなヌルい配置かと油断してたら
普通に歯ごたえあってビビった
525 :
1:2007/06/25(月) 07:20:49
>>514-516 うーむ、10MBって全然気にするレベルじゃなかったのねw
みんなGB単位のRAM使ってるんだろうなぁ。
まあそれなら、さらに今後の改良で、高速化のためにもっとメモリ使う可能性が高まってまいりました。
>>517 手詰まりを勘で打破するのもマインスイーパの楽しみの1つだよね。
そういう意味では、必ず解ける配置はその楽しみ方を奪う代わりに、ストレスなく遊べるようにする機能です。
たぶん、タイムアタックにもっと集中できるものになるんじゃないかと思う。
クリアだけが目的なら、ちょっとクリア率が高すぎて、慣れると達成感が減るのもたしか。
でもスコアアップが目的なら、いちいちゲームオーバーになることに煩わされずに、スピードのみの世界に集中できる気がしてます。
(まだハイスコア機能は実装してないけどw)
ちなみに、必ず解けるようにしたくない場合には、単純にランダム配置する機能も備えてますよ。
526 :
1:2007/06/25(月) 07:21:54
>>518 そうそう、その通り!
これを作ろうと思ったきっかけは、まさにそれであります。
あんまり何回も地雷踏んでるとイライラしてしょうがないw
>>519-522 俺の実装で自動で解かせる場合は、どの地雷配置モードになっているか注意してください。
バージョンごとにデフォルトの設定がコロコロ変わってたりするのでw
単純に、「論理だけでクリアできる確率」っていう話だと、良し悪しの判断に使うのは難しいんじゃないかな。
例えば、Windows本家の配置だと(メニューから「本家ランダム」を選んでくれてもいいけど)、最初のクリックの隣に地雷が来る場合もあるから、80%以上の確率で、1手目にいきなり手詰まりになる。
(上級は地雷の密度が21%なので、1手目の隣8マスに地雷がある確率は、1 - (1 - 0.21)^8 = 0.848)
まあ、「勘で開けても地雷じゃない確率」というのもそこそこ高いのは確かなんだけどね。
527 :
1:2007/06/25(月) 07:23:26
>>523 期待値からより安全なものを割り出すってのも、マインスイーパの一面だよね。
ただ、それってタイムアタックのときにも有益じゃないかな。
必ず解ける配置だと、常に「絶対確定するもの」がどこかに存在するわけだけど、それぞれの瞬間ごとに自分の解いている場所の近くにあるとは限らない。
手の届く範囲に手ごろな確定マスがないなら、期待値的に割り出して勘で開けて、マウスの移動量を減らせばタイムを縮められる場面は多々あると思う。
なので、必ず解ける配置でも、勘はどんどん使ってくださいw
>>524 どうもどうも!
けっこう目的は叶ってきてる感じです。
感触的な難易度をほとんど下げずに、配置をいじることができたのは、けっこう大きいですね。
このスレで色々意見もらったり教えてもらったおかげでありますm(_ _)m
528 :
1:2007/06/25(月) 14:45:12
>>528 というか、わがままを聞いてもらえるなら SourceForge にうpして欲しい。
530 :
1:2007/06/26(火) 05:35:03
>>529 たしかに。そろそろ移行しようかなぁ。
音声リソースとかはそのまま丸パクリかなw
フリー素材からそれらしいのをもらってくるとか
533 :
1:2007/06/29(金) 22:08:37
遅くなりました。
SourceForgeに上げる前にコードをきっちり整理しようと思ったら、タイムアタックについ熱中してしまいましたw
マインスイーパってハイスコアが出るまでやめられなくなっちゃう時あるよね。
ちょっとした新機能も加えたので、SourceForgeのセットアップができたらまた来ます ノシ
>>531-532 情報提供サンクス!
とりあえずは今のままうpしちゃうけど、素材集のほうも見てみます。
534 :
1:2007/06/30(土) 02:04:39
535 :
1:2007/06/30(土) 02:14:40
ハイスコアとか、ひとまずwinmineの情報を読み込んでみました(書き込みはしないので、ハイスコアが有効なのは起動してる間だけw)。
ハイスコアが出たとき、ダイアログボックスではなくメッセージボックスが出るので、ポンって音がしてちょっとウザいですが、一時的です。
あと、自分の「目標タイム」を設定して、達成できなさそうなときは自動的にゲームオーバーにしてくれる、とっても優しい機能もつけました。
メニューから「ゲージを使用」ってのを選ぶと、ステータスバーにゲージが出てきます。
「目標タイム」はとりあえず自動的にハイスコアのタイムになるようにしてみました。
プレイ前の状態で右上の時間表示が「目標タイム」になっているので、左側のカウンタと同様、ホイールとかクリックで調節できます。
これ、ゲージがなくなると焦るから、かなりタイムの上達に役立つと思います。
自分のハイスコアが目標タイムだと、ちょっとキツイかもしれないので、プレイ前状態で適度に数字を大きくしてみてください。
536 :
1:2007/07/01(日) 09:47:56
どうやらSourceForgeのスタッフも週末はオフらしい。
週明けるまで承認待ちかorz
537 :
1:2007/07/03(火) 03:27:14
承認されました!
これがトップページでいいのかな?
http://sourceforge.net/projects/ktmine/ (フォーラムとかで日本語の書き込みも問題なさそう)
つーか、CVSを自分でセットアップしたことがないので、全然わからんヽ(`Д´)ノ
プロジェクト名:ktmine
- モジュール名:ktmine
- - 1番上のnamespace:ktmine
って3段階同じ名前になって不恰好だなぁ。
こんなんでいいのかな?
お疲れさま。
しかしSourceForge今なんか重いな……
539 :
1:2007/07/03(火) 04:38:47
>>538 どうもどうも。
たしかにちょっと重い感じですね。
初めてなんで、こんなもんかなぁって思ってたw
何か最初にimportしたときに、coreっていうディレクトリが追加されてなくて、手動でシコシコ追加したので、その前にチェックアウトとかしてた場合は、もう一回やってみてください。
自分でチェックアウトしてビルドしたらちゃんとできたので、たぶんうまくいったと思います。
一応チェックアウト用のコマンドくらい貼っておこうかな
cvs -z3 -d:pserver:
[email protected]:/cvsroot/ktmine co -P ktmine
540 :
1:2007/07/03(火) 04:44:16
BCC用のMakefileの中でmkdir -pとかしてるんですが、Windowsに入ってる元のMKDIRが働いた場合に"-p"っていう名前でディレクトリ作っちゃったりしないか心配なんですが・・・。
もしそんなことが起こった場合は、Makefileの上の方で
MKDIR = mkdir -p
って部分から-pを削除するとか、まあ何とかしてくださいw
VC++でビルドする場合は、
>>445氏提供のktmine.vcprojファイルをダブルクリックすれば、IDEが立ち上がると思います。
このファイルにおいらが勝手に手を加えて、エディタで手書きした部分と、IDEで変更した部分がごちゃまぜになってるので、ちゃんとできたよっていう報告とかいただけるとうれしいです。
Releaseのほうでビルドすると、最適化とかしてくれると思います。
って、こういうことはREADMEとかに書くべきなのかな。
あんまり作法とかがわかってないので、つっこみあったらガンガンお願いします。
あとは、CVS経由じゃなくてダウンロードできるようにしないとなぁ。
できればEXEに直リンクしたいとこだけど、できるかな?
541 :
1:2007/07/04(水) 04:28:05
さて、やっとダウンロードできるようになりました。
どのリンク貼ったらいいんだかわからなかったんですが、とりあえずこれで大丈夫かな?
http://sourceforge.net/project/showfiles.php?group_id=200130 EXEファイルと、そのZIP版を用意しておきました。
たぶんブラウザのキャッシュから直で実行なんてこともできると思います。
ウィルスチェック等は自己責任でお願いしますm(_ _)m
SourceForge側でチェックしてくれるサービスとかあったらいいんだけど・・・。
まあでも、最近のセキュリティソフトはダウンロードしたら自動でやってくれると思います。
542 :
1:2007/07/04(水) 05:29:16
そろそろネタも尽きてきたこのスレですが、最近ちょっと忙しくてマインスイーパの開発も滞りまくりなんで、チラシの裏っぽいことでも書いておこうと思います。
とりあえず、必ず解けるマインスイーパってのは実はどこにでもあるっていう話で、思いっきり興醒めなわけですw
でも、日本語版の有名どころではあんま見かけないってことなので開発は続けようと思ってます。
アルゴリズム的にも、もっともっと高速+良質なものにしていきたいのもあるし。
アシスト機能は自分的には気に入ってます。
今まで3マス同時に解析するなんて、全く自分の手の届く存在じゃなかったんですが、アシストモードをつけてみたら、けっこうありふれた存在なわけじゃないですか。
で、アシスト機能つけながら、なぜそうなるのかってのをじっくり見つめたりしてたら、普段のプレイ中にも自然と頭の中でできるようになってきた感じがします。
そもそもプログラムとして実装するときには、「理屈上これこれこうなるはず」っていうのをプログラムとして書き出すわけですよね。
でも、実際にできあがってみると、感触的なものってのは全然違ったりするのが面白いところだと思います。
543 :
1:2007/07/04(水) 05:40:16
実はこのスレを立てたころは、マインスイーパの上級で150秒くらいかかってたんですが、けっこう練習したのもあって120秒切るくらいになりました。
何か音楽聴きながらとか、全然関係ないこと考えながらやるとハイスコアが出た気がしますw
まあそれはさておき、実際に攻略するときには、一つの場所にあまりこだわってしらみつぶしに攻略するよりも、執着せずにどんどん「遠くへ遠くへ」進んでいく感じのほうがタイムが縮まる感じがしました。
そこでちょっと思いついたんですが、アシストモードの別バージョンで、「次にどこを攻めれば最速で攻略できるか」みたいなのをハイライトできたら面白そうだなぁと思いました。
まあ要件が激しく曖昧なので、実装できるかどうかわかりませんがw
それともう一つ、今のアシストモードは「2段階以上先を読むことができない」という制限が、けっこう貧弱に思えてきました。
普通にプレイしてて読むのは、だいたい2段階先かなって気がします。
(あ、旗を立てて攻略する場合の話です。旗を立てない場合は先読みだらけなわけだし)
特に、2マス以上の解析をして、「いくつかのマスが安全である」ことがわかった場合、左クリックで1マスずつ開けるより、さらに先まで読んで、「旗を立てられるのはどこか」を探すほうが、ずっと早くなると思います。
まあ、そんな感じの、より実践的なものをアシスト機能に加えていきたいと思ってます。
544 :
1:2007/07/04(水) 05:53:25
あと、ム板だしC++のことでも書いておこうかな。
実はこれまで、dynamic_castって何だか知らなかったんですが、必要に迫られて初めて知ったっていう感じです。
要は継承関係のあるクラスのポインタか参照を、子クラスの方にダウンキャストするってことだったんですね。
しかも実行時なんですよね。
簡単に言うと、Javaみたいなキャストってことなのかな。
あと、プログラムのほとんどの部分で、メモリ上にずっしり座って動かないオブジェクトを操作してるので、ポインタではなく、const参照使いまくりになってます。
こうなると、C++もほとんどJavaと変わらない雰囲気になってきました。
アロー演算子ではなく、普通のドット演算子でメソッド呼び出ししても、virtualなやつは勝手に子クラスのメソッドのほうを呼んでくれるんですね。
これも今回初めて知りました。
C++でオブジェクト指向なものって、基本的にポインタでやるものだと思ってましたが、参照も「隠れたポインタ」みたいに動くので、いい感じにできてたんですねぇ。
545 :
1:2007/07/04(水) 06:04:25
あ、そういえば、今のソースコードのなかで、ものすごく気に食わない部分があります。
enumとかconstな整数の宣言なんですが、あっちこっちに、しかも変なとこに宣言してあります。
これ、何とかならないかなぁ。
それに変なプレフィクスつけて名前の衝突を緩和してるんですが、本当はそれぞれの定数が該当するclassの中にでも宣言したほうがいい気がしてます。
でもclassの中に宣言すると、外からそれぞれのenum値を使うときに、「クラス名::」をつけなきゃならなくて、面倒なんですよね。
using class なんちゃら;
とかできないのかなぁ。
もしくはclassの中にnamespaceを入れたり(今使ってるコンパイラではできなかったです)。
何かうまい方法とか知ってる人いますか?
アドバイスとかもらえたら幸いです。
546 :
1:2007/07/04(水) 06:12:27
そういえば、ほとんどコメントが書いてないので、たぶんソースを読んでいただいても「何じゃこりゃ」って感じかと思いますw
ちょっとずつコメントは足していくので、今はこんなとこで勘弁してください。
ソースコードには
>>539のCVSでアクセスするか、
>>537のトップページから「Code→CVS Browse」ってたどればブラウザでのんびり眺めることもできると思います。
大雑把な説明も今書いちゃおうかな。
ちょっとpackageシステムっぽいのを意識して、namespaceごとにディレクトリ分けしてみました。
namespaceは
- ktmine
- - core
- - gui
の3つだけです。
それぞれのディレクトリの横には、ktmine.hとか、core.hとか、gui.hとかがありますが、これらはincludeすることで、そのnamespaceを丸ごと使えるような雰囲気を意識しました。
ディレクトリの中には、_decl.hっていうのがありますが、これはプロトタイプ宣言の寄せ集めです。
(何かC++はクラスの宣言場所とか依存関係でものすごくこんがらがるので、試行錯誤の結果こんな感じになってます)
ちなみに、問題のenumたちの宣言は、だいたいcore/_decl.hやgui/_decl.hに入ってた気がします。
全然関係ない場所にもあったりするかもw
今日は一人で連投しすぎなので、この辺にしておきます。
それぞれのclass等のことはまた後日ということで。
それでは。長文失礼しました(今更だけどw)
まあ週末にでものんびり眺めるよ
>>545 何か名前空間を作ってそっちに入れるといいんじゃない?
549 :
1:2007/07/05(木) 04:04:26
>>547 これはどうもです。
週末までにはソースコードのコメントをもうちょい増やせると思います(たぶん)。
JavaDoc風のコメント書こうと思ったけど、C++だとメンバ関数の宣言(.h)と定義(.cpp)のどっち側に書けばいいんだろう?
インラインのやつはそのまま宣言と一緒に埋め込んであったり、かなり無茶苦茶な状態ですがw
>>548 クラスとは別口に名前空間を作る感じですかねぇ?
たしかにそうするしかないかも。
550 :
67:2007/07/05(木) 05:53:08
>>549 JavaDoc風なら、Doxygen使えばドキュメントになるから宣言に書けばOK。
551 :
1:2007/07/06(金) 00:31:03
>>550 お!なるほど。
それじゃ、宣言のほうに書いてく感じで行ってみます。
どうもです!
いまさらだが、.jp じゃなくて本家のほうにうpしたのか。
553 :
デフォルトの名無しさん:2007/07/18(水) 10:42:57
最初に、猫を、3個持ってて、わからなくなったら、猫を、落として、犠牲にする、ゲーム
がどうしたんですか
うんこ
箱のなかの猫が生きてるか死んでるか当てる
どきどきシュレーディンガー
うっかり生きてる箱をあけちゃうと猫に喰われる。
うっかり死んでる箱をあけちゃうと猫に呪われる。
どーしたらいいんだ・・・
開けないで放置するとそのうち死んで腐りだす。
死んだかどうかはどうやって確かめる?
箱を開けない限り、永遠に猫が生き続ける可能性もある箱^^
100% 餓死する時間が経てば確実に死んでいるだろう。
100%餓死する時間とは?
100万回死んだ猫
568 :
67:2007/07/21(土) 18:26:07
つまり、開けない限り地雷は無いんだよ。
空けた瞬間に周りの数に従って地雷が配置されるのさ。
#って言うネタプログラムを前に作って顰蹙買ったw
プレイヤーからは判別できないから顰蹙も買わないんじゃ
570 :
67:2007/07/21(土) 21:24:31
いや、地雷数が最後まで判らないもんでw
運のとこだけ最初からあけとけば?
572 :
デフォルトの名無しさん:2007/07/25(水) 01:01:15
趣旨とは違うかもしれませんが、
自動モードでやって、
□□□□□□□□□
@A□□□□□□□
@□□□□□□□
@□AB□CA□
@□□□□□□□
@A□□□□□□□
□□□□□□□□□
で、
一番右のAの右側3マスを開いてくれません。
>>565 個体差があるから一概にはいえないが1週間くらい待てば確実に餓死してるんじゃね?
574 :
572:2007/07/25(水) 01:18:22
また、同じく
□□□□
□B@□
□@□□
□□□□
の、
□□□□
□B@□
□@☆□
□□□□
も開いてくれません。
ちなみに前図の左側は壁と思ってください。
おまいら、必ず解ける上海作ってみろよ。
2枚ずつ積んでれば必ず解けるべ
解けなくなるのは引くほうが悪いw
上海のことだろ
何も無い状態からルールに沿って2枚ずつ積んでいけば必ず解ける面にはなると
見えない牌があるから解くのは運がいるけど
だから運がいらないのを作れという話じゃないのか
そんな上海、面白いのか?
手戻しだけできりゃいいじゃん
マインスイーパも同じ事じゃん・・
運がいらないのも同じ方法で作れるだろ
まず見えない範囲のみを埋めてその上に牌を乗せればいい
それなら最初から牌が隠れない配置にしろよって感じだが
584 :
デフォルトの名無しさん:2007/07/25(水) 15:04:56
>>581 解けるかどうか分からない上海は、やる気がしない。
11119999
って並んでしまったら、だめだよ
見えない牌があってもundo すればいつかは解けるはず。
>>578 作ってくれw
>>586 こんなもん作ってどうすんの・・・スレ違いだし・・・
ゲームやりたいなら検索すりゃ幾らでも落ちてんじゃないの?
つか上海でUndoアリって意味ねぇ・・・
作れるよって証明だけだからプロンプトに盤面データ吐くだけのヤツ作ったよ
ttp://www.uploda.org/uporg922815.zip.html データフォーマット考えるの面倒だったから平面のみ、仕様はsample.txt見て
取れるかどうかのチェックに牌が上に乗ってるかどうか足すだけだからいいよね
その他チェックちゃんとやってないからバグってたらごめん
一応解説すると
>>578ぐるぐる再帰かけて終わり。バックトラック法ね。
>>587 何だかんだいってちぇんとつくってくれるんだねww
実行してみたら、ペアになるはずだろうにならないぞ?バグ?
590 :
572:2007/07/25(水) 23:21:11
たぶん同じことですけど、
□□□□□
□□□□□
□@A@□
□□□□□
□□□□□
の、
□□□□□
□□☆□□
□@A@□
□□☆□□
□□□□□
も自動で開きません。
上海で undo しない
>>587さんはフリーセルでも undo しないんだろうか?
シャッフルよりはアンドゥの方がよい気がする
上海は、じっくりしたパズルなので時計が付いてるソフトは嫌だ。
スパイダーもアンドゥゲームだなあ
595 :
デフォルトの名無しさん:2007/07/29(日) 23:00:02
スパイダーて面白くないだろ?
そう?面白いけどな。
597 :
デフォルトの名無しさん:2007/08/04(土) 08:02:14
上海のほうが面白い
□●●●□
□●?●□
□●?●□
□●●●□
□□□□□
とか
??●□□
??●□□
●●●□□
□□□□□
□□□□□
みたいに、フィールドが分断される配置だと運任せのゲームに成り下がってしまうわけだから…
どうすればいいかは頭のいいおまいらならわかるよな?
必ず解けるマインスイーパはもう完成してるから。
ああ、自分で作るって事じゃないのか
>>575 必ず解ける解答付きの上海がすでにある。
ちゃんと成果が上がったスレってすごいな
スレ見てた感じでは、役に立ってたと思う。
607 :
1:2007/08/13(月) 12:54:34
しばらくぶりになってしまって申し訳ないですorz
設定ダイアログをまだつけてなかったので、これからつけてみます!
それと、みなさんレスどうもです!
返事を書かせていただきます。
608 :
1:2007/08/13(月) 12:59:58
>>552 .jp知ったときには後の祭りでしたw
まあSourceForge本家のサイトでも日本語使えるみたいなんでよかったです。
>>554-567 シュレーディンガーの猫?ってやつですか?
やべ、話の内容についていけませんでしたw
>>568-570 顰蹙がよめない・・・
>>608 >顰蹙がよめない・・・
コピペして検索だだだ
あ、ひんしゅくかw
国語辞典で調べましたw
>>571 運にならないように配置する方針で、けっこううまくいきました。
>>572 えーと、実はそこはまだ今の実装の不完全な部分です。
解けないものもあるんです。
>>465あたりに書いたんですが、5マス同時に見ないと判別できないものはとりあえず無視することにしました。
と思ったら、
>>574は3マスだけで判断できるじゃん・・・
ちょっとまた考えて見ます。
>>575-589 上海は全然わからないんで、また後でチェックします。
611 :
1:2007/08/13(月) 13:15:45
>>590 あれ、本当だ。なんでだろ??
混乱してきたので、また後ほど。
>>599-604 どうやら、完成までもうちょっとかかりそうです・・・
>>605-606 このスレなしでは不可能でしたよ!
技術的なとこもずいぶんアドバイスもらったし、あと一番コアなアルゴリズムも参考にさせてもらってます。
最初にランダムに置いてしまってから、解けるかどうかをチェックするっていうやつですね。
自分の中では、ユーザーが最初にクリックしてから、その一瞬の間で解くなんて時間かかりすぎて無理だろうと思ってたんですが、実際にはそのやり方が一番だったみたいです。
612 :
1:2007/08/13(月) 13:16:44
おっと、
>>609と
>>610の名前欄抜けてましたorz
まあ、トリつけてるわけじゃないし、あんまり変わんないかなw
613 :
1:2007/08/13(月) 13:17:55
あ、ごめんなさい、
>>609はレスくれてたんですねorz
コピペして検索しましたw
コピペして選択して変換キーでおk
616 :
1:2007/08/13(月) 21:11:00
>>614 初めて知った、その機能・・・
>>615 これ怖すぎwww
猫は死ぬわ足は吹っ飛ぶわ
マインの数を紙にメモしながらやったけど、71/210点でしたorz
でも楽しかった
617 :
1:2007/08/13(月) 21:13:52
とりあえず
>>590の状況がうまくまとまらず参っちゃってます。
もうちょっと開ける場所として、
□□□□□
☆□☆□☆
☆@A@☆
☆□☆□☆
□□□□□
こんな感じになると思うんだけど、アルゴリズム的に見破る術がなかなか見つからず・・・
618 :
572:2007/08/14(火) 14:34:38
□□□□□
★□☆□★
★@A@★
★□☆□★
□□□□□
★は☆が開けば、@とAの関係だけで開くことができるので、敢えて省略しました。
同様のパターンでは次もあります。
□□□□□
□□□□□
□CAC□
□□□□□
□□□□□
□□□□□
□□□□□
□DCD□
□□□□□
□□□□□
>>618 > □□□□□
> □□□□□
> □CAC□
> □□□□□
> □□□□□
これ、どこか確定する?
□□□□□
●□□□●
●CAC●
●●□●●
□□□□□
とか
□□□□□
●□●□□
□CAC●
●□●□●
□□□□□
とか、いろんな状況がありうると思うけど。
620 :
572:2007/08/14(火) 18:01:12
申し訳ないです。
仰る通りだと思います。
代わりにもう一つパターンを上げさせてもらいます。
□□□□□
□□C□□
□@□@□
□□□□□
の
□□□□□
□□C□□
□@□@□
□□☆□□
☆が開きます。
自分もかつて2つの数字が関係するアルゴリズムは、このスレとほぼ同じ
レベルまで導くことができたのですが、3つの数字が関係する場合の
アルゴリズムが見つけられず、断念してました。
1さんの思考の糧になればと思い、例だけ列挙した次第です。
621 :
デフォルトの名無しさん:2007/08/23(木) 01:13:44
なにいってんだおめ
保
守
目的を完遂した良スレだったな。
626 :
デフォルトの名無しさん:2008/05/03(土) 02:20:50
良スレ
627 :
デフォルトの名無しさん:2008/05/03(土) 06:02:17
むしろ
>>7の上みたいにうまい人がやってるくらいのスピードで自動で解いてくれるソフトの方が欲しい
1ゲーム終わったら自動で次のゲームを延々と続けるのをただ眺めていたい
Win98時代のデフラグみたいに眺めて楽しいのがいい
628 :
デフォルトの名無しさん:2008/05/03(土) 14:32:19
>>627 そんな感じのスクリーンセーバーがあったな
urlは忘れたけど
いいねぇ、それ。
始めの方しか読んでないんで既出ならすまん
x*yのフィールドにn個(x*n未満)の地雷
始めのクリック時のブロックは無地である必要がある
以下n個のループ
ランダムに座標を選ばせて、そこはクリック座標の周囲ではなく、そこに地雷がないなら仮設置してみる
仮設置した座標を囲む地雷のない最低4か8ブロックの閉空間(■か◆)
□□□□◆■◆
◆■◆□■●■
■●■■◆■◆ ●地雷
◆■●●■□□
□◆■■◆□□
■か◆のそれぞれからクリック座標への道(4か8方向探査)が存在していれば本設置する
と、文章わかりにくくてすまん
プログラム組んでないんで正しいのか間違ってるのかもわからないし、経路探査重そうではあるが
こんなのどうだろう
633 :
632:2008/08/09(土) 09:45:27
しまった、完成していたのか
穴だらけのアルゴリズムを披露しそこねたか
634 :
572:2008/08/09(土) 14:23:25
そのアルゴリズムだと
□□□□□□□
□□●□□□□
□□□□□●□
□□□☆□□□
□●□□□□□
□□□□●□□
□□□□□□□
☆最初のクリック座標
●地雷
の配置ができる可能性がありますが、
これは☆をクリックすると
■■■■■■■
■■■■■■■
■■@@@■■
■■@□@■■
■■@@@■■
■■■■■■■
■■■■■■■
となって、最初から論理的に解くことができない
配置になると思われます。
簡単だろ
その状態、もう少し進むよ。
例えば
■■■■■■■
■■■■■■■
■■@@@■■
■▲@□@■■
■■@@@■■
■■■■■■■
■■■■■■■
の▲に地雷があると仮定すると
■■■■■■■
■○○○▲○■
■○@@@○■
■▲@□@○■
■○@@@○■
■○○○▲○■
■■■■■■■
の○には地雷がないことになって、右側中央の@に矛盾する。
だから
■■■■■■■
■■■○■■■
■■@@@■■
■○@□@○■
■■@@@■■
■■■○■■■
■■■■■■■
の○四か所を開けられる。
637 :
572:2008/08/09(土) 20:58:13
間違えました。前出の図は論理的に解ける箇所が
ありますね。すみません。以下の図に訂正します。
□□□□□□□
□□□●□□□
□□□□□□□
□●□☆□●□
□□□□□□□
□□□●□□□
□□□□□□□
□□□□□□□
□●□●□□□
□□□□□□□
□□□☆□●□
□●□□□□□
□□□●□□□
□□□□□□□
も、配置ができる可能性があり、
■■■■■■■
■■■■■■■
■■A@A■■
■■@□@■■
■■A@A■■
■■■■■■■
■■■■■■■
となって、論理的に解けません。
638 :
デフォルトの名無しさん:2008/08/09(土) 21:59:38
MOUSEDOWNされたマス意外に爆弾を埋めていけばいいのに
ひどいインチキですね