1 36 37 40 41 import java.awt.*; 42 import java.awt.event.*; 43 import java.awt.image.*; 44 import java.net.*; 45 import java.applet.*; 46 47 62 public 63 class TicTacToe extends Applet implements MouseListener { 64 67 int white; 68 69 72 int black; 73 74 77 final static int moves[] = {4, 0, 2, 6, 8, 1, 3, 5, 7}; 78 79 82 static boolean won[] = new boolean[1 << 9]; 83 static final int DONE = (1 << 9) - 1; 84 static final int OK = 0; 85 static final int WIN = 1; 86 static final int LOSE = 2; 87 static final int STALEMATE = 3; 88 89 92 static void isWon(int pos) { 93 for (int i = 0 ; i < DONE ; i++) { 94 if ((i & pos) == pos) { 95 won[i] = true; 96 } 97 } 98 } 99 100 103 static { 104 isWon((1 << 0) | (1 << 1) | (1 << 2)); 105 isWon((1 << 3) | (1 << 4) | (1 << 5)); 106 isWon((1 << 6) | (1 << 7) | (1 << 8)); 107 isWon((1 << 0) | (1 << 3) | (1 << 6)); 108 isWon((1 << 1) | (1 << 4) | (1 << 7)); 109 isWon((1 << 2) | (1 << 5) | (1 << 8)); 110 isWon((1 << 0) | (1 << 4) | (1 << 8)); 111 isWon((1 << 2) | (1 << 4) | (1 << 6)); 112 } 113 114 118 int bestMove(int white, int black) { 119 int bestmove = -1; 120 121 loop: 122 for (int i = 0 ; i < 9 ; i++) { 123 int mw = moves[i]; 124 if (((white & (1 << mw)) == 0) && ((black & (1 << mw)) == 0)) { 125 int pw = white | (1 << mw); 126 if (won[pw]) { 127 return mw; 129 } 130 for (int mb = 0 ; mb < 9 ; mb++) { 131 if (((pw & (1 << mb)) == 0) && ((black & (1 << mb)) == 0)) { 132 int pb = black | (1 << mb); 133 if (won[pb]) { 134 continue loop; 136 } 137 } 138 } 139 if (bestmove == -1) { 141 bestmove = mw; 142 } 143 } 144 } 145 if (bestmove != -1) { 146 return bestmove; 147 } 148 149 for (int i = 0 ; i < 9 ; i++) { 151 int mw = moves[i]; 152 if (((white & (1 << mw)) == 0) && ((black & (1 << mw)) == 0)) { 153 return mw; 154 } 155 } 156 157 return -1; 159 } 160 161 165 boolean yourMove(int m) { 166 if ((m < 0) || (m > 8)) { 167 return false; 168 } 169 if (((black | white) & (1 << m)) != 0) { 170 return false; 171 } 172 black |= 1 << m; 173 return true; 174 } 175 176 180 boolean myMove() { 181 if ((black | white) == DONE) { 182 return false; 183 } 184 int best = bestMove(white, black); 185 white |= 1 << best; 186 return true; 187 } 188 189 192 int status() { 193 if (won[white]) { 194 return WIN; 195 } 196 if (won[black]) { 197 return LOSE; 198 } 199 if ((black | white) == DONE) { 200 return STALEMATE; 201 } 202 return OK; 203 } 204 205 208 boolean first = true; 209 210 213 Image notImage; 214 215 218 Image crossImage; 219 220 223 public void init() { 224 notImage = getImage(getCodeBase(), "images/not.gif"); 225 crossImage = getImage(getCodeBase(), "images/cross.gif"); 226 227 addMouseListener(this); 228 } 229 230 public void destroy() { 231 removeMouseListener(this); 232 } 233 234 237 public void paint(Graphics g) { 238 Dimension d = getSize(); 239 g.setColor(Color.black); 240 int xoff = d.width / 3; 241 int yoff = d.height / 3; 242 g.drawLine(xoff, 0, xoff, d.height); 243 g.drawLine(2*xoff, 0, 2*xoff, d.height); 244 g.drawLine(0, yoff, d.width, yoff); 245 g.drawLine(0, 2*yoff, d.width, 2*yoff); 246 247 int i = 0; 248 for (int r = 0 ; r < 3 ; r++) { 249 for (int c = 0 ; c < 3 ; c++, i++) { 250 if ((white & (1 << i)) != 0) { 251 g.drawImage(notImage, c*xoff + 1, r*yoff + 1, this); 252 } else if ((black & (1 << i)) != 0) { 253 g.drawImage(crossImage, c*xoff + 1, r*yoff + 1, this); 254 } 255 } 256 } 257 } 258 259 264 public void mouseReleased(MouseEvent e) { 265 int x = e.getX(); 266 int y = e.getY(); 267 268 switch (status()) { 269 case WIN: 270 case LOSE: 271 case STALEMATE: 272 play(getCodeBase(), "audio/return.au"); 273 white = black = 0; 274 if (first) { 275 white |= 1 << (int)(Math.random() * 9); 276 } 277 first = !first; 278 repaint(); 279 return; 280 } 281 282 Dimension d = getSize(); 284 int c = (x * 3) / d.width; 285 int r = (y * 3) / d.height; 286 if (yourMove(c + r * 3)) { 287 repaint(); 288 289 switch (status()) { 290 case WIN: 291 play(getCodeBase(), "audio/yahoo1.au"); 292 break; 293 case LOSE: 294 play(getCodeBase(), "audio/yahoo2.au"); 295 break; 296 case STALEMATE: 297 break; 298 default: 299 if (myMove()) { 300 repaint(); 301 switch (status()) { 302 case WIN: 303 play(getCodeBase(), "audio/yahoo1.au"); 304 break; 305 case LOSE: 306 play(getCodeBase(), "audio/yahoo2.au"); 307 break; 308 case STALEMATE: 309 break; 310 default: 311 play(getCodeBase(), "audio/ding.au"); 312 } 313 } else { 314 play(getCodeBase(), "audio/beep.au"); 315 } 316 } 317 } else { 318 play(getCodeBase(), "audio/beep.au"); 319 } 320 } 321 322 public void mousePressed(MouseEvent e) { 323 } 324 325 public void mouseClicked(MouseEvent e) { 326 } 327 328 public void mouseEntered(MouseEvent e) { 329 } 330 331 public void mouseExited(MouseEvent e) { 332 } 333 334 public String getAppletInfo() { 335 return "TicTacToe by Arthur van Hoff"; 336 } 337 } 338 | Popular Tags |