2010-04-21 76 views
2

我想创建一个游戏,以左侧的3个绿色点和右侧的3个红色点开始,并在它们之间留出空间。终结应该有颜色切换方面。Java数组游戏 - 游戏逻辑概念

游戏的规则是,如果点旁边有一个空格,它应该可以在那里移动,如果旁边有一个相反的颜色 - 它应该能够跳过,如果有一个相反颜色背后的空间。

我的问题位于代码下方。

下面是代码:

//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

digits为0或为最大的磁盘阵列索引,就会出现问题。当digits为0时,您不能检查mellan[digits-1],并且当digits是数组的最大索引时,您无法检查mellan[digits+1]

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

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

因为Java使用短路计算对于这样的布尔运算,这种表达的第二部分将仅在第一部分的计算结果为true评估。因此,只有当digits大于0时才会访问mellan[digits-1].

显然,您还需要处理左右两个位置的位置,但同样的原则也适用于此。

+0

谢谢句法!很理解你的解释!一个侧面的问题,这是在数组中移动/切换索引的唯一方法吗? – Zopyrus 2010-04-21 13:06:51

0

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

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

谢谢您输入Tedil! – Zopyrus 2010-04-21 19:16:09

1

你可以考虑下列之一:

1)垫双方有2个绿色(或红色)点。他们将会成为障碍。

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

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

我也建议重构代码一点。您可以将验证跳转(右侧或左侧)的代码抽取到单独的方法中,该方法接收方向(+ 1/-1,更适合作为枚举)作为参数。

+0

感谢您的输入Eyal!我首先考虑了1),但是如果有另外一种方式,这会让我的阵列变得更长,我不想这样做 - 因此在这里问这里:) 我将用方法重构代码并用图形方式进行开发(MVC ),但我觉得有必要首先尽可能简单地完成游戏逻辑,并且从这一点开始对其进行更多更改。 – Zopyrus 2010-04-21 13:14:17