今天把以前的扫雷代码重构了一遍,有点收获
1.分清代码中结构相同的部分和不同的部分,将结构相同的部分提取出来
之前的代码:
if (bomb == nearBombNum[x][y]) // 如果周围雷数和判断一样 { if (x - 1 >= 0 && y + 1 >= 0 && x - 1 <= 19 && y + 1 <= 19 && !isBomb[x][y])// 边界判断,如果点击处不是地雷 { changeBombImage(button[x - 1][y + 1]); // 点击处左上角判断 if (nearBombNum[x - 1][y + 1] == 0 && !isBomb[x - 1][y + 1]) showBomb(button[x - 1][y + 1]); } if (x >= 0 && y + 1 >= 0 && x <= 19 && y + 1 <= 19 && !isBomb[x][y]) { changeBombImage(button[x][y + 1]); // 点击处正上方判断 if (nearBombNum[x][y + 1] == 0) showBomb(button[x][y + 1]); } if (x + 1 >= 0 && y + 1 >= 0 && x + 1 <= 19 && y + 1 <= 19 && !isBomb[x][y]) { changeBombImage(button[x + 1][y + 1]); // 点击处右上角判断 if (nearBombNum[x + 1][y + 1] == 0) showBomb(button[x + 1][y + 1]); } if (x - 1 >= 0 && y >= 0 && x - 1 <= 19 && y <= 19 && !isBomb[x][y]) { changeBombImage(button[x - 1][y]); // 点击处左边判断 if (nearBombNum[x - 1][y] == 0) showBomb(button[x - 1][y]); } if (x + 1 >= 0 && y >= 0 && x + 1 <= 19 && y <= 19 && !isBomb[x][y]) { changeBombImage(button[x + 1][y]);// 点击处右边判断 if (nearBombNum[x + 1][y] == 0) showBomb(button[x + 1][y]); } if (x - 1 >= 0 && y - 1 >= 0 && x - 1 <= 19 && y - 1 <= 19 && !isBomb[x][y]) { changeBombImage(button[x - 1][y - 1]); // 点击处左下角判断 if (nearBombNum[x - 1][y - 1] == 0) showBomb(button[x - 1][y - 1]); } if (x >= 0 && y - 1 >= 0 && x <= 19 && y - 1 <= 19 && !isBomb[x][y]) { changeBombImage(button[x][y - 1]); // 点击处正下方判断 if (nearBombNum[x][y - 1] == 0) showBomb(button[x][y - 1]); } if (x + 1 >= 0 && y - 1 >= 0 && x + 1 <= 19 && y - 1 <= 19 && !isBomb[x][y]) { changeBombImage(button[x + 1][y - 1]); // 点击处右下角判断 if (nearBombNum[x + 1][y - 1] == 0) showBomb(button[x + 1][y - 1]); }
每一个格子,都要对周围的8个格子进行处理,包括边界判断,旗子数目计算,地雷数目计算,都有相同的结构,只是不同的格子,各自的坐标不同 ,通过2个数组xLocation 和yLocation组合起来,循环8次,就能执行同样的操作了。
重构之后的代码:
int xLocation[] = { x - 1, x, x + 1, x - 1, x + 1, x - 1, x,x + 1, }; int yLocation[] = { y + 1, y + 1, y + 1, y, y, y - 1, y - 1,y - 1 }; if (bomb == nearBombNum[x][y]) // 如果周围雷数和判断一样 { for (int i = 0; i < 8; i++) // 周围8个格子,每个格子判断一次 { if (new Mybutton(xLocation[i], yLocation[i]) .locationLegalJudge() && !isBomb[x][y]) // 边界判断,而且不是地雷 { int xL = xLocation[i]; int yL = yLocation[i]; changeBombImage(button[xL][yL]); if (nearBombNum[xL][yL] == 0 && !isBomb[xL][yL]) showBomb(button[xL][yL]); } } }
2.边界判断
刚开始一直在边界判断上出问题,总是写一堆复杂的判断条件
开始是这样的:
if (x - 1 >= 0 && y + 1 >= 0 && x - 1 <= 19 && y + 1 <= 19&& !isBomb[x][y]) if (x >= 0 && y + 1 >= 0 && x <= 19 && y + 1 <= 19&& !isBomb[x][y]) if (x +1 >= 0 && y + 1 >= 0 && x + 1 <= 19 && y + 1 <= 19&& !isBomb[x][y]) …… ……
上面这种方式,参数坐标一直在不断改变,很混乱
后来想了想,用构造方法的方式来解决这个问题就比较简单了
Mybutton类
Mybutton(int x, int y) { //构造方法 this(); // 调用无参构造方法 this.x = x; this.y = y; } public boolean locationLegalJudge() { //边界判断方法 return this.x >= 0 && this.x < 19 && this.y >= 0 && this.y < 19; }
然后对一个格子周围8个格子做边界判断
for(int i=0;i<8;i++) { if(new Mybutton(xLocation[i],yLocation[i]).locationLegalJudge()) //边界判断 { …… } }
解决这个问题的主要思想就是,将变化的坐标,变成构造方法的参数,归一为同样的形式,用同样的方法判断就好了。
相关推荐
改善既有的代码重构(ppt),改善既有的代码重构,改善既有的代码重构PPT
代码重构 重构与模式
《代码重构》书籍的中文版电子版,软件开发者必读书籍。 重构——改善既有代码的设计(中文版)
代码重构
JAVA 代码重构 JAVA 代码重构 JAVA 代码重构 JAVA 代码重构 JAVA 代码重构
java代码重构经验分享
代码重构技术
重构是持续改进代码的基础。抵制重构将带来技术麻烦:忘记代码片段的功能、创建无法测试的代码等等。 而有了重构,使用单元测试、共享代码以及更可靠的无BUG的代码这些最佳实践就显得简单多了。 《31天重构速成》该...
Java 代码 重构 实例 指南 ,欢迎下载
代码重构的指导书籍以及设计模式的一些简介
高仿微信,iOSAppTemplate代码重构
讲述了java代码的重构总结 规范代码,有必要好好学习
Java代码重构示例 Java代码重构示例 Java代码重构示例 Java代码重构示例 Java代码重构示例 Java代码重构示例 Java代码重构示例
java代码重构
优秀的程序员,应该懂得代码重构,写出更加优美和逻辑清晰的代码
代码重构 (C# & ASP.NET) 英文原版 && 源代码
软件设计是演进过程,而重构是设计演进的基本方法。重构是指不改变软件行为的前提下,修改程序内部结构。重构说简单,做不简单。首先,需要知道代码的好坏,即代码异味,设计原则等。其次,需要以自动测试作为保障。
代码重构总结实例
Java设计模式+代码重构等PDF合集,Java设计模式+代码重构等PDF合集,Java设计模式+代码重构等PDF合集,Java设计模式+代码重构等PDF合集