Java阵列游戏 - 游戏逻辑概念

时间:2010-04-21 12:27:17

标签: java arrays logic

我想创建一个游戏,左边是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();
}
}

问题
现在,它正在构成游戏逻辑。如果点不能向后移动我会完成任务。但是因为它们能够向后移动,所以当代码在数组外部检查时它会给我错误(尽管可以理解)。

我头顶上的解决方案是让数组更长,没有重要的迹象,以免得到错误。但我问是否还有另一种方式? 因为,现在的方式,我不能移动我的第一个和最后一个点尽管中间的数字应该工作!

3 个答案:

答案 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
}