【问题标题】:Comparing Arrays in Java for a Game比较游戏中的 Java 数组
【发布时间】:2013-01-06 00:49:53
【问题描述】:

我想知道是否有人可以帮助我,我有一个游戏,计算机生成一个随机的 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 只是说明在数组中存储值的位置。这样做的问题是它并不总是将数组正确地返回到它要做的事情。

【问题讨论】:

  • "数组应该是:6775"。是 6757 对吧?
  • 尝试制作一个 SCCEE 并向我们展示一些输出。

标签: java arrays


【解决方案1】:

使用其他方法,如果你有一个场景,你会遇到麻烦

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]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;
}

【讨论】:

  • 对于这种组合,您会得到错误的结果:combo: [0,1,1,3]guess = [1, 1, 5, 1]
  • 您需要两个循环才能使精确匹配成为首选!您可能也只需要一个布尔数组,我的意思是,结果已经存储了选择组合位置的原因。
  • @agim、combo = [0,1,1,3]guess = [1,1,5,1] 产生正确的结果 [6,7,5,5],因为第二个 1 是正确的,而第一个 1(猜测)指的是 @ 中的第三个987654335@。所有其他数字都是错误的(因为combo 没有三个1,也不包含5)。
  • @owlstead,真的。关于单个布尔数组的好消息。但我认为它可以找到正确的结果。
  • 如果描述正确(比较示例),结果应该是5,7,6,5。抱歉,我的意思是5,6,7,5
【解决方案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;
        }
    }
}
...

【讨论】:

  • 只有在没有其他匹配项时才分配5会使程序变得不必要地复杂
  • 你还有一个peg :)
  • 你的意思是Pegs[i]=7;?我认为i 可以。 :-)
  • 谢谢,但这并没有在 else 循环中起作用,所以即使我应该添加 7,我也永远不会添加。
  • 我尝试了您的测试数据,结果符合预期[6, 7, 7, 5]
猜你喜欢
  • 2012-10-12
  • 1970-01-01
  • 2018-04-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-10
  • 1970-01-01
相关资源
最近更新 更多