开发五子棋小游戏3.0

发布时间:2026/8/13 12:31:51
开发五子棋小游戏3.0 效果展示功能改进1、窗体画面不丢失在ChessTools类中编写drawChessBoard、drawAllChess方法并在MyFrame类中重写的paint里调用这样窗体每刷新一次棋盘、棋子就重绘一次。2、结合一维数组和二维数组实现功能创建一维数组记录落子顺序解决重复落子、悔棋问题创建二维数组记录棋子的位置重复落子、悔棋、判断输赢3、关键代码提醒实现悔棋功能时需要定义一个全局变量size来记录落子顺序MouseReleased方法中有一处代码chess[r][c] chessColor;即将chessColor赋给每个棋子这样在实现判断输赢功能时颜色相同即可转化为二维数组相等GoBangListener类中的画笔需要由MyFrame类来传递在GoBangUI中实现传递是因为该类中早已创建GoBangListener的对象和MyFrame的对象固定格式如下Graphics g mf.getGraphics(); gbl.g g;当一个类创建的对象需要在多个类当中使用时往往只在其中那一个已经创建了其他多个类的对象的类中创建对象其他需要调用该对象的类只需设置引用变量然后在创建这个对象的类中分别将该对象传给其他类中的引用变量即可,相关代码举例/*写在GoBangUI类中*/ ChessTools ct new ChessTools(); //将棋子工具类的对象传给窗体对象和监听器对象 myFrame.ct ct; gbl.ct ct;代码展示一基础版Data接口package GoBang.v1; public interface Data { final int X50,Y50,SIZE40,ROW15,COL15; }Chess类package GoBang.v1; public class Chess { int row; int col; int color; }MyFrame类继承JFrame类package GoBang.v1; import javax.swing.*; import java.awt.*; public class MyFrame extends JFrame implements Data { GoBangListener gol; ImageIcon ii new ImageIcon(D:\\谢智宁\\其他\\编程入门\\图片素材\\3865cd33e305922fcebd3c28aa422396 (1).jpeg); Override public void paint(Graphics g) { super.paint(g); g.drawImage(ii.getImage(),0,0,850,800,null); //绘制棋盘图 Color col new Color(246, 149, 56); g.setColor(col); g.fillRect(X-SIZE/2,Y-SIZE/2,COL*SIZE,ROW*SIZE); //画线 Color col1 new Color(0,0,0); g.setColor(col1); for(int i0;iCOL;i){ g.drawLine(X,Yi*SIZE,X(COL-1)*SIZE,Yi*SIZE); g.drawLine(Xi*SIZE,Y,Xi*SIZE,Y(ROW-1)*SIZE); } //画点 g.setColor(Color.black); g.fillOval(X3*SIZE-5,Y3*SIZE-5,10,10); g.fillOval(X11*SIZE-5,Y11*SIZE-5,10,10); g.fillOval(X3*SIZE-5,Y11*SIZE-5,10,10); g.fillOval(X11*SIZE-5,Y3*SIZE-5,10,10); g.fillOval(X7*SIZE-5,Y7*SIZE-5,10,10); // 绘制已经保存的棋子 调用监听器中的棋子数组 int size gol.size; Chess[] cs gol.cs; for (int i 0; i size; i) { int r cs[i].row; int c cs[i].col; int color cs[i].color; int cx c*SIZEX; int ry r*SIZEY; if (color 1) { g.setColor(Color.black); }else if (color 2) { g.setColor(Color.white); } //绘制棋子 g.fillOval(cx-SIZE/2,ry-SIZE/2,SIZE,SIZE); } } }GoBangListener类package GoBang.v1; import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; public class GoBangListener implements MouseListener, ActionListener, Data { Graphics g; int chessColor 1;//初始值为黑色1为黑2为白0为空 int size 0; //创建一个二维数组存储棋子的位置 int chess[][] new int[ROW][COL]; //创建一个一维数组保存棋子信息 Chess[] cs new Chess[225]; public void actionPerformed(ActionEvent e){ String hq e.getActionCommand(); if(hq.equals(悔棋)){ if(size 0){ JOptionPane.showMessageDialog(null,没有可悔的棋子); }else{ Chess lastChess cs[size-1];//取出最后一个子 int c lastChess.col; int r lastChess.row; chess[r][c] 0;//清空二维数组中的存储数据保证可再在此处落子 cs[size-1] null;//删除最后一颗棋子 size--; chessColor lastChess.color;//切换下子方 flushUI(); } } } public void mouseClicked(MouseEvent e) { } public void mousePressed(MouseEvent e){ } public void mouseReleased(MouseEvent e){ //获取鼠标释放处的坐标值 int x e.getX(); int y e.getY(); //将坐标值通过算法转化为行列值 int c (x-XSIZE/2)/SIZE; int r (y-YSIZE/2)/SIZE; //判断落子是否越界 if(xX-SIZE/2||cCOL||yY-SIZE/2||rROW||c0||r0){ JOptionPane.showMessageDialog(null,该区域无法落子); return; } //将行列值还原成坐标 int cx c*SIZEX; int ry r*SIZEY; if(chess[r][c]!0){ JOptionPane.showMessageDialog(null,此处已有棋子); return; } //将棋子颜色保存到二维数组中 chess[r][c] chessColor; //创建棋类对象,将棋子存储到数组中 Chess CS new Chess(); CS.row r; CS.col c; CS.color chessColor; cs[size] CS; size; //交替落子 if(chessColor 1){ g.setColor(Color.black); chessColor 2; }else if(chessColor 2){ g.setColor(Color.white); chessColor 1; } //绘制棋子 g.fillOval(cx-SIZE/2,ry-SIZE/2,SIZE,SIZE); }public void flushUI() { //绘制棋盘图 Color col new Color(246, 149, 56); g.setColor(col); g.fillRect(X - SIZE / 2, Y - SIZE / 2, COL * SIZE, ROW * SIZE); //画线 Color col1 new Color(0, 0, 0); g.setColor(col1); for (int i 0; i COL; i) { g.drawLine(X, Y i * SIZE, X (COL - 1) * SIZE, Y i * SIZE); g.drawLine(X i * SIZE, Y, X i * SIZE, Y (ROW - 1) * SIZE); } //画点 g.setColor(Color.black); g.fillOval(X 3 * SIZE - 5, Y 3 * SIZE - 5, 10, 10); g.fillOval(X 11 * SIZE - 5, Y 11 * SIZE - 5, 10, 10); g.fillOval(X 3 * SIZE - 5, Y 11 * SIZE - 5, 10, 10); g.fillOval(X 11 * SIZE - 5, Y 3 * SIZE - 5, 10, 10); g.fillOval(X 7 * SIZE - 5, Y 7 * SIZE - 5, 10, 10); // 绘制已经保存的棋子 调用监听器中的棋子数组 for (int i 0; i size; i) { int r cs[i].row; int c cs[i].col; int color cs[i].color; int cx c*SIZEX; int ry r*SIZEY; if (color 1) { g.setColor(Color.black); }else if (color 2) { g.setColor(Color.white); } //绘制棋子 g.fillOval(cx-SIZE/2,ry-SIZE/2,SIZE,SIZE); } } public void mouseEntered(MouseEvent e){ } public void mouseExited(MouseEvent e){ } }GoBangUI类package GoBang.v1; import javax.swing.*; import java.awt.*; public class GoBangUI implements Data { public void showUI(){ MyFrame myFrame new MyFrame(); myFrame.setTitle(五子棋2.0); myFrame.setSize(850,800); myFrame.setDefaultCloseOperation(3); myFrame.setLocationRelativeTo(null); myFrame.setPreferredSize(null); //将鼠标监听器绑定在窗体上 GoBangListener gbl new GoBangListener(); myFrame.addMouseListener(gbl); gbl.g myFrame.getGraphics();//将窗体中的画笔的地址传给监听器中成员变量g使得该变量也可以使用画笔的方法,必须放在窗体可视化后 myFrame.setLayout(null);// 设置布局 为null 自己指定每个组件的尺寸与位置 JButton jb new JButton(悔棋); jb.addActionListener(gbl); jb.setBackground(Color.white); jb.setBounds(XSIZE*COL,YSIZE,SIZE*2,SIZE); Font font new Font(微软雅黑,Font.BOLD,20); jb.setFont(font); myFrame.add(jb); myFrame.setVisible(true); gbl.g myFrame.getGraphics();//将窗体中的画笔的地址传给监听器中成员变量g使得该变量也可以使用画笔的方法,必须放在窗体可视化后 myFrame.gol gbl;//将监听器对象传给myFrame中的监听器成员变量确保myFrame中调用的和这里的监听器是同一个 } static void main() { GoBangUI gbui new GoBangUI(); gbui.showUI(); } }二整理升级版Data接口package GoBang.v2; public interface Data { final int X50,Y50,SIZE40,ROW15,COL15; }Chess类package GoBang.v2; public class chess { int row; int col; int color; }MyFrame类继承JFrame类package GoBang.v2; import javax.swing.*; import java.awt.*; public class MyFrame extends JFrame implements Data { ImageIcon ii new ImageIcon(D:\\谢智宁\\其他\\编程入门\\图片素材\\3865cd33e305922fcebd3c28aa422396 (1).jpeg); chessTools ct; Override public void paint(Graphics g) { super.paint(g); g.drawImage(ii.getImage(),0,0,850,800,null); ct.drawChessBoard(g); ct.drawAllChess(g); } }GoBangListener类package GoBang.v2; import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; public class GoBangListener implements MouseListener, ActionListener { chessTools ct; Graphics g; public void actionPerformed(ActionEvent e){ String ac e.getActionCommand();//获取按钮的文本 if(ac.equals(悔棋)){ ct.rebackChess(g); } //获取按钮 JButton playJbt (JButton)e.getSource(); if(ac.equals(开始对局)){ ct.startGame(g); playJbt.setText(对局结束); ct.drawChessBoard(g); }else if(ac.equals(对局结束)){ ct.gameOver(); playJbt.setText(开始对局); } } public void mouseClicked(MouseEvent e) { } public void mousePressed(MouseEvent e){ } public void mouseReleased(MouseEvent e){ //获取鼠标释放处的坐标值 int x e.getX(); int y e.getY(); ct.playChess(x,y,g); } public void mouseEntered(MouseEvent e){ } public void mouseExited(MouseEvent e){ } }ChessTools类package GoBang.v2; import javax.swing.*; import java.awt.*; public class chessTools implements Data{ //创建一个二维数组存储棋子的位置 private int chess[][] new int[ROW][COL]; //创建一个一维数组记录棋子顺序 private chess[] cs new chess[225]; private int chessColor 0;//初始值为空1为黑2为白0为空 private int size 0; //绘制棋盘图 public void drawChessBoard(Graphics g){ Color col new Color(246, 149, 56); g.setColor(col); g.fillRect(X-SIZE/2,Y-SIZE/2,COL*SIZE,ROW*SIZE); //画线 Color col1 new Color(0,0,0); g.setColor(col1); for(int i0;iCOL;i){ g.drawLine(X,Yi*SIZE,X(COL-1)*SIZE,Yi*SIZE); g.drawLine(Xi*SIZE,Y,Xi*SIZE,Y(ROW-1)*SIZE); } //画点 g.setColor(Color.black); g.fillOval(X3*SIZE-5,Y3*SIZE-5,10,10); g.fillOval(X11*SIZE-5,Y11*SIZE-5,10,10); g.fillOval(X3*SIZE-5,Y11*SIZE-5,10,10); g.fillOval(X11*SIZE-5,Y3*SIZE-5,10,10); g.fillOval(X7*SIZE-5,Y7*SIZE-5,10,10); } //开始下棋 public void startGame(Graphics g) { chessColor 1; chess new int[ROW][COL];//重新创建数组达到清空二维数组效果 cs new chess[225];//清空一维数组 size 0; drawChessBoard(g); } //结束对局 public void gameOver(){ chessColor 0;//后续无法落子 } //画所有保存的棋子 public void drawAllChess(Graphics g){ // 绘制已经保存的棋子 调用监听器中的棋子数组 for (int i 0; i size; i) { int r cs[i].row; int c cs[i].col; int color cs[i].color; int cx c*SIZEX; int ry r*SIZEY; if (color 1) { g.setColor(Color.black); }else if (color 2) { g.setColor(Color.white); } //绘制棋子 g.fillOval(cx-SIZE/2,ry-SIZE/2,SIZE,SIZE); } } public void rebackChess(Graphics g) { if (size 0) { JOptionPane.showMessageDialog(null, 没有可悔的棋子); } else { chess lastChess cs[size - 1];//取出最后一个子 int c lastChess.col; int r lastChess.row; chess[r][c] 0;//清空二维数组中的存储数据保证可再在此处落子 cs[size - 1] null;//删除最后一颗棋子 size--; chessColor lastChess.color;//切换下子方 drawChessBoard(g); drawAllChess(g); } } public boolean checkPlayChess(int x,int y){ if (chessColor 0) { JOptionPane.showMessageDialog(null, 请先开始对局); return false; } //将坐标值通过算法转化为行列值 int c (x-XSIZE/2)/SIZE; int r (y-YSIZE/2)/SIZE; //判断落子是否越界 if(xX-SIZE/2||cCOL||yY-SIZE/2||rROW||c0||r0){ JOptionPane.showMessageDialog(null,该区域无法落子); return false; } if(chess[r][c]!0){ JOptionPane.showMessageDialog(null,此处已有棋子); return false; } return true; } public void saveChessData(int r,int c){ //将棋子颜色保存到二维数组中 chess[r][c] chessColor; //创建棋类对象,将棋子存储到数组中 chess CS new chess(); CS.row r; CS.col c; CS.color chessColor; cs[size] CS; size; } public void drawChess(int c,int r,Graphics g){ //交替落子 if(chessColor 1){ g.setColor(Color.black); chessColor 2; }else if(chessColor 2){ g.setColor(Color.white); chessColor 1; } //将行列值还原成坐标 int cx c*SIZEX; int ry r*SIZEY; //绘制棋子 g.fillOval(cx-SIZE/2,ry-SIZE/2,SIZE,SIZE); } public void playChess(int x,int y,Graphics g){ //将坐标值通过算法转化为行列值 int c (x-XSIZE/2)/SIZE; int r (y-YSIZE/2)/SIZE; if(!checkPlayChess(x,y)){ return; } saveChessData(r,c);//先保存再绘制棋子不然chessColor会先改变保存的棋子颜色有误 drawChess(c,r,g); isWin(c,r); } //r,c为最后一颗落子的行列值 public int Row(int r,int c) { int count 1; //向左寻找连续的颜色相同的棋子 for (int i c - 1; i 0; i--) { if (chess[r][i] chess[r][c]) { count; }else{ break; } } //向右寻找 for (int i c 1; i COL; i) { if (chess[r][i] chess[r][c]) { count; }else{ break; } } return count; } public int Col(int r,int c){ int count 0; //向上寻找 for(int ir-1;i0;i--){ if(chess[i][c]chess[r][c]){ count; }else{ break; } } //向下寻找 for(int ir1;iROW;i){ if(chess[i][c]chess[r][c]){ count; }else{ break; } } count; return count; } // 左斜向判断 左上到右下 public int Left(int r, int c) { int count 1; //向左上寻找 for(int ir-1,jc-1;i0j0;i--,j--){ if(chess[i][j]chess[r][c]){ count; }else{ break; } } //向右下寻找 for(int ir1,jc1;iROWjCOL;i,j){ if(chess[i][j]chess[r][c]){ count; }else{ break; } } return count; } //右斜下判断 public int Right(int r,int c){ int count 1; //向右上寻找 for(int ir-1,jc1;i0jCOL;i--,j){ if(chess[i][j]chess[r][c]){ count; }else{ break; } } //向左下寻找 for(int ir1,jc-1;iROWj0;i,j--){ if(chess[i][j]chess[r][c]){ count; }else{ break; } } return count; } public boolean isWin(int c,int r){ int rc Row(r,c); int cc Col(r,c); int lc Left(r,c); int rtc Right(r,c); if(rc5||cc5||lc5||rtc5){ if(chess[r][c]1){ JOptionPane.showMessageDialog(null,黑棋胜利); chessColor0; }else { JOptionPane.showMessageDialog(null, 白棋胜利); chessColor0; } return true; }else{ return false; } } }GoBangUI类package GoBang.v2; import GoBang.v1.Data; import javax.swing.*; import java.awt.*; public class GoBangUI implements Data { ChessTools ct new ChessTools(); public void showUI(){ MyFrame myFrame new MyFrame(); myFrame.setTitle(五子棋3.0); myFrame.setSize(850,800); myFrame.setDefaultCloseOperation(3); myFrame.setLocationRelativeTo(null); myFrame.setPreferredSize(null); //将鼠标监听器绑定在窗体上 GoBangListener gbl new GoBangListener(); myFrame.addMouseListener(gbl); myFrame.setLayout(null);// 设置布局 为null 自己指定每个组件的尺寸与位置 Font font new Font(微软雅黑, Font.BOLD, 16); JButton startBtn new JButton(开始对局); startBtn.addActionListener(gbl); startBtn.setBounds(XSIZE*COL,YSIZE,SIZE*3,SIZE); startBtn.setBackground(Color.WHITE); startBtn.setFont(font); myFrame.add(startBtn); JButton jb new JButton(悔棋); jb.addActionListener(gbl); jb.setBackground(Color.white); jb.setBounds(XSIZE*COL,YSIZE*2,SIZE*3,SIZE); jb.setFont(font); myFrame.add(jb); myFrame.add(startBtn); myFrame.setVisible(true); gbl.g myFrame.getGraphics();//将窗体中的画笔的地址传给监听器中成员变量g使得该变量也可以使用画笔的方法,必须放在窗体可视化后 //将棋子工具类的对象传给窗体对象和监听器对象 myFrame.ct ct; gbl.ct ct; } static void main() { GoBangUI gbui new GoBangUI(); gbui.showUI(); } }