花了5天的时间写了一个简单的五子棋游戏,其中碰到了许多问题。
1.在JPanel上添加背景图片的问题
因为不能直接在JPanel上直接添加图片,所以我是通过JLabel,把图片放到JLabel中,再将JLabel添加到JPanel中(使用BorderLayout布局),这样做是可以把图片添加上去,但是JPanel中的按钮(也用BorderLayout布局)就被挤到最上面了,这个问题至今没有解决。
2.关于悔棋
悔棋的话很简单,就是把保存在队列里的最后一个元素删除。然后将二维数组(标志棋盘上的某个点是否有棋子)中对应的位置清0,否则,如果再次下相同的位置,不会有棋子出现。如果是一次悔一个棋子,那么还要注意就是要改变标志棋子颜色的变量。
3.关于重绘
大概有3个地方用到重绘,第一,画棋盘的时候,因为棋盘要一直存在,所以我是把画棋盘的方法写在paint()方法中;第二,悔棋的时候,每悔一次棋,就要重绘一次,第三,黑棋或者白棋获胜的时候,因为我判断获胜的方法单独写在一个类中,所以一开始的时候,获胜后我重绘的是当前这个类的paint()方法,出现的现象是必须改变下窗体的状态后棋子才清空,后来次发现,应该重绘的是棋盘的paint()方法。.
4关于传参
可以达到传参效果的方法有,通过构造方法来传;通过自己定义的方法来传(和构造方法差不多);把你需要的变量设置为静态的
5.判断输赢
我的方法是,根据你鼠标点击的位置,分别向8个方向找,如果是相同的棋子,count++;然后在判断count和5的关系
6.关于人机对战
人机对战应该是时间花的最长的一部分了,现在实现的只是电脑只能去防守。我的思路是,根据人当前下棋子的位置,来检索它周围8个方向上的棋子,如果某个方向上有4个相连,(这种情况电脑必输)所以不做变化,但是如果某个方向上有4个相连并且最两边中的一边有电脑的棋子(冲四的情况),就把两边中没有电脑棋子的那一边的权值设为最大;如果某个方向上有3个相连的(活三),就把最两边空的的位置的权值设为第二大;如果有一端被堵(明三),则把没有堵的那端的权值设为第三大;以此类推,也许是我的权值大小设置不当,有时候人机对战会有bug。
7数组下标越界
因为棋盘比窗体小,而标志棋盘上某点有棋子的大小为棋盘,所以应该设置一些判断。
8.关于命名
因为英语水平有限,所以每次给变量取名字的时候都会很蛋疼,所以有的直接用拼音代替。
关于五子棋,我觉得应该注意的问题就这么多,关于人机,应该继续努力。