我一直致力于骑士旅行问题的实施,并且在我的代码中遇到了一个小问题。
我遇到的问题是我的switch语句。我很困惑为什么在它经历了所有可能的移动之后,并且没有更多的工作,它不会像我想要的那样违约。相反,它打印出最后一块板,但保持正常运行,所以我必须取消构建。
任何帮助将不胜感激!
我的目标是让它显示“不再有可能的动作”。当它无法在其他任何地方移动时,而不是永远运行。
以下是输出的示例:它在左下角的53处停止。
1 0 41 34 3 38 23 36
42 33 2 39 44 35 46 21
7 40 43 4 19 22 37 24
32 11 6 0 26 45 20 47
0 8 0 18 5 16 25 0
10 31 12 51 14 27 48 0
53 0 9 30 17 50 15 28
0 0 52 13 0 29 0 49
BUILD STOPPED (total time: 0 seconds)
这是我的开关代码:
public class MoveKnight extends Moves {
public int[][] moveTheKnight() {
Moves switchBetweenMoves = new Moves();
switchBetweenMoves.startingLocation();
while (knight != 64) {
int randomMove = 1 + new Random().nextInt(8);
switch (randomMove) {
case 1:
switchBetweenMoves.firstMoveChoice();
break;
case 2:
switchBetweenMoves.secondMoveChoice();
break;
case 3:
switchBetweenMoves.thirdMoveChoice();
break;
case 4:
switchBetweenMoves.forthMoveChoice();
break;
case 5:
switchBetweenMoves.fifthMoveChoice();
break;
case 6:
switchBetweenMoves.sixthMoveChoice();
break;
case 7:
switchBetweenMoves.seventhMoveChoice();
break;
case 8:
switchBetweenMoves.eighthMoveChoice();
break;
default:
System.out.println("No more possible moves.");
break;
}
}
return board;
}
}
答案 0 :(得分:2)
由于int randomMove = 1 + new Random().nextInt(8);
...
此处new Random().nextInt(8)
的输出始终为0到7,因为8是独占的,因此1+new Random().nextInt(8)
总是从1到8不等!
仅当要匹配的参数与任何情况都不匹配时才执行默认情况,在这种情况下它将传递给默认值。但是,你已明确提到1到8的情况---因此,default
将不会出现!
nextInt(int n)方法用于统一获取伪随机数 在0(包括)和指定值之间分配int值 (独占),从这个随机数生成器的序列中提取。
答案 1 :(得分:1)
在这种情况下,您的switch语句中的default
案例似乎 是检查完成情况的正确位置。
相反,我会专注于你的while语句中的条件。目前,它是以下内容:
while (knight != 64) {
您还可以使用break
语句来突破您的while循环
如果我猜测,knight
的值是它所经过的平方数,顺便说一句,这就是我构建while
循环的方式
while(knight < 64)
{
if(/*you have no more moves*/)
{
System.out.println("No more possible moves.");
break;
}
//logic for moving
}
当default
与任何案例都不匹配时,您的代码只会转到randomMove
案例。
但是,您定义randomMove
int randomMove = 1 + new Random().nextInt(8);
情况永远不会是这样
答案 2 :(得分:0)
Random.nextInt(8)
生成0-7范围内的值,因为参数是 exclusive 。
你的代码加1,永远不会产生大于8的数字。
一切都按预期行事。
答案 3 :(得分:0)
Random.nextInt(int n):从这个随机数生成器的序列中返回一个伪随机,均匀分布的int值介于0(含)和指定值(不包括)之间
您的randomMove
变量在1到8之间变化。default
大小写只会在randomMove < 1
或randomMove > 8
时执行。
如果我理解你的代码,建议你改变你的条件:
while (knight != 64 && switchBetweenMoves.hasValidMoves())
当且仅当存在有效移动时,hasValidMoves才返回true,这些移动都是骑士范围内尚未被访问的移动。