Java 五子棋人人对战和人机对战简单实现

您所在的位置:网站首页 java五子棋游戏程序设计 Java 五子棋人人对战和人机对战简单实现

Java 五子棋人人对战和人机对战简单实现

2023-08-01 02:35| 来源: 网络整理| 查看: 265

废话不多说,咱直接进入正题

 

首先,为了方便,咱们先用一个Java接口把一些全局要用的数据写到接口里,这样就不用传来传去了

package wuziqi; public interface Gobang { public static final int size = 40; // 设置格子大小为40 public static final int X = 20, Y = 20; // 设置棋盘右上角的位置 public static final int coloum = 15; //设置行数 public static final int row = 15; //设置列数 public static final int[][] array1 = new int[coloum][row]; //记录棋子位置的数组 public static final int[][] weightArray = new int[coloum][row]; //记录棋盘每个位置的权值 public static final boolean flag[] = new boolean[2]; //记录选择的模式 }

接下来,就是棋盘的实现了,由于棋盘要一开始就出现在界面上,并且要一直存在,不能消失,所以我们用重绘来画出棋盘

public void paint(Graphics g) { super.paint(g); for (int i = 0; i < coloum; i++) { g.drawLine(X, Y + size * i, X + size * (coloum - 1), Y + size * i);// 横线 //格子40 g.drawLine(X + size * i, Y, X + size * i, Y + size * (coloum - 1));// 竖线 //格子40 } }

这样我们就画好了棋盘,接下来我们要做的就是棋盘布局,加一些按钮。这里我用的是边界布局管理器(BorderLayout)把容器的的布局分为五个位置:CENTER、EAST、WEST、NORTH、SOUTH。依次对应为:上北(NORTH)、下南(SOUTH)、左西(WEST)、右东(EAST),中(CENTER)。

package wuziqi; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; import java.awt.FlowLayout; import java.awt.Graphics; import javax.swing.ButtonGroup; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JRadioButton; public class GobangMain extends JPanel implements Gobang { public static void main(String[] args) { GobangMain gm = new GobangMain(); gm.initUI(); } public void initUI() { JFrame frame = new JFrame("五子棋"); frame.setSize(780, 635); frame.setDefaultCloseOperation(3); frame.setLocationRelativeTo(null); frame.setResizable(false); frame.setLayout(new BorderLayout()); // 设置棋盘面板的背景颜色 this.setBackground(Color.LIGHT_GRAY); // 将棋盘面板添加到窗体的中间部分 frame.add(this, BorderLayout.CENTER); // 实例化JPanel面板对象,作为东边放置按钮的面板 JPanel eastPanel = new JPanel(); // 设置东边面板的布局方式为流式布局居中对齐 eastPanel.setLayout(new FlowLayout()); // 设置面板容器组件的宽度和高度 eastPanel.setPreferredSize(new Dimension(150, 0)); // 实例化单选按钮分组对象 ButtonGroup bg = new ButtonGroup(); // 定义数组,存储组件上要显示的文字信息 String[] array = { "开始新游戏", "悔棋", "认输", "对战模式:", "人人对战", "人机对战" }; for (int i = 0; i < array.length; i++) { if (i < 3) { JButton button = new JButton(array[i]); button.setPreferredSize(new Dimension(140, 80)); eastPanel.add(button); } else if (i == 3) { JLabel label = new JLabel(array[i]); eastPanel.add(label); } else { JRadioButton button = new JRadioButton(array[i]); button.setSelected(false); bg.add(button); eastPanel.add(button); } } // 将eastPanel添加到窗体上的东边 frame.add(eastPanel, BorderLayout.EAST); frame.setVisible(true); } public void paint(Graphics g) { super.paint(g); for (int i = 0; i < coloum; i++) { g.drawLine(X, Y + size * i, X + size * (coloum - 1), Y + size * i);// 横线 //格子40 g.drawLine(X + size * i, Y, X + size * i, Y + size * (coloum - 1));// 竖线 //格子40 } } }

贴上效果图:

 

界面写好了,接下来就是下棋了,因为要根据鼠标点击的位置来下棋和选择的模式进行人人对战和人机对战,所以这里我们要用到Java里面自带鼠标监(MouseAdapter)和动作监听(ActionListener),要把棋子画到棋盘上,自然还要用到画笔(Graphics)

package wuziqi; import java.awt.Color; import java.awt.Graphics; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.util.Arrays; import javax.swing.JOptionPane; public class GobangListener extends MouseAdapter implements ActionListener,Gobang{ private GobangMain gm; // 棋盘面板对象 private Graphics g; // 画笔对象 boolean cco=true; //记录下黑棋还是白棋 boolean fff=true; //记录是否能悔棋 boolean ggg=true; //记录是否能认输 private MyArrayList array; int coloum1,row1; int xx,yy,max; public GobangListener(GobangMain gm,MyArrayList array) { //从GobangMain传窗体对象和记录棋子的数组 this.gm = gm; this.array=array; } public void actionPerformed(ActionEvent e) { if (e.getActionCommand().equals("开始新游戏")) { for(int i=0;i1) { array1[coloum1][row1]=0; Chess aaa=array.get(array.getSize()-2); coloum1=aaa.coloum; row1=aaa.row; array.Delete(); cco=!cco; gm.repaint(); } } } if(flag[1]) { //人机对战悔棋 if(fff) { if(cco) { if(array.getSize()>2) { array1[xx][yy]=0; Chess aaa=array.get(array.getSize()-2); coloum1=aaa.coloum; row1=aaa.row; array.Delete(); array1[coloum1][row1]=0; Chess bbb=array.get(array.getSize()-2); xx=bbb.coloum; yy=bbb.row; array.Delete(); gm.repaint(); } } } } } if (e.getActionCommand().equals("认输")) { if(ggg) { if(cco) { JOptionPane.showMessageDialog(gm, "白棋获胜"); }else { JOptionPane.showMessageDialog(gm, "黑棋获胜"); } gm.removeMouseListener(this); fff=false; ggg=false; } } if (e.getActionCommand().equals("人人对战")) { //选择人人对战模式 flag[0]为true,flag[1]为false flag[0]=true; flag[1]=false; for(int i=0;i


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3