我设计了一个简单的tic tac toe游戏,这里有一些我的担忧:
在我看来,play()方法不属于Game()。如果在Player中定义它看起来更好,但我不知道如何使它在Player中工作。另外,我正在通过传递他们的身份来初始化球员。这看起来对我不对。如何解决这个问题?
/*Game class-establishes rules and determines winner */
package game.tictactoe;
public class Game {
String[] gameState = new String[9];
Player player1;
Player player2;
// updates the gamestate array with the latest move
public void updateStatus(int position, String symbol) {
gameState[position] = symbol;
}
public Game() {
player1 = new Player(1);
player2 = new Player(2);
for(int i = 0; i < 9; i++) {
gameState[i] = "";
}
}
// checks if game over. If game over, return winner or tie, else return "Game in prgress"
public String getGameStatus() {
if((gameState[0].equals(gameState[1]))
&& gameState[0].equals(gameState[2])
&& gameState[1].equals(gameState[2])
&& !gameState[0].equals("")){
return gameState[0];
}
else if((gameState[3].equals(gameState[4]))
&& gameState[3].equals(gameState[5])
&& gameState[4].equals(gameState[5])
&& !gameState[3].equals("")){
return gameState[3];
}
else if((gameState[6].equals(gameState[7]))
&& gameState[6].equals(gameState[8])
&& gameState[7].equals(gameState[8])
&& !gameState[6].equals("")){
return gameState[6];
}
else if((gameState[0].equals(gameState[3]))
&& gameState[0].equals(gameState[6])
&& gameState[3].equals(gameState[6])
&& !gameState[0].equals("")){
return gameState[0];
}
else if((gameState[1].equals(gameState[4]))
&& gameState[1].equals(gameState[7])
&& gameState[4].equals(gameState[7])
&& !gameState[1].equals("")){
return gameState[1];
}
else if((gameState[2].equals(gameState[5]))
&& gameState[2].equals(gameState[8])
&& gameState[5].equals(gameState[8])
&& !gameState[2].equals("")){
return gameState[2];
}
else if((gameState[0].equals(gameState[4]))
&& gameState[0].equals(gameState[8])
&& gameState[4].equals(gameState[8])
&& !gameState[0].equals("")){
return gameState[0];
}
else if((gameState[2].equals(gameState[4]))
&& gameState[2].equals(gameState[6])
&& gameState[4].equals(gameState[6])
&& !gameState[2].equals("")){
return gameState[2];
}
else {
for(int i=0; i < 9; i++) {
if(gameState[i].equals("")) {
return "Game in progress";
}
}
return "It's a tie!!";
}
}
public String play(int position) {
if(!player1.hasPlayed()) {
player1.played(true);
player2.played(false);
updateStatus(position,player1.getSymbol());
return player1.getSymbol();
}
else {
player2.played(true);
player1.played(false);
updateStatus(position,player2.getSymbol());
return player2.getSymbol();
}
}
}
/*Player class- Initializes the players that are in the game */
package game.tictactoe;
public class Player {
private boolean hasPlayed;
private String symbol;
private int id;
Player(int id) {
this.id = id;
if(id == 1) {
hasPlayed = false;
symbol = Symbols.X.toString();
}
else {
hasPlayed = true;
symbol = Symbols.O.toString();
}
}
public void played(boolean flag) {
hasPlayed = flag;
}
public boolean hasPlayed() {
return hasPlayed;
}
public String getSymbol() {
return symbol;
}
}
/* Symbol-Enum that represents the two symbols used in the game */
package game.tictactoe;
public enum Symbols {
X,O;
}
答案 0 :(得分:2)
从面向对象的角度处理编程解决方案的一个好方法是首先问自己“我的应用程序空间中的名词是什么?”
正如我们从1970年代的星期六早上的电视中学到的那样,名词是一个人,地点或者事物。
枚举应用程序中的所有名词应该成为您要为应用程序编写的所有类的基础。名词是对象。因此,您需要使用的对象每个都需要为它们编写的类。
在Tic Tac Toe中,名词可以是:游戏,网格,符号,玩家
在您的应用程序中枚举了名词后,您可以经常考虑与它们相关的行为。问问自己“我的名词有什么样的行为?”或“我的名词会采取什么行动?”这应该成为您编写的方法的基础。你编写的方法自然应该为他们所采用的类编写。
例如,网格可以在其中放置标记。还可以检查网格以查看玩家是否赢了。玩家可以采取行动。您可以通过问自己这样的问题来预测您想要为您的课程编写的方法。
要问自己的另一件事是“我的名词有什么特征(或属性)?”例如,游戏可以有一些游戏次数。玩家可以获得胜负。这些特征与他们的名词有“关系”,这是一个重要的线索,它们应该成为你们班级的实例领域。
我会说你走在正确的轨道上,但是你还没有走得太远,无法最大化应用程序的面向对象。它仍然过于程序化。出于这个原因,您可以预期它会很脆弱,即如果您想在不破坏应用程序的情况下进行更改,则难以修改。在坚实的物体基础上预测您的设计将有助于您将应用程序分解为小型,易于管理且可维护性更强的部件。