国庆闲着没事儿写个连连看,断断续续写了两三天,估计加起来也有8个man hour了。简单记录一下实现流程。
罗马不是一天建成的,从零开始的话还是一步一步走,写一点看一下效果,慢慢东西就出来了。
主要有四个类:
主界面,Card,CardHolder,判断卡片是否
联通的
算法类。
刚开始主要创建主界面、Card和CardHolder:
- a.先搞个Frame出来
- b.实现CardHolder和Card,能new出一堆Card来,并且Card记录有自己的位置,自己的value。这里最好用二维数组,刚开始我用的List,结果发现后面写算法不方便。。
- c.能根据位置把这些Card作为矩形画在Frame上。
- d.让Card成对出现(其实在new的时候控制下value就行了)
- e.添加鼠标事件监听,能根据事件点击坐标算出来是哪个Card被点到了,然后设置selectedCard
- f.实现连接算法(其实是蹲坑时候想到的),根据拐角数算,直连,一个拐角的情况,两个拐角的情况,边缘要特殊处理一下。这一步比较费时间,我写的也不是很好。
- g.实现重排。刚开始完全没必要在意这些画出来的Card是不是随机的,哪怕都是挨着的也没关系,实现这一步的时候重用一下方法,new Card的时候调用一下就行了。
- 其他闲杂点,比如加menu,控制消除的card怎么重绘,双缓冲什么的。。。其实主要是功能,软件总有做不完的细节和需求的,慢慢改。
需要优化点和其他未加入功能点:
- 1.后来想到可以让Card继承Jcomponent,这样可能在绘制上更方便点,事件监听可能也好点。后来解决闪烁问题还是在paint的时候先搞个图,最后画图,这点和awt的重写update实现双缓冲还是有区别的;事件的话还是用的事件委托,等于整个界面只有一个listener,这点和Ext的表格事件很像,如果表格一堆listener的话太浪费了。
- 2.连接算法感觉略笨,好像自己玩连连看的时候,游戏能自动判断当前是不是还有可消的牌。如果实现的话应该是在另外一个线程里面计算每个牌的可消牌,并且缓存起来,这样点击的时候直接从这个缓存取就行了,也不用实时计算能不能消除了。这个实现起来应该还行,但是貌似每次消除或者重排的话,都得遍历所有卡片重新算一遍。
- 3.可以加入timer,提示什么什么的功能。
- 4.可以让value变成一幅画,消除有连接线,消除播放声音,右键取消选择什么的。
- 5.size现在是写死的。。。
- 6.可以消掉某牌之后其他的牌移动。
...
里面有些方法名用的也不是很恰当,凑合看看吧~
写完之后被老婆喷:写这么半天功能才这么鶸 =。=
- class='magplus' title='点击查看原始大小图片' />
- 大小: 307.9 KB
- LLK.rar (16.2 KB)
- 下载次数: 0