public class Game extends Applet
1:
2: package tictactoe;
3:
4: import java.awt.*;
5: import java.awt.event.*;
6: import java.applet.Applet;
7:
8: public class Game extends Applet {
9:
10: public Game() {
11: players = new Player[2];
12: board = new Board(this, 3, 3);
13: messageBar = new Label("Game begin.");
14: setLayout(new BorderLayout());
15: add(board, BorderLayout.CENTER);
16: add(messageBar, BorderLayout.SOUTH);
17:
18: Panel controlPanel = new Panel();
19: Button newGameButton = new Button("New Game");
20: Choice gameTypeChoice = new Choice();
21: gameTypeChoice.addItem("human-machine");
22: gameTypeChoice.addItem("human-human");
23: gameTypeChoice.addItem("machine-machine");
24: add(controlPanel, BorderLayout.NORTH);
25: controlPanel.setLayout(new FlowLayout());
26: controlPanel.add(newGameButton);
27: controlPanel.add(gameTypeChoice);
28:
29: newGameButton.addActionListener(new ActionListener() {
30: public void actionPerformed(ActionEvent event) {
31: newGame();
32: }
33: });
34:
35: gameTypeChoice.addItemListener(new ItemListener() {
36: public void itemStateChanged(ItemEvent event) {
37: if (event !=null &&
38: event.getStateChange() == ItemEvent.SELECTED) {
39: setGameType((String) event.getItem());
40: }
41: }
42: });
43: }
44:
45: public void init() {
46: setGameType(getParameter("type"));
47: newGame();
48: }
49:
50: public void setGameType(String gameType) {
51: this.gameType = gameType;
52: }
53:
54: public void newGame() {
55: if (gameType.equals("human-human")) {
56: players[0] = new HumanPlayer(this, 1);
57: players[1] = new HumanPlayer(this, 2);
58: } else if (gameType.equals("machine-machine")) {
59: players[0] = new MachinePlayer(this, 1);
60: players[1] = new MachinePlayer(this, 2);
61: } else {
62: players[0] = new HumanPlayer(this, 1);
63: players[1] = new MachinePlayer(this, 2);
64: }
65:
66: board.reset();
67: messageBar.setText("Game begin.");
68: players[0].start();
69: players[1].start();
70: players[0].setNext(players[1]);
71: players[1].setNext(players[0]);
72: players[0].turn();
73: }
74:
75: /**
76: * return false if it's an illegal move.
77: */
78: public boolean makeMove(Move move) {
79: if (board.makeMove(move, turn.getId())) {
80: board.checkGame(turn.getId());
81: if (isOver()) {
82: int winner = board.getWinner();
83: if (winner >= 0) {
84: displayMessage("Player " + winner + " won.");
85: } else {
86: displayMessage("It's a draw");
87: }
88: for (int n = 0; n < players.length; n++)
89: players[n].interrupt();
90: }
91: return true;
92: } else {
93: return false;
94: }
95: }
96:
97: public Player getPlayer() {
98: return turn;
99: }
100:
101: public Board getBoard() {
102: return board;
103: }
104:
105: public boolean isOver() {
106: return board.isOver();
107: }
108:
109: public void displayMessage(String msg) {
110: messageBar.setText(msg);
111: }
112:
113: protected String gameType;
114: protected Player players[];
115: protected Player turn;
116: protected Board board;
117: protected Label messageBar;
118:
119:
120:
121: public static void main(String[] args) {
122: String gameType = "human-machine";
123: if (args.length > 0) {
124: gameType = args[0];
125: }
126: Frame frame = new Frame("Tic-Tac-Toe");
127: frame.setLayout(new BorderLayout());
128: Game game = new Game();
129: frame.add(game, BorderLayout.CENTER);
130: game.setGameType(gameType);
131: game.newGame();
132: frame.setSize(280, 300);
133: frame.addWindowListener(new WindowAdapter() {
134: public void windowClosing(WindowEvent e) {
135: System.exit(0);
136: }
137: });
138: frame.show();
139: }
140:
141: }
142: