Java如何实现五子棋游戏
发表于:2025-01-19 作者:千家信息网编辑
千家信息网最后更新 2025年01月19日,本篇内容介绍了"Java如何实现五子棋游戏"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!简介相比之前
千家信息网最后更新 2025年01月19日Java如何实现五子棋游戏
本篇内容介绍了"Java如何实现五子棋游戏"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!
简介
相比之前,做出了以下修改:
1.新增菜单栏,将重新开始和退出的按钮移到了菜单栏;
2.可以实时显示时间(多线程);
3.下棋时可以显示当前是哪一方在下棋;
4.可以更改背景颜色;
5.可以更改先行方(默认黑子)。
结果
完整代码
1.Frame.java(主界面)
package Gobang;import javax.swing.*;import java.awt.*;import java.awt.event.*;import java.awt.image.*;//import java.applet.*;//import java.net.*;//import java.io.*;//import javax.imageio.*;public class Frame extends JFrame implements MouseListener,ActionListener{//JFrame的扩展类 //ImageIcon image; //JLayeredPane layeredPane; //JPanel jp; /*本来想用于播放背景音乐,但是没有成功,,,先暂时放弃 File f; URI uri; URL url; @SuppressWarnings("deprecation") */ private static final long serialVersionUID = 1L; public JButton AdmitDefeatButton,RegretButton;//两个按钮,各有其功能。 JLabel TimeLabel;//用来显示时间 JLabel jl1,jl2,jl3;//游戏信息 Graphics g;//画笔 BufferedImage buf; int x;//鼠标的坐标 int y; int[][] Chess = new int[20][20]; // 保存棋子,1表示黑子,2表示白子 boolean IsBlack = true; //表示当前要下的是黑子还是白子,true表示黑子,false表示白子 boolean IsFinish = false; //表示当前游戏是否结束 int xRange; int yRange; int[] chessX = new int[400];//用来保存从开始到当前的所有棋子,用于悔棋; int[] chessY = new int[400]; int countX = 0; int countY = 0; //菜单栏 JMenuBar menubar; JMenu menu; JMenu setmenu; JMenuItem RestartItem,ExitItem,IntroItem,BackgroundItem,FirstItem; //获取屏幕的宽度和高度 Toolkit kit = Toolkit.getDefaultToolkit(); Dimension screenSize = kit.getScreenSize(); int screenWidth = screenSize.width; int screenHeight = screenSize.height; public Frame() { /*插入背景图片 //layeredPane=new JLayeredPane(); //image=new ImageIcon("F:\\JAVA\\eclipse-workspace\\Gobang\\src\\1.jpg");//随便找一张图就可以看到效果。 //jp=new JPanel(); //jp.setBounds(0,0,600,600); //jl=new JLabel(image); //jl.setBounds(0,0,image.getIconWidth(),image.getIconHeight()); //jp.add(jl); //layeredPane.add(jp,JLayeredPane.DEFAULT_LAYER); //this.setLayeredPane(layeredPane); */ /*音频播放部分 try { f = new File(""); uri = f.toURI(); url = uri.toURL(); AudioClip aau; aau = Applet.newAudioClip(url); aau.loop(); //循环播放 } catch (Exception e) { e.printStackTrace(); } */ //设置标题、大小、排列方式等 this.setTitle("五子棋"); this.setSize(600,600); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setVisible(true); this.setLayout(null); int height = this.getHeight(); int width = this.getWidth(); this.setLocation(screenWidth/2-width/2, screenHeight/2-height/2); //实时显示时间,用到多线程来实时显示。 jl1 = new JLabel("北京时间"); jl1.setLocation(430, 120); jl1.setSize(80,20); this.add(jl1); TimeLabel = new JLabel(); new Thread(new Time(TimeLabel)).start();//新建一个线程 TimeLabel.setLocation(510, 120); TimeLabel.setSize(80,20); this.add(TimeLabel); //显示游戏信息,当前是谁执子; jl2 = new JLabel("游戏信息"); jl2.setLocation(430, 150); jl2.setSize(80,20); jl3 = new JLabel("黑方先行"); jl3.setLocation(510, 150); jl3.setSize(80,20); this.add(jl2); this.add(jl3); //设置背景颜色 this.getContentPane().setBackground(new Color(255, 239 ,213)); this.getContentPane().setVisible(true); //设置菜单栏 menubar = new JMenuBar();//菜单栏 menu = new JMenu("游戏操作"); RestartItem = new JMenuItem("重新开始"); ExitItem = new JMenuItem("退出"); menu.add(RestartItem); menu.add(ExitItem); menubar.add(menu); setmenu = new JMenu("设置"); IntroItem = new JMenuItem("游戏说明"); BackgroundItem = new JMenuItem("背景颜色"); FirstItem = new JMenuItem("先行方"); setmenu.add(IntroItem); setmenu.add(BackgroundItem); setmenu.add(FirstItem); menubar.add(setmenu); menubar.setBackground(new Color(249,205,173)); menubar.setVisible(true); this.setJMenuBar(menubar); //两个按钮,认输和悔棋; AdmitDefeatButton = new JButton("认输"); AdmitDefeatButton.setSize(80,40); AdmitDefeatButton.setLocation(120, 480); RegretButton = new JButton("悔棋" ); RegretButton.setSize(80,40); RegretButton.setLocation(240, 480); this.add(AdmitDefeatButton); this.add(RegretButton); /* 五个按钮添加到中间容器; panel1 = new JPanel(); panel1.setBorder(BorderFactory.createLoweredBevelBorder()); //设置边框 panel1.setLayout(new GridLayout(1,5)); panel1.add(RestartButton); panel1.add(SetButton); panel1.add(AdmitDefeatButton); panel1.add(RegretButton); panel1.add(ExitButton); this.add(panel1); panel1.setSize(460,30); panel1.setLocation(0, 460); */ this.repaint();//表示重新绘制画布,可以自动调用paint函数; //本类作为监听类,包括鼠标监听和按钮动作监听; this.addMouseListener(this); IntroItem.addActionListener(this); BackgroundItem.addActionListener(this); FirstItem.addActionListener(this); RestartItem.addActionListener(this); AdmitDefeatButton.addActionListener(this); RegretButton.addActionListener(this); ExitItem.addActionListener(this); } //画布绘制 public void paint(Graphics g) { if(g == null)//如果第一次绘制,新建一个图片,并且创建画布。 { buf = new BufferedImage(450, 450, BufferedImage.TYPE_INT_RGB); g = buf.createGraphics(); } if(g != null)// { super.paint(g);//表示在原来图像的基础上,再画图 g.setColor(new Color(249,205,173));//画笔颜色调成褐色; g.fill3DRect(20, 130, 400, 400,true);//用画笔画一个边长为400的正方形;边距为20,130 for(int i = 0; i <= 20; i++)//用画笔横竖各画19条线 { g.setColor(Color.BLACK);//画笔颜色调为黑色; g.drawLine(20,130+i*20,420,130+i*20); g.drawLine(20+i*20,130,20+i*20,530); } } for(int i=0; i<20; i++){ for (int j = 0; j < 20; j++) { //画实心黑子,直径16 if(Chess[i][j] == 1){ int tempX = i*20+12; int tempY = j*20+122; g.setColor(Color.BLACK); g.fillOval(tempX, tempY, 16, 16); g.setColor(Color.BLACK); g.drawOval(tempX, tempY, 16, 16); } //画实心白子,直径16 if(Chess[i][j] == 2){ int tempX = i*20+12; int tempY = j*20+122; g.setColor(Color.WHITE); g.fillOval(tempX, tempY, 16, 16); g.setColor(Color.WHITE); g.drawOval(tempX, tempY, 16, 16); } } } g.drawImage(buf, 0, 0,this); } public void mousePressed(MouseEvent e) { // TODO Auto-generated method stub if(!IsFinish) //判断棋局是否结束 { x = e.getX(); //获取当前鼠标点击位置 y = e.getY(); if(x >= 20 && x < 420 && y >= 130 && y<= 530)//判断鼠标是否在棋局内 { xRange = (x-20)%20; if(xRange > 10 && xRange < 20) //如果在交叉点的边长为10的范围内,就把棋子下在这; { x = (x - 20) / 20 + 1; } else { x = (x - 20) / 20; } yRange = (y-130)%20; if(yRange > 10 && yRange < 20) { y = (y - 130) / 20 + 1; } else { y = (y - 130) / 20; } if(Chess[x][y] == 0) //如果该交叉点没有被下过; { chessX[countX++] = x; //存储当前棋子的位置; chessY[countY++] = y; if(jl3.getText().equals("黑方先行")) //如果是黑子 { Chess[x][y] = 1; IsBlack = false; jl3.setText("白方先行"); } else if(jl3.getText().equals("白方先行")) { Chess[x][y] = 2; IsBlack = true; jl3.setText("黑方先行"); } this.repaint();//重新绘制画布 } if(this.isWin())//如果下棋之后赢了,弹出对话框 { if(Chess[x][y] == 1) { JOptionPane.showMessageDialog(this, "黑方胜利"); } else { JOptionPane.showMessageDialog(this, "白方胜利"); } this.IsFinish = true; //游戏结束 } } } } public boolean isWin(){ boolean flag = false; int count = 1; int color = Chess[x][y]; //判断横向是否有5个棋子相连 count = this.checkCount(1,0,color); if(count >= 5){ flag = true; }else { //判断纵向 count = this.checkCount(0,1,color); if(count >= 5){ flag = true; }else { //判断右上,左下 count = this.checkCount(1,-1,color); if(count >= 5){ flag = true; }else { //判断右下,左上 count = this.checkCount(1,1,color); if(count >= 5){ flag = true; } } } } return flag; } // 检查棋盘中的五子棋是否连成五子,xChange,yChange为相对于当前棋子位置的变化量 public int checkCount(int xChange , int yChange ,int color){ int count = 1;//统计总共有几个连着的棋子; int tempX = xChange; int tempy = yChange; //判断棋子右边有没有相同颜色的棋子; while(x + xChange >=0 && x+xChange <20 && y+yChange >=0 && y+yChange < 20 && color == Chess[x+xChange][y+yChange]) { count++; //如果有,棋子数加一 if(xChange != 0) xChange++; //如果横向方向变化,x相对位置加一 if(yChange != 0 ) { if(yChange != 0) { if(yChange > 0) //如果纵向方向增加,y相对位置加一 { yChange++; } else //如果纵向方向减小,y相对位置减一 { yChange--; } } } } xChange = tempX; yChange = tempy; //判断棋子左边有没有相同颜色的棋子; while(x-xChange >=0 && x-xChange <20 && y-yChange >=0 && y-yChange <20 && color == Chess[x-xChange][y-yChange]) { count++; if(xChange != 0) { xChange++; } if(yChange != 0) { if (yChange > 0) { yChange++; } else { yChange--; } } } return count; } //监听动作函数 //@SuppressWarnings("deprecation") public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub if(e.getActionCommand()=="重新开始")//如果点击的按钮是RestartButton,清空画板,还原设置 { if(JOptionPane.showConfirmDialog(this, "是否重新开始游戏?") == 0) { for (int i = 0; i < 20; i++) { for (int j = 0; j < 20; j++) { Chess[i][j] = 0; //清空棋盘的棋子 } } //清空下棋棋子坐标的记录 for (int i = 0; i < 400; i++) { chessX[i] = 0; chessY[i] = 0; } countX =0; countY =0; IsBlack = true; jl3.setText("黑方先行"); IsFinish = false; this.repaint(); } } if(e.getSource() == AdmitDefeatButton)//如果点击的按钮是AdmitDefeatButton,结束游戏,并提示 { if(!IsFinish) //判断棋局是否结束 { if(JOptionPane.showConfirmDialog(this, "是否确定认输?") == 0) { if(IsBlack == true) { JOptionPane.showMessageDialog(this,"白方获胜"); } else { JOptionPane.showMessageDialog(this,"黑方获胜"); } IsFinish = true; } } } if(e.getActionCommand()=="退出")//如果点击的按钮是ExitButton,退出程序 { if(JOptionPane.showConfirmDialog(this, "是否确定退出?") == 0) { System.exit(0); } } if(e.getSource() == RegretButton)///如果点击的按钮是RegretButton,悔棋一步 { if(!IsFinish) //判断棋局是否结束 { if(IsBlack == true) //如果现在是黑子要下,表示悔棋的是白子 { if(JOptionPane.showConfirmDialog(this, "白方想要悔棋,是否同意?") == 0) { int tempX = chessX[--countX]; //获取上一步白子下的位置; int tempY = chessY[--countY]; Chess[tempX][tempY] = 0; //撤回白子 IsBlack = false; //当前要下的变为白方 jl3.setText("白方先行"); } } else { if(JOptionPane.showConfirmDialog(this, "黑方想要悔棋?") == 0) { int tempX = chessX[--countX]; int tempY = chessY[--countY]; Chess[tempX][tempY] = 0; IsBlack = true; jl3.setText("黑方先行"); } } this.repaint(); //重新绘制画布 } } if(e.getActionCommand()=="游戏说明") { JDialog frame1 = new JDialog();//新建对话框 frame1.setSize(200,200); int height = frame1.getHeight(); int width = frame1.getWidth(); frame1.setLocation(screenWidth/2-width/2, screenHeight/2-height/2); JTextArea ta = new JTextArea();//新建文本框 ta.setText("双方分别使用黑白两色的棋子,下在棋盘直线与横线的交叉点上,先形成五子连线者获胜。"); ta.setEditable(false); JScrollPane jsp = new JScrollPane(ta); frame1.setTitle("规则"); frame1.getContentPane().add(jsp); //添加文本框 frame1.setModalityType(Dialog.ModalityType.APPLICATION_MODAL); // 设置模式类型 frame1.setVisible(true); } if(e.getActionCommand()=="背景颜色") { JDialog frame2 = new JDialog();//新建对话框 frame2.setSize(150,200); int height = frame2.getHeight(); int width = frame2.getWidth(); frame2.setLocation(screenWidth/2-width/2, screenHeight/2-height/2); frame2.setLayout(new GridLayout(3,2,10,10)); //三个文本框; JLabel label1 = new JLabel("Red"); JLabel label2 = new JLabel("Green"); JLabel label3 = new JLabel("Blue"); JTextField tf1 = new JTextField("255"); //tf1.setSize(80, 20); JTextField tf2 = new JTextField("239"); //tf2.setBounds(10, 40, 80, 20); JTextField tf3 = new JTextField("213"); //tf3.setBounds(10, 70, 80, 20); frame2.setTitle("设置背景颜色"); frame2.getContentPane().add(label1); frame2.getContentPane().add(tf1); // frame2.getContentPane().add(label2); frame2.getContentPane().add(tf2); frame2.getContentPane().add(label3); frame2.getContentPane().add(tf3); frame2.setModalityType(Dialog.ModalityType.APPLICATION_MODAL); // 设置模式类型 frame2.setVisible(true); //改变背景颜色 int Red =Integer.parseInt(tf1.getText()); int Green =Integer.parseInt(tf2.getText()); int Blue =Integer.parseInt(tf3.getText()); this.getContentPane().setBackground(new Color(Red,Green,Blue)); this.repaint(); } if(e.getActionCommand() == "先行方") { new FirstDialog(IsBlack,jl3);//新建对话框,改变先行方 } } public static void main(String[] args) { new Frame();} @Override public void mouseClicked(MouseEvent e) { // TODO Auto-generated method stub } @Override public void mouseReleased(MouseEvent e) { // TODO Auto-generated method stub } @Override public void mouseEntered(MouseEvent e) { // TODO Auto-generated method stub } @Override public void mouseExited(MouseEvent e) { // TODO Auto-generated method stub }}//改变先行方class FirstDialog extends JDialog implements ItemListener{ /** * */ private static final long serialVersionUID = 1L; Toolkit kit = Toolkit.getDefaultToolkit(); Dimension screenSize = kit.getScreenSize(); int screenWidth = screenSize.width; int screenHeight = screenSize.height; Boolean IsBlack; JLabel jl = new JLabel(); JRadioButton rbWhite,rbBlack; FirstDialog(Boolean IsBlack,JLabel jl) { this.IsBlack = IsBlack; this.jl = jl; this.setSize(150,200); int height = this.getHeight(); int width = this.getWidth(); this.setLocation(screenWidth/2-width/2, screenHeight/2-height/2); this.setTitle("先行方"); //一个单选组合; rbWhite = new JRadioButton("白子"); rbBlack = new JRadioButton("黑子"); this.setLayout(new FlowLayout()); this.getContentPane().add(rbWhite); this.getContentPane().add(rbBlack); // ButtonGroup bgroup = new ButtonGroup(); bgroup.add(rbWhite); bgroup.add(rbBlack); //本类做监听类 rbWhite.addItemListener(this); rbBlack.addItemListener(this); this.setModalityType(Dialog.ModalityType.APPLICATION_MODAL); // 设置模式类型 this.setVisible(true); } public void itemStateChanged(ItemEvent e) { if(rbWhite.isSelected())//选中白子时,将先行方设为白子; { IsBlack = false; jl.setText("白方先行"); } else if(rbBlack.isSelected()) { IsBlack = true; jl.setText("黑方先行"); } } }
2.Time.java(实时显示时间)
package Gobang;import java.awt.*;import javax.swing.*;import java.util.*;import java.text.*;public class Time implements Runnable{ private JLabel lab = new JLabel(); public Time(JLabel lab) { this.lab = lab; } public void run() { while(true) { SimpleDateFormat simpleFormat = new SimpleDateFormat("HH:mm:ss"); Calendar c = Calendar.getInstance(); lab.setText(simpleFormat.format(c.getTime())); lab.setForeground(Color.RED); try { Thread.sleep(1000); }catch(Exception e) { e.printStackTrace(); } } }}
"Java如何实现五子棋游戏"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注网站,小编将为大家输出更多高质量的实用文章!
棋子
颜色
按钮
白子
背景
五子
黑子
黑方
时间
画笔
菜单
监听
五子棋
位置
实时
画布
信息
对话框
文本
棋盘
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
填充家装模型数据库
访问服务器500
武大国家网络安全学院复试
广州知效网络技术有限公司
软件开发税收优惠政策是什么
4g网络安全的防护策略
数据库期末考试题库赣南师范大学
软件开发工程量化表
数据库删除表内容语句
数据库共建 协议书
冗余数据库是什么单位
管理工具找不到服务器
远程连接删除数据库
搜索网络安全为人民服务
软件开发一月多少钱6
运营商和软件开发怎么分
软件开发制作职业
网络技术安全信息中心
上海瑜鹤网络技术有限公司
软件开发人员未来趋势
数据库pbf是什么意思
绍兴海马网络技术有限公司
安防管理平台访问不了服务器
山西电视墙服务器哪个比较好
成都服务器
竹溪公司软件开发专业服务
软件开发工作好找不
运营商和软件开发怎么分
有关党的网络安全主题
抖音红盟网络安全工作室