网络游戏如何将玩家联系在一起?

问题描述 投票:0回答:2

我一直在制作一款基于在线的 connect4 游戏,该游戏在很大程度上运行得非常完美。

唯一的问题是,当进行移动时,游戏会调用 PHP 脚本,该脚本将会话使用的数据写入公开可见的文本文件,然后由其他玩家(使用 jQuery)及其计算机读取相应地更新并渲染它。

但是,我觉得这是实现这个目标的一个非常糟糕的方式。我考虑过使用套接字,但由于计算机上没有运行监听传入数据包的守护进程,并且端口没有在玩家计算机上转发,我不确定如何使用套接字实现这种效果。

php sockets multiplayer
2个回答
1
投票

很少有网络游戏直接连接玩家。几乎在每个在线游戏中,所有数据交换都通过中央服务器进行。这对于防止作弊很重要。只要中立服务器管理游戏状态,任何客户端都无法对其进行操纵以获得优势。

为了节省带宽,每一步读取整个游戏状态并不是一个好方法。如果客户只知道另一位玩家所做的一步,那就更好了,因为所有其他信息都是多余的。

Javascript Websockets 将是向其他玩家推送更新的最佳选择。不幸的是,并非所有浏览器都支持它(Internet Explorer 不太可能在 Windows 7 之前的任何操作系统上支持它)。一个较差但更广泛支持的选项是 AJAX。


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']);
© www.soinside.com 2019 - 2024. All rights reserved.