Bonjour,
Je suis en train de concevoir un petit jeu Tic Tac Toe dans le but de m'exercer à utiliser les patterns, à essayer de comprendre pourquoi dans tel ou tel cas il faut les utiliser ou pas. Pour l'instant, j'en suis à me demander si le State Pattern est vraiment utile pour distinguer une case marquée par un X/O d'une case vierge. Et s'il est (utile), est-ce la bonne méthode pour l'implémenter.
Voilà les parties de codes concernées:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 public interface SquareState { public static final SquareState BLANK_STATE = new BlankState(); public static final SquareState MARKED_STATE = new MarkedState(); public void mark(Square square, Mark mark) throws IllegalStateException; }
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 public class MarkedState implements SquareState { @Override public void mark(Square square, Mark mark) throws IllegalStateException { throw new IllegalStateException(); } }
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 public class BlankState implements SquareState { @Override public void mark(Square square, Mark mark) throws IllegalStateException { square.setMark(mark); square.setState(SquareState.MARKED_STATE); } }
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 public class Square { private SquareState state = SquareState.BLANK_STATE; private Mark mark; public void mark(Mark mark) throws IllegalStateException { state.mark(this, mark); } public void setState(SquareState state) { this.state = state; } public Mark getMark() { return mark; } public void setMark(Mark mark) { this.mark = mark; } }
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 public class Player { private Mark mark; private Board board; public Player(Mark mark, Board board) { this.mark = mark; this.board = board; } public void takeTurn() { try { Point point = new Point('a', '1'); board.markSquare(point, mark); } catch (IllegalStateException e) { System.err.println("Illegal ("+board.getSquaresLeft()+")"); } } }Il y a une ligne qui me dérange, c'est le "--squaresLeft". J'aurai voulu la placer dans la méthode mark() de l'état mais il aurait alors fallu passer en paramètre le plateau à la méthode mark() que la case qui elle même l'aurait passée à celle de l'état, du coup je me suis dit que lancer une exception serait plus judicieux. Mais est-ce la bonne façon de faire, j'attends vos avis avec impatience.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 public class Board { private static final int MAX_ROWS = 3; private static final int MAX_COLUMNS = 3; private static final int MAX_SQUARES = MAX_ROWS*MAX_COLUMNS; private Map<Point, Square> squares = new HashMap<Point, Square>(); private int squaresLeft = MAX_SQUARES; public Board() { buildSquares(); } public void markSquare(Point point, Mark mark) throws IllegalStateException { Square square = getSquare(point); square.mark(mark); --squaresLeft; } public int getSquaresLeft() { return squaresLeft; } }
Merci![]()
Partager