我一直在制作一款基于在线的 connect4 游戏,该游戏在很大程度上运行得非常完美。
唯一的问题是,当进行移动时,游戏会调用 PHP 脚本,该脚本将会话使用的数据写入公开可见的文本文件,然后由其他玩家(使用 jQuery)及其计算机读取相应地更新并渲染它。
但是,我觉得这是实现这个目标的一个非常糟糕的方式。我考虑过使用套接字,但由于计算机上没有运行监听传入数据包的守护进程,并且端口没有在玩家计算机上转发,我不确定如何使用套接字实现这种效果。
很少有网络游戏直接连接玩家。几乎在每个在线游戏中,所有数据交换都通过中央服务器进行。这对于防止作弊很重要。只要中立服务器管理游戏状态,任何客户端都无法对其进行操纵以获得优势。
为了节省带宽,每一步读取整个游戏状态并不是一个好方法。如果客户只知道另一位玩家所做的一步,那就更好了,因为所有其他信息都是多余的。
Javascript Websockets 将是向其他玩家推送更新的最佳选择。不幸的是,并非所有浏览器都支持它(Internet Explorer 不太可能在 Windows 7 之前的任何操作系统上支持它)。一个较差但更广泛支持的选项是 AJAX。
通常您使用带有 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']);