public static void main(String[] args) { JFrame f = new JFrame(); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); int screenWidth = screenSize.width; int screenHeight = screenSize.height; f.setSize(screenWidth / 2, screenHeight / 2); f.setLocation(screenWidth / 4, screenHeight / 4); f.setTitle("FiveChess"); MyPanel panel = new MyPanel(); f.add(panel); f.setVisible(true); } }
class MyPanel extends JPanel { private static final int SIDELENGTH = 10; private ArrayList<Ellipse2D> squares = new ArrayList<Ellipse2D>();; private Ellipse2D current = null; JButton jb = new JButton("重新开始"); JButton jb2 = new JButton("切换先手"); boolean isBlack; boolean first = true; boolean isOver; int l = 16; int n = 20; int bx = 20; int by = 20; int[][] position = new int[n + 1][n + 1];
public void initMyPenal(){ squares = new ArrayList<Ellipse2D>(); current = null; isBlack = first; isOver = false; position = new int[n + 1][n + 1]; for(int i = 0; i <= n; i++) for(int j = 0; j <= n; j++) position[i][j] = 0; repaint(); }
public void paint(Graphics g) { super.paint(g); jb.setLocation(400,150); jb2.setLocation(400,200); g.setColor(Color.RED); g.setFont(new Font(null, Font.BOLD, 20)); g.drawString((first ? "黑" : "白")+"方下子", 400, 100); g.setColor(new Color(240, 210, 120)); g.fillRect(bx - l, by - l, l * (n + 2), l * (n + 2)); g.setColor(Color.BLACK); for (int i = 0; i <= n; i++){ g.drawLine(bx, by + i * l, bx + l * n, by + i * l); g.drawLine(bx + i * l, by, bx + i * l, by + l * n); } Graphics2D g2 = (Graphics2D)g; isBlack = first; for(Ellipse2D r : squares){ g2.setColor(isBlack ? Color.BLACK : Color.WHITE); g2.fill(r); isBlack = !isBlack; } if(isOver) { g.setColor(Color.RED); g.setFont(new Font("TimesRoman", Font.BOLD, 60)); g.drawString((isBlack ? "白" : "黑") + "方获胜", 120, 200); } }
public Ellipse2D find(Point2D p){ for(Ellipse2D r : squares) if(r.contains(p)) return r; return null; }
public void add(Point2D p) { if(p.getX() > bx - l / 2 && p.getX() < bx + l * n + l / 2 && p.getY() > by - l / 2 && p.getY() < by + l * n + l / 2){ for (int i = 0; i <= n; i++) { for (int j = 0; j <= n; j++) { if(position[i][j] == 1 || position[i][j] == -1) continue; current = new Ellipse2D.Double(bx + j * l - l / 2, by + i * l - l / 2, l, l); if (current.contains(p)) { position[i][j] = isBlack ? 1 : -1; isOver = isWin(position, isBlack, i , j) ? true : false; current.setFrame(bx + j * l - l / 2 + 1, by + i * l - l / 2 + 1, l - 2, l - 2); squares.add(current); repaint(); return; } } } } }
private class MouseHandler extends MouseAdapter{ public void mousePressed(MouseEvent event){ if(isOver) return; current = find(event.getPoint()); if(current == null) add(event.getPoint()); } }
private class MouseMotionHandler implements MouseMotionListener{ public void mouseMoved(MouseEvent event){ Rectangle r = new Rectangle(bx - l, by - l, l * (n + 2), l * (n + 2)); if(r.contains(event.getPoint())){ setCursor(Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR)); }else setCursor(Cursor.getDefaultCursor()); } public void mouseDragged(MouseEvent event){} }
public boolean isCzWin(int[][] state, boolean isBlack, int x, int y) {//判断垂直方向是否有五子连珠 int n = 0; int a = (x >= 4 ? x - 4 : 0); int b = (x <= state.length - 5 ? x + 4 : state.length - 1); for (int i = a; i <= b; i++) if (state[i][y] == (isBlack ? 1: -1)) { if (++n == 5) return true; } else n = 0; return false; }
public boolean isSpWin(int[][] state, boolean isBlack, int x, int y) {//判断水平方向是否有五子连珠 int n = 0; int a = (y >= 4 ? y - 4 : 0); int b = (y <= state[0].length - 5 ? y + 4 : state[0].length - 1); for (int i = a; i <= b; i++) if (state[x][i] == (isBlack ? 1: -1)) { if (++n == 5) return true; } else n = 0; return false; }
public boolean isZxWin(int[][] state, boolean isBlack, int x, int y) {//判断左斜方向是否有五子连珠 int n = 1, a = x, b = y; for (int i = 1; i <= 4 && a > 0 && b > 0; i++) if (state[a - 1][b - 1] == (isBlack ? 1: -1)) { n++; a--; b--; } else break; for (int i = 1; i <= 4 && x < state.length - 1 && y < state[0].length - 1; i++) if (state[x + 1][y + 1] == (isBlack ? 1: -1)) { n++; x++; y++; } else break; if (n >= 5) return true; return false; }
public boolean isYxWin(int[][] state, boolean isBlack, int x, int y) {//判断右斜方向是否有五子连珠 int n = 1, a = x, b = y; for (int i = 1; i <= 4 && a > 0 && b < state[0].length - 1; i++) if (state[a - 1][b + 1] == (isBlack ? 1: -1)) { n++; a--; b++; } else break; for (int i = 1; i <= 4 && x < state.length - 1 && y > 0; i++) if (state[x + 1][y - 1] == (isBlack ? 1: -1)) { n++; x++; y--; } else break; if (n >= 5) return true; return false; } }
} public void windowClosing(WindowEvent e) { System.exit(0); } public void windowDeactivated(WindowEvent e){} public void windowActivated(WindowEvent e){} public void windowOpened(WindowEvent e){} public void windowClosed(WindowEvent e){} public void windowIconified(WindowEvent e){} public void windowDeiconified(WindowEvent e){} } public class mywindow { public static void main(String argc []) { myframe f = new myframe(); } }