·
#include __FILE__

浅浅改了一下,你没给代码仓库,所以修改后的代码就被我传到reproduce/demo2048上了(这是我临时代码的仓库不要介意)

首先使用回调解耦的方法用得非常好,确实不应该“越职”修改

其次代码逻辑问题不大,就是控制层和视图层并没有完全分离,一个简单的例子是_CardPane中混杂了合并卡片的逻辑,其他的代码可以自己想想是属于视图还是控制的,尽量分离,不过我对JavaFX不是很熟,怎么改出优雅的代码还得是你来

然后多使用语法糖简化代码,比如Menu gameMenu=new Menu("游戏");,等号后面明确给出类型,那么前置类型就可以用var省略(JDK10以上),var gameMenu=new Menu("游戏");,其他的语法糖也可以想想怎么用上

最后要说的是注释和代码风格,你的代码中有大量的无效注释,实际上好的代码是自解释的,比如

  • score+=card.getNumber();//计入分数
  • voidCards.add(card);//添加到列表中
  • card.draw();//重绘
  • cardMatrixPane.createKeyListener();//添加键盘监听

还有很多地方,其实这些代码你一看就能懂,注释就是多余的了,代码风格的话我把一些操作合并整理了一下,你可以对照着看看(上下左右操作我想了很久也没办法合并那就不改了)

Replies
3

谢谢,我已经翻阅了你优化后的代码

其中afterGetMoreScoreInfo()方法的变化是最大的,你为它准备了一个静态内部类Counter,还加入了表格来显示。而我在写这个方法的时候已经处在了代码的收尾阶段,所以搞得有些粗糙

我还看到了像三元表达式这类的语法糖,它更加简洁;以及一些其他的优化,有些是我写代码时粗心没有注意到的

toString()方法改用了格式化字符串,这确实更标准一些

以及,看到一部分的遍历改用了for-each循环,这样的写法是专门为了简化代码,还是有另外的好处呢?

关于控制层和视图层的分离,我之后会尝试

其实我也不想加那个类,但字符串根本搞不定,本来循环加上%10d这种东西就可以搞定了,但是JavaFX有毛病空格和数字的宽度不一样就没法对齐(可能是因为字体不等宽),不过\t是可以对齐的,但4和65536需要的个数不一样,又得特判就很烦,也就意味着没办法轻松优化掉你那一大堆字符串拼接,后来发现Alert居然可以内嵌任意东西那我干脆搞个表格好了,但表格也不是什么简单能搞定的东西,所以就网上看了点代码仿照写了写

for-each的好处在于不需要脑子想边界了,不容易出错,也不需要你那样显式创建一个变量了,但是如果需要用到下标的话还是老老实实用原来的for,所以只有部分用了,还有写起来更爽不是么

奥,推荐使用Github托管代码,可以轻松管理版本,也就是可以追溯做了什么优化

(还有就是我Java写得不太多,所以有些想法并不是在Java中最优解,好在你的代码还比较简单我还hold住)

好的