⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tictactoe.java

📁 这是《Java 2 简明教程(第2版)》一书配套的源代码。
💻 JAVA
字号:
import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
import java.net.*;
import java.applet.*;

public
class TicTacToe extends Applet implements MouseListener {
    int white;

    int black;

    final static int moves[] = {4, 0, 2, 6, 8, 1, 3, 5, 7};

    static boolean won[] = new boolean[1 << 9];
    static final int DONE = (1 << 9) - 1;
    static final int OK = 0;
    static final int WIN = 1;
    static final int LOSE = 2;
    static final int STALEMATE = 3;

    static void isWon(int pos) {
for (int i = 0 ; i < DONE ; i++) {
    if ((i & pos) == pos) {
won[i] = true;
    }
}
    }

    static {
isWon((1 << 0) | (1 << 1) | (1 << 2));
isWon((1 << 3) | (1 << 4) | (1 << 5));
isWon((1 << 6) | (1 << 7) | (1 << 8));
isWon((1 << 0) | (1 << 3) | (1 << 6));
isWon((1 << 1) | (1 << 4) | (1 << 7));
isWon((1 << 2) | (1 << 5) | (1 << 8));
isWon((1 << 0) | (1 << 4) | (1 << 8));
isWon((1 << 2) | (1 << 4) | (1 << 6));
    }

    int bestMove(int white, int black) {
int bestmove = -1;

      loop:
for (int i = 0 ; i < 9 ; i++) {
    int mw = moves[i];
    if (((white & (1 << mw)) == 0) && ((black & (1 << mw)) == 0)) {
int pw = white | (1 << mw);
if (won[pw]) {
    // white wins, take it!
    return mw;
}
for (int mb = 0 ; mb < 9 ; mb++) {
    if (((pw & (1 << mb)) == 0) && ((black & (1 << mb)) == 0)) {
int pb = black | (1 << mb);
if (won[pb]) {
    // black wins, take another
    continue loop;
}
    }
}
if (bestmove == -1) {
    bestmove = mw;
}
    }
}
if (bestmove != -1) {
    return bestmove;
}

for (int i = 0 ; i < 9 ; i++) {
    int mw = moves[i];
    if (((white & (1 << mw)) == 0) && ((black & (1 << mw)) == 0)) {
return mw;
    }
}

return -1;
    }

    boolean yourMove(int m) {
if ((m < 0) || (m > 8)) {
    return false;
}
if (((black | white) & (1 << m)) != 0) {
    return false;
}
black |= 1 << m;
return true;
    }

    boolean myMove() {
if ((black | white) == DONE) {
    return false;
}
int best = bestMove(white, black);
white |= 1 << best;
return true;
    }

    int status() {
if (won[white]) {
    return WIN;
}
if (won[black]) {
    return LOSE;
}
if ((black | white) == DONE) {
    return STALEMATE;
}
return OK;
    }

    boolean first = true;

    Image notImage;

    Image crossImage;

    public void init() {
notImage = getImage(getCodeBase(), "images/not.gif");
crossImage = getImage(getCodeBase(), "images/cross.gif");

addMouseListener(this);
    }

    public void destroy() {
        removeMouseListener(this);
    }

    public void paint(Graphics g) {
Dimension d = getSize();
g.setColor(Color.black);
int xoff = d.width / 3;
int yoff = d.height / 3;
g.drawLine(xoff, 0, xoff, d.height);
g.drawLine(2*xoff, 0, 2*xoff, d.height);
g.drawLine(0, yoff, d.width, yoff);
g.drawLine(0, 2*yoff, d.width, 2*yoff);

int i = 0;
for (int r = 0 ; r < 3 ; r++) {
    for (int c = 0 ; c < 3 ; c++, i++) {
if ((white & (1 << i)) != 0) {
    g.drawImage(notImage, c*xoff + 1, r*yoff + 1, this);
} else if ((black & (1 << i)) != 0) {
    g.drawImage(crossImage, c*xoff + 1, r*yoff + 1, this);
}
    }
}
    }

    public void mouseReleased(MouseEvent e) {
int x = e.getX();
int y = e.getY();

switch (status()) {
  case WIN:
  case LOSE:
  case STALEMATE:
    play(getCodeBase(), "audio/return.au");
    white = black = 0;
    if (first) {
white |= 1 << (int)(Math.random() * 9);
    }
    first = !first;
    repaint();
    return;
}

Dimension d = getSize();
int c = (x * 3) / d.width;
int r = (y * 3) / d.height;
if (yourMove(c + r * 3)) {
    repaint();

    switch (status()) {
      case WIN:
play(getCodeBase(), "audio/yahoo1.au");
break;
      case LOSE:
play(getCodeBase(), "audio/yahoo2.au");
break;
      case STALEMATE:
break;
      default:
if (myMove()) {
    repaint();
    switch (status()) {
      case WIN:
play(getCodeBase(), "audio/yahoo1.au");
break;
      case LOSE:
play(getCodeBase(), "audio/yahoo2.au");
break;
      case STALEMATE:
break;
      default:
play(getCodeBase(), "audio/ding.au");
    }
} else {
    play(getCodeBase(), "audio/beep.au");
}
    }
} else {
    play(getCodeBase(), "audio/beep.au");
}
    }

    public void mousePressed(MouseEvent e) {
    }

    public void mouseClicked(MouseEvent e) {
    }

    public void mouseEntered(MouseEvent e) {
    }

    public void mouseExited(MouseEvent e) {
    }

    public String getAppletInfo() {
return "TicTacToe by Arthur van Hoff";
    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -