热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

棋盘覆盖V1.0

什么是棋盘覆盖,棋盘覆盖是用4种不同形态的L型骨牌覆盖给定的特殊棋盘上除特殊方格外的所有方格,且任何2个L型骨牌不得重叠覆盖。对,就这么简单!这是我在大学算法里面学分治算法时学

      什么是棋盘覆盖, 棋盘覆盖是用4种不同形态的L型骨牌覆盖给定的特殊棋盘上除特殊方格外的所有方格,且任何2个L型骨牌不得重叠覆盖。对,就这么简单!这是我在大学算法里面学分治算法时学的一个实例应用,正好为了学习这个算法以及练笔一下JAVA SWING(主要原因是为别人写的毕业设计),在大学期间弄的这么一个东西。
      首先贴一下最终结果图吧:

 1

从界面不难看出,有棋盘、棋盘上的方格、骨牌(4种)等。

 

1、棋盘(ChessPanel):棋盘用了一个JPanel来表示,而棋盘是由一个个的方格(ChessBox)组成的,这个方格将在下面讲到。ChessPanel中主要干的事情就是:

        A.初始化特殊方格:

 

       B.初始化棋盘;同上,这里写的时候有点重复代码,当时没有考虑到,刚看的时候发现,呵呵。

       C.实现paintComponent方法,画棋盘。这里也就是画线,由这些线分割成的方格就是棋盘,其中每个方格有自己的颜色属性等。

 

2、棋盘上的方格(ChessBox):就是上面用到的ChessBox,ChessBox里面没有上面逻辑代码,它只有几个属性:颜色、是否被覆盖、大小(这个多余,因为大小都一样了)。

 

3、骨牌(4种)(DominoPanel):这个类比较复杂,可能是设计不好的原因吧,这个类比较庞大,有快700行了。DominoPanel也是有ChessBox组成,一个DominoPanel有4个Chessbox组成,4种就需要4*4=16个ChessBox组成了。4种骨牌定义如下:

2

下面是构造一种形状的骨牌:通过style & key的与的结果来给骨牌(4个ChessBox)着色,得到最终的骨牌的样式。

 

      其次就是鼠标拖动骨牌的效果,这种效果很容易,添加当鼠标按下及鼠标拖动事件,当鼠标按下时记录此时鼠标的坐标x、y,当鼠标拖动此骨牌且并未松开鼠标时(即在拖动鼠标事件方法里),设置此骨牌位置如下(panel为骨牌的一个引用对象,骨牌类继承的是一个JPanel):
setLocation(panel.getX() + e.getX() - x, panel.getY() + e.getY() - y);
这样即可实现骨牌跟随着鼠标走的简单效果,然后在设置一下拖动时的外观,即可实现游戏中的效果,非常容易理解。

 

      然后就是实现DominoPanel的paintComponent方法:这里有一个拖动时的外观(有小边框)和其他情况时的外观。

 

        最后就是一些细节的处理,1、拖动骨牌(骨牌是一个JPanel,这个东西是方块),所以需要判断如果鼠标在颜色为null地方是拖不动的;2、只有鼠标在棋盘内部才显示边框;3、鼠标拖动骨牌在棋盘内部释放时,骨牌一定要放到正好用线条标好的4个ChessBox里的棋盘上,不能拖到哪放到哪,那样就是乱放了;4、排行榜的实现;5、错误提示;6、自动演示(自动演示时,直接用的直线方程让骨牌直线走到该走的位置的)等。这些请见代码,这里就不多说了。

 

        好了,从界面上看出来的东西也总结的差不多了,下面就是蛮重要的算法了,我认为算法可以优化,但是当时限于水平有限就没有再在这上面纠结了,希望大虾们可以帮俺看看,谢谢。算法就四个字:分而治之。懂了就懂了,不懂还是不懂。多说无益,算法如下(游戏中源码,未改动):主要在这里面做的事情就是记录正确的走法,定义一个HashMap来存储正确的走法(通过遍历棋盘覆盖主算法),其中Key存储手工走动时的左上角顶点,Value存储拖动的骨牌的样式(四种中的一种),这样即可实现当拖动骨牌时,根据存储过的走法(HashMap存储个人觉得非常合适,而且效率也非常不错,需要注意的是HashMap中的put方法的使用场合),判断走法是否正确,并给予相关提示,还有就是自动演示部分,这里用到的是Robot。

       

 

      算法部分总结就此打住,如果不明白的可以Google,我自己也是。下面是一个计时的东西,之前写的时候不知道JAVA里面有没有专门计时的,所以就自己用了一个Sleep做了这个计时,很简单,另起一个线程(防止界面卡住),在这个线程里面做的事情就是分、秒、毫秒的++操作,具体代码很容易。

 

      好了,基本差不多了,界面UI部分就不说了,全部JAVA SWING,因为现在工作了,用的是.net,SWING这方面也忘了差不多了,所以还需要复习一下才能那啥,哈哈。最后上几张图还是有必要的,有图有真相。实在的,虽然很简单的一个东西,写的时候还是考虑很多的细节部分的。

