import javax.swing.*; import java.awt.*; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.awt.event.MouseMotionListener; public class MyMouseListener extends JPanel implements MouseListener { public MyMouseListener() {//棋盘类构造函数 setBackground(Color.LIGHT_GRAY);//设置背景颜色 addMouseListener(this);//将棋盘类添加到鼠标事件监听器 addMouseMotionListener(new MouseMotionListener() {//匿名内部类 @Override public void mouseMoved(MouseEvent e) {//根据鼠标的移动所在的坐标来设置鼠标光标形状 int x1 = (e.getX() - MARGIN + GRID_SPAN / 2) / GRID_SPAN;//对鼠标光标的x坐标进行转换 int y1 = (e.getY() - MARGIN + GRID_SPAN / 2) / GRID_SPAN;//对鼠标光标的y坐标进行转换 if (x1 < 0 || x1 > ROWS || y1 < 0 || y1 > COLS || GameOver || findchess(x1, y1)) { setCursor(new Cursor(Cursor.DEFAULT_CURSOR));//设置鼠标光标为默认形状 } else { setCursor(new Cursor(Cursor.HAND_CURSOR));//设置鼠标光标为手型 } } @Override public void mouseDragged(MouseEvent e) { } }); for (int i = 0; i < MARGIN * 2 + GRID_SPAN * COLS; i++) {//对board[][]赋初值 for (int j = 0; j < MARGIN * 2 + GRID_SPAN * COLS; j++) { board[i][j] = "0"; } } } public static int MARGIN = 30;//定义边距 public static int ROWS = 15;//定义行数 public static int COLS = 15;//定义列数 public static int GRID_SPAN = 35;//网格间距 Chess[] chessList = new Chess[(ROWS + 1) * (COLS + 1)];//定义一个棋子数组 String[][] board = new String[MARGIN * 2 + GRID_SPAN * COLS][MARGIN * 2 + GRID_SPAN * COLS];//声明一个字符串数组,用来判断输赢 int chessCount;//棋子数目 int xindex, yindex;//棋子的坐标索引 boolean start = true;//开始默认黑子先下 boolean GameOver = false;//定义是否游戏结束 @Override//点击 public void mouseClicked(MouseEvent e) { } @Override//鼠标按下 public void mousePressed(MouseEvent e) { if (GameOver)//游戏结束,不能按 return; String colorName = start ? "黑棋" : "白棋";//判断是什么颜色的棋子 xindex = (e.getX() - MARGIN + GRID_SPAN / 2) / GRID_SPAN;//得到棋子x坐标 yindex = (e.getY() - MARGIN + GRID_SPAN / 2) / GRID_SPAN;//得到棋子y坐标 board[xindex][yindex] = colorName;//以棋子x坐标y坐标做索引将棋子的颜色添加到board中 if (xindex < 0 || xindex > ROWS || yindex < 0 || yindex > COLS) {//棋子在棋盘外不能下, return; } else if (findchess(xindex, yindex)) {//所下位置已有棋子,不能下 return; } Chess po = new Chess(xindex, yindex, start ? Color.black : Color.WHITE);//对棋子对象进行初始化 chessList[chessCount++] = po;//将棋子对象添加到棋子数组中 repaint();//重画图型 if (win(xindex, yindex, start)) {//判断是否胜利 String msg = String.format("恭喜 %s赢了", colorName); JOptionPane.showMessageDialog(this, msg); //gameOver=true; GameOver = true; } else if (chessCount == (COLS + 1) * (ROWS + 1)) {//判断是否全部下满 String msg = String.format("恭喜 %s赢了", colorName); JOptionPane.showMessageDialog(this, msg); GameOver = true; } start = !start;//改变棋子先下棋状态 } @Override//鼠标离开 public void mouseReleased(MouseEvent e) { } @Override public void mouseEntered(MouseEvent e) { } @Override public void mouseExited(MouseEvent e) { } private boolean findchess(int index, int yindex) {//查找所在位置是否有棋子 for (Chess c : chessList) { if (c != null && c.getX() == xindex && c.getY() == yindex) return true; } return false; } @Override protected void paintComponent(Graphics g) {//画棋盘和棋子 super.paintComponent(g); for (int i = 0; i <= ROWS; i++) {//画横线 g.drawLine(MARGIN, MARGIN + i * GRID_SPAN, MARGIN + COLS * GRID_SPAN, MARGIN + i * GRID_SPAN); } for (int j = 0; j <= COLS; j++) {//画竖线 g.drawLine(MARGIN + j * GRID_SPAN, MARGIN, MARGIN + j * GRID_SPAN, MARGIN + ROWS * GRID_SPAN); } for (int i = 0; i < chessCount; i++) {//画棋子 int xpos = chessList[i].getX() * GRID_SPAN + MARGIN;//得到棋子x坐标 int ypos = chessList[i].getY() * GRID_SPAN + MARGIN;//得到棋子y坐标 g.setColor(chessList[i].getColor());//设置棋子颜色 g.fillOval(xpos - Chess.DIAMETER / 2, ypos - Chess.DIAMETER / 2, Chess.DIAMETER, Chess.DIAMETER);//画棋子 if (i == chessCount - 1) { g.setColor(Color.red);//标记最后一个棋子为红色 g.drawRect(xpos - Chess.DIAMETER / 2, ypos - Chess.DIAMETER / 2, Chess.DIAMETER, Chess.DIAMETER); } } } private boolean win(int x, int y, boolean start) {//对棋子输赢的判断 String str = start ? "黑棋" : "白棋"; //棋子所在行和列是否有五子相连的情况 for (int i = 0; i < 16; i++) { if ((board[x][i].equals(str) && board[x][i + 1].equals(str) && board[x][i + 2].equals(str) && board[x][i + 3].equals(str) && board[x][i + 4].equals(str)) || (board[i][y].equals(str) && board[i + 1][y].equals(str) && board[i + 2][y].equals(str) && board[i + 3][y].equals(str) && board[i + 4][y].equals(str))) return true; } //棋子所在撇行是否有五子相连的情况 if (x + y >= 4 && x + y <= 30) { int i = (x + y <= 19) ? x + y : x + y - 20; if (x + y <= 19) { for (int k = 0; k <= i - 4; k++) { if (board[k][i - k].equals(str) && board[k + 1][i - k - 1].equals(str) && board[k + 2][i - k - 2].equals(str) && board[k + 3][i - k - 3].equals(str) && board[k + 4][i - k - 4].equals(str)) return true; } } else { for (int k = i; k <= 15; k++) { if (board[k][20 - k].equals(str) && board[k + 1][20 - k - 1].equals(str) && board[k + 2][20 - k - 2].equals(str) && board[k + 3][20 - k - 3].equals(str) && board[k + 4][20 - k - 4].equals(str)) return true; } } } //棋子所在捺行是否有五子相连的情况 if (y - x <= 15 && x - y <= 15) { int i = (x < y) ? y - x : x - y; if (x < y) { for (int k = 0; k <= 19 - 4 - i; k++) { if (board[k][i + k].equals(str) && board[k + 1][i + k + 1].equals(str) && board[k + 2][i + k + 2].equals(str) && board[k + 3][i + k + 3].equals(str) && board[k + 4][i + k + 4].equals(str)) return true; } } else { for (int k = i; k <= 15; k++) { if (board[k][i + k].equals(str) && board[k + 1][i + k + 1].equals(str) && board[k + 2][i + k + 2].equals(str) && board[k + 3][i + k + 3].equals(str) && board[k + 4][i + k + 4].equals(str)) return true; } } } return false; } public void restartGame() {//重新开始函数 for (int i = 0; i < chessList.length; i++)//设置为初始状态 chessList[i] = null; for (int i = 0; i < MARGIN * 2 + GRID_SPAN * COLS; i++) { for (int j = 0; j < MARGIN * 2 + GRID_SPAN * COLS; j++) { board[i][j] = "0"; } } start = true; GameOver = false; chessCount = 0; repaint(); } public Dimension getPreferredSize() {//画矩形 return new Dimension(MARGIN * 2 + GRID_SPAN * COLS, MARGIN * 2 + GRID_SPAN * ROWS); } }
import java.awt.*; public class Chess { private int x;//棋子的x坐标索引 private int y;//棋子的y坐标索引 private Color color;//棋子颜色 public static int DIAMETER=30;//直径 public Chess(int x,int y,Color color){//棋子构造函数 this.x=x; this.y=y; this.color=color; } public int getX() { return x; } public int getY() { return y; } public Color getColor() { return color; } }
import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; public class Test extends JFrame { private MyMouseListener chessbord;//声明一个棋盘对象 private Panel tool; //声明一个面板对象 private Button StartButton;//声明开始按钮 public Test() {//构造函数 setTitle("单机版五子棋");//设置标题 MyButtonLister mb = new MyButtonLister();//按钮事件处理对象 tool = new Panel();//面板对象 chessbord = new MyMouseListener();//棋盘对象 StartButton = new Button("ks");//设置开始按钮 tool.setLayout(new FlowLayout(FlowLayout.CENTER));//流式布局 tool.add(StartButton); StartButton.addActionListener(mb); add(tool, BorderLayout.SOUTH);//按钮所在的位置 add(chessbord);//添加棋盘对象 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//设置关闭 pack();//自适应 } private class MyButtonLister implements ActionListener { //按钮处理事件类 @Override public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub Object obj = e.getSource();//获取事件源 if (obj == StartButton) {//事件源是重新开始按钮 System.out.println("重新开始"); chessbord.restartGame(); // } else if (obj == BackButton) {//事件源是悔棋按钮 // System.out.println("悔棋!"); // chessbord.goback(); } } } public static void main(String[] args) { Test jf=new Test();//声明框架对象 jf.setLocationRelativeTo(null);//居中显示 jf.setVisible(true);//设置为可见 } }