Java五子棋之坐标校正

上篇针对了Java项目中的解构思维,在这篇内容中我们不妨从整体项目中拆解拿出一个非常重要的五子棋逻辑实现:坐标校正,我们如何使漫无目的鼠标点击变得有序化和可控化呢?

目录

一、从鼠标监听到获取坐标

1.MouseListener和MouseAdapter

2.mousePressed方法

二、坐标校正的具体实现方法

1.关于fillOval方法

2.坐标获取

3.坐标转换

4.坐标还原


一、从鼠标监听到获取坐标

1.MouseListener和MouseAdapter

一共有五种鼠标事件:Clicked(点击)、Pressed(按下)、Released(释放)、Exited(鼠标位置离开界面)、Entered(鼠标位置进入界面)

public interface MouseListener extends EventListener {

    /**
     * Invoked when the mouse button has been clicked (pressed
     * and released) on a component.
     * @param e the event to be processed
     */
    public void mouseClicked(MouseEvent e);

    /**
     * Invoked when a mouse button has been pressed on a component.
     * @param e the event to be processed
     */
    public void mousePressed(MouseEvent e);

    /**
     * Invoked when a mouse button has been released on a component.
     * @param e the event to be processed
     */
    public void mouseReleased(MouseEvent e);

    /**
     * Invoked when the mouse enters a component.
     * @param e the event to be processed
     */
    public void mouseEntered(MouseEvent e);

    /**
     * Invoked when the mouse exits a component.
     * @param e the event to be processed
     */
    public void mouseExited(MouseEvent e);
}

总的来说MouseAdapter用起来要比MouseListener要更方便一点,因为当我们用 MouseListener 时,必须实现接口中的所有方法,即使可能只对其中的一部分感兴趣,如果不全部列出就会出现报错。而MouseAdapter帮助我们简化处理了鼠标事件,我们只需要选择性使用并重写。

证明如下:

需要注意的是MouseListener是一个接口,应该使用implements而不是extends

2.mousePressed方法

我们下棋是通过鼠标点击屏幕实现的,所以我们需要重写mousePressed方法,在其中实现一些具体的方法逻辑。

二、坐标校正的具体实现方法

1.关于fillOval方法

 g.fillOval(x,y,w,h);

这是一个有坑的方法,正常我们认为画圆认为点击的地方即为圆心,但fillOval方法的x,y是所画圆的左上角坐标,即实际圆心坐标还要各偏离点击的size/2

 g.fillOval(x-size/2,y-size/2,w,h);

2.坐标获取

int x1 = e.getX();
int y1 = e.getY();
System.out.println("点击的x坐标:"+x1+"点击的y坐标:"+y1);

3.坐标转换

将点击的大坐标(x1,y1)转换为棋盘上的某行某列小坐标(r,c)

棋盘的范围是:(x0-size/2,y0-size/2)~ (x0+size*row+size/2,y0+size*col+size/2)

  int r0 = (x1+SIZE/2-x0)/SIZE;
  int c0 = (y1+SIZE/2-y0)/SIZE;

重点:之所以要加上size/2是防止点击(x0-size/2,y0-size/2)的位置时候出现负数,可以自行验算一下

4.坐标还原

还原出来的坐标就应该可以达到我们正常落子的要求了。

int wzqX = x0- SIZE/2 + r0*SIZE;
int wzqY = y0- SIZE/2 + c0*SIZE;
g.fillOval(wzqX,wzqY,SIZE,SIZE);

这里要减去size/2就是因为第一点里fillOval我们所说的小细节的地方。

以上就是本次五子棋小游戏中坐标获取与校对的全部内容啦。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/739222.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

夏季高压电环境下,工厂如何高效检测可燃气体报警器?

近日,美光台中工厂因高压气体泄漏引起火灾的事件引发了广泛关注。这起事件不仅让人们看到了工厂安全管理的紧迫性,更让可燃气体报警器这一安全设备成为了焦点。 在这篇文章中,佰德将从美光台中工厂火灾案例出发,深入探讨可燃气体…

气象站的种类和应用范围可以根据不同的分类标准进行详细的划分和描述

气象站的种类和应用范围可以根据不同的分类标准进行详细的划分和描述。以下是从不同角度对气象站的种类和应用范围的介绍: 一、气象站的种类 根据用途和安装环境分类: 农业气象站:专为农业生产服务,监测土壤温度、湿度等参数&am…

零基础STM32单片机编程入门(一)初识STM32单片机

文章目录 一.概要二.单片机型号命名规则三.STM32F103系统架构四.STM32F103C8T6单片机启动流程五.STM32F103C8T6单片机主要外设资源六.编程过程中芯片数据手册的作用1.单片机外设资源情况2.STM32单片机内部框图3.STM32单片机管脚图4.STM32单片机每个管脚可配功能5.单片机功耗数据…

Race Condition竞争条件

Race Condition Question – why was there no race condition in the first solution (where at most N – 1) buffers can be filled?Processes P0 and P1 are creating child processes using the fork() system callRace condition on kernel variable next_available_pid…

Pycharm配置conda环境(解决新版本无法识别可执行文件问题)

