编码游戏节目,其中4名玩家猜测物品的价格。确切的价格是用户首先输入的。我设置它的方式是找到玩家猜测价格和物品确切价格之间的最小差异。具有最小差异的玩家是圆形赢家。
public static int getRoundsWon(double [] guessPrice, double exactPrice) {
double minValue = 0;
do {
try {
for (int x = 0; x < 5; x++) {
minValue = (guessPrice[x] - exactPrice);
}
} catch (NumberFormatException e) {
JOptionPane.showMessageDialog(null, "invalid");
}
} while (numRounds <=3)
我想使用线性搜索,但我不确定如何。我会做Math.min(minValue)吗?
答案 0 :(得分:1)
此代码将执行(绝对)最小差异的线性搜索,并返回获胜者的基于0的索引(根据guessPrice数组)。 绝对差异意味着差异可以是负的或正的,只考虑它的绝对值。
public static int getRoundsWon(double[] guessPrice, double exactPrice) {
//first set (temporary) the first player as the winner (and its difference as the minimum)
double minValue = Math.abs(exactPrice-guessPrice[0]);
int roundWinner = 0;
for (int k=1;k<guessPrice.length;k++) { //then check for all other players
double diff = Math.abs(exactPrice-guessPrice[k]);
if (diff<minValue) { //if we found a new minimum
minValue=diff; //store the new minimum
roundWinner=k; //and set the new temporary winner
}
}
return roundWinner; //return the actual winner
}
该方法要求guessPrice数组的长度至少为一(即至少一个元素),但由于在你的游戏中你说你有四个玩家,这应该不是问题。
答案 1 :(得分:0)
我认为在这种情况下你想要做的是存储玩家猜测与循环体中临时变量的确切价格之间的差异,然后检查该值是否小于当前最小值,在这种情况下,您将使用临时值替换最小值。我会使用一个sentinel作为最小值的初始值,比如Integer.Max_VALUE,这样玩家的猜测总是小于最小值的初始值。
// set minValue to largest possible value of double
double minValue = Double.MAX_VALUE;
for(int x = 0; x < 4; x++ ){
// set temp to difference between user's guess and exact price
double temp = Math.abs(exactValue - userGuess);
// set minValue to minimum of previous minValue or userGuess
minValue = Math.min(minValue, temp);
}
答案 2 :(得分:0)
正如您所建议的那样,我使用线性搜索,并将初始最小值设置为double的最大值,确保它将被第一个猜测价格替换。 如果猜测价格数组为空,我也会返回-1的赢家指数,让你处理错误(而不是抛出或捕捉异常)
int winnerIndex = -1;
double minDifference = Double.MAX_VALUE;
for(int i = 1; i < guessPrices.length; i++) {
double temp = guessPrices[i] - exactPrice;
if(temp < minDifference) {
minDifference = temp;
winnerIndex = i;
}
}
return winnerIndex;