0

我想知道是否有人可以帮助我,我有一个游戏,计算机生成一个随机的 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; 
    } 
} 

数组guess 存储用户的猜测,数组combo 是正确的代码,Pegs[] 是存储比较数组的位置,int peg 只是说明在数组中存储值的位置。这样做的问题是它并不总是将数组正确地返回到它要做的事情。

4

2 回答 2

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;
        }
    }
}
...
于 2013-01-06T00:57:18.417 回答
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用双倍计算你最后的猜测。

通过使用两个标志数组,一个用于完全匹配,一个用于错误猜测单个标志数组,您可以获得更好和准确的结果:

**已编辑** 我将其还原,因为我发现对于combo = [0, 1, 1, 3]and 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;
}
于 2013-01-06T01:30:55.577 回答