引言: 很多小伙伴在下载最新版本的pycharm或者更新到最新版本后为项目配置conda环境的时候,发现文件夹目录中无法显示可执行文件(一般为python.exe),以下就是本人遇到该问题后试验和解决该问题的一些方法和思路。 一般遇到该问题的人群有两种&#xff…

Keil移植库文件的方法

创建新的文件夹,并且添加已存在的文件: 点击小锤子按钮选择下图所示的界面: 为编译器指明编译路径:

APM教程-SkyWalking安装和配置

SkyWalking简介 APM (Application Performance Management) 即应用性能管理,属于IT运维管理(ITOM)范畴。主要是针对企业 关键业务的IT应用性能和用户体验的监测、优化,提高企业IT应用的可靠性和质量,保证用户得到良好的服务&#…

宝兰德受邀出席多样性算力产业峰会2024,共探未来算力新趋势

近日,以“共筑新算力,智启新未来”为主题的多样性算力产业峰会2024在北京成功举办。本次峰会由中国通信标准化协会多样性算力产业及标准推进委员会(CCSA TC622,以下简称“推委会”)主办,邀请了来自计算产业…

Hadoop 2.0 大家族(四)

目录 七、Flume(一)Flume简介(二)Flume入门 八、Mahout(一)Mahout简介(二)Mahout入门 七、Flume Flume是一个分布式高性能、高可靠的数据传输工具,它可用简单的方式将不同…

文华财经股票期货K线形态提示主图指标公式源码

文华财经K线形态主图指标公式源码: A1:ABS(O-C)HHV(ABS(O-C),20)&&ISUP; //DRAWCOLORKLINE(A1&&BACKSET(ISLASTBAR,SUMBARS(A1,1)),COLORLIGHTBLUE,0); DRAWSL(A1&&BACKSET(ISLASTBAR,SUMBARS(A1,1)),L-2*MINPRICE,0,6,0,COLORRED),LINE…

【WEB前端2024】3D智体编程:乔布斯3D纪念馆-第47课-动态切换内嵌blender展厅的壁画

【WEB前端2024】3D智体编程:乔布斯3D纪念馆-第47课-动态切换内嵌blender展厅的壁画 使用dtns.network德塔世界(开源的智体世界引擎),策划和设计《乔布斯超大型的开源3D纪念馆》的系列教程。dtns.network是一款主要由JavaScript编…

驾照减分考试搜题软件?分享四个可以搜答案的软件 #其他#笔记#经验分享

大学生们可以通过使用搜题软件,快速找到自己遇到的问题的答案,提高学习效率,以下分享各类型的供大家学习。 1.彩虹搜题 这是个微信公众号 学生或者是成年人使用非常广的一款学习应用软件,里面包含了各行各业的海量题库&#xf…

QT实现QGraphicsView绘图 重写QGraphicsSvgItem类实现边框动画

目录导读 简述使用 QTimer 实现 QGraphicsSvgItem 边框动画效果 简述 在了解学习WPS的流程图的时候,发现它这个选择图元有个动态边框效果,而且连接线还会根据线生成点从头移动到尾的动画。像这种: 在QML中实现这种动画属性很简单&#xff0…

晨持绪科技:开好一家抖音小店运营怎么做

在数字时代,抖音小店以其独特的社交媒体优势迅速崛起,成为许多创业者的新宠。但如何有效运营,却是一门学问。首要任务是确定你的小店定位,这关系到后续的产品选择、目标客户群及营销策略。定位明确后,接下来便是挑选适…

Spring框架学习笔记(本地印象笔记搬运)(整理中)

1、背景 Spring作为Java Web开发使用最频繁的框架,具有非常高的学习价值,在Spring框架源码中包含了很多设计模式(单例、原型、代理、观察者等),读懂这些源码有助于拓宽开发思路,同时也能提高后端排查错误的…

win10免安装配置MySQL8.4.0

注:此教程基于win10 22H2 版本 1、下载最新版本MySQL压缩包 下载链接:MySQL官网下载地址 点击第二行的 ZIP Archive 后面的Download(当前时间2024-06-19最新版本是8.4.0) 2、解压并添加配置文件 下载完毕后,解压缩…

Java程序之可爱的小兔兔

题目: 古典问题,有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? 程序分析: 兔子的规律为数列1,1,2,3,…

【数据结构与算法】Dijkstra算法、Floyd算法

文章目录 最短路径Dijkstra算法实现 Floyd算法实现 最短路径 前文提到,对于不带权图来说,BFS可以解决最短路径问题,因为它是类似于树的层次遍历那样,同一个结点的后继的访问顺序相邻,这使得BFS首次访问结点时的路径必…

CCRC-DSO数据安全官和CCRC-DSA数据安全评估师的差异

在当前时代背景下,随着中国数据安全政策的加速推进和相关法律法规的密集发布,对数据资产进行全生命周期的安全管控变得日益迫切。 这不仅成为企业可持续发展的必要条件,也引发了广泛的关注于数据安全相关的专业培训及认证领域。 在此环境下&a…

PS系统教程26

PS与BR的关系 如何把图片以图层的方式导入画板里面 选中三张图片/多张选择工具-PS-将文件载入PS图层意味着这三张图片以图层的方式嵌入PS中 拼接长图 裁剪图片 保存裁剪后的图片拼接图片选中要拼接的图片选择工具-PS-Photomerge(拼合图像) 图像处理器 大白话&…