Java 数组游戏-游戏逻辑概念

Posted

技术标签:

【中文标题】Java 数组游戏-游戏逻辑概念【英文标题】:Java Array Game - Game Logic Concept 【发布时间】:2011-02-10 14:04:12 【问题描述】:

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


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

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

【问题讨论】:

【参考方案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!

以上是关于Java 数组游戏-游戏逻辑概念的主要内容,如果未能解决你的问题,请参考以下文章

java游戏开发杂谈 - 有限状态机

numpy逻辑运算问题

1.10 从0开始学习Unity游戏开发--接收用户输入

java 程序逻辑控制+猜数字游戏+程序调试详解

基于状态机模型的斗地主游戏(NodeJs&SocketIO)

cocos2dx塔防游戏逻辑