投稿者 メッセージ
<  PHPプログラミング  ~  phpでオセロ
kelly
投稿1時間: 水 1月 31, 2007 11:39 am  引用



登録日: 2007年1月 31日
投稿記事: 4

PHPでオセロどうやってつくれますか?これができないと学校卒業できないのでわかるかた教えてください Crying or Very sad
トップに移動
ユーザー情報を表示 メッセージを送信
ach
投稿1時間: 木 2月 01, 2007 2:11 am  引用



登録日: 2006年8月 19日
投稿記事: 19

猶予時間を考えると
http://www.amy.hi-ho.ne.jp/okuhara/
とか,既製のAjaxアプリををハックするしかないかな?
サーバーとAjaxアプリ間の通信プロトコルを解析してしまえば,通信先をかえてPHPで思考ルーチン作るだけです.
特に上のやつはシンプルですので思考ルーチンの製作にだいぶ時間を回せるかと

でも流用したのがばれたら卒業さしてくれないかも.
その辺は自己責任で(w


この流用(盗用)する方法でよくて,且つ「わからん.ひとまず教えれ!」ってときは……まあそう書いてください
トップに移動
ユーザー情報を表示 メッセージを送信
kelly
投稿1時間: 金 2月 02, 2007 1:20 pm  引用



登録日: 2007年1月 31日
投稿記事: 4

わかりました!一度必死でやってみます Very Happy
またおって報告します。
トップに移動
ユーザー情報を表示 メッセージを送信
kelly
投稿1時間: 金 2月 02, 2007 3:34 pm  引用



登録日: 2007年1月 31日
投稿記事: 4

Crying or Very sad 申し訳ですが教えてください。頭が混乱しすぎました。
流用というとあまりよくないイメージなので参考にする。
というこにしましょう!
トップに移動
ユーザー情報を表示 メッセージを送信
ach
投稿1時間: 土 2月 03, 2007 2:33 am  引用



登録日: 2006年8月 19日
投稿記事: 19

まずは環境の再現ということで原材料(html, javascript, gif)をすべてダウンロードしてみましょう
index.htmlを見ればわかるように材料はindexのほかはすべて/okuhara/ajax/にあります

で自分の環境に配置ここでは次のように配置したとします
http://localhost/index.html
http://localhost/ajax/(*.js|*.gif) (等)

実はindex.htmlはオセロのテーブルとそのすぐ下のjavascript(googleの広告じゃないほう)以下はただの文章なので削除します.
代わりにハック用に次のようなフォームを挿入(挿入した結果こんな感じになるようにする)
Code:

   </table>
   <script language="javascript" type="text/javascript"><!--
          updateScore(false);
          // if (!isIE)
          //       document.write('<embed src="click.au" id="soundeffect" width="0" height="0" autostart="false" enablejavascript="true">');
   // --></script>
   <form name=hoge>
      cClick<input name=piyo>
      comResponse<input name=fuga>
   </form>
</body>
</html>

ついでajax/brevajax.jscClick
Code:

function cClick(n) {
   hoge.piyo.value=n; //ここを追加
   if ((timerID != 0) || ((n != 0) && (ValidPos[n] == 0)))
      return;   // invalid move

comResponse
Code:

function comResponse(s) {
   var img;
   var comMv = parseInt(s);
   hoge.fuga.value=s;//ここを追加

   if (isNaN(comMv))


(わかりやすくするためです)

これでハックの下準備は完了です.
では解読に移ります
トップに移動
ユーザー情報を表示 メッセージを送信
ach
投稿1時間: 土 2月 03, 2007 2:49 am  引用



登録日: 2006年8月 19日
投稿記事: 19

まずindex.htmlを読むとmouseoverとかでcOver等の関数を呼び出していることがわかります
これらの関数はajax/brevajax.js内に存在します.
で升目をクリックをするといろいろな関数を経た後にajax.get関数(メソッド)によって
/cgi-bin/user/okuhara/breversi.pl
へ接続されます.もちろんこいつが思考ルーチンです.
ではどのようなリクエストがjavascriptから送られ,どのような返事が返っているのかを見てみましょう

http://localhost/osero.phpを作り次のように書きます
Code:

<?php
//おまじない
header("Content-type: text/plain");
header("Cache-Control: no-cache");

//送られるはずだったリクエストを再現
$url = "http://www.amy.hi-ho.ne.jp/cgi-bin/user/okuhara/breversi.pl?".$_SERVER["QUERY_STRING"];
$res = file_get_contents($url);//結果を取得

//結果をファイルと標準出力へ
file_put_contents(time().".txt",$_SERVER["QUERY_STRING"]."\n\t=>\t$res");
echo $res;
?>


そして,ajax/brevajax.js内の二つある/cgi-bin/user/okuhara/breversi.plosero.phpで置換します


この状態でゲームをすると
ブラウザー <=> osero.php <=> breversi.pl
のように通信が行われ透過的にosero.phpが通信ログをとっていきます


さて,数ゲームほどやってみてうまく動くか見てみましょう.
たまにchangeとかもしてみるといいです
棋譜をとると解析に便利……って勝てねーorz
トップに移動
ユーザー情報を表示 メッセージを送信
ach
投稿1時間: 土 2月 03, 2007 4:01 am  引用



登録日: 2006年8月 19日
投稿記事: 19

そろそろログと棋譜がたまってきましたか?
ではいよいよ通信プロトコルの解析です(といっても簡単ですが)

一手目黒51(テキストエリアに出力されてるはず)
二手目白60(こっちも)
さてログはどのようになっているでしょうか?
Code:

m=0&p=0000000000000000000000000002100000011100000000000000000000000000+2
   =>   60

うーん読みにくい.P=以下を8文字ずつで分割だ!!!
(この辺はajax/brevajax.jssendReques, comRequestを読めばわかる)
Code:

m=0&p=
00000000
00000000
00000000
00021000
00011100
00000000
00000000
00000000+2
   =>   60

まあ後いくつか眺めればすぐに通信プロトコルはわかりますが
p=00..が盤面の情報で,+2はその盤面から2(白)をおく場合の(最適?)解を示せという意味です
それに対しプログラムは60(これがプログラムの回答)とだけ出力しておしまい.
後は,javascriptがそれを解釈してオセロをひっくり返す.
なんともシンプルなことにこのオセロゲームの通信プロトコルはたったそれだけなのです.
m=2はモードです(実はおくださんのこのプログラムは単体でajax以外にtext形式などいくつかのモードを扱えます)

後はosero.php[b]に[b]/cgi-bin/user/okuhara/breversi.plのこの挙動をエミュレーションさせれば課題は無事終了
めでたしめでたし


key point
何で(左上基準で)6行5列が51で6行6列が60なわけ?
i +1行 j+1 列 = 10 + 9 * j + i (i , j = 0~7)

盤面を配列にするには?
たぶんこんな感じ
Code:

$MAP=array();// $j + 1 行 $j + 1 列の色=$MAP[$j][$i]
for ($j = 0; $j < 8; $j++)
{
    $j2 = 8*$j;
    $MAP[$j] = array();
    for ($i = 0; $i < 8; $i++)
    {
        $MAP[$j][$i] = $_GET["p"][$i+$j];
    }
}
$color=$_GET["p"][85];//...000+2のうちの2部分


思考ルーチンってどんなの?
COMに勝てない私に言われましても……
トップに移動
ユーザー情報を表示 メッセージを送信
kelly
投稿1時間: 月 2月 05, 2007 4:41 pm  引用



登録日: 2007年1月 31日
投稿記事: 4

ありがとうございます Exclamation Exclamation Exclamation Exclamation
お礼を言い切れないくらい感謝しています。
本当にありがとうございました。
トップに移動
ユーザー情報を表示 メッセージを送信
特定期間内の記事を表示:   
All times are GMT +9:00

次のトピックを表示
前のトピックを表示
Page 1 of 1
フォーラム一覧  ~  PHPプログラミング

トピックの新規投稿   返信


 
移動先:  

新規投稿: 不可
返信: 不可t
自分の記事の編集: 不可
自分の記事の削除: 不可
投票への参加: 不可




Powered by phpBB
customized by phpspot.