为了深入学习Java中GUI与事件处理机制,利用java中的GUI与事件处理机制等功能实现围棋小游戏。

效果图   

一、概述

1、GUI是指图形用户界面也称图形用户接口,在Java中是进行人机交互的窗口,在这个窗口中用户可以实现应用程序提供的所有功能。事件处理机制在上一篇文章中有详细介绍,这里不多说明。

二、设计

(本人的设计思想是:先设计一个整体的框架,再往设计好的框架中加入组件,并一步步的进行调试,争取每步都在正确的路线上,各代码之间相互融合。)

1、逻辑设计

1)、首先创建一个顶级窗口容器类myframe,作为整体的框架。

2)、然后创建规则类Rule,加入到框架中

3)、然后创建棋盘类ChessPad,加入到框架中,再在棋盘类中添加具体的组件,比如说一个重新开始按钮和两个用于提示作用的文本框,如上效果图。

4)、再创建黑棋子类Chess_black和白棋子类Chess_white,加入到棋盘类中

5)、最后创建实现鼠标监听事件类Listen,用于实现各组件的产生的事件。

6)、最后创建一个主类mains,用于启动程序。

注意:这里其实是有三个容器,一个顶级窗口容器属于最顶级的,一个规则类容器(因为这里我是用继承JPanel面板容器实现的)和一个棋盘类容器(还是用继承JPanel面板容器实现的)。我把各种组件都是添加到棋盘类容器中的,所以当实现组件产生的事件时,其实是在棋盘类容器中进行各种操作的,而不是在顶级窗口容器中。

2、代码实现

(1)、这里通过创建一个窗口类myfame继承JFrame类来创建顶级窗口容器。注意:这里的窗口类布局管理器为空布局。

package 单机围棋;import javax.swing.JFrame;class myframe extends JFrame//窗口类
{private static final long serialVersionUID=2l;ChessPad chessPad=new ChessPad();//方法定义public void display()//窗口设置{setTitle("围棋");setLayout(null);//设置容器布局为空布局setSize(570,560);//窗口大小/***********************************************/Rule rule=new Rule();//规则面板类对象add(rule);rule.setBounds(60, 20, 440, 30);//设置规则面板类在窗口中的位置和大小/***********************************************/ChessPad chessPad=new ChessPad();//棋盘面板类对象add(chessPad);chessPad.setBounds(60, 60, 440, 440);//设置棋盘面板类在窗口中的位置和大小/***********************************************/setVisible(true);//窗口为可见setResizable(false);//不可改变窗口大小setLocationRelativeTo(null);setDefaultCloseOperation(EXIT_ON_CLOSE);}
}

(2)、通过创建一个Rule类继承JPanel面板容器实现规则面板,再加入到顶级窗口容器中,并设置在窗口中的位置。

package 单机围棋;import java.awt.Color;import javax.swing.JLabel;
import javax.swing.JPanel;public class Rule extends JPanel//规则面板类
{private static final long serialVersionUID=2l;//属性定义 JLabel label;//标签//方法定义public Rule() {setBackground(Color.orange);//面板颜色setSize(440, 30);//面板大小label=new JLabel("单击左键下棋子,双击左键吃棋子,落子无悔!请慎重!");add(label);}
}

(3)、通过创建棋盘类ChessPad继承JPanel面板容器实现棋盘,并在棋盘容器中加入重新开始组件,一个标签组件,和两个文本框组件。

