
本科生毕业设计论文内芯格式-googlecode.docx
6页┊┊┊┊┊┊┊┊┊┊┊┊┊装┊┊┊┊┊订┊┊┊┊┊线┊┊┊┊┊┊┊┊┊┊┊┊┊毕业设计(论文)报告纸棋类游戏开发框架的探索——Animal Kingdom之设计与实现软件工程 陈犇 指导老师 张晨曦【摘要】 Animal Kingdom(以下简称AK)本是由同济大学本科生在2005年自行开发的运行在Mac OS X平台下的棋类游戏该作品曾获2006年苹果中国学生开发挑战赛第一名本课题的目标是分析原有设计中存在的缺陷,并尝试设计出一套通用的、适用于绝大多数棋类游戏的开发框架笔者,也是AK的原主要开发者,结合自身在美国苹果公司的子公司的实习时所积累的经验和学习到的设计原则,并在对市场上同类产品进行比较的基础上,对原有设计中存在的缺陷进行了系统的分析同时,笔者对棋类游戏的共同性进行了一定的研究,在UML的帮助下,设计出了符合目的大致框架在重构AK的过程中,适逢Apple推出了iPhone SDK的测试版本在没有对项目做太大改动的前提下,笔者成功的将新框架下的AK移植到iPhone平台,使AK在共享大多数代码的同时,可以部署到两个不同的平台同时,笔者使用到了Mac OS X 10.5 Leopard的一些新功能,如Core Animation。
关键词】 棋类游戏 苹果 以此类推【外文摘要】 This article describes the development process of Animal Kingdom.Refactoring is the key.【外文关键词】 Mac OS X Leopard board game1 引言 21.1 Animal Kingdom的由来 21.2 AK开发中所遇到问题 21.3 课题的目标 22 同类软件的比较 22.1 Othello的启示 22.2 一个Java棋类游戏的启示 22.3 Big Bang Chess简介 23 问题分析与设计指导方针 23.1 老版AK存在的问题分析:违反的设计原则等 23.2 新设计:设计原则,UML图等等 24 开发环境与使用到的技术 25 各模块的具体实现 25.1 AI部分,同时说明棋类游戏通用性 25.2 人机交互部分 25.3 多媒体部分 25.4 移植到iPhone平台 26 开发流程 27 可能的改进与展望 3谢 辞 3参考文献 31 引言1.1 Animal Kingdom的由来1.2 AK开发中所遇到问题1.3 课题的目标2 同类软件的比较要对原先AK设计上的失误有一个深入和彻底的了解,只分析AK本身是不够的。
因此,笔者参考了类似的棋类游戏,并从技术和功能两个方面分析(fixme: 扩展这段)2.1 Othello的启示Othello[1]是笔者在瑞典Uppsala大学交换学习时,Logic Programming课程的最终项目该项目是使用Prolog语言(fixme:或许需要简短介绍),对Othello游戏(也就是黑白棋)进行实现Logic Programming用于实现棋类游戏AI所需要的回溯算法有其独到的简洁之美,不过该项目更值得借鉴的,是其对接口的设计为了让学生的项目能够和由老师事先做好的标准的程序进行对战,同时能够让游戏有一个图形界面,而不必让学生将大部分时间花在图形界面上,Uppsala大学的老师设计了一套简单但足够通用的接口,可以让学生的命令行程序简单了整合到一个带有图形界面和标准AI程序的框架里接口由如下predicates(LP当中自程序的名称,类似与命令式语言中的函数)构成,下面的“+”表示输入,“-”表示输出· initialize(+Side, -State) 如果程序是Side一边,那么最初的棋盘状态由State表示initialize在程序开始会被调用一次· best_move(+State, -Move) State表示当前棋盘的状态,Move表示由算法生成的,基于当前状况下的最佳的一步棋。
· move(+Move, +State, -NewState) Move表示程序自身走的一步棋,State表示当前棋盘的状态,而NewState是在下了Move这步棋后,棋盘会变成的状态· opponent_move(+Move, +State, -NewState) 这个predicates于move/3基本相同,唯一的差别是Move是由对方所下· game_over(+State, -Winner, -Whites, -Blacks) 这个predicates为真的条件是:State是一盘棋的最终状态,Winner是赢家,Whites和Blacks各为白、黑棋子最终的数量学生的程序,只要正确的实现以上的语句,就能够被整合到测试系统中,与标准程序进行对战这里,笔者不详细介绍具体数据结构的实现——数据结构可以因语言而异,而只着重在这个接口所代表的一种设计理念——理念则是四海皆通的这个接口的好处是,客户端(学生的程序)不需要知道任何图形界面的细节,甚至不用自己维护棋盘的数据结构表示,而只用根据当前的输入信息,计算出合理的输出信息在对AK的算法模块进行重构的过程中,笔者借鉴了Othello这样的接口设计理念,然而,这样的接口设计也并不是完美的。
Othello的图形界面比较简单,没有多少人机交互的操作比如只要棋盘上有空的格子,那么当前的棋手必定可以在那一格走棋,图形界面也不用追踪鼠标的位置来提示用户哪一个可以下棋然而在AK中,人机交互则是非常频繁的,用户甚至可以将一个棋子拖拽到棋盘上的另一个位置这就要求算法部分提供额外的信息,指明哪些棋子是可以被移动的、被选中的棋子可以移动到哪一格以及哪些空格上可以下新的棋子等等另一方面,稍微高级一些的AI算法会根据历史纪录来调整走棋的策略,这就需要算法模块自身储存棋盘的状态信息在这个前提下,Othello由server统一保存棋盘信息的模式就不再适用2.2 一个Java棋类游戏的启示Othello的接口设计虽然很具有借鉴性,但其没有运用到面向对象的设计思想,而AK的设计语言是Objective-C(一款建立在C语言基础上的,面向对象的语言)上的因此,分析一款由面向对象语言实现的棋类游戏就显得很有意义Four in a row[2]是一款基于Java的,使用Applet实现图形界面的简单棋类游戏虽然程序本身不复杂,但其设计思想也很值得借鉴有两点最值得一提:一是程序定义了一系列的抽象类,用于描述棋盘信息和规定player的行为;另一点是该程序采用了监听者的设计模式,这使得各个模块之间可以以一种低耦合的方式进行沟通。
AK的新算法模块设计基本上借鉴了这样的设计思想:笔者定义了一系列Objective-C protocol,以供具体的实现类来继承同时其他模块可以通过Key-Value Observing[3]的方式监听算法模块,以获知算法模块合适计算好了下一步棋算法模块可以在一个单独的线程里进行计算,这样图形界面部分不会被中断2.3 Mac OS X具代表性的应用程序的对比除了在技术层面对类似的程序进行分析和比较,也需要对同类成功的产品进行比较在Mac OS X平台上,最著名的棋类游戏当属来自Freeverse公司的Big Bang Board Games与所有成功的游戏一样,BBB有着吸引人的图形界面,可爱的动画人物以及滑稽的音效等等但最为Mac OS X平台独占的游戏,BBB与操作系统紧密结合,使用到了许多OS X独有的技术,极大的丰富了用户体验不过更值得一提的是,BBB是一个系列的游戏,其包括黑白棋、国际象棋等著名的棋类游戏当这一系列的游戏都有一个统一的框架,其界面风格、音效都类似,其内部必定以某种方式共享了许多代码很遗憾的,BBB是一款商业软件,其代码不是开源的,笔者不能深入的研究其内部架构当这种多种游戏共享一个框架的概念,引领着笔者去寻找在Mac OS X平台上类似的构架的应用程序。
Adium是一款在Mac OS X平台下十分流行的、开源的聊天软件客户端其特点是通过利用同样为遵循GPL协议的libpurple库来兼容许多种聊天协议但使Adium与其他libpurple的软件所区别开来的,是其独到的用户界面、音效和其最值得一提的一个特性:允许用户从网上下载各种各样的美化界面的插件(Xtras)如果我们将这样的概念应用到棋类游戏的设计中,那将会非常的有趣:用户的自定义或者从网上下载不同的插件以更改棋类游戏的外观,甚至定义一个新的游戏这也正是新AK的一个设计目标3 问题分析与设计指导方针3.1 老版AK存在的问题分析:违反的设计原则等通过与同类应用程序的对比,老AK的问题有:算法模块的设计不佳、整体框架缺乏合理设计、扩展性差等具体说来,老版AK违反了以下设计原则[4]:· Open-close原则若要添加新功能,或是修改部分代码,AK的许多部分都要同时被修改,可谓牵一发而动全身这个显然违反了open-close原则(模块的设计应该对于修改是封闭的,对于扩展则是开放的)· Single-responsibility原则许多老AK的类实现了太多的功能3.2 新设计:设计原则,UML图等等新AK的设计的原则是尽可能的将各个模块区分开来。
作为棋类游戏,最关键的模块之一,自然是算法模块,所以新的设计也送这个里开始新的算法接口采用Objective-C的protocol(类似Java里的interface)来定义:@protocol AKPlayer
