多态性两个子类修改同一父变量java
我有一个帮助我的大学班级建立一个tic-tac-toe游戏。我对Java非常陌生(一周),但我已经编写了大约两年的代码。我遇到的问题是在我的父类游戏中,我有一个用于棋盘的3d阵列。为了操纵棋盘,我有两个子类,一个用于播放器,一个用于计算机播放器。然而,似乎每当计算机类或玩家类更改棋盘时,他们都在指责自己的版本,而不是父类中的共享版本。我确信这是因为我对Java中的多态性缺乏了解,所以任何建议都将不胜感激
父游戏类:
package ticTacToe;
import java.util.Scanner;
public class TicTacToe {
private String[][] NumberBoard;
protected String[][] GameBoard;
public TicTacToe() {
NumberBoard = new String[3][3];
GameBoard = new String[3][3];
int counter = 0;
for(int i=0; i<3; i++)
{
for(int k =0; k<3; k++)
{
counter++;
NumberBoard[i][k] = Integer.toString(counter);
GameBoard[i][k] = " ";
}
}
}
public void draw ( String[][] f) {
for(int i =0; i<3; i++)
{
for(int k =0; k<3; k++)
{
System.out.print(f[i][k]);
if(k<2)
System.out.print(" | ");
}
if(i<2) {
System.out.println();
System.out.print("---------");
System.out.println();
}
}
}
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
TicTacToe Game = new TicTacToe();
Player RealPerson = new Player();
Computer ComputerPlayer = new Computer();
int N = 0;
while(true) {
System.out.println();
System.out.println("PLease choose a spot to place in (0 to quit): ");
if(input.hasNextInt())
{
N = input.nextInt();
}
else
{
input.next();
System.out.println("That wasn't a number, please enter a number( 0 to quit)");
continue;
}
if(N < 0 || N > 9)
{
System.out.println("That's not a valid choice, please pick another!");
continue;
}
if (N != 0)
{
Game.GameBoard = ComputerPlayer.NormalEval(N+1);
Game.draw(Game.GameBoard);
System.out.println();
System.out.println();
System.out.println();
Game.draw(Game.GameBoard);
Game.GameBoard = RealPerson.BoardUpdater(N);
//Game.draw(Game.GameBoard);
System.out.println();
System.out.println();
System.out.println();
}
else
break;
}
input.close();
Game.draw(Game.NumberBoard);
System.out.println();
System.out.println();
}
}
儿童玩家等级:
package ticTacToe;
public class Player extends TicTacToe {
public String[][] BoardUpdater(int N) {
if(N < 4 && N >=0)
GameBoard[0][N-1] = "X" ;
if(N > 3 && N < 7)
GameBoard[1][N-4] = "X";
if(N > 6 && N <10)
GameBoard[2][N-7] = "X";
//draw(GameBoard);
return GameBoard;
}
}
儿童电脑班:
package ticTacToe;
public class Computer extends TicTacToe {
public String[][] NormalEval(int N) {
//int a = 0;
if(N < 4 && N >=0)
GameBoard[0][N-1] = "O" ;
if(N > 3 && N < 7)
GameBoard[1][N-4] = "O";
if(N > 6 && N <10)
GameBoard[2][N-7] = "O";
//this.draw(GameBoard);
return GameBoard;
//return a;
}
}
# 1 楼答案
你的继承结构被打破了,两个玩家类都不应该从游戏中扩展。问问自己,一个人是否在玩一个游戏,一个更具体的游戏版本?答:不,这意味着这个结构没有通过继承“is-a”测试
而不是使用继承,在这种情况下,您应该使用组合,其中游戏类应该是一个单独的类,两个玩家类应该是一个不同抽象父玩家类的子类,与游戏类一起,然后持有两个玩家实例(如果是两人游戏),同样,每个玩家持有对单个游戏实例。这被称为“has-a”结构