我正在尝试构建一个主要使用PHP的浏览器卡片游戏,并且可能还会使用其他一些有用的语言来测试和扩展我的PHP知识,并使用我一直想做的事情。但是我读过并试图实现的每个在线解决方案都行不通,我不知道为什么。我有这样的逻辑:
//find game form
print "<form method='post' action='game.php'>
<label>Enter host generated game #</label><br>
<label><input type='text' name='gamenumber'></label><br>
<label><input type='submit' name='findgame' value='FindGame'></label><br><br>
</form>";
//host game button
print "<form method='post' action='game.php'>
<label><input type='submit' name='hostgame' value='HostGame'></label>
</form>";
//game logic
if(isset($_POST['hostgame']))
{
$roomnumber = rand();
print $roomnumber;
insertField($Ausername,$roomnumber); //insert field GUI
//link game to host for future field printing
$query = "UPDATE game".$roomnumber." SET host='".$Ausername."' WHERE host='null'";
$result = mysqli_query($link, $query);
print "<div id='quote'>"; //populate host just disappears <meta http-equiv='refresh' content='5' />
//populates self and opponents in hosts perspsective
populatehost($roomnumber);
print "</div>";
}
if(isset($_POST['findgame'])) //this processes after user submits data.
{
$roomnumber = $_POST['gamenumber'];
$_SESSION['gamenumber'] = $_POST['gamenumber'];
//link game to find for future field printing
$query = "UPDATE game".$roomnumber." SET find='".$Ausername."'WHERE find='null'";
$result = mysqli_query($link, $query);
print "<form method='post' action='game.php'>
<label><input type='submit' name='startgame' value='StartGame'></label>
</form>";
//populates self and opponents in finds perspsective
populatefind($roomnumber);
}
if(isset($_POST['startgame'])) //this processes after user submits data.
{
print "<br>Game started.<br>";
print "heads or tails?\n\n";
print "<form method='post' action='game.php'>
<label><input type='text' name='headstails'></label><br>
<label><input type='submit' name='select' value='Select'></label><br><br>
</form>";
//finder always starts game
populatefind($_SESSION['gamenumber']);
}
$gameStatus="";
$flip = rand(1,2);
$coin = "heads";
$gameStarted = "game not started";
if($flip==1)
$coin="heads";
else if($flip==2)
$coin="tails";
if(isset($_POST['headstails'])) //this processes after user submits data.
{
if($_POST['headstails']==$coin)
{
print "find game player goes first";
$gameStarted = "game started";
//notify find game player he goes first
//do logic where he goes first
}
else
{
print "host game player goes first";
$gameStarted = "game started";
//notify host game player he goes first
//do logic where he goes first
}
populatefind($_SESSION['gamenumber']);
}
这是我尝试过的粘贴在页面底部的jquery函数。
?>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js%22%3E%3C/script%3E">
jQuery(function () {
var $els = $('div[id^=quote]'),
i = 0,
len = $els.length;
$els.slice(1).hide();
setInterval(function () {
$els.eq(i).fadeOut(function () {
i = (i + 1) % len
$els.eq(i).fadeIn();
})
}, 2500)
})
</script>
</body>
</html>
所以我能够为主持人和发现者打印字段,一旦取景器翻转硬币,就会说出谁先从他们的角度出发..但是我很难让它出现在其他玩家身上透视。我正在考虑通过使用执行所有打印的功能刷新div来实现它,但无论如何都似乎没有任何效果。我尝试了很多不同的PHP睡眠方法,我尝试了一些jquery函数,没有任何效果。 btw populate host和populate find只是基于变量数组的巨型表的函数。
答案 0 :(得分:7)
您尝试实现的这类事情将使用常规Ajax调用来花费大量服务器资源。
类似问题:Link
让我们考虑两个用户之间的聊天作为示例:
用户的1页有一个Javascript计时器,每秒都会询问新消息:“嘿服务器,给我发新消息。”无论是否有新消息,服务器都会处理请求,搜索新消息要回复的消息“我现在没有给您留言”或“这是您的新留言”。 对于用户2也是如此。
如果两个用户都将聊天页面保持打开状态10秒钟,您的服务器将收到20个新消息请求,将搜索20个新消息,并将发送20个回复,其中包含新消息或“无新消息”回复。即使两个用户都没有发送任何内容,只需保持页面打开即可。想象一下,如果有1000个用户连接到您的聊天室!
在这种情况下,最好的方法是Socket。在同一个聊天示例中,用户1和用户2将继续收听新消息,而不是每秒都要求他们。当用户1发送消息时,服务器将通知用户2“我有一条新消息。这是。”
如果连接了1000个用户,则完全没有问题。服务器将新消息发送到套接字通道,并且将通知所有连接的用户。没有延迟。
在您的具体情况下,将这样工作:播放器1和播放器2正在侦听新消息。当玩家1点击卡片时,将触发服务器命令。服务器将接收并发送套接字通道的消息:“嘿,等待新卡的所有人,这里是”,然后每个玩家都会收到通知。瞬间。
第一种情况的另一个问题,使用Javascript计时器:如果您增加计时器间隔,则回复将延迟传递。
套接字的另一个好处是:它独立于技术。 PHP,Java,Node等
使用WebSocket和Php的GitHub项目:Link
You can see some socket demos here
Here is a repository with some tests I ran when I tried Socket earlier
答案 1 :(得分:3)
你可以这样做:
setInterval(function refresh(){
var value = Math.round(Math.random()*100);
$("#target").addClass("hidden");
$("#target").html(value);
$("#target").removeClass("hidden");
}
, 1500);
.hidden {
display: none;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="target">
</div>