TCP - 如何在本地主机服务器上的两个玩家之间玩 java 游戏
TCP - How to play a java game between two players on localhost server
我在 java 中制作了一个名为 Two Dice Pig
的游戏。该游戏有一个简单的 GUI 界面,显示两个骰子面以及玩家得分和姓名。游戏以询问玩家姓名的简单对话消息开始,然后游戏开始。两位玩家都只与一个 GUI 界面交互,并在轮到他们时进行游戏。游戏是完全编码的。现在,我想要的是制作一个服务器 (For now I want to try it on my local server)
并且两个玩家都应该有自己的 GUI。当玩家 A 正在玩游戏时,玩家 B 不应该对界面做任何事情。我希望它清除。这是我的网络项目,但我不知道该怎么做。任何帮助将不胜感激。
Note: I want to apply the same idea as
this man applied. Just watch only for 15 seconds. Thanks!
,
你应该开始谷歌搜索 "Rest Services with Java" 或类似的东西。
您需要一些中央组件来管理您的两个 android 游戏会话的游戏状态。例如你有一个像 localhost://myService/Dice
这样的 url
会 POST
掷新的骰子。如果其他人对该资源进行了 GET
,他将能够取回您在游戏中投掷的骰子。
如果您不希望玩家能够互动,您可以禁止玩家 POST
一个新的骰子,当他不能这样做时,GUI 应该以某种方式反映这一点。也许在你发布一个骰子或类似的东西后禁用按钮。
还有更多内容,但这应该可以帮助您入门。
https://docs.oracle.com/javaee/6/tutorial/doc/gilik.html
上面 url 中的重要代码部分是这样的 hello world:
package com.sun.jersey.samples.helloworld.resources;
import javax.ws.rs.GET;
import javax.ws.rs.Produces;
import javax.ws.rs.Path;
// The Java class will be hosted at the URI path "/helloworld"
@Path("/helloworld")
public class HelloWorldResource {
// The Java method will process HTTP GET requests
@GET
// The Java method will produce content identified by the MIME Media
// type "text/plain"
@Produces("text/plain")
public String getClichedMessage() {
// Return some cliched textual content
return "Hello World";
}
}
制作一款多人游戏并非易事。准备好重写大部分代码,因为您似乎从一开始就没有考虑过编写多人游戏代码。这里有两种不同的策略:
方法一:哑客户端
大部分游戏逻辑应该在服务器中完成。客户端只显示服务器告诉他们的内容。他们还向服务器发送命令以更改游戏状态。
示例:
- 玩家 X 点击掷骰子按钮。
- 客户端 X 向服务器发送
roll
命令
- 服务器检查是否轮到玩家 X,return如果不是则报错。
- 服务器掷骰子。假设它的 3.
- 服务器将轮次改为 Y。
- 服务器向所有客户端发送消息说骰子是 3,轮到 Y。
基本上服务器等待玩家的命令并按顺序执行。更新世界并向所有客户端广播新世界。客户端只是等待从服务器获取更新并将它们显示给用户。
方法二:锁步模拟
大部分游戏逻辑都是在客户端和服务器中完成的,只是在它们之间进行调解以传达命令。仅传输命令并在每个客户端中模拟状态。您应该非常小心,不要出现同步错误(命令可能会延迟交付或可能发生其他事情)。您应该确保在相同状态下在每个客户端应用命令。例如,随机种子应该相同,因此随机函数将 return 在两个客户端中具有相同的值。
示例:
- 玩家 X 点击掷骰子。
- 客户 X 自己掷骰子,假设结果是 4
- 客户端 X 将向服务器发送滚动命令。
- 服务器向客户端Y广播滚动命令。
- 客户端Y收到滚动命令。
- 客户端 Y 将掷骰子,结果应该是 4(您的代码应该以一致的方式在所有客户端中提供相同的结果)
我在 java 中制作了一个名为 Two Dice Pig
的游戏。该游戏有一个简单的 GUI 界面,显示两个骰子面以及玩家得分和姓名。游戏以询问玩家姓名的简单对话消息开始,然后游戏开始。两位玩家都只与一个 GUI 界面交互,并在轮到他们时进行游戏。游戏是完全编码的。现在,我想要的是制作一个服务器 (For now I want to try it on my local server)
并且两个玩家都应该有自己的 GUI。当玩家 A 正在玩游戏时,玩家 B 不应该对界面做任何事情。我希望它清除。这是我的网络项目,但我不知道该怎么做。任何帮助将不胜感激。
Note: I want to apply the same idea as
this man applied. Just watch only for 15 seconds. Thanks!
,
你应该开始谷歌搜索 "Rest Services with Java" 或类似的东西。
您需要一些中央组件来管理您的两个 android 游戏会话的游戏状态。例如你有一个像 localhost://myService/Dice
这样的 url
会 POST
掷新的骰子。如果其他人对该资源进行了 GET
,他将能够取回您在游戏中投掷的骰子。
如果您不希望玩家能够互动,您可以禁止玩家 POST
一个新的骰子,当他不能这样做时,GUI 应该以某种方式反映这一点。也许在你发布一个骰子或类似的东西后禁用按钮。
还有更多内容,但这应该可以帮助您入门。
https://docs.oracle.com/javaee/6/tutorial/doc/gilik.html
上面 url 中的重要代码部分是这样的 hello world:
package com.sun.jersey.samples.helloworld.resources;
import javax.ws.rs.GET;
import javax.ws.rs.Produces;
import javax.ws.rs.Path;
// The Java class will be hosted at the URI path "/helloworld"
@Path("/helloworld")
public class HelloWorldResource {
// The Java method will process HTTP GET requests
@GET
// The Java method will produce content identified by the MIME Media
// type "text/plain"
@Produces("text/plain")
public String getClichedMessage() {
// Return some cliched textual content
return "Hello World";
}
}
制作一款多人游戏并非易事。准备好重写大部分代码,因为您似乎从一开始就没有考虑过编写多人游戏代码。这里有两种不同的策略:
方法一:哑客户端
大部分游戏逻辑应该在服务器中完成。客户端只显示服务器告诉他们的内容。他们还向服务器发送命令以更改游戏状态。
示例:
- 玩家 X 点击掷骰子按钮。
- 客户端 X 向服务器发送
roll
命令 - 服务器检查是否轮到玩家 X,return如果不是则报错。
- 服务器掷骰子。假设它的 3.
- 服务器将轮次改为 Y。
- 服务器向所有客户端发送消息说骰子是 3,轮到 Y。
基本上服务器等待玩家的命令并按顺序执行。更新世界并向所有客户端广播新世界。客户端只是等待从服务器获取更新并将它们显示给用户。
方法二:锁步模拟
大部分游戏逻辑都是在客户端和服务器中完成的,只是在它们之间进行调解以传达命令。仅传输命令并在每个客户端中模拟状态。您应该非常小心,不要出现同步错误(命令可能会延迟交付或可能发生其他事情)。您应该确保在相同状态下在每个客户端应用命令。例如,随机种子应该相同,因此随机函数将 return 在两个客户端中具有相同的值。
示例:
- 玩家 X 点击掷骰子。
- 客户 X 自己掷骰子,假设结果是 4
- 客户端 X 将向服务器发送滚动命令。
- 服务器向客户端Y广播滚动命令。
- 客户端Y收到滚动命令。
- 客户端 Y 将掷骰子,结果应该是 4(您的代码应该以一致的方式在所有客户端中提供相同的结果)