3

4

5
6

 

源码下载地址:http://download.csdn.net/source/2545075


推荐阅读
  • 转载自:http:www.blogjava.netCarpenterLeearchive20160427430268.html总体介绍之所以把HashSet和HashMa ... [详细]
  • 缓存这个东西就是为了提高运行速度的,由于缓存是在寸土寸金的内存里面,不是在硬盘里面,所以容量是很有限的。LRU这个算法就是把最近一次使用时间离现在时间最远的数据删除掉。先说说List:每 ... [详细]
  • 本篇文章给大家分享的是有关Java中怎么对HashMap按键值排序,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话 ... [详细]
  • 01Map集合概述A:Map集合概述:我们通过查看Map接口描述,发现Map接口下的集合与Collection接口下的集合,它们存储数据的形式不同a:Collection中的集合 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • Hibernate延迟加载深入分析-集合属性的延迟加载策略
    本文深入分析了Hibernate延迟加载的机制,特别是集合属性的延迟加载策略。通过延迟加载,可以降低系统的内存开销,提高Hibernate的运行性能。对于集合属性,推荐使用延迟加载策略,即在系统需要使用集合属性时才从数据库装载关联的数据,避免一次加载所有集合属性导致性能下降。 ... [详细]
  • 初探PLC 的ST 语言转换成C++ 的方法
    自动控制软件绕不开ST(StructureText)语言。它是IEC61131-3标准中唯一的一个高级语言。目前,大多数PLC产品支持ST ... [详细]
  • 点击上方“新机器视觉”,选择加”星标”或“置顶”重磅干货,第一时间送达很早就想总结一下前段时间学习HALCON的心得,但由于其他的事情总是抽不出时间。去年有过一段时间的集中学习,做 ... [详细]
  • HashMap:键值对(key-value):通过对象来对对象进行索引,用来索引的对象叫做key,其对应的对象叫做value.默认是1:1关系:存在则覆盖,当key已经存在,则利用新的va ... [详细]
  • Java集合详解5:深入理解LinkedHashMap和LRU缓存
    Java集合详解5:深入理解LinkedHashMap和LRU缓存今天我们来深入探索一下LinkedHashMap的底层原理,并且使用linkedhashmap来实现LRU缓存。具体代码在我的 ... [详细]
  • HashTable与ConcurrentHashMap均可实现HashMap的功能,对外提供了键值对存储的数据结构。但是在内部结构及实现上有何区别,性能上的差异到底在哪里又是如何导致的 ... [详细]
  • 手写HashMap,快手面试官直呼内行
    手写HashMap,快手面试官直呼内行-手写HashMap?这么狠,面试都卷到这种程度了?第一次见到这个面试题,是在某个不方便透露姓名的Offer收割机大佬的文章:这……我当 ... [详细]
author-avatar
荷丹满
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有