我想知道是否有人可以帮助我,我有一个游戏,计算机生成一个随机的4位数代码,每个数字范围从0-5。然后用户猜测这段代码,计算机返回一个我打印成字符串的数组。该数组应该包含猜测中每个数字的6,正确位置的正确数字,猜测中每个数字为7,这是正确的数字,但是错误的数字,最后是5表示任何完全不正确的数字
示例,,如果代码是:0143
并且用户的猜测是:0451
数组应该是:6775
这是因为0完全正确,1和4在代码中,但是在错误的位置猜测,并且5完全不正确。此外,每个数字都在数组的单独部分中。
这是我到目前为止所做的:
for (int i = 0; i < 4; i++) {
if (combo[i] == guess[i]) {
Pegs[peg] = 6;
peg++;
}
}
for (int i = 0; i < 4; i++) {
for (int x = 0; x < 4; x++) {
if (guess[i] == combo[x] && guess[i] != combo[i]) {
Pegs[peg] = 7;
peg++;
}
}
}
for (int i = 0; i < 4; i++) {
if (Pegs[i] == 0) {
Pegs[i] = 5;
}
}
数组猜测存储用户猜测,数组组合是正确的代码,Pegs []是存储比较数组的地方,而int peg只是说明在数组中存储值的位置。这样做的问题是它并不总是正确地将数组返回到它要做的事情。
答案 0 :(得分:2)
要比较数组,只需要第一个循环,只有当同一位置的数字不相等时才应执行内循环:
for(int i = 0; i < 4; i++) {
Pegs[i]=5;
if(combo[i] == guess[i]) {
Pegs[i] = 6;
guess[i]= -1;
}
}
for(int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
if(combo[i] == guess[j]) {
Pegs[i]=7;
guess[j]= -1;
break;
}
}
}
...
答案 1 :(得分:2)
使用其他方法,如果你有
的场景,你会遇到麻烦int[] combot = new int[] {0, 1, 1, 3};
int[] guess = new int[] {0, 4, 5, 1};
因为你会得到错误的[6, 7, 7, 5]
而不是正确的[6, 7, 5, 5]
,因为你会计算你的最后一次猜测1
。
通过使用两个flags数组,一个用于完全匹配,一个用于错误猜测一个标志数组,您可以获得更好更准确的结果:
** 已修改 **我已将其还原,因为我发现对于combo = [0, 1, 1, 3]
和guess = [3, 0, 1, 5]
,它的回复不正确。
public int[] computeGuess(int[] combo, int[] guess) {
int[] result = new int[4];
Arrays.fill(result, 5); // incorrect values for all!
boolean[] exactMatches = new boolean[4]; // all initially set to false
boolean[] misplaced = new boolean[4];
for (int i = 0; i < 4; i++) {
if (combo[i] == guess[i]) {
exactMatches[i] = true;
misplaced[i] = false; // make sure we don't use this as misplaced
} else {
for (int j = 0; j < 4; j++) {
if (i != j && combo[i] == guess[j] && !exactMatches[j] && !misplaced[j]) {
misplaced[j] = true;
break;
}
}
}
}
int i = 0;
for (boolean b : exactMatches) {
if (b) {
result[i++] = 6;
}
}
for (boolean b : misplaced) {
if (b) {
result[i++] = 7;
}
}
return result;
}