我正在写一个Java算法,它可以让一个游戏中的六个玩家分别掷出一个骰子和最高的掷骰子等等。我已经编写了骰子滚动方法,它以<String playerName, Player player>
的形式接收玩家地图,并且让每个玩家掷骰子,其中玩家是存储游戏必需的许多玩家属性的类。努力保持一个算法,通过骰子订购玩家整齐
问题我在订购玩家时遇到了麻烦,如果两个玩家掷出相同的数字,他们会再次掷出,以便看到谁先走到另一个玩家的前面。下面是一个例子情形:
位置:播放器(数轧)
1:汤姆(5)
2:杰里(4)
= 3:插孔(3)
= 3:吉尔(3)
5:哈里(2)
6:罗恩(1)
So杰克和吉尔再次滚动。杰克掷出6分,吉尔掷出3分。杰克现在位于第三位,吉尔在第四位。
我已经开始写快速的任何策略变得看起来过于复杂,非常不整洁,难以阅读。这是由于必须检查是否有任何重复的卷筒在任何数量的卷筒上,同时以正确的顺序存储每个卷筒,如果存在重复的卷筒,允许两个或更多个位置。 任何人都可以想出一个整齐的结构,其中可以确定和存储此订单?
Player
的每个实例都有一个nextPlayer
变量,它指向后面的位置的玩家。这也可能是最好的,也存储numberRolled
在课堂上。任何滚动相同编号的玩家都可以存储在新地图中,然后再次传入rollDice
方法。
编辑
感谢安迪·特纳,这里是我的解决方案:
private Player[] playerOrder = new Player[ModelConstants.NUM_PLAYERS_PLUS_NEUTRALS];
playerOrder = getPlayerOrder();
Player[] getPlayerOrder() {
Player[] players = ModelConstants.PLAYERS.values().toArray(new Player[ModelConstants.PLAYERS.size()]);
String[] playerNames = ModelConstants.PLAYERS.keySet().toArray(new String[ModelConstants.PLAYERS.size()]);
getPlayerOrder(playerNames, players, 0, players.length);
return players;
}
void getPlayerOrder(String[] playerNames, Player[] players, int start, int end) {
// Get all players between players[start] (inclusive) and
// players[end] (exclusive) to re-roll the dice.
for (int i = start; i < end; ++i) {
players[i].setDiceNumberRolled(rollDice(playerNames[i], players[i]));
}
// Sort this portion of the array according to the number rolled.
Arrays.sort(players, start, end, new Comparator<Player>() {
@Override public int compare(Player a, Player b) {
return Integer.compare(a.getDiceNumberRolled(), b.getDiceNumberRolled());
}
});
for (int i = 0; i < playerNames.length; i++) {
playerNames[i] = HashMapUtilities.getKeyFromValue(ModelConstants.PLAYERS, players[i]);
}
// Look for players who rolled the same number.
int i = start;
while (i < end) {
// Try to find a "run" of players with the same number.
int runStart = i;
int diceNumberRolled = players[runStart].getDiceNumberRolled();
i++;
while (i < end && players[i].getDiceNumberRolled() == diceNumberRolled) {
i++;
}
if (i - runStart > 1) {
// We have found more than one player with the same dice number.
// Get all of the players with that dice number to roll again.
addMessageToLog(MessageType.INFO, "There has been a tie." , 2000);
tiedPlayers = true;
getPlayerOrder(playerNames, players, runStart, i);
tiedPlayers = false;
}
}
}
private int rollDice(String playerName, Player player) {
int numberRolled = 0;
if (player.getPlayerType().equals(PlayerType.HUMAN)) {
boolean diceRolled = false;
while (!diceRolled) {
String message = ", roll the dice";
if (tiedPlayers == true) {
message += " again.";
}
else {
message += ".";
}
String userInput = getCommand(playerName + message, "Invlaid command. Type \"Roll Dice\" or something similar.", 2000);
if (userInput.equalsIgnoreCase("Roll Dice") || userInput.equalsIgnoreCase("roll the dice") || userInput.equalsIgnoreCase("Roll")) {
numberRolled = dice.rollDice();
diceRolled = true;
}
else {
addMessageToLog(MessageType.ERROR, "Invlaid command. Type \"Roll Dice\" or something similar.", 0);
}
}
}
else {
String message = " is now rolling the dice";
if (tiedPlayers == true) {
message += " again...";
}
else {
message += "...";
}
addMessageToLog(MessageType.INFO, playerName + message, 2000);
numberRolled = dice.rollDice();
}
player.setDiceNumberRolled(numberRolled);
addMessageToLog(MessageType.SUCCESS, playerName + " rolled a " + numberRolled, 1000);
addDicePanel(numberRolled);
return numberRolled;
}
private void setPlayerOrder() {
for (int i = 0; i < playerOrder.length; i++) {
if (i == (playerOrder.length - 1)) {
playerOrder[i].setNextPlayer(playerOrder[0]);
}
else {
playerOrder[i].setNextPlayer(playerOrder[i + 1]);
}
}
activePlayer = playerOrder[0];
}
private void changePlayer() {
activePlayer = activePlayer.getNextPlayer();
}
请出示你是如何存储和基于骰子的第一辊分发代码。 –
@AndyTurner我不在我存储程序的计算机上,所以我在我的文章 – KOB
中添加了一个(未测试的)我的样本解决方案(int i = 6; i <1; i--){ ':这个for循环将永远不会执行。 –