我必须写一些针对蛇和梯子以及tic tac toe的课程。
我正在尝试创建一个Player类,它是Player_Piece
和Player_Symbol
的超类。
玩家类必须:创建玩家对象,存储玩家对象states:Name
,Score
。
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;
}
}
答案 0 :(得分:1)
我不知道你对我们的答案有什么期望。但如果你想知道如何创建你的应用程序的良好结构。有一些与Java相关的要点。
继承不是那么好的模式。如果你有很多相同的属性使用它。它对于扩展一些现有组件非常有用。
重要且有用的是界面。例如,您需要方法getName,getScore,saveState等。您可以使用这些方法创建接口,然后在您的类中实现它。
封装也很重要,如果不需要保护或公开,您的属性应该是私有的。
OOP - 只有在这种情况下表现良好时才使用静态属性和方法。例如,数学运算或记录库。
MVC(模型视图控制器) - 您应该分离逻辑,用户界面和收集用户操作。
您还可以查看一些模式,如单身或装饰。
你写道,你是Java的新手,所以我希望你能理解它。
将来你的应用可能会有这样的结构:
当然,有很多替代品,取决于您的要求和技术。
答案 1 :(得分:0)
继承并不是一个好主意。 Player_Piece extends Player
暗示'玩家的棋子是玩家',换句话说'pawn is a human'。事实上,这不是现实世界的良好代表,甚至不是最糟糕的部分;我最担心的是你引入了“代码味”。
子类结合了多个职责:名称和职位。这可能听起来完全没有问题,因为这两个责任是如此之小。将两者结合起来有什么危害?嗯,根据我的经验,每次维护噩梦都很小。重构虽然仍然很容易;你等待的时间越长,痛苦就越大。一般来说,这违反了single responsibility principle。对于这个具体案例,这就是为什么这是坏事。
姓名和职位可能有不同的寿命。位置仅对单个游戏的持续时间有意义,而名称可能在多个游戏中持续存在。这通常表明应该有两个不同的对象。
位置不仅与玩家有关,也与蛇和梯子有关。现在,位置在类Player_Piece
中由两个整数属性row
和column
实现。将这些属性移动到单独的类Position
,您很快就会发现蛇和梯子也从这个类中受益。如果你不这样做,那么你很快就会发现一些代码重复; obj1.row == obj2.row && obj1.column == obj2.column
将成为代码中的重复表达式。通过适当的抽象,可以将其简化为更具可读性obj1 == obj2
。
谈到抽象,请停止使用颜色,类型和符号的字符串;枚举更合适。