3

私はオンラインベースのconnect4ゲームを作成してきましたが、これはほとんどの場合、完全に機能します。

唯一の問題は、移動が行われると、ゲームがPHPスクリプトを呼び出して、セッションに使用されたデータを公開されているテキストファイルに書き込み、他のプレーヤー(jQueryを使用)によって読み取られ、そのコンピューターが更新されることです。それに応じてレンダリングします。

しかし、これはこの目標を達成するための非常に悪い方法だと思います。ソケットの使用を考えましたが、着信パケットをリッスンしているコンピューターでデーモンが実行されておらず、プレーヤーのコンピューターでポートが転送されていないため、ソケットを使用してこの効果を実現するにはどうすればよいかわかりません。

4

2 に答える 2

1

プレイヤーを直接接続するオンライン ゲームはほとんどありません。ほぼすべてのオンライン ゲームで、すべてのデータ交換は中央サーバーを経由します。不正を防止するために重要なことです。中立的なサーバーがゲームの状態を管理している限り、クライアントが有利になるように操作することはできません。

帯域幅を節約するために、すべての動きでゲームの状態全体を読み取るのは良い方法ではありません。他のすべての情報は冗長であるため、クライアントが他のプレイヤーが行った 1 つの動きについてのみ通知されると、より良い結果が得られます。

Javascript Websockets は、更新を他のプレーヤーにプッシュするための最良のオプションです。残念ながら、まだすべてのブラウザーがサポートしているわけではありません (Internet Explorer が Windows 7 より前のオペレーティング システムでサポートされる可能性はほとんどありません)。劣るものの、より広くサポートされているオプションは AJAX です。

于 2012-10-09T08:00:47.310 に答える
1

通常、ファイルの代わりに PHP で mySQL データベースを使用します。このようにゲーム状態を書くことができますが、PDO のようなデータベース層を使用する方が良いでしょう:

$gamestate_serialized= mysql_real_escape_string(serialize($gamestate_array));
$gameID= intval($gameID);
$query= "insert into gamestate (gameID, state) values ($gameID,'$gamestate_serialized')";
$handle= mysql_query($query);
if(!$handle) print mysql_error();

次のように読みます。

$gameID= intval($gameID);
$query= "select state from gamestate where gameID=$gameID"; 
$handle= mysql_query($query);
if(!$handle) print mysql_error();
$row = mysql_fetch_assoc($handle);
$state_array= unserialize($row['state']);
于 2012-10-09T07:54:57.590 に答える