package 单机围棋;import java.awt.Color;
import java.awt.Graphics;import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;public class ChessPad extends JPanel//棋盘面板类
{private static final long serialVersionUID=3l;//属性定义JButton button;//按钮JTextField text1,text2;//文本框JLabel label;//标签Listen listen=new Listen();//创建监听器对象//方法定义ChessPad()//构造方法{setSize(440,440);//棋盘面板大小setLayout(null);//棋盘布局为空setBackground(Color.orange);//面板颜色button=new JButton("重新开始");add(button);button.addMouseListener(listen);//在按钮中添加监听器button.setBounds(3, 10, 85, 20);text1=new JTextField("请黑棋下子");add(text1);text1.addMouseListener(listen);//在文本框1中添加监听器text1.setBounds(92, 10, 100, 20);label=new JLabel("提示框:"); add(label);label.setBounds(214, 10, 60, 20);text2=new JTextField("游戏开始,请黑棋先下子");add(text2);text2.setBounds(257, 10, 180, 20);//在文本框2中添加监听器listen.set1(button, this);//把按钮实例对象和棋盘实例对象传入实现监听事件类的中listen.set2(text1, text2,label);//把文本框实例对象和标签实例对象传入实现监听事件类的中addMouseListener(listen);//在棋盘类中添加监听器,注意这里是吧整个棋盘面板作为事件源}@Overridepublic void paintComponent(Graphics g)//画线,棋盘行列间距为40像素,行列为19{super.paintComponent(g);for(int i=40;i<=400;i=i+20)g.drawLine(40, i, 400, i);for(int j=40;j<=400;j=j+20)g.drawLine(j, 40, j, 400);//在棋盘的指定位置绘制实心圆,注意左上角坐标不是圆心坐标g.fillOval(97, 97, 6, 6);g.fillOval(337, 97, 6, 6);g.fillOval(97, 337, 6, 6);g.fillOval(337, 337, 6, 6);g.fillOval(217, 217, 6, 6);}public void paintchess()//在棋盘上画棋子的方法{Graphics p=getGraphics();p.fillOval(96, 96, 10, 10);}
}

(4)、创建黑棋子类,并实现MouseListener接口用来在自身类中实现”双击黑棋子进行吃黑棋子“的功能。这里的黑棋是通过继承JPanel容器实现的,也就是说黑棋子其实也是个面板容器(同样白棋子也是)。

package 单机围棋;import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;import javax.swing.JPanel;public class Chess_black extends JPanel implements MouseListener//黑棋子类继承面板容器,自身实现鼠标点击事件
{public static final long serialVersionUID=03l;//序列号ChessPad chessPad;public void get(ChessPad chessPad)//传入棋盘实例对象{this.chessPad=chessPad;}public Chess_black()//定义黑棋子面板容器大小,并添加鼠标事件监听器 {setSize(20,20);addMouseListener(this);}@Overridepublic void paint(Graphics p)//定义黑棋子颜色宽高{p.setColor(Color.black);p.fillOval(0, 0, 20, 20);}@Overridepublic void mouseClicked(MouseEvent e)//实现鼠标监听事件{if (e.getClickCount()>=2)//如果鼠标连续点击了两下或以上{if(e.getSource()==this)//如果鼠标点击的是黑棋子组件{chessPad.remove(this);//在棋盘面板容器中移除被点击的黑棋子组件chessPad.repaint();//刷新棋盘,如果不刷新,则会显示异常}   }}public void mousePressed(MouseEvent e) {}public void mouseReleased(MouseEvent e) {}public void mouseEntered(MouseEvent e) {}public void mouseExited(MouseEvent e) {}
}

(5)、使用与创建黑棋子类相同的方法创建白棋子Chess_white。

package 单机围棋;import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;import javax.swing.JPanel;public class Chess_white extends JPanel implements MouseListener
{public static final long serialVersionUID=02l;//序列号ChessPad chessPad;public void get(ChessPad chessPad){this.chessPad=chessPad;}public Chess_white(){setSize(20,20);addMouseListener(this);}@Overridepublic void paint(Graphics p)//重写paint方法画好白棋子对象颜色和大小。该方法为在面板容器中使用的用来设计面板样式的方法,//所以只要调用该方法所在类的容器对象,就可以显示该方法所设计的容器的样子{p.setColor(Color.white);p.fillOval(0, 0, 20, 20);}@Overridepublic void mouseClicked(MouseEvent e){if (e.getClickCount()>=2){if(e.getSource()==this){chessPad.remove(this);chessPad.repaint();}    }}public void mousePressed(MouseEvent e) {}public void mouseReleased(MouseEvent e) {}public void mouseEntered(MouseEvent e) {}public void mouseExited(MouseEvent e) {}
}

