プログ

’14修了無内定理系院卒の活動雑記||プー太郎ログ||プログラミング雑記

GitHubに登録しました

登録したのは良いけれど,これってどの程度のプログラムを載っけるのが良いのか難しいな.とりあえず完成品かモジュール・関数の1つかなっていう印象を受けたけど,長かったり自分しか使えなさそうな部分が多いとブログに乗せるのに合わない気がする.

今日はドティのプログラミング(?)改善する点は多々あれど,とりあえずコンピュータ相手にゲーム開始~終了の流れは実装.現状の工夫した点と残る改善点,そして残る実装部分についてのまとめ.

f:id:triplog:20140413024507p:plain
状態遷移図とフローチャート図を組み合わせたような概念図らしき何か.

工夫した点

・ページを複数用意することで管理しやすく
当初はゲーム開始後は同一ページ内で処理を済ませようと考えていたが,入出力にいちいちチェックが掛かって分かりにくいのと,ページ同士の対話的になって理解・管理がしやすいので複数ページを使う方式に.自分の番のページと相手の番のページを,結果ページを介して交互に行き来することで手番を管理する.自分と相手が同時に回答することはないので,結果ページの中で分岐することで結果表示には同一ページを使いまわすことができる.ただ,手番のページは似通っているので統合して内部分岐にさせても良いかもしれない.
・回答履歴を変数にまとめる
回答履歴はゲーム内で重要な要素でありどう実装しようか悩んでいたけど変数recordにまとめてsubmitするようにした.2~9はそのままに,10~20はそれぞれa~kで表記し,回答順に並べた文字列とした.例えば11→12→14→9と回答した場合はrecord="bce9"となり,この文字列とanswerを比較することで回答済みの番号であるかを判断できる.この部分のコードは以下の通り.

コメントにも書いているようにもっと良い方法があるように思える.
今回は2~20しか想定してないので前半のnum2char()を使って,

<?php
$record = $record . num2char($answer);
?>

とすることで末尾に追加して管理し,

<?php
$answer = 0;
while(($answer<$enNum+1)||($enNum+10<$answer)
    ||(strpos($record, num2char($answer))!==false))
  $answer = rand(1, 10) + rand(1, 10);
?>

とすることで,一定の範囲内かつ過去に回答されてない値をランダムに生成することができる.strpos()は文字列内に含まれる部分文字列の開始位置を返す関数だけど,含まれない時に返される値FALSEが0として扱われることもあり,かつ文頭の位置も0であるため,「含まれる場合」の条件式は「strpos()!==FALSE」となることに注意.その次の行で2回の和にしてるのは,中央値が出やすいようにするため.んでもって

<?php
function readRec($input)
{
  $i = 0;
  while($i < strlen($input))
  {
    echo char2num($input[$i]) . "";
    $i = $i+1;
  }
}
?>

とすることで,"bce9"を11→12→14→9→と書き出せる.
ところでずいぶん表示が汚いな...<?php ?>つければ解決しました.

改善点

データが丸見え
現状は概念図で示したような変数のやりとりをすべてphpのsubmit+getで行っているため,アドレス末尾に?enNum=8など表示されて値が丸見えである.また同時に,これらの値を変更することでゲームが成立しないような動き(相手の番を飛ばす,番号を変更する)を行うこともできてしまう.そうでなくともブラウザバックや更新を使うことでやり直したりができてしまうのでこれらは直さないといけない.手法の1つにインラインフレームを使う方法が考えられるけど,フレームはあまり使わない方が良いという記述を見かけたのでできれば他の方法にしたい.とりあえずは性善説に頼って後回し...

postにするだけで解決でした.今までずっとpostがうまくいかず悩んでたんだけど,method "post"って誤表記してたせいでgetになってしまってただけという.method="post"と正しく書くよう注意しましょう.ただブラウザバックについては解決してないのでまだまだ課題は残ります.あとは自分の回答で回答済みの値を表示しないようにするとか.

残る実装

一人用のCOM対戦が終わったら今度は対戦できるように通信関係のプログラム.と思ってたけど,PHPだけでやるのは限界がありそうだからJavaScriptとか学ぶようかも知れない.ちょっとココらへんは改めて構成を考える必要がありそう.ただ就活だったりFEだったりがあるので,あまり膨大だと厳しい.