gpt4 book ai didi

java - 自动化多人游戏中的坑洼,玩家可以使用自己的算法

转载 作者:行者123 更新时间:2023-12-04 18:06:17 25 4
gpt4 key购买 nike

关于标签

我将其标记为Java的的C++问题。这意味着我不是在寻找特定于语言的答案。我只标记了C++和Java,因为我精通它们,并且如果用这些(或类似)语言编写代码示例,它们很可能会理解您的代码示例。

我在找什么

关于安全的指针洞察,我在开发软件时应考虑的措施,主要是游戏,例如以下所述。通过安全性,我的意思是检查并再次检查用户是否以不想要的方式行事。这可能意味着行为,例如将他/她存在的最新恶意病毒更新集发送到服务器/其他客户端,或者通过例如黑客入侵的方式损害其他玩家的用户体验。

预期的评论和答案

Are you asking how to stop people from hacking your game?



无论如何,这是 而不是,这是我的问题,因为它对于此线程而言过于宽泛。但是,如果您确实找到了一种简单的方法(通过作弊)来赢得每场比赛,请告诉我。

This question is better suited in X



我已经在CodeReview和程序员中提出了这个问题。在这两个网络中,该职位均受到好评。为了公平起见,这里也很不受欢迎(请参阅ADTC的评论),因此是赏金。悬赏后,我改写了这篇文章,以更好地满足SO的标准。但是,如果您仍然认为此帖子不太适合此处,请告诉我原因。我很难确定这是否更适合SO或Programmers,所以不要以为这只是我一秒钟不考虑之后在这里发布的转储。

To create a connection between two machines, you should use Sockets. Google it.



我不是在寻找这种技术帮助。我知道如何实现该软件,这不是我第一次这样做。请看看我问的实际问题。

我为什么要问这个?

相关软件

我正在开发类似蛇的多人游戏,玩家可以使用自己的算法来确定蛇的下一步行动。播放器通过客户端-服务器连接彼此连接,即,一个播放器将充当主机。您可以假设服务器代码将等到所有玩家轮到使用,直到更新所有客户端之间的游戏状态为止。

关于游戏

我的游戏在文件夹中搜索任何兼容的.jar文件,这些文件的主类扩展了特定的抽象类。然后,玩家可以通过直接连接到其他玩家或通过在大厅搜索游戏来通过网络连接到其他玩家。

在玩游戏时,每个玩家将使用自己的算法来确定其蛇的 下一步 Action 。每个游戏的持续时间可能会有所不同,具体取决于为游戏指定的更新速率,但是大多数情况下它们的运行速度很快,并且很可能会在不到30秒的时间内结束。

我还没有实现实际的网络多人游戏。

逻辑的模板源文件如下:
package template

import snake.*;

public class TemplateLogic extends SnakeLogic {

@Override
public void onLaunch() {
}

@Override
public String getMove() {
return "UP";
}

}

因此,从主机播放器的角度来看,我打算做的是以String格式(“上”,“下”,“左”,“右”)通过网络获取播放器的下一个 Action ,因此在这方面不会有任何安全问题。每个客户用来确定其下一步行动的实际程序只能在相应客户的计算机上运行。

我希望你到目前为止一直在关注我。无论如何,我现在担心的是我可能忽略的任何其他坑洼。确定所有这些坑洼可能是一件繁琐的工作,因此,我主要不会问这个。我对这件事的见解是我所期望的。理想情况下,我可以从不同的人的多个答案中得到更大的了解。

浮现在其他问题之上的问题是,我可以阻止任何客户端在其程序上使用会损害其他播放器用户体验的方法吗?这样的方法例如可以是 Thread.sleep():如果玩家让他的算法在每次移动之间等待10分钟,那将很烦人。对于这个特殊的问题,我认为应该为每个 Action 设置一个时间限制,在此之后,落后的/恶意的玩家将被踢出或被分配一个默认的 Action ,以便游戏可以正常继续。

注释:

@Darinth的回答使我想起了游戏的一个非常重要的方面: 用户输入被允许,这意味着蛇的下一步 Action 可以由人类玩家决定-也就是说,游戏可以正常地通过键盘进行。此外,没有任何限制会限制您在纯AI和仅键盘解决方案之间进行选择:您可以将它们混合在一起,例如,自己控制蛇,并在发现自己将自己陷入陷阱时让AI接管。

总结一下

我忽略了大事吗?我已经计划将这作为我和我的 friend 一起度过的一个小项目,以度过一段时光,但是我有点发烧友。

,无论您的想法有多小,请不要犹豫。如果您想到更多的兴趣点,以后可以编辑答案以使其更全面。我会定期检查所有答案以进行修改。

感谢您的时间。

