我正在为Windows Phone 7编写一个多人游戏.我需要确保每个玩家同时发生事件.我现在的方法是提前播放我希望活动发生的时间,并依靠电话的时钟相当准确.
麻烦的是,我已经看到一些时钟不准确的情况 - 它可能会在几秒钟内消失.所以我想要做的是估计电话时钟与服务器的时间有多么不同.当然,需要考虑网络延迟,特别是因为对我开放的唯一网络协议是Http.
所以我的问题是,有没有人知道我可以用来估计客户端和服务器之间时钟时间差异的算法,精度大约是100ms?
从我作为数学本科生的日子开始,我似乎记得有一个统计模型可以用于这种情况,我们正在采样一个假定由常数加上误差量(延迟)组成的值.假设遵循一些分配.有人知道这个,它确实适用吗?
我是python的新手,并且已经尝试在python上制作多人二十一点游戏一段时间了.我遇到了很多很多问题,并且想知道你们是否可以帮助我.
import random
def total(hand):
aces = hand.count(11)
t = sum(hand)
if t > 21 and aces > 0:
while aces > 0 and t > 21:
t -= 10
aces -= 1
return t
Cards = ["2H", "3H", "4H", "5H", "6H", "7H", "8H", "9H", "2C", "3C", "4C", "5C", "6C", "7C", "8C", "9C", "10C", "2S", "3S", "4S", "5S", "6S", "7S", "8S", "9S", "10S", "2D", "3D", "4D", "5D", "6D", "7D", "8D", "9D", "10D", "AH", "JH", "QH", "KH", "AC", "JC", "QC", "KC", …Run Code Online (Sandbox Code Playgroud) 关于标签
我将其标记为Java 和 C ++问题。这意味着我不是在寻找特定于语言的答案。我只标记了C ++和Java,因为我精通它们,并且如果用这些(或类似)语言编写代码示例,则很可能会理解您的代码示例。
指针和洞察力的安全性措施,发展软件时,主要是我应该考虑到游戏,如描述的下方。安全是指检查并再次检查用户是否采取了非故意的行为。这可能意味着一些行为,例如将他/她存在的最新恶意病毒更新集发送到服务器/其他客户端,或者通过黑客攻击等方式损害其他玩家的用户体验。
预期的评论和答案
您是否在问如何阻止人们入侵您的游戏?
这是不以任何方式,我的问题,因为它的方式过于广泛,这个线程。但是,如果您确实找到了一种简单的方法(通过作弊)来赢得每场比赛,请告诉我。
这个问题更适合X
我已经在CodeReview和程序员中提出了这个问题。在这两个网络中,该职位均受到好评。为了公平起见,这里也很不受欢迎(请参阅ADTC的评论),因此赏金很高。悬赏后,我重写了这篇文章,以更好地满足SO的标准。但是,如果您仍然认为此帖子不太适合此处,请告诉我原因。我很难确定这是否真的更适合SO或Programmers,所以不要以为这只是我一秒钟不考虑之后在这里发布的转储。
要在两台计算机之间创建连接,应使用套接字。去谷歌上查询。
我不是在寻找这种技术帮助。我知道如何实现该软件,这不是我第一次这样做。请看看我问的实际问题。
有问题的软件
我正在开发类似蛇的多人游戏,玩家可以使用自己的算法来确定蛇的下一步行动。播放器通过客户端-服务器连接彼此连接,即,一个播放器将充当主机。您可以假设服务器代码将等到所有玩家轮到自己,直到更新所有客户端之间的游戏状态为止。
关于游戏
我的游戏在文件夹中搜索任何兼容的.jar文件,这些文件的主类扩展了特定的抽象类。然后,玩家可以通过直接连接到其他玩家或通过在大厅搜索游戏来通过网络连接到其他玩家。
在玩游戏时,每个玩家将使用自己的算法来确定其蛇的下一步动作。每个游戏的持续时间可能会有所不同,具体取决于为游戏指定的更新速率,但是大多数情况下它们的速度很快,并且很可能会在不到30秒的时间内结束。
我还没有实现实际的网络多人游戏。
逻辑的模板源文件如下:
package template
import snake.*;
public class TemplateLogic extends SnakeLogic {
@Override
public void onLaunch() {
}
@Override
public String getMove() {
return "UP";
}
}
Run Code Online (Sandbox Code Playgroud)
因此,从主机播放器的角度来看,我打算做的是以String格式(“上”,“下”,“左”,“右”)通过网络获取播放器的下一个动作,因此在这方面不会有任何安全问题。每个客户用来确定其下一步行动的实际程序只能在相应客户的计算机上运行。
我希望你到目前为止一直在关注我。无论如何,我现在担心的是我可能忽略的任何其他坑洼。确定所有这些坑洼可能是一件繁琐的工作,因此,我主要不会问这个。我对这件事的见解是我所期望的。理想情况下,我可以从不同的人的多个答案中得到更大的了解。
浮现在其他问题之上的问题是,我可以阻止任何客户端在其程序上使用会损害其他播放器用户体验的方法吗?例如,这样的方法Thread.sleep():如果玩家让他的算法在每次移动之间等待10分钟,那将很烦人。对于这个特殊的问题,我认为应该为每个动作设置一个时间限制,在此之后,落后的/恶意的玩家将被踢出或被分配一个默认的动作,以便游戏可以正常继续。
音符:
@Darinth的回答让我想起了游戏的一个非常重要的方面:允许用户输入,这意味着蛇的下一步可以由人类玩家决定-也就是说,可以使用键盘正常玩游戏。此外,没有任何限制会限制您在纯AI和仅键盘解决方案之间进行选择:您可以将它们混合在一起,例如,自己控制蛇,并在发现自己将自己陷入陷阱时让AI接管。
我忽略了大事吗?我已经计划将这作为我和我的朋友一起度过的一个小项目,与他们共度时光,但是我有点发烧友。
无论您的想法有多小,请不要犹豫。如果您想到更多的兴趣点,以后可以编辑答案以更全面。我会定期检查所有答案以进行修改。
感谢您的时间。 …
我正在使用 LibGDX 和 Box2D 编写一个 Android 游戏。我计划为其添加回合制多人游戏功能。
现在,如果我在两个客户端上以相同的时间步长以相同的速率步进 Box2D 世界,并使用完全相同的初始参数在两个客户端上开始模拟,当模拟结束时,两个模拟的最终状态是否完全相同相同?换句话说,Box2D 模拟是完全确定的吗?
如果不是,那么这意味着每次模拟结束时,作为主机的一个客户端将不得不告诉另一个丢弃其最终模拟的结果并使用它来代替。
我在我的统一游戏中第一次尝试使用Google实时多人游戏。QuickMatch工作正常,我的意思是我可以使用以下方法获取连接的参与者的ID并将其存储到字符串中:
string MyId = PlayGamesPlatform.Instance.RealTime.GetSelf ().ParticipantId;
//string frndId = PlayGamesPlatform.Instance.RealTime.GetParticipant ();
//Get all opponent's ID
List<Participant> playerIDs = PlayGamesPlatform.Instance.RealTime.GetConnectedParticipants ();
if (MyId == playerIDs [0].ParticipantId) {
oppoUsarname = playerIDs [1].DisplayName.ToString ();
multiplayersName [1].text = "nothosting" + oppoUsarname;
gameHost = true;
OppoID = playerIDs [1].ParticipantId;
OppoDN = playerIDs [1].DisplayName.ToString ();
} else {
oppoUsarname = playerIDs [0].DisplayName.ToString ();
multiplayersName [1].text = "gamehoster" + oppoUsarname;
gameHost = false;
OppoID = playerIDs [0].ParticipantId;
OppoDN = playerIDs [0].DisplayName.ToString ();
}
Run Code Online (Sandbox Code Playgroud)
对手进入房间后,我可以展示他的表情displayname …
我设法使用 Unity Netcode 实现某种多人游戏,我知道这是非常新的,但我遇到了一个相当大的问题。我似乎无法断开与服务器实例的连接。这会导致我加载游戏场景并生成 NetworkManager 实例的问题。然后我返回主菜单场景并再次加载游戏场景,现在有 2 个 NetworkManager 实例,这显然会导致错误。
我在文档中读到您可以使用它:
public void Disconnect()
{
if (IsHost)
{
NetworkManager.Singleton.StopHost();
}
else if (IsClient)
{
NetworkManager.Singleton.StopClient();
}
else if (IsServer)
{
NetworkManager.Singleton.StopServer();
}
UnityEngine.SceneManagement.SceneManager.LoadScene("MainMenu");
}
Run Code Online (Sandbox Code Playgroud)
然而,所有这些停止函数似乎在单例下根本不存在。我错过了图书馆或其他什么吗?现在我使用的解决方法是禁用“不破坏”,然后 NetworkManager 在切换场景后被破坏,但是如果我想在切换场景后保留它怎么办?有没有办法控制服务器/客户端何时停止?我假设这是一个错误,但我只是想确定一下。
最近我一直在研究多人网络应用程序.我使用Bonjour服务和NSStream对象成功实现了客户端服务器模型.双向沟通已成功完成.
我面临的问题是:运行应用程序的两个设备通过本地wifi连接.从客户端向服务器发送消息时存在延迟问题,反之亦然.
简要描述:
有任何想法吗?
好吧,我不知道这个问题的标题是否合适,但我不知道如何用几句话来说.
我目前正在开发一个多人2D游戏,在服务器端使用NodeJS和Socket.io,在客户端使用HTML5.除非他们完成比赛,否则这个游戏不需要保存球员的进度.我必须确保所有关于球员的信息,例如得分和帮助始终有效.所以我决定将这些信息集中在服务器上,这样客户端就不会向服务器发送分数,而是根据发送的信息计算服务器计算分数并将其发送给所有客户端.除此之外,我可以让这个游戏的不同会话最少运行2个玩家,最多4个玩家.
起初我决定实现这一点,服务器总是在内存中维护游戏会话数据,但现在我在质疑自己是否应该使用数据库来存储这些数据.我正在使用数据库来存储会话数据,因为我没有使用未完成的会话数据.但是,我应该在他们玩的时候维护数据库中的会话和玩家数据吗?我的问题是客户端经常与服务器通信,这种方法我必须首先从数据库请求他们的数据,进行必要的更改,将其存储回数据库,并在每个客户端请求上重复此过程.也许答案很明显,但我应该使用这种方法吗?
这是我第一次开发游戏,所以我不知道事情通常如何运作.我只知道我希望服务器快速.我之所以选择维护内存的一切,主要是因为我发现的关于多人游戏开发的所有示例和教程都没有提到过数据库......
谢谢!
我正在尝试使用javascript制作一个"FourConnect"游戏.我想,所有在线用户都有一个列表.这个列表是我在firebase网站上的例子.现在我希望我可以选择一个在线用户并向他们发送邀请来与我一起玩.所以我写了一个函数,所有用户都希望我有一个额外的div.当我点击div时,这个特殊用户应该得到一个确认框来说出okey或取消.如果用户点击该键,则该游戏应该开始.我将保存用户的名称和ID.这已经有效了.
我的问题是,我不知道如何将请求发送给其他用户.我尝试了很多,但总是确认框在我的brwoser上而不是在其他用户的浏览器上.
我在firebase页面和谷歌上寻找解决方案,但找不到任何解决我问题的方法.
我已有的代码:
var name = prompt("Your name?", "Guest"),
currentStatus = "? online";
// Get a reference to the presence data in Firebase.
var userListRef = new Firebase(connectFour.CONFIG.firebaseUrl);
// Generate a reference to a new location for my user with push.
var myUserRef = userListRef.push();
var gameId = myUserRef.name();
document.getElementById('labelGameId').innerHTML = gameId;
beginGame({id: gameId, name: name, status: currentStatus});
// Get a reference to my own presence status.
var connectedRef = new Firebase('http://presence.firebaseio-demo.com/.info/connected');
connectedRef.on("value", function(isOnline) {
if (isOnline.val()) {
// …Run Code Online (Sandbox Code Playgroud) 我想知道在lance-gg中是否有一种简单的方法可以仅向每个玩家发送玩家特定数据,而不是向所有玩家发送所有数据.
我希望创建一个扑克游戏,并且不希望每个玩家所持有的数据都向所有玩家广播,而只是让每个玩家都收到有关他们自己的牌的信息.
这在目前的GameEngine和ServerEngine之间是否可以轻松实现?
在游戏过程中,需要执行以下步骤:
玩家的牌也需要存储在服务器上,但不能在每一步重新广播.
multiplayer ×10
c# ×2
networking ×2
socket.io ×2
algorithm ×1
android ×1
blackjack ×1
box2d ×1
c++ ×1
firebase ×1
html5 ×1
http ×1
iphone ×1
java ×1
javascript ×1
lance ×1
node.js ×1
python ×1
security ×1
sendmessage ×1