Я проделал здесь некоторое время для решения, но не могу найти его. Я попробовал these ones и многие другие, и я столкнулся с той же проблемой.Вызов нестатического метода (в другом классе) из статического
Я пытаюсь сделать простой текст игры, и я бегу в вопрос, где у меня есть основной класс и класс под названием «Gameboard», что у меня есть как массив, определенной как это:
static GameBoard[] gameboard = new GameBoard[9];
Теперь это работает нормально, пока я не попытаюсь изменить характеристики одного из этих объектов массива. Я буду делать:
gameboard[input].setState(2);
и конкретный экземпляр игрового поля, которые должны изменить не будет только одна: все они изменяются, когда я делаю это. Это странно. Только gameboard[**input**]
должен измениться, а не все 9 экземпляров игрового поля. Любая переменная и метод, который у меня есть, являются «статическими», но из-за основного метода (public static void main ...) все, кажется, должно быть статическим. Как мне избавиться от всего этого статического?
GameBoard Класс
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;
}
}
Основной класс (названный Game)
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();
}
}
UPDATE: текущие ответы не работают. Хотя Eclipse не понимает этого, делая GameBoard нестатическим, вызывает исключения с нулевым указателем, когда упоминается какой-либо метод в нем.
«КАЖДАЯ переменная и метод, который у меня есть, являются« статическими »» - хорошо, что это не очень хорошая идея, если вы хотите, чтобы разные экземпляры имели разные состояния. Вы понимаете, что означает 'static'? –
Ваша проблема в том, что вы пытаетесь иметь экземпляры 'static', которые являются противоречиями. 'setState' не меняет их всех, у вас есть только один набор статических переменных для обновления. – Grayson
Не полностью, хотя я изучил Java более 2 лет назад. Я не использовал Java совсем недавно, но я не помню, чтобы когда-либо учился «статический». Английский говорит мне, что «статический» неизменен, но я думаю, что это _slightly_ off, так как значение может измениться. – Bobdabiulder