- 浏览: 113242 次
- 性别:
- 来自: 深圳
博客专栏
-
告诉你什么是优雅的代码
浏览量:23453
最新评论
-
wfm0105:
不支持小数
告诉你什么是优雅的代码(6)------阿拉伯钱数转换为中文形式 -
wfm0105:
daisy_rainbow 写道 不懂这些数组里 ...
告诉你什么是优雅的代码(4)-----智力题的解法(答案) -
恒之疆:
无敌模式有问题
告诉你什么是优雅的代码(11)----html5 之XXOO棋 -
Shengli_fu:
...
告诉你什么是优雅的代码 -
Shengli_fu:
...
告诉你什么是优雅的代码(5)------ 百度之星也是普通人(答案)
最近在写优雅代码系列的时候,由于程序偏向算法性,代码写得比较PO。于是今天打算用OO来写火柴游戏。谁知道,一旦打开我那OO思想的闸门,就让我意识到什么是厚积薄发,各种设计模式便如一个个性感的美女一样浮现在我脑海中,令我欲罢不能。于是一个个的类便如雪片一般飘散开来。写到兴起,竟抛弃了火柴游戏的实现,写成了一个“多位数运算控制台显示系统”的怪胎。首先来看下这个系统的使用方法:
public static void main(String[] args) { MultiDigit num1 = new MultiDigit(42723); MultiDigit num2 = new MultiDigit(2577); Operation op = OperFactory.getOper('+'); Expression exp = new Expression(num1,num2,op); exp.draw(); }
执行后,运行结果如下:
M M MMMM MMMM MMMM MMMM MMMM MMMM MMMM MMMM M M MMMM MMMM MMMM MMMM M M M M M M | M M M M --- M M M M M M M M MMMM MMMM M MMMM MMMM -+- MMMM MMMM M M MMMM MMMM MMMM M M M M M M M M M | M M M M --- M M M M M M M M MMMM M MMMM MMMM MMMM MMMM M M M MMMM MMMM MMMM MMMM
且不论这里显示效果不是太好,来说一下这个系统的设计。整个系统大概用到了“单例模式”,“模板模式”,“享元模式”,“工厂模式”,大概20个类,有极佳的可扩展性。不是太难,就不拿出来了。
好了,有了以上这个超强的显示系统。再来分析一下火柴游戏的算法。首先来看一下这张表:
数字 加一 减一 自移动
0 8 6,9
1
2 3
3 9 2
.
.
.
9 8 5,3 6,0
这张是反映火柴可能变化的表,加一表示增加一根火柴,我们将每个数字的变化存到集合dic[],当检验某个表达式时,遍历一下三个数的dic[],如果符合移动规则并且等式成立,则找到了可行解。合理的移动规则有三种:1.没有产生过移动 2.一加一减 3.自移动一次,如何表示和计算这种规则是个难点。我的方法如下,为每个数字附加一个值,见下表:
数字 (0) 加一 (1) 减一 (3) 自移动 (4)
对应三条规则,对于任意三个数字,附加值的计算结果分别为:
0+0+0 = 0
0+1+3 = 4
0+0+4 = 4
可见,sum(3个数) == 0 或4 ,则是符合移动规则的。
于是,一个优雅的方案浮出水面:
import java.util.ArrayList; import java.util.List; import app.matchgame.digit.Expression; import app.matchgame.digit.MultiDigit; import app.matchgame.digit.OperFactory; import app.matchgame.digit.Operation; class Node{ int digit; int flag; public Node(int digit,int flag){ this.digit = digit; this.flag = flag; } } class Digit{ List<Node> dic = new ArrayList<Node>(); int p = 0; public void addNode(Node node){ dic.add(node); } public boolean hasNext(){ return p < dic.size(); } public Node next(){ return dic.get(p++); } public void clear(){ p = 0; } public Digit clone(){ Digit clone = new Digit(); clone.dic = this.dic; clone.p = 0; return clone; } } public class MatchGame { private Digit[] digTable; public void init(){ digTable = new Digit[10]; for (int i = 0; i < digTable.length; i++) { digTable[i] = new Digit(); digTable[i].addNode(new Node(i,0)); } digTable[0].addNode(new Node(8,1)); digTable[0].addNode(new Node(6,4)); digTable[0].addNode(new Node(9,4)); digTable[2].addNode(new Node(3,4)); digTable[3].addNode(new Node(9,1)); digTable[3].addNode(new Node(2,4)); digTable[5].addNode(new Node(6,1)); digTable[5].addNode(new Node(9,1)); digTable[5].addNode(new Node(3,4)); digTable[6].addNode(new Node(8,1)); digTable[6].addNode(new Node(5,3)); digTable[6].addNode(new Node(0,4)); digTable[6].addNode(new Node(9,4)); digTable[7].addNode(new Node(1,3)); digTable[8].addNode(new Node(6,3)); digTable[8].addNode(new Node(9,3)); digTable[9].addNode(new Node(8,1)); digTable[9].addNode(new Node(5,3)); digTable[9].addNode(new Node(3,3)); digTable[9].addNode(new Node(0,4)); digTable[9].addNode(new Node(6,4)); } public void calc(int a,int b,int c, Operation op){ Digit dig1 = digTable[a].clone(); Digit dig2 = digTable[b].clone(); Digit dig3 = digTable[c].clone(); while(dig1.hasNext()){ Node d1 = dig1.next(); dig2.clear(); while(dig2.hasNext()){ Node d2 = dig2.next(); dig3.clear(); while(dig3.hasNext()){ Node d3 = dig3.next(); int tmp = d1.flag + d2.flag + d3.flag; if((tmp == 0 || tmp == 4)&& op.oper(d1.digit,d2.digit) == d3.digit){ MultiDigit num1 = new MultiDigit(d1.digit); MultiDigit num2 = new MultiDigit(d2.digit); Expression exp = new Expression(num1,num2,op); exp.draw(); System.out.println(); } } } } } public static void main(String[] args) { MatchGame demo = new MatchGame(); demo.init(); //此处可根据输入获取相应运算 Operation op = OperFactory.getOper('+'); demo.calc(3, 6, 9,op); } }
运行结果如下:
HHHH HHHH HHHH H | H --- H H HHHH -+- HHHH HHHH H | H H --- H HHHH HHHH HHHH HHHH HHHH HHHH H | H --- H H HHHH -+- HHHH HHHH H | H --- H H HHHH HHHH HHHH
发表评论
-
shiro 整合dwz 解决登录跳转问题
2014-02-26 11:07 5698在dwz界面操作会话超时时,有两种处理方法。一种是跳 ... -
html5--笑傲弈林
2011-06-24 17:39 2503结合笔者发过的ht ... -
Ice中间件研究
2011-06-17 15:02 10524Ice中间件研究 简介 Ic ... -
朝花夕拾-----中国象棋
2011-03-10 22:51 2063整理文件,发现昔日写的中国象棋程序,把玩一番,直叹今不如昔,锋 ... -
告诉你什么是优雅的设计(2)--------重构EasyMonitor
2011-01-20 17:33 2284EasyMonitor1.0出来后不久,玩着玩着,我就敏锐 ... -
告诉你什么是优雅的设计(1)--------EasyMonitor1.0
2011-01-19 17:44 2681公司里不知哪个“专家”做的项目,总把tomcat ... -
还原javaeye的崇高文化
2010-12-07 18:57 1527平时对帖子的质量比较苛刻,对一些没内容帖子不免冷嘲热讽。 本来 ... -
html5-贪食蛇
2010-11-30 14:09 1481随着HTML5的插入触碰到RIA的G点,b/s的生产力将进一步 ... -
告诉你什么是优雅的代码(10)----鬼斧神工
2010-11-03 16:06 2410最近逛javaeye得出的体会就是现在的弟弟妹妹确实都很强。动 ... -
告诉你什么是优雅的代码(9)----山寨版猜珍珠
2010-10-08 17:16 1836国庆长假百无聊赖,于是玩玩3366的游戏。 玩到一款小游戏ht ... -
告诉你什么是优雅的代码(8)-----排列组合专题
2010-09-25 14:20 6214http://www.iteye.com/topic/7703 ... -
JAVA程序员情书
2010-09-21 11:55 3673根据网络同名情书改编,版权所有,盗版不究。 我能抽象出整个 ... -
告诉你什么是优雅的代码(7)-----银行作业调度系统
2010-09-20 11:51 2378公告:C1000,请到1号窗口办理,估计用时48秒。 公 ... -
告诉你什么是优雅的代码(6)------阿拉伯钱数转换为中文形式
2010-09-19 14:08 3265http://www.iteye.com/topic/7668 ... -
世人谓我太疯癫,我笑世人看不穿
2010-09-17 17:44 1354你来迟了。 首先来看下这个系统的使用方法: publ ... -
告诉你什么是优雅的代码(5)------ 百度之星也是普通人
2010-09-14 16:34 2062今天在挖掘《优雅代码》系列的题材的时候,发现一贴http:// ... -
告诉你什么是优雅的代码(4)-----智力题的解法(答案)
2010-09-08 16:08 2714以下智力题摘自某一帖子。在纸上画了一下之后有了答案。出于职业敏 ... -
告诉你什么是优雅的代码(4)-----智力题的解法
2010-09-08 10:43 1925以下智力题摘自某一帖子。在纸上画了一下之后有了答案。出于职业敏 ... -
告诉你什么是优雅的代码(3)------山寨拼音分词
2010-09-06 16:27 4564早上看见一帖《拼音语法检查》,感觉比较啰嗦,也比较低效。于是自 ... -
用hibernate也能玩出jdbc的感觉
2010-09-03 15:20 1423相信大家都看了那篇《用jdbc也能玩出hibernate的 ...
相关推荐
国嵌必修实验代码5-5-2国嵌必修实验代码5-5-2国嵌必修实验代码5-5-2国嵌必修实验代码5-5-2国嵌必修实验代码5-5-2国嵌必修实验代码5-5-2国嵌必修实验代码5-5-2国嵌必修实验代码5-5-2国嵌必修实验代码5-5-2国嵌必修...
国嵌必修实验代码5-4-2国嵌必修实验代码5-4-2国嵌必修实验代码5-4-2国嵌必修实验代码5-4-2国嵌必修实验代码5-4-2国嵌必修实验代码5-4-2国嵌必修实验代码5-4-2国嵌必修实验代码5-4-2国嵌必修实验代码5-4-2国嵌必修...
Spring5 框架 ---- Spring5的新功能 ---- 代码 Spring5 框架 ---- Spring5的新功能 ---- 代码 Spring5 框架 ---- Spring5的新功能 ---- 代码 Spring5 框架 ---- Spring5的新功能 ---- 代码 Spring5 框架 ---- Spring...
国嵌必修实验代码3-1-3国嵌必修实验代码3-1-3国嵌必修实验代码3-1-3国嵌必修实验代码3-1-3国嵌必修实验代码3-1-3国嵌必修实验代码3-1-3国嵌必修实验代码3-1-3国嵌必修实验代码3-1-3国嵌必修实验代码3-1-3国嵌必修...
国嵌必修实验代码4-2-2国嵌必修实验代码4-2-2国嵌必修实验代码4-2-2国嵌必修实验代码4-2-2国嵌必修实验代码4-2-2国嵌必修实验代码4-2-2国嵌必修实验代码4-2-2国嵌必修实验代码4-2-2国嵌必修实验代码4-2-2国嵌必修...
qt-everywhere-opensource-src-5.6.3 用于手工编绎用的。
在本文中,我们将深入探讨如何使用Qt5框架与WebEngineView组件来嵌入百度地图,以便在您的应用程序中集成地理定位功能。这个示例项目,"Qt5-嵌入百度地图demo",演示了如何利用Qt5.5的特性与百度地图API进行交互,...
策略为王股市软件源代码-----网盘下载地址
这些通常是为工作台生成的项目添加额外代码的示例。 修复了STM32G431CB器件的HSE时钟设置错误。在工作台中选择8 MHz作为振荡器频率实际上会导致HSE设置为24 MHz。这会影响B-G431B-ESC1板。 解决了固件示例对STM32...
uid-generator中的workId是由uid-generator自动生成的,并且考虑到了应用部署在docker上的情况,在uid-generator中用户可以自己去定义workId的生成策略,默认提供的策略是:应用启动时由数据库分配。...
家政服务-家政服务平台-家政服务平台源码-家政服务平台java代码-家政服务平台设计与实现-基于springboot的家政服务平台-基于Web的家政服务平台设计与实现-家政服务网站-家政服务网站源码-家政服务网站java代码-家政...
C语言程序设计实验指导_上交大_课前练习-改错-完善程序-课后练习参考答案
**百度地图API(Android)开发详解** 在Android应用开发中,集成地图功能是非常常见的需求,而百度地图API提供了强大的地图服务,让开发者能够轻松地在应用中实现定位、导航、路线规划等多种功能。以下是对百度地图...
文档"天狼星51&AVR单片机程序代码.doc"可能包含了51单片机的实例代码和讲解,这对于初学者理解并模仿编写程序非常有帮助。"10天学会51与C配套仿真开发板.DSN"可能是某个开发板的工程文件,用于配合硬件进行实践操作...
ucos-ii全部源代码 ucos-ii全部源代码 ucos-ii全部源代码ucos-ii全部源代码ucos-ii全部源代码ucos-ii全部源代码 ucos-ii全部源代码ucos-ii全部源代码ucos-ii全部源代码ucos-ii全部源代码
它通过提供一种高级的、独立于具体构建工具的语言(CMakeLists.txt),使得开发者能够描述项目中的源代码组织方式、编译步骤以及如何组装可执行文件或库。CMake并不直接进行编译和链接,而是生成特定构建系统的构建...
严蔚敏数据结构C语言版本_可运行源码_完全C语言代码实现 ----- 毕业设计,课程设计,项目源码均经过助教老师测试,运行无误,欢迎下载交流 ----- 下载后请首先打开README.md文件(如有),某些链接可能需要魔法打开...
压缩包中的"D-S Fusion"可能包含了实现以上步骤的MATLAB代码文件,包括定义BPA、Dempster's组合规则、计算信念和似然函数,以及进行决策的脚本或函数。通过阅读和理解这些代码,可以深入学习D-S证据理论的实际应用,...
CSP-J第二轮认证真题及答案代码! 2023年CSP-J复赛第二轮认证真题,附带参考答案代码!附带参考代码! CSP-J/S复赛第二轮认证复习专用! CSP-J/S复赛第二轮认证得分技巧! CSP-J/S复赛第二轮认证真题参考! CSP-J/S...