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