【问题标题】:Java Array Game - Game Logic ConceptJava 数组游戏-游戏逻辑概念
【发布时间】:2024-01-19 05:17:01
【问题描述】:

我想创建一个以左侧 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();
}
}

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

我头顶上的解决方案是使数组更长,并带有微不足道的符号,以免出现错误。但是我想问有没有别的办法? 因为现在的情况,我不能移动我的第一个和最后一个点中间的数字应该可以正常工作!

【问题讨论】:

    标签: java arrays logic


    【解决方案1】:

    digits 为 0 或数组的最大索引时会出现此问题。当digits 为0 时不能检查mellan[digits-1],当digits 是数组的最大索引时不能检查mellan[digits+1]

    因此,您需要在尝试访问阵列之前检查这些情况。你可以试试这样的:

    checkempty2 = (digits > 0) && (mellan[digits-1] == tom);
    

    因为 Java 使用 短路求值 来进行这样的布尔运算,所以只有当第一部分的计算结果为 true 时,才会计算该表达式的第二部分。所以mellan[digits-1]只有在digits大于0时才会被访问。

    显然,您还需要处理左侧或右侧的位置 2 空格,但同样的原则也适用于此。

    【讨论】:

    • 谢谢语法!非常明白你的解释!一个附带问题,这是在数组中移动/切换索引的唯一方法吗?
    【解决方案2】:

    您可以考虑以下其中一项:

    1) 用 2 个绿色(或红色)点填充两侧。它们将成为障碍。

    2) 在检查数组的下一个/上一个位置时添加条件。

    我会选择第二种方法...

    我还建议稍微重构一下代码。您可以将验证跳转(右或左)的代码提取到一个单独的方法中,该方法接收一个方向(+1/-1,最好作为枚举)作为参数。

    【讨论】:

    • 感谢您的意见 Eyal!起初我考虑过 1) 但这会使我的数组更长,如果有另一种方法我不想这样做 - 因此在这里问:) 我将使用方法重构代码并以图形方式开发它 (MVC) 但是我觉得有必要首先尽可能简单地完成游戏逻辑,然后再对其进行越来越多的修改。
    【解决方案3】:

    只需检查 digits + n 是否大于或等于 0(并且小于 mellan.length)。 例如:

    if(digits-2 >= 0)
    {
        //put core here
    }
    

    【讨论】:

    • 感谢您的意见 Tedil!