我有一个蓝牙游戏应用程序,架构很像 API Demo 中的蓝牙聊天应用程序,只是不是发送消息,而是两个玩家互相发送一个“东西”来玩游戏。
为了简化,例如,两个玩家都选择枚举 {Red, Green, Blue} 之一,然后按下发送按钮通过蓝牙消息机制发送。如果两个玩家都选择了相同的枚举,他们玩的游戏就说“相同”,否则说“不一样”。对不起,你知道我为什么要隐藏这个,我希望它不会影响讨论。
枚举由按钮表示,例如
redButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
myColor = Red;
}
发送按钮就像
send.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
sendChoiceViaBluetooth();
//inside this method I used some stuff from the
//BluetoothChat API Demo to send the choice
}
如果我在发送按钮后点击不同的“颜色”按钮,我可以重新发送一个新的选择。
还有这样的judge()方法
if (myColor != null && otherColor != null){
compareColors();
showResult();
myColor = null;
otherColor =null;
}
myColor 和 otherColor 在开始时都为空,并在judge() 结束时被重置。
问题是如果我在两台设备上玩很多次都非常快,或者有时我只是不知道为什么,游戏就会不同步。即我仅从设备 A 发送颜色,设备 B 进行判断(),而不是设备 A,然后我去设备 B 并发送颜色,设备 A 进行判断,但设备 B 上没有任何内容。双方似乎都是从上届会议的“其他颜色”中做出判断。这可以继续,但有时它会在一段时间后消失。
我认为某处可能不同步,但我不知道在哪里。很多通讯方式只是来自API Demo中的BluetoothChatService.java,大部分是同步的。
有人可以指点我寻找答案的方向吗?我应该在哪里检查等?很抱歉这篇冗长的帖子,实际代码更糟,但我试图简化情况。
..................................................... ........我发现这个错误可能是由于传输丢失。假设 play A 和 B 都比较 localColor 和 remoteColor 以获得结果。如果玩家A将他的颜色发送给B但它是LOST,那么此时游戏状态是这样的:(v表示选择,x表示无)
A | B
Time 1: localColor remoteColor | localColor remoteColor
v x x x
什么都不会播放。现在如果B选择颜色并发送成功,状态变为:
A | B
Time 2: localColor remoteColor | localColor remoteColor
v v v x
只有 A 得到两个选择,所以只有 A 做一个判断(),B 什么都不做。不同步。接下来A选择一些东西,只有B做judge(),A什么也不做。
我应该怎么做才能让两个玩家保持在同一页面上?即确保其他玩家收到本地选择?