(6)、鼠标监听事件类Listen,用于实现各组件相应的功能。

package 单机围棋;import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JTextField;public class Listen extends MouseAdapter//实现鼠标点击事件
{JButton button;ChessPad chessPad;JTextField text1,text2;JLabel label;int x,y;int color=0;//让黑棋先落子Chess_black chessblack;Chess_white chesswhite;public void set1(JButton button,ChessPad chessPad)//传入组件实例对象,并初始化{this.button=button;      this.chessPad=chessPad;}public void set2(JTextField text1,JTextField text2,JLabel label)//传入组件实例对象,并初始化{this.text1=text1;this.text2=text2;this.label=label;}@Overridepublic void mouseClicked(MouseEvent e)//鼠标在组件上单击(按下并释放)时调用该方法。{if(e.getSource()==button)//重新开始事件的实现{chessPad.removeAll();//删除容器中所有组件chessPad.repaint();//刷新容器显示界面//重新往容器中添加组件chessPad.add(button);chessPad.add(text1);chessPad.text1.setText("请黑棋下子");chessPad.add(label);chessPad.add(text2);chessPad.text2.setText("重新开始了,请黑棋先下子");color=0;//颜色重新设置为0,重新从黑棋开始下     }   //得到鼠标在容器中的坐标x=e.getX();y=e.getY();//得到坐标在棋盘上的行列位置int a=(x+9-20)/20;//行位置int b=(y+9-20)/20;//列位置if(e.getSource()==chessPad)//在棋盘上下棋事件的实现{if(x<35||y<35||x>405||y>405)//判断鼠标下棋位置,若超出棋盘位置则不落子{chessPad.text2.setText("别乱点!棋只能下在棋盘上面!");//鼠标超出棋盘位置,不落子}else//鼠标在棋盘中,开始落子{if(color==1)//若棋子颜色为1,则落白子{chesswhite=new Chess_white();//定义白棋子组件实例对象chesswhite.get(chessPad);chessPad.add(chesswhite);//往棋盘容器中添加白子chesswhite.setBounds(a*20+10, b*20+10, 20, 20);//白子落子位置chessPad.text1.setText("请黑棋下子");chessPad.text2.setText(null);color--;//棋子颜色设置0,控制下一步落子颜色为黑子}else if(color==0)//若棋子颜色为0,则落黑子{chessblack=new Chess_black();//定义黑棋子组件的实例对象chessblack.get(chessPad);chessPad.add(chessblack);//往棋盘容器中添加黑子chessblack.setBounds(a*20+10, b*20+10, 20, 20);//黑子落子位置chessPad.text1.setText("请白棋下子");    chessPad.text2.setText(null);color++;//棋子颜色设置为1,控制下一步落子为白子}}}}
}

(6)、鼠标监听事件类Listen创建

