我创建了一个白板网络应用程序,大量注册用户可以在其中登录并开始在 html5 Canvas 上绘图。我通过 python websockets 设计了游戏的“多人游戏”方面,并使用 php 进行登录,目前 Canvas 页面有一个“session_start();”所以我可以添加一个功能来查看当前谁在使用该应用程序,我觉得它也可以用于“回合制”方面。
现在我试图阻止用户同时在 Canvas 上绘图,如果可能的话,我希望每个用户在 Canvas 上绘图时都有公平的轮流。我不确定如何完成此操作,但我认为 Javascript 绝对是其背后的逻辑。
关于我将如何实现此功能的任何意见或建议?
编辑 好的,因为没有人有任何答案或建议,我会尝试向您提供我到目前为止所做的尝试,我认为它可能在正确的方向上,即使它不起作用:
var player = document.getElementById("inputnameid").value;
var currentPlayer = player; // player class
//array of player objs.
var array1 = [player]; // list that OnCurrentPlayerEndTurn cycles through to choose user
// call this at the start of the app
function OnStartTurn()
{
currentPlayer.OnBeginTurn();
var inputs=document.getElementById('inputty');
for(i=0;i<inputs.length;i++){
inputs[i].disabled=false;
}
//This function will activate the GUI so the user can now act
}
// call this function when setTimeout is 10 seconds
function OnCurrentPlayerEndTurn()
{
setTimeout('OnCurrentPlayerEndTurn();', 10*1000);
change currentPlayer variable to the next player in line
OnStartTurn(); // will cause the next player to begin his turn
}
最佳答案
你的问题似乎集中在前端代码上,虽然它很重要,但并不是这个问题的关键部分。正如您所指出的,回合制游戏的核心是活跃玩家的循环传球。您可能希望在服务器端完成此操作:从那里协调不同的玩家要容易得多。
您将在服务器上维护给定游戏中的玩家列表。在游戏开始之前,每个客户端都会在服务器上注册,并在其中存储一个识别用户 ID。然后在每一轮中,服务器允许每个玩家轮流。回合顺序当然取决于游戏的具体情况,但无论回合顺序是固定的还是流动的,总体思路都是相同的。
轮到每个玩家时,服务器会向该玩家的客户端发送一张票。这本质上是一次性一密 (OTP) 概念:生成一个难以猜测的随机 token (因此不要只使用递增整数,而是使用一些廉价的哈希函数或类似函数)。然后客户端发送这张票以及他们想要进行的移动请求,服务器在采取任何行动之前验证这张票是否对应于当前活跃的玩家。
根据游戏的规则和要求,服务器可以立即使票(例如国际象棋)无效,可以等到“回合结束”移动,或者可以在一段时间后使票无效。然后,服务器会为下一位玩家生成一张新票。
客户端代码自然遵循此架构。默认情况下可以禁用所有输入,并且仅在客户端持有有效票证时才启用。如果票据设计为超时,您可能需要一种查询服务器的方法以确定它是否仍然有效。如果用户总是负责结束他们自己的回合(明确或隐含),你可以不用这样做。
关于javascript - 在 Javascript 中创建用户回合制游戏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26573696/