我从答案中或自己获得的相关想法
  • 在每次移动后,将游戏状态的哈希值与所有客户端进行比较。 除具有相同哈希值的所有玩家外,其他所有玩家都将被踢出,最低要求是将主机保留在游戏中(如果有4位玩家,其中2位玩家拥有一个哈希,另外2位玩家拥有另一哈希,不包含主持人的组将被踢出,依此类推)。我想出了这个,但是这要感谢@ToYono,所以功劳归功于他。
  • 在游戏开始之前,比较每个玩家的校验和。 所有具有与主机不同校验和的玩家都将被踢出(或什至不让其进入游戏)。归功于@ToYono。
  • 将所有排名匹配的内容随机化。 禁止有效使用从同一台计算机使用多个连接来玩同一游戏。如果一个玩家在一个游戏中玩多条蛇,他可能会拥有一种试图合法地玩游戏的算法,而两种算法只是在破坏另一名玩家。归功于@Surt。
  • 允许用户输入。 从一开始就被设计为游戏的一部分,但我忘了提及它。感谢@Darinth提出了可能性,因此使我想起了这一重要方面。
  • 最佳答案

    如果一个玩家可以作弊,那么一些玩家就会作弊。那么最简单的作弊方法是什么?

    1)更改游戏状态,有效撤消之前的 Action 。

  • 所有其他播放器和/或服务器应验证该更新,因为它是谨慎的值,您处理该更新应该不成问题。客户端支票可能就足够了,但是精明的黑客可以通过将支票更改为类似的东西来破解支票

    bool allowedMove(){
    返回true;
    ...这里剩余的原始校验码

  • 然后,必须使用代码SHA3的校验和来对付哪个?因为MD5即将结束其安全时代。

    示例:WoW传送黑客,x,y,z在客户端上计算并发送到主机。
  • 作弊者入侵客户端以获取所需的结果。
  • Bliz在客户端上进行校验和。
  • 作弊者刚刚插入了一个带有x,y,z的新网络程序包,以传送到他们希望的位置。
  • Bliz检查执行此操作的外部程序。
  • 作弊者会将他们的外部程序随机化。
  • Bliz反对服务器端距离检查。
  • 作弊者反对将传送限制在允许的距离内,导致人们在空中飞行而无法飞行。
  • Bliz反对进一步的服务器端完整性检查,显然可以解决大多数问题。

  • 2)以不人道的速度使用react,有效地消除了人为的延迟。
    除非更快地给出更多的 Action ,否则这不是游戏中的问题,但这是在程序之间,因此...它们可能总是比人类更快。
  • 如果 react 时间通常比人类快,那另一端可能是作弊者。回复和ping时间之间的差异不够大。

  • 3)自动定位确保不人道的高命中率。
  • 该玩家的命中率比第二最佳被证实的人类玩家高。

  • 示例:射击游戏XXX
  • 外部程序可以捕获玩家坐标,并通过Windows API将更正后的目标提供给游戏。

  • 4)使用其他外部帮助程序
  • 比其他玩家更好的AI

  • 例如:在线国际象棋游戏,作弊者使用国际象棋程序来帮助移动。
  • 您的玩家可以制作一个程序,该程序可以保存游戏状态,并使外部程序处理数据并进行下一步操作,然后由作弊程序加载并作为下一步操作发送。
  • 检查程序中是否有任何负载,玩家可能合法地希望储蓄以分析其程序有效性。
  • 使用优化的多芯片多线程矢量化算法,作弊者可以探索大多数或所有游戏状态。
  • 几乎不可能检查外部程序是否有帮助,可以检查外部Windows事件的生成,但是会出现很多误报。您可以尝试防止任何加载/保存作弊,但是作弊者可以在IP级别进行攻击。
  • 受到的最大保护是,使其付出的努力可能会超过任何 yield 。

  • 5)多重拳击,有些玩家可能有多台计算机协作以取得胜利

    使用多台计算机或程序实例的
  • 可以增加作弊者主实例获胜的机会,因为其他人破坏了其他玩家。

  • 示例:可能会在射击游戏中发生吗?
  • 作弊者发送诱饵或压制单位来开火或阻碍敌人的行动,而真正的玩家则以其他方式射击对方玩家或得分。
  • 难以检查,因为2个人可以从同一位置合法玩耍。
  • 如果多个播放器的计算机的MAC地址相同,则可能表示作弊,因为他们随后将在同一台PC上使用。但这甚至不是欺骗者,因为它们可能是在封闭的虚拟机中播放的。

  • 6)预计算所有游戏状态,以便作弊者可以使用最佳策略。
  • 球员如果不这样做,将选择次佳的起跑手法。

  • 示例:井字游戏
  • 可以计算所有游戏状态。 (您可以在井字游戏中这么做)。
  • 评价玩家应该在这里提供帮助,但作弊者仍然可以轻松获胜。
  • 预编译打开序列通常用于国际象棋程序。
  • 击败它的唯一方法是非常随机化的 map ,并且起始位置的状态如此之大以至于无法预先计算。

  • 7)创建新的身份击败评级。
  • 作弊者获胜后感到无聊,他们将以较低的评分为自己创建新的“玩家”以再次“获胜”。
  • 即使玩家不作弊,也会发生这种情况,他们会创建新的身份,以便击败容易的受害者。

  • 8)赢得交易
  • 2个作弊者彼此交易获胜

  • 示例:WoW战场
  • 使用外部程序来增加找到合适的对手的机会。
  • 断开连接,以避免在未与正确的对手配对时注册。即使没有作弊,断开连接也经常发生(如果您想减少这种情况,请不要玩无线或手机)。
  • 检测2个Mac地址是否以不同的身份发挥作用,并且每台Mac上只有一个获胜。

  • 9)失去连接时断开连接。

    X)未知未知数(与已知已知,未知已知,已知未知相对)
  • 总会有人发明一些我们没有想到的新作弊方式。

  • 示例:逃税
  • 总是存在漏洞,收入报告缺失或虚假,欺诈性的新扣除等。
  • 幸运的是,
  • 总是有一种方法可以找出某人是否在作弊中处于最高位置,您可以检查他们提交给程序的算法并查看其作弊行为。请注意,将要检索的程序可能是伪造的,但是测试它是否可以赢得如此巨大的成绩可能是微不足道的。
  • 更聪明的作弊者将保持在雷达之下。
  • 关于java - 自动化多人游戏中的坑洼,玩家可以使用自己的算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26521477/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com