package 单机围棋;import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JTextField;public class Listen extends MouseAdapter//实现鼠标点击事件
{JButton button;ChessPad chessPad;JTextField text1,text2;JLabel label;int x,y;int color=0;//让黑棋先落子Chess_black chessblack;Chess_white chesswhite;public void set1(JButton button,ChessPad chessPad)//传入组件实例对象,并初始化{this.button=button;      this.chessPad=chessPad;}public void set2(JTextField text1,JTextField text2,JLabel label)//传入组件实例对象,并初始化{this.text1=text1;this.text2=text2;this.label=label;}@Overridepublic void mouseClicked(MouseEvent e)//鼠标在组件上单击(按下并释放)时调用该方法。{if(e.getSource()==button)//重新开始事件的实现{chessPad.removeAll();//删除容器中所有组件chessPad.repaint();//刷新容器显示界面//重新往容器中添加组件chessPad.add(button);chessPad.add(text1);chessPad.text1.setText("请黑棋下子");chessPad.add(label);chessPad.add(text2);chessPad.text2.setText("重新开始了,请黑棋先下子");color=0;//颜色重新设置为0,重新从黑棋开始下     }   //得到鼠标在容器中的坐标x=e.getX();y=e.getY();//得到坐标在棋盘上的行列位置int a=(x+9-20)/20;//行位置int b=(y+9-20)/20;//列位置if(e.getSource()==chessPad)//在棋盘上下棋事件的实现{if(x<35||y<35||x>405||y>405)//判断鼠标下棋位置,若超出棋盘位置则不落子{chessPad.text2.setText("别乱点!棋只能下在棋盘上面!");//鼠标超出棋盘位置,不落子}else//鼠标在棋盘中,开始落子{if(color==1)//若棋子颜色为1,则落白子{chesswhite=new Chess_white();//定义白棋子组件实例对象chesswhite.get(chessPad);chessPad.add(chesswhite);//往棋盘容器中添加白子chesswhite.setBounds(a*20+10, b*20+10, 20, 20);//白子落子位置chessPad.text1.setText("请黑棋下子");chessPad.text2.setText(null);color--;//棋子颜色设置0,控制下一步落子颜色为黑子}else if(color==0)//若棋子颜色为0,则落黑子{chessblack=new Chess_black();//定义黑棋子组件的实例对象chessblack.get(chessPad);chessPad.add(chessblack);//往棋盘容器中添加黑子chessblack.setBounds(a*20+10, b*20+10, 20, 20);//黑子落子位置chessPad.text1.setText("请白棋下子");    chessPad.text2.setText(null);color++;//棋子颜色设置为1,控制下一步落子为白子}}}}
}

(7)、主类mains创建,最后启动主类既可启动程序,进行围棋游戏啦!!

package 单机围棋;public class mains
{public static void main (String []args){new myframe().display();}
}

三、总结

通过这次小游戏的实现,了解掌握GUI图形界面的设计,并学习界面中各组件与事件处理机制的功能交互实现。这里主要是运用到了JPanel容器(JPanel又称面板,是Java中最常用的轻量级容器之一,其默认布局管理器是FlowLayout(流式布局管理器)。JPanel可以容纳其他组件,但其本身不可见,需要加入到顶级容器中才能存在,因此也称为中间容器,JPanel之间可以嵌套,对组件进行组合。)来实现界面的设计。当然也可以使用其他的组件或者容器来进行界面的设计,并且也可以添加其他组件来实现相应更复杂的功能,但由于图形界面的设计并不是Java的强项,也由于GUI发展的停滞,这里不对GUI作深入的了解。本文旨在学习Java事件处理机制以及事件处理机制实现功能的过程,并对设计模式有一定的学习和了解,并规范代码的实现,给本人自己找准一种学习的思路,也希望能给读者带来帮助。

Java路漫漫,唯有君作伴~

