于无声处

人生三恨:鲥鱼多剌,海棠无香,需求常变

纵横字谜(基本框架)

  老婆最喜欢玩纵横字谜,比如对南方周末每期的《小强填字》总是津津乐道。最近我闲来无事,不妨做一个电脑上玩的填字,以博老婆一笑,^-^。
  首先应该有一个TPuzzleItem类吧?这个表示谜题的单个条目,包括坐标、方向(横向还是纵向)、谜面、谜底等属性,对了,还应该保存解题人输入的答案。这个TPuzzleItem还应该有一些方法(没有方法的类,也就没有存在的必要了),比较重要的就是根据给定的逻辑坐标返回该单元格的字符(如果给定的坐标不属于该条目,就返回空),为了便于导入和导出,还应该有ExportToXMLNode和ImportFromXMLNode这两个方法,以便于根据XML节点来导入导出。
  多个条目应该由TPuzzle类来管理,TPuzzle有一个私有的TList对象来维护条目列表,而不是让TPuzzle从TCollection继承,因为我实在不想过多去了解这个TCollection的内部结构,用委托而不是继承,也是俺一贯的做法。同样,TPuzzle也应该有ExportToXMLNode和ImportFromXMLNode这两个方法。每一个TPuzzle代表一个谜题,为了区分不同的谜题,它具有一个Guid属性。
  TPuzzle与TPuzzleItem于GUI完全无关,它只是在提供谜题的逻辑,至于界面上如何实现,如何与用户交互这些工作,交给TPuzzleGUI来处理。TPuzzleGUI委托一个私有字段FPuzzle来处理逻辑方面的问题,自己接受用户的输入、负责在屏幕上绘制出谜题。TPuzzleGUI从TCustomControl继承,并具有WS_VSCROLLBAR和WS_HSCROLLBAR属性,这样可以显示很大的栅格给用户(虽然实际上可以用不到),由于并未对栅格建立二维数组,只是由TPuzzle来维护一组条目列表,所以占用的内存并不因屏幕上显示的栅格多少而增加。
  界面的设计可简可繁,反正一切都是绘制出来的,由于绘制的小地方比较多,所以TPuzzleGUI也用一个缓冲区,先将所有要绘制的内容画在缓冲区中,再一次性画上屏幕,有点象DirectDraw的做法,但是这种小玩意就不用劳DX的大驾了吧。界面设计稍微细微一点,带给用户的感觉也就好一点,可惜俺不是美工,没办法把一切都画得那么完美:-(
  还剩下一个如何保存多个谜题的问题,这种存储由TPuzzleContainer来完成,这是一个抽象类,才能方便俺以后改变存储方式,比方说今天用XML来存储,明天想通了,或许就用个ACCESS库了呢。抽象工厂模式应该是要用到的吧,虽然现在还看不出有什么好处,呵呵。

阅读更多
个人分类: 其他(技术文章)
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