《五子棋游戏(论文范文,JSP,JAVA,毕业设计).doc》由会员分享,可在线阅读,更多相关《五子棋游戏(论文范文,JSP,JAVA,毕业设计).doc(23页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、移动电话应用程序蓝牙对战五子棋游戏的设计分析摘要 信息技术的进步和广泛应用正在深刻地影响着生活中的各个角落。程序的运行环境也不在局限于计算机。本文主要讨论了使用无线开发工具(WTK)在移动电话这类联网的受限配置设备(CLDC)上开发蓝牙对战五子棋游戏的应用程序(MIDlet)的实现过程。通过该程序的实现,可以了解到基于J2ME开发的基本知识。关键词 J2ME;无线通讯工具包(WTK);联网的受限设备配置(CLDC);移动电话;蓝牙应用 1 引言从1997年的第一款手机游戏贪吃蛇到目前,手机游戏已经不在停留在简单的俄罗斯方块之类的画面简单、规则单一的游戏了,而是发展到了可以与电脑相媲美的、具有很
2、强交互性和娱乐性的复杂形式。蓝牙对战五子棋游戏,是一个通过蓝牙作为传输信息的工具,实现对战的游戏开发。该游戏在五子棋单机版的基础上加入了蓝牙联网功能,使具备蓝牙功能的手机可以任意互联,不受到空间和时间的限制进行游戏对战,使游戏更具趣味性。2 可行性分析 适用于蓝牙无线联网技术的JABWT标准(Java APIs for Bluetooth Wireless Technology),由JSR-82规范所定义,该标准能支持蓝牙应用软件的快速开发,并保证其轻便、安全,以及具有高度的可用性。目前已经有越来越多的设备支持蓝牙程序的运行,因此,移动应用市场也急切需要有更多的此类游戏出现。蓝牙功能除了收发信
3、息和传输文件外,还能用来玩联机游戏,越来越多的手机支持蓝牙功能,可以预见,蓝牙将成为手机的标准功能。蓝牙(Bluetooth)是一种支持设备间短距离通信(一般10m以内)的无线电技术。通过蓝牙,人们能在包括移动电话、PDA、无线耳机、笔记本电脑、相关外设等众多设备之间进行无线信息交换。可以说,蓝牙为手机对战游戏提供了不错的联网平台,使玩家不再玩单机游戏。目前,大部分的手机都支持Java功能,Java手机游戏很多,但支持蓝牙对战的不多,而且并非所有的Java游戏都能在Java手机上使用,它们之间根据手机品牌和型号不同也有些区别。所以选择Java蓝牙联网游戏时需要认准该游戏是否支持自己的手机。3
4、软件需求分析游戏主要内容为双人联机对战,游戏只支持对战功能,不能进行单机游戏。界面比较简单,但是棋盘大小设计的比较灵活和人性化,可以根据不同手机屏幕自动调整大小。玩家使用四个方向键的上下左右来移动落子的位置,移动到空白位置使用确定按钮来落子。为简单起见,游戏不涉及悔棋,棋盘采用默认尺寸为15*15,并且客户端先下。在游戏逻辑方面没有人工智能,只有“判赢”算法。游戏启动时,MIDlet对象会先显示一个提示界面的闪屏,用户按确定后,显示连接选择表单,提示玩家选择联网类型。在玩家选择本机作为服务器或者客户端之后开始游戏。游戏用户界面示意图如下。客户端服务器游戏画布白方 游戏画布黑方开始游戏闪屏 确定
5、连接类型选择表单 确定对战 玩家选择4 开发环境操作系统:Windows xp开发环境:JDK-1.6软件开发工具:J2ME WTK-2.5.2集成开发开发化境:Eclipse客户端类连接控制类继承继承主类画布类逻辑类棋子类ConnectionServerClientBTFIRCanvasBTFIRMIDletBTFIRLogicDotCanvasMIDlet服务器类5 游戏的类结构整个游戏共由7个类组成,如上图所示是游戏的类结构。游戏的BTFIRMIDlet类负责保持display对象,并提供个屏幕的切换。游戏包含3个屏幕:由信息提示框Alert类实现的游戏闪屏欢迎界面;在Form表单上应用
6、ChoiceGroup实现的连接类型选项,连接类型可以是服务器或者客户端;在选定连接类型后进入游戏画布,为了简单起见,默认客户端一方先落子(黑方)。BTFIRCanvas类实现了游戏画布,BTFIRLogic类实现了游戏逻辑,Dot类代表了五子棋的棋子,Connection类用于网络连接和用户界面之间的交互,这样整个程序架构更加清晰。Sever类为服务器端联网程序,负责提供服务,等待其他设备接入,并负责服务器一方落子信息的发送和对方信息的接收;Client类为客户端程序,用于搜索设备,搜索服务,并负责客户端一方棋盘行列信息的发送与接收。各个类之间在程序运行时的组织与联系方式(以建立的是服务器为
7、例):NY落子;isMyTurn=false;BTFIRCanvasisMyturn=truekey不做任何操作跟新Logic类;isMyTurn=true;Connection类发送消息;Connection类接收消息;消息接收server(client)Thread.run()设置本地蓝牙为可被发现模式;开通自己的服务地址(创建服务);成功则通知connection(connection再通知画布更新信息);由“服务”接收连接进来的信息(建立Conn);将连接的流对象conn添加到客户处理类来处理;server中的客户处理类类queue-conn;run()处理queue; DataOut
8、putStream(dos)-queue.conn;DataInputStream(dis)-queue.conn;read();send();影响6 各模块的设计6.1 主类BTFIRMIDlet类javax.microedition.lcduiAlertChoiceGroupCommandDisplayFormImageBTFIRMIDletPr: alert :AlertPr: choiceType :ChoiceGroupPr: CMD_EXIT :CommandPr: CMD_PLAY :CommandPr: display :DisplayPr: form :FormPr: img
9、Splash :ImagePr: isServer :BooleanPr: myCanvas :BTFIRCanvasPu: BTFIRMIDlet() :voidPu: commandAction() :voidPu: destroyApp() :voidPu: exit() :voidPu: startApp() :voidPu: getDisplayable() :Displayablejavax.microedition.lcduiCommandListenerjavax.microedition.midletMIDletBTFIRCanvasjavax.microedition.lc
10、duiDisplayableItemjava.ioIOExceptionjava.langStringPr: alert :Alert Alert的实例对象,用于开始时的欢迎画面。Pr: choiceType :ChoiceGroup ChoiceGroup的选择组件,用于选择客户端还是服务端。Pr: CMD_EXIT :Command和Pr: CMD_PLAY :Command Command的按钮。Pr: display :Display 显示控制对象。Pr: form :Form 连接类型选择的窗体。Pr: imgSplash :Image Image的图片对象,用于欢迎界面上的图片。P
11、r: isServer :Boolean 用户选择的的结果存于此布尔变量,服务器为TRUE,客户端为FALSE。Pr: myCanvas :BTFIRCanvas游戏画布实例对象,根据其构造函数传入是服务器还是客户端的信息。Pu: BTFIRMIDlet() :void 本类的构造方法,用于初始化alert和form等信息。Pu: commandAction(Command,Displayable) :void 重写事件监听的虚函数,如点击软键CMD_PLAY则显示画布:构造相应画布,显示画布,让画布打开连接,调用画布开局函数对画布初始化创建逻辑;否则退出。Pu: destroyApp() :
12、void 销毁应用程序的固定的需要重写的方法,本程序中无用,不做定义。Pu: exit() :void 人为主动销毁程序的方法。Pu: startApp() :void 启动应用程序的固定的需要重写的方法,调用显示方法显示提示欢迎框,和form。Pu: getDisplayable() :Displayable 返回form对象。6.2 逻辑类BTFIRLogic类的实现BTFIRLogic类是五子棋对战游戏的逻辑类,该类创建了棋盘的状态数组,并根据对战双方的落子情况更新该数组。对战双方落子后,BTFIRLogic类也负责检测双方的获胜情况,并通知游戏画布更新用户界面。java.langObj
13、ectjava.langObjectBTFIRLogicPu: PLAYER_NONE :intPu: PLAYER_BLACK :intPu: PLAYER_WHITE :intPu: boardSize :intPr: isBlack :booleanPr: isBlackWon :booleanPr: isGameOver :booleanPr: lastDot :DotPr: triedDot :DotPr: myCanvas :BTFIRCanvasPr: playerCounter :intPu: BTFIRLogic() :voidPu: checkGameOver() :boo
14、leanPu: isBlackWon() :booleanPu: lastDot() :DotPu: triedDot() :DotPu: playerBlackGo() :booleanPu: playerWhiteGo() :booleanPr: checkFiveInRow() :intPr: connectedIn1D() :intPr: connectedIn8D() :intPr: expendedIn1D() :intPr: expendedIn8D() :intPr: goAt() :voidPr: isGameOver() :booleanPr: moveOneStep()
15、:DotPr: table :intBTFIRCanvasDotPu: PLAYER_NONE :int 静态常量0表示空白区域Pu: PLAYER_BLACK :int 静态常量1表示黑方落子Pu: PLAYER_WHITE :int 静态常量2表示白方落子Pu: boardSize :int 静态常量15表示棋盘的大小为15Pr: isBlack :boolean 是否落子方为黑方标志,在逻辑类构造函数赋值Pr: isBlackWon :boolean 是否黑方胜利标志,用于传参Pr: isGameOver :boolean 游戏是否结束标志,用于传参Pr: lastDot :Dot 最后
16、棋子对象,存放行和列的坐标Pr: triedDot :Dot 棋子对象,相当于棋子的bufferPr: myCanvas :BTFIRCanvas 游戏画布对象Pr: playerCounter :int 落子计数器,包括0、1、2分别表示空白区域数量,黑子数量,白子数量Pr: table :int 存放棋盘的状态的数组Pu: BTFIRLogic(BTFIRCanvas canvas,boolean isBlack) :void 构造函数,与Canvas类建立联系,初始化标志位、计数器和棋盘数组table。Pu: playerBlackGo(int row,col) :boolean 黑方落
17、子,调用goAt(row,col,player)落子,落子前首先检测该位置是否为空白区域,并且是否超出棋盘,否则判定为无效落子。落子成功返回的布尔值为真,无效落子返回的布尔值为假,以此作为是否成功落子的判定。落子之后随即检测是否存在“五子连珠”情况(调用isGameOver()检查),更新所有状态,标志。Pu: playerWhiteGo(int row,col) :boolean 白方落子,同上。以下方法都是服务于以上两个方法的,所以简单介绍。Pr: checkFiveInRow(row,col,n) :int 检查某一位置的棋子是否存在五子连珠,存在则返回方向代码,不存在则返回-1。Pr:
18、 goAt() :void 在棋盘上落子就是将数组中的相应位置填充为某方的代码,如1、2Pr: isGameOver() :boolean调用checkFiveInRow()调用myCanvas.notifyGameEnd(isBlackWon)打印游戏结束;Pr: moveOneStep(Dot,Direct) :Dot 在某方向(8个方向Direct)上移动一步,由connectedIn1D()等同类方法调用。6.3 游戏画布类BTFIRCanvas的实现BTFIRCanvasPr: BLACK :intPr: WHITE :intPr: midlet :BTFIRMIDlet Pr: l
19、ogic :BTFIRLogicPr: font :FontPr: imgStatus :ImagePr: CMD_STOP :CommandPr: connection :ConnectionPr: boardLength :intPr: boardSize :intPr: boardX :intPr: boardY :intPr: canvasWidth :intPr: canvasHeight :intPr: cHeight :intPr: cWidth :intPr: fontHeight :intPr: fontWidth :intPr: gridLength :intPr: sto
20、neLength :intPr: statusColor :intPr: statusImage :intPr: isBlack :boolean Pr: isBlackFirst :boolean Pr: isColor :boolean Pr: isMyTurn :boolean Pr: isServer :boolean Pr: isUpSide :boolean Pu: BTFIRCanvas() :voidPu: commandAction() :voidPu: paint() :voidPro:keyPressed() :voidPu: repaintAt() :voidPu: n
21、ewStage() :voidPu: notifyGameEnd() :voidPu: openConnection() :voidPu: completeInitialization() :voidPu: receiveMessage() :voidPu: setStatus() :voidPr: calcSize() :voidPr: xByCol() :voidPr: yByRow() :voidPr: status :StringBTFIRLogicBTFIRMIDletConnectionjavax.microedition.lcduiCommandListenerCanvasjav
22、ax.microedition.lcduiCommandFontImagejava.langStringjava.ioIOExceptionPrintStreamDotjavax.microedition.lcduiAlertAlertTypeDisplayGraphicsDisplayablejavax.microedition.midletMIDletPr: BLACK :int 定义颜色的常量,置值为0,调用时为黑色。Pr: WHITE :int 定义颜色的常量,置值为0xffffff,调用时为白色。Pr: midlet :BTFIRMIDlet 主类的对象,需要主类传来些主类的参数Pr
23、: logic :BTFIRLogic 定义逻辑类的对象,需要调用逻辑类的方法。Pr: font :Font 字体对象,字体设置和计算字体大小用到。Pr: imgStatus :Image 定义图片对象的数组,存放图片。Pr: CMD_STOP :Command 按钮的对象,在画布上添加退出按钮。Pr: connection :Connection 连接类的对象,创建连接。Pr: boardLength :int 棋盘长度。Pr: boardSize :int 棋盘大小默认为15*15Pr: boardX :int 棋盘左上角的X坐标。Pr: boardY :int 棋盘左上角的Y坐标。Pr:
24、 canvasWidth :int 屏幕宽度。Pr: canvasHeight :int 屏幕高度。Pr: cHeight :int 棋盘绘制区域的高度Pr: cWidth : int 棋盘绘制区域的宽度Pr: fontHeight :int 字体高度。Pr: fontWidth :int 字体宽度。Pr: gridLength :int 棋格长度。Pr: stoneLength :int 棋子直径。Pr: statusColor :int 提示字符串的颜色。Pr: statusImage :int 提示图片的代码。Pr: isBlack :boolean 我方是否为黑子,初始值为true。P
25、r: isColor :boolean 手机是否支持颜色的标志Pr: isMyTurn :boolean 是否轮到我方落子,初始值为true。Pr: isServer :boolean 我方是否为服务器,初始值为true。Pr: isUpSide :boolean 提示字符串位置是否在上方。Pu: BTFIRCanvas(BTFIRMIDlet,isServer) :void 画布的构造函数,为类结构必须有的函数。主要用于加载游戏资源(图片、软键),并初始化参数,包括屏幕尺寸、提示字符串的参数,以及我方是否为服务器,默认情况下客户端先落子,而先落子方采用黑色棋子。Pu: commandActi
26、on(Command,Displayable) :void 由于画布实现了按键监听的接口,所以必须重写此函数。Pu: paint(Graphics g) :void 为画布类结构必须有的函数。在此函数中绘制所有界面。主要画面包括棋盘、棋子和提示字符串。棋盘根据尺寸属性(calcSize()方法计算所得的所有尺寸保存在属性里)绘制线条并填充棋盘底色,棋子根据BTFIRLogic所保存的棋盘数组中的内容绘制不同颜色的棋子(1为黑色,2为白色)。Pro:keyPressed(int keyCode) :void 为画布类结构必须有的函数。用户界面的输入部分支持键盘输入,键盘的上下左右键能让引导框移动
27、,当玩家按下确定键(fire)后,进行落子,如果落子成功,则发送消息(connection.sendMessage())通知对方;如果是无效的落子,则不进行任何操作。Pu: repaintAt(int row,int col) :void 自定义重新绘制函数。当玩家在某个位置落子时,游戏画布并不重新绘制整个屏幕,而是仅仅绘制发生变化的小范围区域,这样能减少整个绘制操作的的工作量,对提高游戏性能有所帮助。根据指定行和列绘制区域。Pu: newStage() :void 游戏新开局时(BTFIRMIDlet中)调用此方法,该方法根据己方落子颜色(构造时传入)创建游戏逻辑对象,并设置游戏中使用的标志
28、位,在默认情况下,客户端先手,并且为黑色棋子。开局时在游戏画布中添加退出软键用于退出游戏。Pu: notifyGameEnd() :void 游戏结束时对画布的修改:设置输赢提示,之后对所有的状态设置进行封锁。Pu: openConnection() :void 创建连接,在其中构造connection对象,并设置是否为服务器。打开连接。Pu: completeInitialization(isBTReady) :void 根据参数提示用户,如果连接成功,则提示玩家联网成功,否则连接失败,则跳出提示对话框,并退出程序。isBTReady是在客户和服务端处连接成功的标志的赋值。Pu: recei
29、veMessage() :void 接收对方信息,并处理Canvas。在此方法中由connection获取对方落子行列信息更新游戏逻辑(logic.playWhiteGo()),然后将isMyturn设置为true,等待我方落子。isMyturn相当于此方法的一个锁。Pu: setStatus(String,color,image) :void 该方法调整状态提示字符串:设置字符串的内容、颜色及相关图片。Pr: calcSize() :void 在绘制屏幕之前,将首先计算屏幕中各个部分的位置和大小。如果屏幕的宽度小于高度,提示字符串位于屏幕上方;反则侧方。在除掉字符串的宽度和高度后,将屏幕剩余
30、部分的宽或高最小值作为棋盘的边长。该方法被newStage方法调用。Pr: xByCol(col) :void 返回指定列的x坐标;该方法被calcSize调用。Pr: yByRow(row) :void 返回指定行的y坐标;该方法被calcSize调用。Pr: status :String 存放状态字符串,设置状态时就将此字符串调用出去。6.4 连接控制类Connection类ConnectionPro: server :ServerPro: client :ClientPro: isServer :booleanPr: myCanvas :BTFIRCanvasPro: selectedR
31、 :intPro: selectedC :intPu: completeInitialization() :voidPu: Connection() :voidPu: getSelectedC() :intPu: getSelectedR() :intPu: receiveMessage() :voidPu: sendMessage() :voidPu: start() :voidjava.ioObjectClient.1java.ioPaintStreamjava.langIntegerStringSystemBTFIRCanvasClientServer Connection类负责整个联网
32、过程,在联网方面,游戏画布收发消息只与该类进行交互,然后由它与服务器和客户端进行交互。所以,Connection类介于用户界面和具体联网之间的控制类。Pro: server :Server 服务器对象Pro: client :Client 客户端对象Pro: isServer :boolean 是否为服务器标志,由画布传进。Pr: myCanvas :BTFIRCanvas 游戏画布,与画布建立联系Pro: selectedR :int 传递的行值Pro: selectedC :int 传递的列值Pu: completeInitialization(isBTReady) :void 客户端或者
33、服务器连接后,又其反馈连接情况,将连接是否成功的信息反馈给Connection类,然后传递给画布告知玩家,这样做的好处是保持各类结构的明确性。该方法由服务器或客户端调用。Pu: Connection(BTFIRMIDlet, isServer) :void 构造函数。传递画布,以及设置连接类型。Pu: getSelectedC() :int 获得selectedC信息Pu: getSelectedR() :int 获得selectedR信息Pu: receiveMessage(String messageR, messageC) :void 由服务器或客户端对象调用,将收到的参数消息传递给Co
34、nnection对象;然后告知画布接收消息:画布调用getSelectedC()和getSelectedR()获取行列信息。Pu: sendMessage() :void 用于发送消息(己方落子的行列值),如果己方为服务器,则调用服务器对象的sendMessage();如果己方为客户端,则调用客户端对象的sendMessage()。Pu: start() :void 画布调用start()方法启动连接,如果是服务器,则创建服务器对象并启动服务器连接;如果是客户端,则创建客户端对象并启动客户端连接,根据isSever确定是创建客户端,还是服务器。这样做可以在画布调用时能够统一,使用更简单。6.5
35、 服务器类Server类服务器类主要创建蓝牙连接和服务,并等待客户端的连接。创建好连接后进行行列数值的收发。ServerPr: accepterThread :ThreadPr: connection :ConnectionPr: connectionURL :StringPr: dos :DataOutputStreamPr: isClosed :booleanPr: local :LocalDevicePr: messageR :StringPr: messageC :StringPr: notifier :StreamConnectionNotifierPr: processor :Se
36、rver.ClientProcessorPr: queue :VectorPu: run() :voidPu: sendMessage() :voidPr: readInputString() :voidPu: Server() :voidPu: start() :voidPr: processConnection() :voidjava.langObjectRunnablejava.ioDataInputStreamIOExceptionPrintStreamjava.langExceptionSystemjavax.microedition.ioConnectionConnectorCon
37、nectionServer.ClientProcessorjava.ioDataOutputStreamjava.langStringThreadjava.utilVectorjavax.bluetoothLocalDevicejavax.microedition.ioStreamConncetionStreamConncetionNotifierPr: accepterThread :Thread 线程,在this.start()中调用并启动。Pr: connection :Connection 连接类Pr: connectionURL :String 服务器连接地址Pr: dos :Dat
38、aOutputStream 数据输出流Pr: isClosed :boolean 连接标志Pr: local :LocalDevice 本地设备管理,来自蓝牙包Pr: messageR :String 行信息Pr: messageC :String 列信息Pr: notifier :StreamConnectionNotifier 流连接通告器Pr: processor :Server.ClientProcessor 客户端处理Pr: queue :Vector 连接队列,可保存对象Pu: Server(Connection) :void 构造函数。将Connection与本类中的connec
39、tion建立联系。获取Connection对象,该类作为一个连接中枢,起到联网和用户界面之间沟通的作用。Pu: run() :void Server类实现了Runnable接口,在run()方法中先获取本地蓝牙管理器,将其设置为允许其他设备访问,然后按照指定服务地址开通服务并等待客户端的联入。Pu: sendMessage(String message1,message2) :void 发送数据。Server类收发的数据位玩家落子的行列信息,这些信息已经被Connection类转化为字符串形式。发送信息既往数据输出流(DataOutputStream)中写入数据。Pr: readInputSt
40、ring(StreamConnection) :void 接收数据。被内部客户端处理类调用,接收信息则从数据输入流中读取数据,并传递给Connection连接类。Pu: start() :void 线程的创建和启动。Pr: processConnection() :void 在线程中调用了ClientProcessor类的processConnection()方法,该方法打开了连接的数据输出流以便数据发送。调用了Server的readInputString。在Server中使用了内部类ClientProcessor用来处理客户端,该类也实现并启动了一个线程,为的是随时等待加入的客户端;在构造函
41、数中创建并启动该类的线程;在run()方法中等待客户端的连接,在获得客户端后,尝试开启数据流。本类主要围绕run()展开,依次经行获取蓝牙管理,设置访问权限,开通指定地址的服务,接受连接,在客户连接处理类中添加连接并唤醒处理线程。这时数据流赋值给dos,再由收发数据方法处理。6.6 客户端类Client类Client类主要负责搜索设备和服务,并负责客户端的信息收发。Client类引用了较多蓝牙API,并且实现了Runnable和DiscoveryListener接口。javax.bluetoothBluetoothStateExceptionLocalDeviceDeviceClassRemo
42、teDeviceServiceRecordjavax.microedition.ioConnectionConnectorClientpro: conn :StreamConnectionpro: devices :Vectorpro: i :intpro: messageR :Stringpro: messageC :String pro: records Vectorpro: transIDs :intPr: connection :ConnectionPr: discoveryAgent : DiscoveryAgentPr: discType :intPr: ECHO_SERVER_U
43、UID :UUID Pr: isClosed :boolean Pr: processorThread :ThreadPu: Client :voidPu: deviceDiscovered :voidPu: inquiryCompleted() :voidPu: run() :voidPu: sendMessage() :voidPu: servicesDiscovered() :voidPu: serviceSearchCompleted() :voidPu: start() :voidClient.1Connectionjava.langObjectRunnablejavax.bluetoot