记录java围棋小游戏心得相关推荐

  1. Java 坦克小游戏心得

    原本是闲得慌无聊才去尝试做这个项目的,因为小时候玩小霸王的游戏机,那个时候经常玩这个游戏吧,特别是喜欢那种自定义地图的模式,觉得自由度非常不错.总之关于这个游戏,想说的一大堆.鉴于能有个空闲的时间,打 ...

  2. (心得三)java俄罗斯方块小游戏编写心得

    在"java俄罗斯方块小游戏编写心得02"中,我们已经做到了方块的各种功能的实现,那么接下来我们需要一个destroyLine()方法来对方块进行消除.我们需要想一个问题,当一个方 ...

  3. (心得二)java俄罗斯方块小游戏编写心得

    在"java俄罗斯方块小游戏编写心得01"中已经将游戏界面完成,那么接下来就是要让方块动起来. 我们之前在写Cell类时,曾经给每个最基本小方块定义了三个方法,即左移.右移.下落, ...

  4. 用JAVA制作小游戏——飞机大战(三)

    本篇博客是对飞机大战游戏项目完整代码的展示 详细代码讲解: 用JAVA制作小游戏--飞机大战(一) 用JAVA制作小游戏--飞机大战(二) 最下方附整个程序的文件下载链接 代码展示 主界面 impor ...

  5. 用JAVA制作小游戏——飞机大战(二)

    本篇博客是对飞机大战游戏使用代码的展示 重难点: 首先需要鼠标能够控制战机,使鼠标在窗口内时始终能够使战机的位置与鼠标相同,实现鼠标控制战斗机移动. 其次需要能够以一定的速度产生子弹和敌机,并且以一定 ...

  6. java游戏暂停弹出字体_小白写了个java的小游戏 想加个暂停的功能 无从下手 求大佬们帮...

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 第一次写java的小游戏 想实现点击右下角的暂停 实现游戏的暂停和继续 不知道该怎么加,自己找了线程的内容但试了还是成功不了,求大佬们帮一下小白.代码有点 ...

  7. 用JAVA制作小游戏——推箱子(三)

    本篇博客主要是对推箱子地图编辑器功能的代码讲解. 首先给出这段代码的部分运行截图: 重难点: 地图编辑器主要有三个重难点: 需要有一个绘制地图的界面 能够实现地图绘制的功能 地图绘制完成后需要将地图内 ...

  8. 用JAVA制作小游戏——推箱子(二)

    本篇博客主要是推箱子游戏界面功能的代码讲解. 首先先给出这段代码的部分运行截图: 重难点: 游戏界面主要有五个重难点: 固定好地图的位置 地图的显示 构建菜单栏 读取地图数据 玩家操作功能实现 地图的 ...

  9. 用JAVA制作小游戏——推箱子(一)

    本篇博客是对推箱子游戏首页代码的展示 效果图: 难点: 在背景图上添加按钮. 由于直接使用add方法,会变成图片一块区域,按钮一块区域,彼此互不重叠,形成的界面效果不太好,因此用了JLayeredPa ...

最新文章

  1. Android——学习:线性布局权重分配
  2. 2015.1.10 解决DataGridView SelectionChanged事件自动触发问题
  3. Firefox 突然拉黑中国用户
  4. JAVA代码编写的30条建议
  5. 解决AttributeError: module ‘scipy.misc‘ has no attribute ‘imread‘报错问题
  6. 【Linux】一步一步学Linux——unzip命令(68)
  7. 两个具有相同的名称在CLASSPATH中的类
  8. C++多态的基本语法与原理剖析
  9. 学习oracle的感悟,随笔:最近关于Oracle学习思考的一些感悟
  10. Python 3.6部分新特性
  11. 用element-ui的走马灯carousel轻松实现自适应全屏banner图 解决el-carousel默认高度300问题  组件代码
  12. 简单实现滑动门效果css或js+css
  13. python for spss statistics_IBM SPSS Statistics 与用户自定义 Python 模块的集成及分析
  14. Python绘制韦恩图并通过集合找到交集并集数据
  15. 【技术认证介绍】阿里云认证介绍
  16. win10文件显示后缀名_手机必装!百度家的万能文件管理器,功能强大无广告!...
  17. 苹果手机解压缩软件_解压缩全能王app下载-解压缩全能王app手机版
  18. Alpine Linux
  19. laravel 系统服务-助手函数
  20. cnpm报错 : 无法加载文件 C:\Users\Administrator\AppData\Roaming\npm\cnpm.ps1,因为在此系统上禁止运行脚本

热门文章

  1. 58同城姚劲波:以域名起家 从创业小子到亿万富翁
  2. Java GUI 知识总结
  3. 微信小程序接收富文本编辑器图片大小解决方法
  4. 安利一款功能强大,简单好用的录屏软件!
  5. 计算机毕业设计PHP高校体育场馆管理系统(源码+程序+VUE+lw+部署)
  6. 天津市数字经济行业投资策略研究及发展方向建议报告2022-2027年
  7. 前端实现表格中的颜色变化以及不同点击效果
  8. Sketch Essential Training: The Basics Sketch基本训练:基础知识 Lynda课程中文字幕
  9. 实现js动态设置css样式,js动态设置全局样式主题色
  10. GIS技术在水资源领域的应用与发展