投稿者 |
メッセージ |
|
< PHPプログラミング ~ phpでオセロ |
|
時間:
水 1月 31, 2007 11:39 am
|
|
|
|
PHPでオセロどうやってつくれますか?これができないと学校卒業できないのでわかるかた教えてください |
|
|
|
|
|
|
|
時間:
木 2月 01, 2007 2:11 am
|
|
|
登録日: 2006年8月 19日
投稿記事: 19
|
|
猶予時間を考えると
http://www.amy.hi-ho.ne.jp/okuhara/
とか,既製のAjaxアプリををハックするしかないかな?
サーバーとAjaxアプリ間の通信プロトコルを解析してしまえば,通信先をかえてPHPで思考ルーチン作るだけです.
特に上のやつはシンプルですので思考ルーチンの製作にだいぶ時間を回せるかと
でも流用したのがばれたら卒業さしてくれないかも.
その辺は自己責任で(w
この流用(盗用)する方法でよくて,且つ「わからん.ひとまず教えれ!」ってときは……まあそう書いてください |
|
|
|
|
|
|
|
時間:
金 2月 02, 2007 1:20 pm
|
|
|
|
わかりました!一度必死でやってみます
またおって報告します。 |
|
|
|
|
|
|
|
時間:
金 2月 02, 2007 3:34 pm
|
|
|
|
申し訳ですが教えてください。頭が混乱しすぎました。
流用というとあまりよくないイメージなので参考にする。
というこにしましょう! |
|
|
|
|
|
|
|
時間:
土 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.jsのcClickを
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))
|
(わかりやすくするためです)
これでハックの下準備は完了です.
では解読に移ります |
|
|
|
|
|
|
|
時間:
土 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.plをosero.phpで置換します
この状態でゲームをすると
ブラウザー <=> osero.php <=> breversi.pl
のように通信が行われ透過的にosero.phpが通信ログをとっていきます
さて,数ゲームほどやってみてうまく動くか見てみましょう.
たまにchangeとかもしてみるといいです
棋譜をとると解析に便利……って勝てねーorz |
|
|
|
|
|
|
|
時間:
土 2月 03, 2007 4:01 am
|
|
|
登録日: 2006年8月 19日
投稿記事: 19
|
|
そろそろログと棋譜がたまってきましたか?
ではいよいよ通信プロトコルの解析です(といっても簡単ですが)
一手目黒51(テキストエリアに出力されてるはず)
二手目白60(こっちも)
さてログはどのようになっているでしょうか?
Code: |
m=0&p=0000000000000000000000000002100000011100000000000000000000000000+2
=> 60
|
うーん読みにくい.P=以下を8文字ずつで分割だ!!!
(この辺はajax/brevajax.jsのsendReques, 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に勝てない私に言われましても…… |
|
|
|
|
|
|
|
時間:
月 2月 05, 2007 4:41 pm
|
|
|
|
ありがとうございます
お礼を言い切れないくらい感謝しています。
本当にありがとうございました。 |
|
|
|
|
|
|
|