我已经在这里四处寻找解决方案,但是找不到。我尝试了these ones和许多其他方法,但遇到了同样的问题。
我试图制作一个简单的文字游戏,但遇到一个问题,我有一个主类和一个名为“ gameboard”的类,该类作为数组定义如下:static GameBoard[] gameboard = new GameBoard[9];
现在,这很好用,直到我尝试更改这些数组对象中单个对象的特征为止。我会做:
gameboard[input].setState(2);
并且应该更改的游戏板的特定实例将不是唯一的实例:当我这样做时,它们都将更改。有点奇怪。只有
gameboard[**input**]
应该更改,而不是所有9个游戏板实例。我拥有的每个变量和方法都是“静态”的,但是由于main方法(public static void main ...),所有内容似乎都必须是静态的。我如何摆脱所有这些静电?游戏板类
package com.name.tictactoe;
public class GameBoard {
char[] States = {'N','X','O'};
char state;
public void setState(int s){
state = States[s];
}
public char getState(){
return state;
}
}
主班(称为游戏)
package com.name.tictactoe;
import java.util.Scanner;
public class Game {
static boolean turn, win;
static GameBoard[] gameboard;
static Scanner kb = new Scanner(System.in);
static int input;
public static void main(String[] args){
gameboard = new GameBoard[9];
reset();
displayStates();
askTurn();
displayStates();
askTurn();
}
public static void askTurn() {
System.out.println();
System.out.println();
System.out.println("Where do you want to go? Use the numbers shown, where the first segment is the top and the last is the bottom - left to right.");
input = kb.nextInt();
if(input > 8){
System.out.println("Input out of bounds. Game over by default.");
try {
Thread.sleep(1000000000);} catch (InterruptedException e) {e.printStackTrace();}
}
gameboard[input].setState(2);
}
public static void reset(){
for(int i = 0; i < 9; i++){
gameboard[i].setState(0);
}
}
public static void displayStates(){
for(int i = 0; i < 9; i++){
System.out.print(gameboard[i].getState() + " ");
if(i ==2 || i ==5){
System.out.print(" II ");
}
}
System.out.println();
for(int i = 0; i < 9; i++){
System.out.print(i + " ");
if(i ==2 || i ==5){
System.out.print(" II ");
}
}
System.out.println();
}
}
更新:当前答案不起作用。尽管Eclipse并没有意识到这一点,但使GameBoard成为非静态的会导致在引用其中的任何方法时导致空指针异常。
最佳答案
static
变量属于类,而不是对象,因此,所有GameBoard
都将受到影响!
仅仅因为您使用静态方法并不意味着您无法操纵实例变量。首先,使GameBoard
类中的所有内容均为非静态(除非您确实确实需要在所有实例之间共享的某些值)。这包括实例变量和getter / setter方法。
如果您的程序专门通过main
方法工作,则将GameBoard[]
对象保持静态。然后,当您调用该方法时:
gameboard[input].setState(2);
这将仅更改索引
GameBoard
处input
的状态。编辑:
要使用内部的基本
GameBoard[]
对象实例化GameBoard
,可以在main
方法的开头执行此操作:for(int x=0; x<gameboard.length; x++) {
gameboard[x] = new GameBoard(); //Assuming you want to use the default constructor
}