[转]

posted @ 2008-07-20 10:31 RichardHe 阅读(1069) | 评论 (0)  编辑 |

posted @ 2008-07-20 09:45 RichardHe 阅读(910) | 评论 (0)  编辑 |

posted @ 2008-07-16 18:10 RichardHe 阅读(421) | 评论 (0)  编辑 |

posted @ 2008-07-10 17:27 RichardHe 阅读(457) | 评论 (0)  编辑 |

posted @ 2008-07-09 15:11 RichardHe 阅读(679) | 评论 (0)  编辑 |

posted @ 2008-07-08 11:49 RichardHe 阅读(2164) | 评论 (1)  编辑 |

posted @ 2008-07-05 13:39 RichardHe 阅读(437) | 评论 (0)  编辑 |

posted @ 2008-07-05 13:39 RichardHe 阅读(996) | 评论 (0)  编辑 |

posted @ 2008-07-04 13:23 RichardHe 阅读(917) | 评论 (0)  编辑 |

posted @ 2008-07-04 13:18 RichardHe 阅读(569) | 评论 (0)  编辑 |

posted @ 2008-06-25 17:12 RichardHe 阅读(231) | 评论 (0)  编辑 |

     摘要: 一.引言言

有限状态机是一种用来进行对象行为建模的工具,其作用主要是描述对象在它的生命周期内所经历的状态序列,以及如何响应来自外界的各种事件。在面向对象的软件系统中,一个对象无论多么简单或者多么复杂,都必然会经历一个从开始创建到最终消亡的完整过程,这通常被称为对象的生命周期。一般说来,对象在其生命期内是不可能完全孤立的,它必须通过发送消息来影响其它对象,或者通过接受消息来改变自身。在大多数情况下,这些消息都只不过是些简单的、同步的方法调用而已。例如,在银行客户管理系统中,客户类(Customer)的实例在需要的时候,可能会调用帐户(Account)类中定义的getBalance()方法。在这种简单的情况下,类Customer并不需要一个有限状态机来描述自己的行为,主要原因在于它当前的行为并不依赖于过去的某个状态。[1]

遗憾的是并不是所有情况都会如此简单,事实上许多实用的软件系统都必须维护一两个非常关键的对象,它们通常具有非常复杂的状态转换关系,而且需要对来自外部的各种异步事件进行响应。例如,在VoIP电话系统中,电话类(Telephone)的实例必  阅读全文

posted @ 2008-06-13 15:01 RichardHe 阅读(1807) | 评论 (0)  编辑 |

     摘要: 有限状态机(Finite State Machine或者Finite State Automata)是软件领域中一种重要的工具,很多东西的模型实际上就是有限状态机。

最近看了一些游戏编程AI的材料,感觉游戏中的AI,第一要说的就是有限状态机来实现精灵的AI,然后才是A*寻路,其他学术界讨论比较多的神经网络、模糊控制等问题还不是很热。

FSM的实现方式:
1) switch/case或者if/else
这无意是最直观的方式,使用一堆条件判断,会编程的人都可以做到,对简单小巧的状态机来说最合适,但是毫无疑问,这样的方式比较原始,对庞大的状态机难以维护。

2) 状态表
维护一个二维状态表,横坐标表示当前状态,纵坐标表示输入,表中一个元素存储下一个状态和对应的操作。这一招易于维护,但是运行时间和存储空间的代价较大。

3) 使用State Pattern
使用State Pattern使得代码的维护比switch/case方式稍好,性能上也不会有很多的影响,但是也不是100%完美。不过Robe  阅读全文

posted @ 2008-06-13 14:48 RichardHe 阅读(2126) | 评论 (0)  编辑 |

posted @ 2008-06-05 14:17 RichardHe 阅读(709) | 评论 (0)  编辑 |

posted @ 2008-06-04 15:39 RichardHe 阅读(193) | 评论 (0)  编辑 |

posted @ 2008-06-04 15:23 RichardHe 阅读(1111) | 评论 (0)  编辑 |

posted @ 2008-06-04 15:22 RichardHe 阅读(479) | 评论 (0)  编辑 |

