开发五子棋小游戏1.0——了解Java中的继承、绘图与鼠标监听器的使用
📅 2026/7/26 7:54:10
👁️ 阅读次数
📝 编程学习
目录
1. 初识项目开发
语言
技术技能
2.继承
3.五子棋的初步开发
1. 初识项目开发
语言
游戏:
- 矩阵游戏:五子棋、围棋、象棋、连连看、俄罗斯方块、扫雷
界面开发:创建窗体设置属性、创建组件对象添加到窗体上
监听器:创建监听器类实现监听器接口,重写监听器方法,创建对象与组件绑定
数组:[] 初始化、下标、长度
判断与循环:if-else、for、while
类与对象:属性、方法、创建对象、调用属性以及方法
- 鼠标、键盘控制游戏(自己独立完成一些任务):植物大战僵尸、雷霆战机
技术技能
画图
- Graphics 图形、GPU-显卡-5060
- 绘制直线、矩形、圆形、设置颜色、设置字体、绘制图片
窗体对象在可视化之后也可以获取一个 Graphics 对象,用于在窗体上绘制图形。
Graphics g = jf.getGraphics();鼠标监听器
接口:MouseListener
功能:监听窗体,当鼠标在窗体上按下、松开、点击等操作后会被识别,用来获取坐标。
public class GoBangListener implements MouseListener { @Override public void mouseClicked(MouseEvent e) { }// 鼠标单击(按下+释放,且没有拖动) @Override public void mousePressed(MouseEvent e) { }// 鼠标按下(任意按键按下瞬间) @Override public void mouseReleased(MouseEvent e) { }// 鼠标释放(松开按键) @Override public void mouseEntered(MouseEvent e) { }//鼠标光标进入组件区域 @Override public void mouseExited(MouseEvent e) { }//鼠标光标离开组件区域 }2.继承
在编写五子棋的代码时,我们会遇到以下问题:
绘制好的图形在窗体上,一旦窗体改变尺寸/最大化/最小化/移出屏幕外,绘制的图形就会消失
而出现这个问题的原因是:
窗体以上情况发生时,会调用GPU重新绘制窗体自己本身
基于此,我们可以通过继承的学习来解决这个问题~
- 继承是面向对象三大特性之一(封装、继承、多态)
- 作用:复用已有类的代码,建立类与类之间的父子关系
- 类与类之间的关系:
子类 继承 父类:
public class 子类名 extends 父类名{ }1.子类中可以继承父类所有的属性以及方法
2.子类可以改造父类的方法 通过重写方法的形式
3.五子棋的初步开发
package xzn0721; import javax.swing.*; import java.awt.*; import java.awt.image.ImageObserver; import java.text.AttributedCharacterIterator; public class GoBangUI { public void showUI(){ myFrame jf = new myFrame(); jf.setSize(600,700); jf.setLocationRelativeTo(null);//居中显示 jf.setDefaultCloseOperation(3); jf.setVisible(true); //将鼠标监听器绑定到窗体上,实现点击鼠标就能画圆 GoBangListener gbl = new GoBangListener(jf); jf.addMouseListener(gbl); } static void main() { GoBangUI gbUI = new GoBangUI(); gbUI.showUI(); } }package xzn0721; import javax.swing.*; import java.awt.*; public class myFrame extends JFrame { @Override public void paint(Graphics g) { super.paint(g); g.setColor(Color.orange); g.fillRect(0,0,500,500); //划线 g.setColor(Color.black); for(int i=1;i<16;i++) { g.drawLine(50, 20 + i * 30, 470, 20 + i * 30);//(x1,y1)是线段的起点坐标,(x2,y2)是线段的终点坐标 g.drawLine(20 + i * 30, 50, 20 + i * 30, 470); } //画棋盘上的点 g.setColor(Color.black); g.fillOval(137,137,6,6);//(x,y)是圆形外接正方形的左上角顶点,width、height分别是正方形的宽与高 g.fillOval(377,377,6,6); g.fillOval(377,137,6,6); g.fillOval(137,377,6,6); g.fillOval(257,257,6,6); } }package xzn0721; import javax.swing.*; import java.awt.*; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; public class GoBangListener implements MouseListener { JFrame jf; int clickCount;//记录点击次数,初始值为0 //构造方法将窗体地址传给鼠标监听器的成员变量 public GoBangListener(JFrame jf){ this.jf = jf; } @Override public void mouseClicked(MouseEvent e) { clickCount++; int x=e.getX();//获取鼠标点击的坐标 int y=e.getY(); //使用窗体的作图工具(简称画笔) Graphics g1 = jf.getGraphics(); if (clickCount % 2 == 0) { g1.setColor(Color.white); } else { g1.setColor(Color.black); } g1.fillOval(x-15,y-15,30,30); } @Override public void mousePressed(MouseEvent e) { } @Override public void mouseReleased(MouseEvent e) { } @Override public void mouseEntered(MouseEvent e) { } @Override public void mouseExited(MouseEvent e) { } }运行结果
提示:
不能把监听器 “绑定到圆上”。 Swing 原生没有图形碰撞监听,圆只是画出来的像素,不是组件;鼠标监听器只能绑定组件。
该程序的缺陷:
1、在窗体上随意落子,未将棋子限定在交点坐标
2、可重复落子
下篇博客,我来改进这些问题~
编程学习
技术分享
实战经验