开发五子棋小游戏1.0——了解Java中的继承、绘图与鼠标监听器的使用

目录

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、可重复落子

下篇博客,我来改进这些问题~