目录
遇到的困难
面板布局
先增加了一个图片设置为背景图片,并增加到Layred Pane面板的最底层,然后在Layered Pane和Glass Pane面板中间的内容面板ContentPane中增加组件,其中Content Pane必须设置为绝对布局(默认是流布局管理器FlowLayout),否则第一个组件的setBounds方法对组件无效,该组件会一直固定在内容面板的左上角。
消除框内的消除操作
用到了java8的新特性流Stream,Stream(流)是一个来自数据源的并行队列并且支持聚合操作。
流可以让我们以一种声明的方式处理数据。
将消除框内记录卡牌的链表写进流里,然后对流进行按照卡牌的名字进行分组,得到一个map集合
key是卡牌的名字,value是list集合,存放名字是key的卡牌。当有集合的大小为三时,说明消除框内有三张相通的牌,可以进行消除。
两个功能键的实现
上移
将消除框内的卡牌移动到消除框上方,消除框内无任何卡牌,该卡牌可以被重新点击进入消除框,消除框被点击后变成灰色,不能被再次点击。这里限制了按钮只能被点击一次,可以定义一个全局变量,当消除框内有牌时点击代表使用了,若消除框内无卡牌时点击,不被记录。
洗牌
用一个集合来记录面板内除了被移动到消除框上方和消除框内的卡牌,也就是单元格cell状态为1的卡牌,然后挨个打乱顺序后重新分发到每个图层中。然后判断是否被遮盖来设置Brand的图像是彩色还是灰色。该按钮也是只能使用一次,使用过后变灰。
“删除”监听
在写的过程中我试图用删除监听器,但是我在看似合乎逻辑的方法里把卡牌、按钮等的监听删除后,依旧会监听,然后执行监听事件里的操作,然后我就很纳闷为啥会这样,debug之后才意识到删除监听的操作就写在监听事件的代码里,也就是相当于在监听的事件里把监听删除,这样是矛盾的。但是当监听发生后(卡牌被点击移动到消除框后,功能键按钮按下变灰后)当其再次被点击后我不想让它在执行监听事件里的操作,此时我们就可以给该组件定义一个变量来设置监听的次数。
这个小游戏是根据b站尚学堂的视频讲解写的,在该视频的基础上我又增加了关卡、功能按钮的操作,开始、通关、游戏失败的图形界面。写的过程中遇到了大大小小的Bug,尤其是对监听器的处理这部分用了很多时间才解决,有时候改的都有点精神失常了,不过还好最后都一一解决了,虽然还不是很完美,但总算把想出来的写出来并实现了。