posted @ 2008-06-04 15:21 RichardHe 阅读(300) | 评论 (0)  编辑 |

posted @ 2008-06-04 15:21 RichardHe 阅读(483) | 评论 (0)  编辑 |

posted @ 2008-06-04 15:20 RichardHe 阅读(297) | 评论 (0)  编辑 |

posted @ 2008-06-04 15:19 RichardHe 阅读(677) | 评论 (0)  编辑 |

posted @ 2008-06-04 15:01 RichardHe 阅读(419) | 评论 (0)  编辑 |

posted @ 2008-06-04 14:50 RichardHe 阅读(341) | 评论 (0)  编辑 |

posted @ 2008-06-04 14:45 RichardHe 阅读(319) | 评论 (0)  编辑 |

posted @ 2008-06-03 11:39 RichardHe 阅读(414) | 评论 (0)  编辑 |

     摘要: 转自http://www.cppblog.com/alantop/archive/2008/05/15/49989.html
char test[] = "0xf";
long lResult = strtol(test, '\0', 16);  阅读全文

posted @ 2008-05-16 17:44 RichardHe 阅读(912) | 评论 (0)  编辑 |

     摘要: 声明函数指针

回调函数是一个程序员不能显式调用的函数;通过将回调函数的地址传给调用者从而实现调用。要实现回调,必须首先定义函数指针。尽管定义的语法有点不可思议,但如果你熟悉函数声明的一般方法,便会发现函数指针的声明与函数声明非常类似。请看下面的例子:

void f();// 函数原型

上面的语句声明了一个函数,没有输入参数并返回void。那么函数指针的声明方法如下:

void (*) ();

让我们来分析一下,左边圆括弧中的星号是函数指针声明的关键。另外两个元素是函数的返回类型(void)和由边圆括弧中的入口参数(本例中参数是空)。注意本例中还没有创建指针变量-只是声明了变量类型。目前可以用这个变量类型来创建类型定义名及用sizeof表达式获得函数指针的大小:

// 获得函数指针的大小
unsigned psize = sizeof (void (*) ());

