/** * @author [email protected] On Oct.23,2004 12:00 * * TODO To change the template for this generated type comment go to Window - * Preferences - Java - Code Generation - Code and Comments */
import java.awt.*; import java.awt.event.*;
import javax.swing.*;
public class First extends JFrame {
public First() { DrawPane drawPane = new DrawPane(getBackground()); Container pane = getContentPane(); pane.add(drawPane, BorderLayout.CENTER); setSize(600, 580); //f.setExtendedState(JFrame.MAXIMIZED_BOTH); //f.setUndecorated(true); //f.setAlwaysOnTop(true); //f.setLocationByPlatform(true);
setLocation(208, 104); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //setBackground(Color.PINK); setResizable(false); setVisible(true); }
public static void main(String[] args) { new First(); } }
class DrawPane extends JPanel { private Insets insets;
final static int BLACK = -1;
final static int WHITE = 1;
private Point point = null;
private int colorStatus;
private int[][] status = null;
private int count;
private int chessNum;
private JTextArea infoText = null;
private int[][] statusW = null;
private int level=1 ;
private int whiteCount=0;
private int blackCount=0; private Color bgColor=null; public DrawPane(Color c) {
initComponent(); initChess(); bgColor=c; addMouseListener(new MouseAdapter() { public void mouseClicked(MouseEvent e) { response(e.getPoint()); } }); setFocusable(true); addKeyListener(new myKeyListener()); }
public void paintComponent(Graphics g) { super.paintComponent(g); if (insets == null) { insets = getInsets(); } //super.paintComponents(g); Graphics2D g2d = (Graphics2D) g; g2d.setColor(Color.orange); g2d.fill3DRect(50, 50, 400, 400, true); g2d.setColor(Color.RED); for (int i = 0; i < 8; i++) { for (int j = 0; j < 8; j++) { g2d.drawString(i + "", 50 * i + 75, 45); g2d.drawString(j + "", 40, 50 * j + 75); g2d.drawRect(50 + 50 * i, 50 + 50 * j, 50, 50); if (status[i][j] == BLACK) { g2d.setColor(Color.BLACK); g2d.fillOval(i * 50 + 53, j * 50 + 53, 44, 44); } if (status[i][j] == WHITE) { g2d.setColor(Color.WHITE); g2d.fillOval(i * 50 + 53, j * 50 + 53, 44, 44); } if (status[i][j] > 1) { // g2d.setColor(Color.BLUE); // g2d.drawString("" + (status[i][j] - 1), i * 50 + 75, // j * 50 + 75); g2d.drawString("X", i * 50 + 75, j * 50 + 75); }
g2d.setColor(Color.BLACK); g2d.fillOval(200, 470, 30, 30);
g2d.setColor(Color.WHITE); g2d.fillOval(300, 470, 30, 30);
g2d.setColor(bgColor); g2d.fillRect(240, 470, 60, 30); g2d.fillRect(340, 470, 60, 30); g2d.setColor(Color.RED); g2d.drawString("" + blackCount, 240, 490); g2d.drawString("" + whiteCount, 340, 490);
} } //jug(colorStatus); }
public void initComponent() { infoText = new JTextArea(); setLayout(new BorderLayout()); infoText.setEditable(false); //infoText.setBackground(Color.PINK); infoText.setForeground(Color.BLACK); JScrollPane jsp = new JScrollPane(infoText); JPanel infoPanel = new JPanel(new BorderLayout()); //infoPanel.setBackground(Color.PINK); infoPanel.add(jsp, BorderLayout.CENTER);
infoPanel.add(new JLabel(" "), BorderLayout.NORTH); infoPanel.add(new JLabel(" "), BorderLayout.SOUTH);
add(infoPanel, BorderLayout.EAST);
}
public void initChess() { chessNum = 4; count = 0; colorStatus = BLACK; status = new int[8][8]; status[3][3] = BLACK; status[4][4] = BLACK; status[3][4] = WHITE; status[4][3] = WHITE; statusW = new int[8][8]; for (int i = 0; i < 8; i++) { for (int j = 0; j < 8; j++) { statusW[i][j] = 2; } }
for (int i = 0; i < 4; i++) { statusW[i + 2][0] = 3; statusW[i + 2][1] = 1; statusW[i + 2][7] = 3; statusW[i + 2][6] = 1; statusW[0][i + 2] = 3; statusW[1][i + 2] = 1; statusW[7][i + 2] = 3; statusW[6][i + 2] = 1; } for (int i = 0; i < 2; i++) { for (int j = 0; j < 2; j++) { statusW[i][j] = 0; statusW[7 - i][j] = 0; statusW[i][7 - j] = 0; statusW[7 - i][7 - j] = 0; } } statusW[0][0] = 4; statusW[0][7] = 4; statusW[7][0] = 4; statusW[7][7] = 4;
jug(colorStatus); String msg=" F1: 级别1\n F2: 级别2\n F3: 重新开始"; infoText.setText(msg+" \n"); repaint(); }
public void response(Point p) { boolean interrupt = false; point = setPoint(p); if (point != null) { int x = point.x / 50 - 1; int y = point.y / 50 - 1;
if (check(x, y, colorStatus) > 0) {
manulChess(x, y, BLACK); if (level == 1) { autoChess(WHITE); } else { autoChess(WHITE, 2); } if (blPass()) { if (!blPass()) { repaint(); } else { interrupt = true; } } if (blOver(interrupt)) { initChess(); } }
}
}
public Point setPoint(Point p) { if (p.x < 50 || p.x > 450 || p.y < 50 || p.y > 450) { return null; } else { p.x = (p.x / 50) * 50; p.y = (p.y / 50) * 50; return p; } }
public boolean change(int i, int j, int sta) {
boolean flag = false;
//north if (j != 0) { if (sta != status[i][j - 1] && 1 == Math.abs(status[i][j - 1])) { int m = j - 1; while (status[i][j - 1] == status[i][m] && m > 0) { m--; // System.out.println(m); } if (status[i][m] == sta) { flag = true; for (int n = j - 1; n > m; n--) { status[i][n] = sta; // System.out.println("[" + i + "," + n + "]" // + status[i][n]); } } } }
//south if (j != 7) { if (sta != status[i][j + 1] && 1 == Math.abs(status[i][j + 1])) { int m = j + 1; while (status[i][j + 1] == status[i][m] && m < 7) { m++; // System.out.println(m); } if (status[i][m] == sta) { flag = true; for (int n = j + 1; n < m; n++) { status[i][n] = sta; // System.out.println("[" + i + "," + n + "]" // + status[i][n]); } }
} }
//west if (i != 0) { if (sta != status[i - 1][j] && 1 == Math.abs(status[i - 1][j])) { int m = i - 1; while (status[i - 1][j] == status[m][j] && m > 0) { m--; // System.out.println(m); } if (status[m][j] == sta) { flag = true; for (int n = i - 1; n > m; n--) { status[n][j] = sta; // System.out.println("[" + n + "," + j + "]" // + status[n][j]); } } } }
//east if (i != 7) { if (sta != status[i + 1][j] && 1 == Math.abs(status[i + 1][j])) { int m = i + 1; while (status[i + 1][j] == status[m][j] && m < 7) { m++; // System.out.println(m); } if (status[m][j] == sta) { flag = true; for (int n = i + 1; n < m; n++) { status[n][j] = sta; // System.out.println("[" + n + "," + j + "]" // + status[n][j]); } }
} }
//northwest if (j != 0 && i != 0) { if (sta != status[i - 1][j - 1] && 1 == Math.abs(status[i - 1][j - 1])) { int m = i - 1; int n = j - 1; while (status[i - 1][j - 1] == status[m][n] && m > 0 && n > 0) { m--; n--; // System.out.println("m=" + m + " n=" + n); } if (status[m][n] == sta) { flag = true; for (int x = i - 1, y = j - 1; x > m; x--, y--) { // for (int y = j - 1; y > n; y--) { status[x][y] = sta; // System.out.println("[" + x + "," + y + "]" // + status[x][y]); // }
} } } }
//southeast if (j != 7 && i != 7) { if (sta != status[i + 1][j + 1] && 1 == Math.abs(status[i + 1][j + 1])) { int m = i + 1; int n = j + 1; while (status[i + 1][j + 1] == status[m][n] && m < 7 && n < 7) { m++; n++; // System.out.println("m=" + m + " n=" + n); } if (status[m][n] == sta) { flag = true; for (int x = i + 1, y = j + 1; x < m; x++, y++) { // for (int y = j + 1; y < n; y++) { status[x][y] = sta; // System.out.println("[" + x + "," + y + "]" // + status[x][y]); // }
} } } }
//northeast if (j != 0 && i != 7) { if (sta != status[i + 1][j - 1] && 1 == Math.abs(status[i + 1][j - 1])) { int m = i + 1; int n = j - 1; while (status[i + 1][j - 1] == status[m][n] && m < 7 && n > 0) { m++; n--; // System.out.println("m=" + m + " n=" + n); } if (status[m][n] == sta) { flag = true; for (int x = i + 1, y = j - 1; x < m; x++, y--) { // for (int y = j - 1; y > n; y--) { status[x][y] = sta; // System.out.println("[" + x + "," + y + "]" // + status[x][y]); // }
} } } }
//southwest if (j != 7 && i != 0) { if (sta != status[i - 1][j + 1] && 1 == Math.abs(status[i - 1][j + 1])) { int m = i - 1; int n = j + 1; while (status[i - 1][j + 1] == status[m][n] && m > 0 && n < 7) { m--; n++; // System.out.println("m=" + m + " n=" + n); } if (status[m][n] == sta) { flag = true;
for (int x = i - 1, y = j + 1; x > m; x--, y++) { // for (int y = j + 1; y < n; y++) {
status[x][y] = sta; // System.out.println("[" + x + "," + y + "]" // + status[x][y]); //}
} } } } return flag;
}
public int check(int i, int j, int sta) {
int flag = 0; if (Math.abs(status[i][j]) == 1) { return 0; }
//north if (j != 0) { if (sta != status[i][j - 1] && 1 == Math.abs(status[i][j - 1])) { int m = j - 1; while (status[i][j - 1] == status[i][m] && m > 0) { m--; // System.out.println(m); } if (status[i][m] == sta) { flag = flag + (j - 1 - m); } } }
//south if (j != 7) { if (sta != status[i][j + 1] && 1 == Math.abs(status[i][j + 1])) { int m = j + 1; while (status[i][j + 1] == status[i][m] && m < 7) { m++; // System.out.println(m); } if (status[i][m] == sta) { flag = flag + (m - j - 1); }
} }
//west if (i != 0) { if (sta != status[i - 1][j] && 1 == Math.abs(status[i - 1][j])) { int m = i - 1; while (status[i - 1][j] == status[m][j] && m > 0) { m--; // System.out.println(m); } if (status[m][j] == sta) { flag = flag + (i - 1 - m);
} } }
//east if (i != 7) { if (sta != status[i + 1][j] && 1 == Math.abs(status[i + 1][j])) { int m = i + 1; while (status[i + 1][j] == status[m][j] && m < 7) { m++; // System.out.println(m); } if (status[m][j] == sta) { flag = flag + (m - i - 1);
}
} }
//northwest if (j != 0 && i != 0) { if (sta != status[i - 1][j - 1] && 1 == Math.abs(status[i - 1][j - 1])) { int m = i - 1; int n = j - 1; while (status[i - 1][j - 1] == status[m][n] && m > 0 && n > 0) { m--; n--; // System.out.println("m=" + m + " n=" + n); } if (status[m][n] == sta) { flag = flag + (i - 1 - m);
} } }
//southeast if (j != 7 && i != 7) { if (sta != status[i + 1][j + 1] && 1 == Math.abs(status[i + 1][j + 1])) { int m = i + 1; int n = j + 1; while (status[i + 1][j + 1] == status[m][n] && m < 7 && n < 7) { m++; n++; // System.out.println("m=" + m + " n=" + n); } if (status[m][n] == sta) { flag = flag + (m - i - 1);
} } }
//northeast if (j != 0 && i != 7) { if (sta != status[i + 1][j - 1] && 1 == Math.abs(status[i + 1][j - 1])) { int m = i + 1; int n = j - 1; while (status[i + 1][j - 1] == status[m][n] && m < 7 && n > 0) { m++; n--; // System.out.println("m=" + m + " n=" + n); } if (status[m][n] == sta) { flag = flag + (j - 1 - n);
} } }
//southwest if (j != 7 && i != 0) { if (sta != status[i - 1][j + 1] && 1 == Math.abs(status[i - 1][j + 1])) { int m = i - 1; int n = j + 1; while (status[i - 1][j + 1] == status[m][n] && m > 0 && n < 7) { m--; n++; // System.out.println("m=" + m + " n=" + n); } if (status[m][n] == sta) { flag = flag + (i - 1 - m);
} } } return flag;
}
public void release() { for (int i = 0; i < 8; i++) { for (int j = 0; j < 8; j++) { if (status[i][j] > 1) { status[i][j] = 0; } } } }
public boolean jug(int color) { //Hashtable table=new Hashtable(); int flag = 0; int isPass = 0; for (int i = 0; i < 8; i++) { for (int j = 0; j < 8; j++) { if (status[i][j] == 0) { flag = check(i, j, color); { if (flag != 0) { status[i][j] = flag + 1; isPass++; } }
} else { flag = 0; }
} } if (isPass > 0) { return true; } else { return false; }
}
public boolean blOver(boolean interrupt) { String msg = ""; whiteCount=0; blackCount=0; for (int i = 0; i < 8; i++) { for (int j = 0; j < 8; j++) { if (status[i][j] == BLACK) { blackCount++; } if (status[i][j] == WHITE) { whiteCount++; } } } if ((whiteCount + blackCount) == 64 || blackCount == 0 || whiteCount == 0 || interrupt) {
if (whiteCount > blackCount) { msg = "白方胜!白方:黑方=" + whiteCount + ":" + blackCount; } else { msg = "黑方胜!黑方:白方" + blackCount + ":" + whiteCount; } JOptionPane.showConfirmDialog(this, msg, "Game Over", JOptionPane.CLOSED_OPTION); return true; } else { return false; }
}
public boolean blPass() { if (chessNum >= 64) { return false; } if (!jug(colorStatus)) { JOptionPane.showMessageDialog(null, "pass"); colorStatus = -colorStatus; count++; infoText.append(count + ": --\n"); return true; } else { return false; } }
public void manulChess(int x, int y, int color) { if (colorStatus == color) { release(); if (status[x][y] == 0) { status[x][y] = colorStatus;
} change(x, y, colorStatus); repaint(); count++; chessNum++; String value = "" + x + "*" + y; infoText.append(count + ": " + value + "\n"); colorStatus = -colorStatus; } }
public void autoChess(int color) { if (colorStatus == color) { int flag = 0; int x = 0; int y = 0; for (int i = 0; i < 8; i++) { for (int j = 7; j >= 0; j--) { int temp = check(i, j, colorStatus); if (temp > flag) { flag = temp; x = i; y = j; } } } if (flag > 0) { if (status[x][y] == 0) { status[x][y] = color;
} change(x, y, colorStatus); repaint(); colorStatus = -colorStatus; count++; chessNum++; String value = "" + x + "*" + y; infoText.append(count + ": " + value + "\n"); } else { colorStatus = -colorStatus; } } }
public void autoChess(int color, int level) { if (colorStatus == color && level == 2) { int flag = -1; int x = -1; int y = -1; for (int i = 0; i < 8; i++) { for (int j = 7; j >= 0; j--) { if (status[i][j] == 0 && statusW[i][j] > flag) { if (check(i, j, colorStatus) > 0) { flag = statusW[i][j]; x = i; y = j; } }
} } if (flag >= 0 && x > -1 && y > -1) { if (status[x][y] == 0) { status[x][y] = color;
} change(x, y, colorStatus); repaint(); colorStatus = -colorStatus; count++; chessNum++; String value = "" + x + "*" + y; infoText.append(count + ": " + value + "\n"); } else { colorStatus = -colorStatus; } } }
class myKeyListener extends KeyAdapter { public void keyPressed(java.awt.event.KeyEvent e) { System.out.println(e.getKeyChar()); if (e.getKeyCode() == KeyEvent.VK_F5) { initChess();
} if (e.getKeyCode() == KeyEvent.VK_F1) { level = 1; initChess(); } if (e.getKeyCode() == KeyEvent.VK_F2) { level = 2; initChess(); } } } } 
|