有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

多态性两个子类修改同一父变量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) 个答案

  1. # 1 楼答案

    你的继承结构被打破了,两个玩家类都不应该从游戏中扩展。问问自己,一个人是否在玩一个游戏,一个更具体的游戏版本?答:不,这意味着这个结构没有通过继承“is-a”测试

    而不是使用继承,在这种情况下,您应该使用组合,其中游戏类应该是一个单独的类,两个玩家类应该是一个不同抽象父玩家类的子类,与游戏类一起,然后持有两个玩家实例(如果是两人游戏),同样,每个玩家持有对单个游戏实例。这被称为“has-a”结构

    public class TicTacToe {
        private AbstractPlayer human = new HumanPlayer(this);
        private AbstractPlayer computer = new ComputerPlayer(this);
    
        //....
    }
    
    public class AbstractPlayer {
        private TicTacToe ticTacToe;
    
        public AbstractPlayer(TicTacToe ticTacToe) {
            this.ticTacToe = ticTacToe;
        }
    }
    
    public class HumanPlayer extends AbstractPlayer {
        public HumanPlayer(TicTacToe ticTacToe) {
            super(ticTacToe);
        }
    }