- ベストアンサー
マインスイーパ、自動解析プログラムの作り方
マインスイーパの自動的に解くプログラムがありますが、 あれはどのような仕組みになっているのでしょうか。 どうやって、マス目の数字を取得しているのか、 どうやって、マスを開けているのか。 プログラムによっては、まだ開けていないマスに 色をつけてくれるものまであり、 手品でも見ているような感じです。 もし、作られた方がいらっしゃったら、 タネ明かしして頂けないでしょうか。 ソースコードレベルでなくても、 だいたいの概略や、ヒントのようなものでも良いので、 よろしくお願いします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
マインスイーパのものは知りませんが、フリーセルやソリティアなどの解法プログラムでの話は同じだと思いますので説明します。 「ソースコードレベルで」という記述があるので、プログラミングを知っているものとして説明します。 ●マス目の数字の取得 マインスイーパなどのプログラムが使用しているメモリをのぞき込んで取得します。 予めアドレスを調べておき、そのアドレスをのぞき込みます。 ●マスを開ける方法 これは、そのマスにマウスクリックのメッセージを送信すればOKDESU% ●マスに色を付ける これは、よくわかりませんが、おそらく外のプログラムから、マインスイーパのクライアント領域に書き込みをしているだけだと思います。 それだと、再描画したときには色が付かないはずです。
その他の回答 (2)
- Xeon4560
- ベストアンサー率0% (0/3)
「APIフック」という技術を使用します。 「APIフック」については、「Advanced Windows」という本が参考になります。APIフック以外にもいろいろ書かれてるのでおもしろいですよ。
- ngsvx
- ベストアンサー率49% (157/315)
#1です。 説明がちょっと簡単すぎましたかね? もう少し具体的に話をしましょう。 ●マスに色を付ける Windowsでは、クライアント領域の書き込みをするにはデバイスコンテキストハンドル(hDC)と、書き込み情報(座標など)を引数としてAPIを呼び出します。 (hDCというのはクライアント領域に関する情報を格納した場所と思って結構です) これはクライアント領域の所持プログラム本人であろうがそうで無かろうが関係ありません。 本人の場合は、hDCを簡単に取得できますが、他人の場合は多少手続きが多くなりますが取得できます。 hDCさえ取得してしまえば、その後のコードは本人も他人も同じになります。 ●マスを開ける方法 マウスをクリックしたとき、Windowsはそのプログラムに対し「マウスがクリックされた」というメッセージを送信します。 アプリケーションはそれをきっかけとしてマウスの処理を行います。 Windowsのプログラムの基本的構造は、このようなOSからのメッセージを処理するという形態になるのですが、アプリケーションから直接メッセージを送る仕組みも用意されています。 それを使って、「マウスがクリックされた」というメッセージを送信すればいいわけです。 ●マス目の数字の取得 「メモリをのぞき込む」ことがわからなかったようですね。まあ、当然といえば当然なのですけど。。。 どんな言語でも、言語レベルでは他のアプリケーションの管理するメモリの内容を見る機能はサポートされていないでしょう。 実行するにはOSレベルの機能が必要です。 これは、デバッガーを作るための機能と言ってもいいと思います。デバッガーはデバッグ対象のプログラムを実行し、そのメモリの内容を見ることが出来ます。 これはたいていのOSでサポートされているはずです。そうでないとデバッガーが作れませんから。 ともかく、この仕組みを使えばメモリの内容を見ることは可能なわけです。 ご質問の主旨が、「どのような仕組みか」ということですので、回答はこの辺にしておきます。 さらに詳しく知りたいのなら、個別に質問するのがよいかと思います。 (概略だけでもこの長さになるし)
お礼
ありがとうございます。 メモリをのぞき込むにはデバッガの機能を使うとは。 手品のタネが少し分かった気分です。
お礼
ありがとうございます。 >マインスイーパなどのプログラムが使用しているメモリをのぞき込んで取得します。 メモリをのぞき込む? >外のプログラムから、マインスイーパのクライアント領域に書き込みをしている 別のプログラムの表示内容を書き換えられるんですか? 驚くことばかりで、全然ピンと来ないですが、 なかなか一筋縄ではいかなそうですね。