我正在寫一個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循環將永遠不會執行。 –