// 为函数指针声明类型定义
typedef void (*pfv  阅读全文

posted @ 2008-05-15 14:54 RichardHe 阅读(172) | 评论 (0)  编辑 |

posted @ 2008-05-14 17:53 RichardHe 阅读(344) | 评论 (0)  编辑 |

posted @ 2008-05-14 13:21 RichardHe 阅读(466) | 评论 (0)  编辑 |

     摘要: 记得2004年刚接触设计模式,买了经典的<<设计模式>>一书,细细地阅读,然后在开发中模仿。一两年时间过去,对23种设计模式弄得还算比较熟悉,也在软件设计中能用则用,比如Singleton, template method, proxy, facade等等。但总感觉用的不爽,当时也说不出原因;就是感觉在使用的过程中,是一种为了使用设计模式而使用上他们,有时候是生搬硬套。总之,自己当时是搞不清楚为什么要使用设计模式,停留在别人说它牛,我就学着用而不落人之后。
我不是一个天质聪颖的人,对软件设计的理解,基本上无法评自己能力单独领悟出来。只有常常督促自己多买国内外软件专家写的好书,来学习他们在这些方面的发现和总结。靠后天学习来弥补先天不足,也是没有办法中的办法。
终于在2007年看到了<>,书中对设计模式的讨论,并没有特别吸引我的地方,不过是用java语言来详细讲解23种模式而已,最多增加一些变体。深深吸引我的是"第二部分面向对象的设计原则",这一部分虽然篇幅不多,但清晰地说明了我们为什么要用设计模式,使用设计模式是来解决什么问题的,使用之后  阅读全文

posted @ 2008-05-14 10:37 RichardHe 阅读(231) | 评论 (0)  编辑 |

posted @ 2008-05-09 15:57 RichardHe 阅读(118) | 评论 (0)  编辑 |

     摘要: d:\test\test\test\test.cpp(27): error C2668: “sqrt” : 对重载函数的调用不明确


如果
int IsSquareNum(int num)
{
if((int)sqrt(num)==(int)sqrt(num))
return 1;
else
return 0;
}
则提示上面的错误

改为:
int IsSquareNum(int num)
{
if((int)sqrt((double)num)==(int)sqrt((double)num))
return 1;
else
return 0;
}  阅读全文

posted @ 2008-05-08 17:12 RichardHe 阅读(860) | 评论 (1)  编辑 |

     摘要: 副本貌似最早出现在魔兽世界
就是人物或者团队进入一个单独的地图(其他人进的和自己不是一个 必须是队伍才能进一个)
里面都是精英怪 难杀 但是出的东西多 可以打到一些套装等
副本任务是 任务必须在进入副本后杀死某些老大或通过杀里面的某些小怪 或得到某些东西的任务  阅读全文

posted @ 2008-05-07 10:37 RichardHe 阅读(295) | 评论 (0)  编辑 |

posted @ 2008-05-06 09:58 RichardHe 阅读(173) | 评论 (0)  编辑 |

posted @ 2008-05-06 09:57 RichardHe 阅读(753) | 评论 (0)  编辑 |

posted @ 2008-05-06 09:56 RichardHe 阅读(122) | 评论 (0)  编辑 |

posted @ 2008-05-05 13:54 RichardHe 阅读(384) | 评论 (1)  编辑 |

     摘要: rac配置过权限之后,基本已经满足日常的应用了,但装上刚运行的时候,我在兴奋之余总感觉那里有点不对劲.回头细看别人搭配的Trac,怎么好像少了几个功能呢?例如可爱的论坛功能,还有实用的标签功能都芳踪难寻,甚是使我纳闷.后来细看文档才发现,这些原来都是Trac的 Plugins.Let's go,让我们去玩玩Trac的插件吧^_^.
首先我们要拜访一个网站Trac-Hacks(http://www.trac-hacks.org),里面包含了许多Trac插件的开源项目,当然管理这些项目的就是Trac o(∩_∩)o
一开始,我对这些插件各自的作用也不太了解,先弄下来几个别人有应用例子的插件玩玩了,首当其冲当然是方便我们权限管理的WebAdmin(据Trac的官方介绍,WebAdmin从Trac0.11版本后就不再捆绑到Trac的主项目中,独立出来一个子项目),废话少说,先看看安装插件,我们要干点什么.
1.安装WebAdmin
我沿着Trac文档的教导,先要去安装一个setuptools,满以为照这文档的链接绝对没有错误,下了一个ez_setup.py脚本,  阅读全文

posted @ 2008-04-08 16:54 RichardHe 阅读(1477) | 评论 (0)  编辑 |

     摘要: 遨游一番Trac之后,真是爱他爱得欲罢不能。在这里我们谈谈Trac的权限配置管理,[由于Trac是用python开发的,而python我一点都不懂,只能站在一个使用者很低的角度谈了o(∩_∩)o,高手们见笑了]  阅读全文

posted @ 2008-04-08 16:16 RichardHe 阅读(886) | 评论 (0)  编辑 |

     摘要: 一、Ticket系统简介

Ticket系统是Trac中关于项目管理的一个重要单元,它是一个简单有效的版本差异和Bug跟踪系统。

在项目开发过程中出现的任何问题,都可以用一个Ticket来标识,例如Bug,项目计划,功能改进,项目建议,Todo等等,都可以写成一个Ticket,开发人员通过访问查看Ticket系统,可以及时的了解到项目进度,有待解决的地方等等

每个Ticket都可以被修改和说明(Description属性),并说明这个Ticket是Bug还是项目建议还是其他什么(Type属性),指派由哪个人对这个Ticket负责(Assigned to/Owner属性),设定Ticket的优先级(Priority属性),设定Ticket的最终完成时间(Milestone属性),设定这个 Ticket属于哪个模块(Component属性)。
  阅读全文

posted @ 2008-04-08 15:50 RichardHe 阅读(761) | 评论 (0)  编辑 |

posts - 94, comments - 138, trackbacks - 0, articles - 94

Copyright © RichardHe