我想创建一个游戏,左边是3个绿点,右边是3个红点,它们之间有空格。最后阶段应该有颜色切换侧。
游戏规则是,如果一个点旁边有一个空格,它应该能够移动到那里,如果它旁边有一个相反的颜色 - 它应该能够跳过,如果有一个空格在相反的颜色背后。
我的问题位于代码下方。
以下是代码:
//import mind.*;
import javax.swing.*;
import java.util.*;
import java.lang.*;
import java.awt.*;
public class Drive {
String[] middle = new String[7];
public Drive() {
int player1, player2;
boolean gameEnd, checkempty, checkempty2, enemy, enemy2;
// Gamepieces
String gr,rd,tom;
gr="G"; rd="R"; tom=" ";
// beginning of the game, endgame and the updating array
String[] begin = {gr,gr,gr,tom,rd,rd,rd};
String[] mellan = new String[7];
String[] end = {rd,rd,rd,tom,gr,gr,gr};
Scanner in = new Scanner(System.in);
while (mellan!=end) {
mellan=begin;
for(int i=0; i<mellan.length; i++) {
System.out.print(mellan[i]);
}
System.out.print(" Choose 0-6: ");
int digits = in.nextInt();
//BOOLEAN for game rules!!!
checkempty = mellan[digits+1]==tom;
checkempty2 = mellan[digits-1]==tom;
enemy = (mellan[digits]==gr && mellan[digits+1]==rd && mellan[digits+2]==tom);
enemy2 = (mellan[digits]==rd && mellan[digits-1]==gr && mellan[digits-2]==tom);
if(checkempty) {
mellan[digits+1]=mellan[digits];
mellan[digits]=tom;
} else if (checkempty2) {
mellan[digits-1]=mellan[digits];
mellan[digits]=tom;
} else if (enemy) {
mellan[digits+2]=mellan[digits];
mellan[digits]=tom;
} else if (enemy2) {
mellan[digits-2]=mellan[digits];
mellan[digits]=tom;
}
}
System.out.print("Nicely Done");
}
// Test Drive!
public static void main(String args[]) {
new Drive();
}
}
问题:
现在,它正在构成游戏逻辑。如果点不能向后移动我会完成任务。但是因为它们能够向后移动,所以当代码在数组外部检查时它会给我错误(尽管可以理解)。
我头顶上的解决方案是让数组更长,没有重要的迹象,以免得到错误。但我问是否还有另一种方式? 因为,现在的方式,我不能移动我的第一个和最后一个点尽管中间的数字应该工作!
答案 0 :(得分:3)
当digits
为0或数组的最大索引时,会出现此问题。当mellan[digits-1]
为0时,您无法检查digits
,如果mellan[digits+1]
是数组的最大索引,则无法检查digits
。
因此,您需要在尝试访问阵列之前检查这些情况。你可以尝试这样的事情:
checkempty2 = (digits > 0) && (mellan[digits-1] == tom);
因为Java使用短路评估来进行这样的布尔运算,所以只有在第一部分求值为true
时才会计算该表达式的第二部分。因此,mellan[digits-1]
仅在digits
大于0时才会被访问。
显然,你还需要处理左侧或右侧的位置2个空格,但同样的原则也适用于那里。
答案 1 :(得分:1)
您可以考虑以下其中一项:
1)用两个绿色(或红色)点填充两侧。它们将成为障碍。
2)每当检查数组的下一个/上一个位置时添加条件。
我会选择第二种方法......
我还建议稍微重构一下代码。您可以将用于验证跳转(右侧或左侧)的代码提取到单独的方法中,该方法接收方向(+ 1 / -1,更好作为枚举)作为参数。
答案 2 :(得分:0)
只需检查digits + n
是否大于或等于0(且小于mellan.length
)。
e.g:
if(digits-2 >= 0)
{
//put core here
}