创建一个可供两个不同游戏使用的玩家类

时间:2014-12-06 14:10:04

标签: java

我必须写一些针对蛇和梯子以及tic tac toe的课程。

我正在尝试创建一个Player类,它是Player_PiecePlayer_Symbol的超类。

玩家类必须:创建玩家对象,存储玩家对象states:NameScore

Player_Piece必须将颜色和位置分配给对象,这些对象是蛇和梯子游戏板上的玩家。它还必须移动件

Player_Symbol是tic tac toe游戏的类,它分配并保持玩家符号(无论是一个或一个十字架)和位置。

我不确定我是否正确完成了这些课程,我希望对我应该改变的任何内容提出一些建议。我是java的新手,我已经被这个

抛到了深渊

玩家类

public class Player {

    private String PlayerName;

    public Player(String name) {
        PlayerName = name;
    }

    /**
     * This set method sets the name of the player.
     * 
     *  @param Takes in a String as name.
     */
    public void setName(String name) {
        this.PlayerName = name;
    }

    /**
     * This get method returns the String value of player name.
     * 
     *  @return PlayerName, a String value.
     */
    public String getName() {
        return PlayerName;
    }

}

Player_Piece Class

public class Player_Piece extends Player {
    // class constants
    // Colors for the players piece 
    public static final String BLUE = "Blue";
    public static final String RED = "red";
    public static final String YELLOW = "Yellow";
    public static final String BLACK = "Black";

    // Types for each players piece. 
    public static final String PLAYER1PIECE = "player one's piece";
    public static final String PLAYER2PIECE = "player two's piece";
    public static final String PLAYER3PIECE = "player three's piece";
    public static final String PLAYER4PIECE = "player four's piece";


    // fields
    private String color;
    private String type;
    private int row;
    private int column;

    // constructors
    /**
     * Constructs a new player piece with a colour and type at the given position.
     * @param color  The piece's color must be one of the following: BLUE, RED, YELLOW or BLACK.
     * @param type   The piece's type must either PLAYER1PIECE, PLAYER2PIECE, PLAYER3PIECE, PLAYER4PIECE.
     */
    public Player_Piece(String color, String type, int row, int column) {


        this.color  = color;
        this.type   = type;
        this.row    = row;
        this.column = column;

    }

    // methods for the class
    /**
     * Returns this players piece color. 
     * @return the color; either BLUE, RED, YELLOW or BLACK.
     */
    public String getColor() {
        return this.color;
    }

    /**
     * Returns this player piece's type.
     * @return the type; either PLAYER1PIECE, PLAYER2PIECE, PLAYER3PIECE, PLAYER4PIECE.
     */
    public String getType() {
        return this.type;
    }

    /**
     * Returns this player's piece row position.
     * @return the position of the piece.
     */
    public int getRow() {
        return this.row;
    }

    /**
     * Returns this player's piece column position.
     * @return the  position of the piece at the column
     */
    public int getColumn() {
        return this.column;
    }

    /**
     * Returns a String  of this piece.
     * @return a three letter String, such as "P1P" for player one's piece.
     */
    public String toString() {
        return this.type.substring(0, 1);
    }

    /**
     * Moves the piece to the  position.
     * 
     * @param row The row position for the piece to move to.
     * @param column The column position for the piece to move to.
     */
    public void move(int row, int column) {
        this.row    = row;
        this.column = column;


      }
}

Player_Symbol Class

public class Player_Symbol extends player {

    private String symbolChoice;
    private int[][] symbolPosition;

    public void setSymbol (String symbol) {
        this.symbolChoice = symbol;
    }

    public void setSymbolPos(int[][] position) {
        this.symbolPosition = position;
    }

    public String getSymbol() {
        return symbolChoice;
    }

    public int[][] getSymbolPos() {
        return symbolPosition;
    }

}

2 个答案:

答案 0 :(得分:1)

我不知道你对我们的答案有什么期望。但如果你想知道如何创建你的应用程序的良好结构。有一些与Java相关的要点。

  1. 继承不是那么好的模式。如果你有很多相同的属性使用它。它对于扩展一些现有组件非常有用。

  2. 重要且有用的是界面。例如,您需要方法getName,getScore,saveState等。您可以使用这些方法创建接口,然后在您的类中实现它。

  3. 封装也很重要,如果不需要保护或公开,您的属性应该是私有的。

  4. OOP - 只有在这种情况下表现良好时才使用静态属性和方法。例如,数学运算或记录库。

  5. MVC(模型视图控制器) - 您应该分离逻辑,用户界面和收集用户操作。

  6. 您还可以查看一些模式,如单身或装饰。

  7. 你写道,你是Java的新手,所以我希望你能理解它。

    将来你的应用可能会有这样的结构:

    • 从数据库表映射的实体类
    • 用于访问数据库的DAO类(CRUD操作)
    • 包含应用主要逻辑的服务类
    • 应该收集操作的控制器类 来自用户并验证数据。
    • UI - 用户界面,它取决于它是web应用程序(jsp,jstl,jsf)还是桌面应用程序(swing,fx)

    当然,有很多替代品,取决于您的要求和技术。

答案 1 :(得分:0)

继承并不是一个好主意。 Player_Piece extends Player暗示'玩家的棋子玩家',换句话说'pawn is a human'。事实上,这不是现实世界的良好代表,甚至不是最糟糕的部分;我最担心的是你引入了“代码味”。

子类结合了多个职责:名称和职位。这可能听起来完全没有问题,因为这两个责任是如此之小。将两者结合起来有什么危害?嗯,根据我的经验,每次维护噩梦都很小。重构虽然仍然很容易;你等待的时间越长,痛苦就越大。一般来说,这违反了single responsibility principle。对于这个具体案例,这就是为什么这是坏事。

寿命

姓名和职位可能有不同的寿命。位置仅对单个游戏的持续时间有意义,而名称可能在多个游戏中持续存在。这通常表明应该有两个不同的对象。

复用性

位置不仅与玩家有关,也与蛇和梯子有关。现在,位置在类Player_Piece中由两个整数属性rowcolumn实现。将这些属性移动到单独的类Position,您很快就会发现蛇和梯子也从这个类中受益。如果你不这样做,那么你很快就会发现一些代码重复; obj1.row == obj2.row && obj1.column == obj2.column将成为代码中的重复表达式。通过适当的抽象,可以将其简化为更具可读性obj1 == obj2

谈到抽象,请停止使用颜色,类型和符号的字符串;枚举更合适。