2024年1月23日发(作者:霍曼云)
需要本论文完整程序源代码,答辩PPT或者更多毕业论文,联系上传者即可
移动电话应用程序蓝牙对战五子棋游戏的设计分析
摘要 信息技术的进步和广泛应用正在深刻地影响着生活中的各个角落。程序的运行环境也不在局限于计算机。本文主要讨论了使用无线开发工具(WTK)在移动电话这类联网的受限配置设备(CLDC)上开发蓝牙对战五子棋游戏的应用程序(MIDlet)的实现过程。通过该程序的实现,可以了解到基于J2ME开发的基本知识。
关键词 J2ME;无线通讯工具包(WTK);联网的受限设备配置(CLDC);移动电话;蓝牙应用
1 引言
从1997年的第一款手机游戏《贪吃蛇》到目前,手机游戏已经不在停留在简单的俄罗斯方块之类的画面简单、规则单一的游戏了,而是发展到了可以与电脑相媲美的、具有很强交互性和娱乐性的复杂形式。
蓝牙对战五子棋游戏,是一个通过蓝牙作为传输信息的工具,实现对战的游戏开发。该游戏在五子棋单机版的基础上加入了蓝牙联网功能,使具备蓝牙功能的手机可以任意互联,不受到空间和时间的限制进行游戏对战,使游戏更具趣味性。
2 可行性分析
适用于蓝牙无线联网技术的JABWT标准(Java APIs for Bluetooth Wireless
Technology),由JSR-82规范所定义,该标准能支持蓝牙应用软件的快速开发,并保证其轻便、安全,以及具有高度的可用性。
目前已经有越来越多的设备支持蓝牙程序的运行,因此,移动应用市场也急切需要有更多的此类游戏出现。蓝牙功能除了收发信息和传输文件外,还能用来玩联机游戏,越来越多的手机支持蓝牙功能,可以预见,蓝牙将成为手机的标准功能。
蓝牙(Bluetooth)是一种支持设备间短距离通信(一般10m以内)的无线电技术。通过蓝牙,人们能在包括移动电话、PDA、无线耳机、笔记本电脑、相关外设等众多设备之间进行无线信息交换。
可以说,蓝牙为手机对战游戏提供了不错的联网平台,使玩家不再玩单机游戏。
目前,大部分的手机都支持Java功能,Java手机游戏很多,但支持蓝牙对战的不多,而且并非所有的Java游戏都能在Java手机上使用,它们之间根据手机品牌和型号不同也有些区别。所以选择Java蓝牙联网游戏时需要认准该游戏是否支持自己的手机。
3 软件需求分析
游戏主要内容为双人联机对战,游戏只支持对战功能,不能进行单机游戏。界面比较简单,但是棋盘大小设计的比较灵活和人性化,可以根据不同手机屏幕自动调整大小。
玩家使用四个方向键的上下左右来移动落子的位置,移动到空白位置使用确定按钮来落子。为简单起见,游戏不涉及悔棋,棋盘采用默认尺寸为15*15,并且客户端先下。在游戏逻辑方面没有人工智能,只有“判赢”算法。
游戏启动时,MIDlet对象会先显示一个提示界面的闪屏,用户按确定后,显示连接选择表单,提示玩家选择联网类型。在玩家选择本机作为服务器或者客户端之后开始游戏。游戏用户界面示意图如下。
开始
游戏闪屏
1
4 开发环境
操作系统:Windows xp
开发环境:JDK-1.6
软件开发工具:J2ME WTK-2.5.2
集成开发开发化境:Eclipse
5 游戏的类结构
Canvas
Server
服务器类
继承
MIDlet
继承
Connection
连接控制类
BTFIRCanvas
画布类
BTFIRMIDlet
主类
逻辑类
Client
客户端类
BTFIRLogic
Dot
棋子类
整个游戏共由7个类组成,如上图所示是游戏的类结构。游戏的BTFIRMIDlet类负责保持display对象,并提供个屏幕的切换。
2
游戏包含3个屏幕:由信息提示框Alert类实现的游戏闪屏欢迎界面;在Form表单上应用ChoiceGroup实现的连接类型选项,连接类型可以是服务器或者客户端;在选定连接类型后进入游戏画布,为了简单起见,默认客户端一方先落子(黑方)。
BTFIRCanvas类实现了游戏画布,BTFIRLogic类实现了游戏逻辑,Dot类代表了五子棋的棋子,Connection类用于网络连接和用户界面之间的交互,这样整个程序架构更加清晰。
Sever类为服务器端联网程序,负责提供服务,等待其他设备接入,并负责服务器一方落子信息的发送和对方信息的接收;Client类为客户端程序,用于搜索设备,搜索服务,并负责客户端一方棋盘行列信息的发送与接收。
各个类之间在程序运行时的组织与联系方式(以建立的是服务器为例):
BTFIRCanvas
key
N
不做任
isMyturn==true
何操作
Y
消息接收
落子; Connection类 Connection类 跟新Logic类;
isMyTurn=false;
发送消息; 接收消息;
isMyTurn=true;
server
()
设置本地蓝牙为可被发现模式;
(client)
开通自己的服务地址(创建服务);
成功则通知connection
(connection再通知画布更新信息);
由“服务”接收连接进来的信息(建
立Conn);
将连接的流对象conn添加到‘客户
处理类’来处理;
server中的‘客户处理类’
queue<-conn;
run(){
处理queue;
3
}
DataOutputStream(dos)<-qu
6 各模块的设计
6.1 主类BTFIRMIDlet类
CommandListener
MIDlet
Alert
ChoiceGroup
4
BTFIRMIDlet
Pr: alert :Alert
Pr: choiceType :ChoiceGroup
IOException
Pr: 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的图片对象,用于欢迎界面上的图片。
Pr: isServer :Boolean 用户选择的的结果存于此布尔变量,服务器为TRUE,客户端为FALSE。
Pr: myCanvas :BTFIRCanvas游戏画布实例对象,根据其构造函数传入是服务器还是客户端的信息。
Pu: BTFIRMIDlet() :void 本类的构造方法,用于初始化alert和form等信息。
Pu: commandAction(Command,Displayable) :void 重写事件监听的虚函数,如点击软键CMD_PLAY则显示画布:构造相应画布,显示画布,让画布打开5
连接,调用画布开局函数对画布初始化创建逻辑;否则退出。
Pu: destroyApp() :void 销毁应用程序的固定的需要重写的方法,本程序中无用,不做定义。
Pu: exit() :void 人为主动销毁程序的方法。
Pu: startApp() :void 启动应用程序的固定的需要重写的方法,调用显示方法显示提示欢迎框,和form。
Pu: getDisplayable() :Displayable 返回form对象。
6.2 逻辑类BTFIRLogic类的实现
BTFIRLogic类是五子棋对战游戏的逻辑类,该类创建了棋盘的状态数组,并根据对战双方的落子情况更新该数组。对战双方落子后,BTFIRLogic类也负责检测双方的获胜情况,并通知游戏画布更新用户界面。
Object
6
BTFIRLogic
Pu: PLAYER_NONE :int
Object
Pu: PLAYER_NONE :int 静态常量0表示空白区域
Pu: PLAYER_BLACK :int 静态常量1表示黑方落子
Pu: PLAYER_WHITE :int 静态常量2表示白方落子
Pu: boardSize :int 静态常量15表示棋盘的大小为15
Pr: isBlack :boolean 是否落子方为黑方标志,在逻辑类构造函数赋值
Pr: isBlackWon :boolean 是否黑方胜利标志,用于传参
Pr: isGameOver :boolean 游戏是否结束标志,用于传参
Pr: lastDot :Dot 最后棋子对象,存放行和列的坐标
7
Pr: triedDot :Dot 棋子对象,相当于棋子的buffer
Pr: 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 黑方落子,调用goAt(row,col,player)落子,落子前首先检测该位置是否为空白区域,并且是否超出棋盘,否则判定为无效落子。落子成功返回的布尔值为真,无效落子返回的布尔值为假,以此作为是否成功落子的判定。落子之后随即检测是否存在“五子连珠”情况(调用isGameOver()检查),更新所有状态,标志。
Pu: playerWhiteGo(int row,col) :boolean 白方落子,同上。
以下方法都是服务于以上两个方法的,所以简单介绍。
Pr: checkFiveInRow(row,col,n) :int 检查某一位置的棋子是否存在五子连珠,存在则返回方向代码,不存在则返回-1。
Pr: goAt() :void 在棋盘上落子就是将数组中的相应位置填充为某方的代码,如1、2
Pr: isGameOver() :boolean调用checkFiveInRow()调用GameEnd(isBlackWon)打印游戏结束;
Pr: moveOneStep(Dot,Direct) :Dot 在某方向(8个方向Direct)上移动一步,由connectedIn1D()等同类方法调用。
8
6.3 游戏画布类BTFIRCanvas的实现
Canvas
CommandListener
BTFIRLogic
BTFIRMIDlet
Connection
BTFIRCanvas
Pr: BLACK :int
Pr: WHITE :int
Pr: midlet :BTFIRMIDlet
Pr: logic :BTFIRLogic
Pr: font :Font
Pr: imgStatus :Image[]
Pr: CMD_STOP :Command
Pr: connection :Connection
Pr: boardLength :int
Pr: boardSize :int
Pr: boardX :int
Pr: boardY :int
Pr: 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
Pr: isBlackFirst :boolean
Pr: isColor :boolean
Pr: isMyTurn :boolean
Pr: isServer :boolean
Pr: isUpSide :boolean
Pu: BTFIRCanvas() :void
Pu: commandAction() :void
Pu: paint() :void
Pro:keyPressed() :void
Pu: repaintAt() :void
Pu: newStage() :void
Pu: notifyGameEnd() :void
Pu: openConnection() :void
Pu: completeInitialization() :void
Pu: receiveMessage() :void
Pu: setStatus() :void
Pr: calcSize() :void
Pr: xByCol() :void
Pr: yByRow() :void
Pr: status :String
9
Dot
IOException
PrintStream
Command
Font
Image
Alert
AlertType
Display
Displayable
Graphics
String
MIDlet
Pr: BLACK :int 定义颜色的常量,置值为0,调用时为黑色。
Pr: WHITE :int 定义颜色的常量,置值为0xffffff,调用时为白色。
Pr: midlet :BTFIRMIDlet 主类的对象,需要主类传来些主类的参数
Pr: logic :BTFIRLogic 定义逻辑类的对象,需要调用逻辑类的方法。
Pr: font :Font 字体对象,字体设置和计算字体大小用到。
Pr: imgStatus :Image[] 定义图片对象的数组,存放图片。
Pr: CMD_STOP :Command 按钮的对象,在画布上添加退出按钮。
Pr: connection :Connection 连接类的对象,创建连接。
Pr: boardLength :int 棋盘长度。
Pr: boardSize :int 棋盘大小默认为15*15
Pr: boardX :int 棋盘左上角的X坐标。
Pr: boardY :int 棋盘左上角的Y坐标。
Pr: 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。
Pr: isColor :boolean 手机是否支持颜色的标志
Pr: isMyTurn :boolean 是否轮到我方落子,初始值为true。
Pr: isServer :boolean 我方是否为服务器,初始值为true。
Pr: isUpSide :boolean 提示字符串位置是否在上方。
Pu: BTFIRCanvas(BTFIRMIDlet,isServer) :void 画布的构造函数,为类结10
构必须有的函数。主要用于加载游戏资源(图片、软键),并初始化参数,包括屏幕尺寸、提示字符串的参数,以及我方是否为服务器,默认情况下客户端先落子,而先落子方采用黑色棋子。
Pu: commandAction(Command,Displayable) :void 由于画布实现了按键监听的接口,所以必须重写此函数。
Pu: paint(Graphics g) :void 为画布类结构必须有的函数。在此函数中绘制所有界面。主要画面包括棋盘、棋子和提示字符串。棋盘根据尺寸属性(calcSize()方法计算所得的所有尺寸保存在属性里)绘制线条并填充棋盘底色,棋子根据BTFIRLogic所保存的棋盘数组中的内容绘制不同颜色的棋子(1为黑色,2为白色)。
Pro:keyPressed(int keyCode) :void 为画布类结构必须有的函数。用户界面的输入部分支持键盘输入,键盘的上下左右键能让引导框移动,当玩家按下确定键(fire)后,进行落子,如果落子成功,则发送消息(ssage())通知对方;如果是无效的落子,则不进行任何操作。
Pu: repaintAt(int row,int col) :void 自定义重新绘制函数。当玩家在某个位置落子时,游戏画布并不重新绘制整个屏幕,而是仅仅绘制发生变化的小范围区域,这样能减少整个绘制操作的的工作量,对提高游戏性能有所帮助。根据指定行和列绘制区域。
Pu: newStage() :void 游戏新开局时(BTFIRMIDlet中)调用此方法,该方法根据己方落子颜色(构造时传入)创建游戏逻辑对象,并设置游戏中使用的标志位,在默认情况下,客户端先手,并且为黑色棋子。开局时在游戏画布中添加退出软键用于退出游戏。
Pu: notifyGameEnd() :void 游戏结束时对画布的修改:设置输赢提示,之后对所有的状态设置进行封锁。
Pu: openConnection() :void 创建连接,在其中构造connection对象,并设置是否为服务器。打开连接。
Pu: completeInitialization(isBTReady) :void 根据参数提示用户,如果连接成功,则提示玩家联网成功,否则连接失败,则跳出提示对话框,并退11
出程序。isBTReady是在客户和服务端处连接成功的标志的赋值。
Pu: receiveMessage() :void 接收对方信息,并处理Canvas。在此方法中由connection获取对方落子行列信息更新游戏逻辑(iteGo()),然后将isMyturn设置为true,等待我方落子。isMyturn相当于此方法的一个锁。
Pu: setStatus(String,color,image) :void 该方法调整状态提示字符串:设置字符串的内容、颜色及相关图片。
Pr: calcSize() :void 在绘制屏幕之前,将首先计算屏幕中各个部分的位置和大小。如果屏幕的宽度小于高度,提示字符串位于屏幕上方;反则侧方。在除掉字符串的宽度和高度后,将屏幕剩余部分的宽或高最小值作为棋盘的边长。该方法被newStage方法调用。
Pr: xByCol(col) :void 返回指定列的x坐标;该方法被calcSize调用。
Pr: yByRow(row) :void 返回指定行的y坐标;该方法被calcSize调用。
Pr: status :String 存放状态字符串,设置状态时就将此字符串调用出去。
6.4 连接控制类Connection类
Connection类负责整个联网过程,在联网方面,游戏画布收发消息只与该类进行交互,然后由它与服务器和客户端进行交互。所以,Connection类介于用户界面和具体联网之间的控制类。
Object
BTFIRCanvas
Client
Server
Connection
Pro: server :Server
Pro: client :Client
Pro: isServer :boolean
Pr: myCanvas :BTFIRCanvas
Pro: selectedR :int
Pro: selectedC :int
Pu: completeInitialization() :void
Pu: Connection() :void
Pu: getSelectedC() :int
Pu: getSelectedR() :int
Pu: receiveMessage() :void
Pu: sendMessage() :void
Pu: start() :void
12
Client.1
PaintStream
Integer
String
System
Pro: server :Server 服务器对象
Pro: client :Client 客户端对象
Pro: isServer :boolean 是否为服务器标志,由画布传进。
Pr: myCanvas :BTFIRCanvas 游戏画布,与画布建立联系
Pro: selectedR :int 传递的行值
Pro: selectedC :int 传递的列值
Pu: completeInitialization(isBTReady) :void 客户端或者服务器连接后,又其反馈连接情况,将连接是否成功的信息反馈给Connection类,然后传递给画布告知玩家,这样做的好处是保持各类结构的明确性。该方法由服务器或客户端调用。
Pu: Connection(BTFIRMIDlet, isServer) :void 构造函数。传递画布,以及设置连接类型。
Pu: getSelectedC() :int 获得selectedC信息
Pu: getSelectedR() :int 获得selectedR信息
Pu: receiveMessage(String messageR, messageC) :void 由服务器或客户端对象调用,将收到的参数消息传递给Connection对象;然后告知画布接收消息:画布调用getSelectedC()和getSelectedR()获取行列信息。
Pu: sendMessage() :void 用于发送消息(己方落子的行列值),如果己方为服务器,则调用服务器对象的sendMessage();如果己方为客户端,则调用客户端对象的sendMessage()。
Pu: start() :void 画布调用start()方法启动连接,如果是服务器,则创建服务器对象并启动服务器连接;如果是客户端,则创建客户端对象并启动客户端连接,根据isSever确定是创建客户端,还是服务器。这样做可以在画布调用时能够统一,使用更简单。
6.5 服务器类Server类
服务器类主要创建蓝牙连接和服务,并等待客户端的连接。创建好连接后进13
行行列数值的收发。
Connection
Processor
DataOutputStream
String
Thread
Vector
oth
LocalDevice
Object
Runnable
DataInputStream
IOException
Server
Pr: accepterThread :Thread
Pr: connection :Connection
Pr: connectionURL :String
Pr: dos :DataOutputStream
Pr: isClosed :boolean
Pr: local :LocalDevice
Pr: messageR :String
Pr: messageC :String
Pr: notifier :StreamConnectionNotifier
Pr: processor :Processor
Pr: queue :Vector
Pu: run() :void
Pu: sendMessage() :void
Pr: readInputString() :void
Pu: Server() :void
Pu: start() :void
Pr: processConnection() :void
StreamConncetion
StreamConncetionNotifier
PrintStream
Exception
System
Connection
Connector
Pr: accepterThread :Thread 线程,在()中调用并启动。
Pr: connection :Connection 连接类
Pr: connectionURL :String 服务器连接地址
Pr: dos :DataOutputStream 数据输出流
Pr: isClosed :boolean 连接标志
Pr: local :LocalDevice 本地设备管理,来自蓝牙包
Pr: messageR :String 行信息
Pr: messageC :String 列信息
Pr: notifier :StreamConnectionNotifier 流连接通告器
14
Pr: processor :Processor 客户端处理
Pr: queue :Vector 连接队列,可保存对象
Pu: Server(Connection) :void 构造函数。将Connection与本类中的connection建立联系。获取Connection对象,该类作为一个连接中枢,起到联网和用户界面之间沟通的作用。
Pu: run() :void Server类实现了Runnable接口,在run()方法中先获取本地蓝牙管理器,将其设置为允许其他设备访问,然后按照指定服务地址开通服务并等待客户端的联入。
Pu: sendMessage(String message1,message2) :void 发送数据。Server类收发的数据位玩家落子的行列信息,这些信息已经被Connection类转化为字符串形式。发送信息既往数据输出流(DataOutputStream)中写入数据。
Pr: readInputString(StreamConnection) :void 接收数据。被内部客户端处理类调用,接收信息则从数据输入流中读取数据,并传递给Connection连接类。
Pu: start() :void 线程的创建和启动。
Pr: processConnection() :void 在线程中调用了ClientProcessor类的processConnection()方法,该方法打开了连接的数据输出流以便数据发送。调用了Server的readInputString。
在Server中使用了内部类ClientProcessor用来处理客户端,该类也实现并启动了一个线程,为的是随时等待加入的客户端;在构造函数中创建并启动该类的线程;在run()方法中等待客户端的连接,在获得客户端后,尝试开启数据流。
本类主要围绕run()展开,依次经行获取蓝牙管理,设置访问权限,开通指定地址的服务,接受连接,在客户连接处理类中添加连接并唤醒处理线程。这时数据流赋值给dos,再由收发数据方法处理。
6.6 客户端类Client类
Client类主要负责搜索设备和服务,并负责客户端的信息收发。Client类引用了较多蓝牙API,并且实现了Runnable和DiscoveryListener接口。
15
Client.1
Connection
String
Thread
Vector
oth
DiscoveryAgent
UUID
StreamConnection
Object
Runnable
oth
oth
DiscoveryListener
Client
pro: conn :StreamConnection
pro: devices :Vector
pro: i :int
pro: messageR :String
pro: messageC :String
pro: records Vector
pro: transIDs :int[]
Pr: connection :Connection
Pr: discoveryAgent : DiscoveryAgent
Pr: discType :int
Pr: ECHO_SERVER_UUID :UUID
Pr: isClosed :boolean
Pr: processorThread :Thread
Pu: Client :void
Pu: deviceDiscovered :void
Pu: inquiryCompleted() :void
Pu: run() :void
Pu: sendMessage() :void
Pu: servicesDiscovered() :void
Pu: serviceSearchCompleted() :void
Pu: start() :void
DataInputStream
DataOutputStream
PrintStream
Exception
InterruptedException
System
Throwable
oth
BluetoothStateException
DeviceClass
LocalDevice
RemoteDevice
ServiceRecord
Connection
Connector
pro: conn :StreamConnection 连接流对象
pro: devices :Vector 向量容器devices存放所有搜索到的设备。
pro: i :int
pro: messageR :String 发出的行信息
pro: messageC :String 发出的列信息
pro: records Vector 服务集合。将搜索到的集合加入服务集合。
pro: transIDs :int[] 服务搜索的事务id集合。
Pr: connection :Connection 连接对象,在构造函数中赋值。
16
Pr: discoveryAgent : DiscoveryAgent 发现代理类的对象,用于发现代理。
Pr: discType :int 参数,返回类型。
Pr: ECHO_SERVER_UUID :UUID 响应服务的UUID(对象)
Pr: isClosed :boolean 连接关闭标志位。
Pr: processorThread :Thread 线程对象,此线程把整个Client作为线程来运行(run())。
Pu: Client(Connection) :void 获取连接类对象。在连接类中创建的Client对象就会和连接类建立联系。
搜索设备
客户端程序使用蓝牙发现API以搜索在其附近的的设备和服务。服务代理类(DiscoveryAgent)同时支持设备与服务的发现。当设备和服务被发现时,想得到通知的客户端应用程序必须实现并注册DiscoveryListener接口,这个接口定义了设备发现通知和服务发现通知的回调(discType)。
使用DiscoveryAgent类,用于搜索设备的相关方法来开始和取消设备发现:
.retrieveDevices(),重新获得已经发现或者附近的已知设备。
.startInquiry(),启动发现附近设备,也叫inquiry。
,计算机范文网 ,.cancelInquiry(),取消当前进行的任何请求。
“蓝牙发现代理”在请求阶段的不同时候会分别调用DiscoveryListener(发现监听器)不同的回调方法:
.deviceDiscovered(),指出是否有设备被发现。
.inquiryCompleted(),指出是否请求已经成功、触发一个错误或已被取消。
设备发现以调用startInquiry()函数开始。在请求进行时,“蓝牙发现代理”会在适当的时候调用回调方法deviceDiscovered()和inquiryCompleted(),此两个方法均为虚函数,需要重写。
Pu: deviceDiscovered(RemoteDevice,DeviceClass) :void 将搜索到的远程设17
备添加到设备集合中。第一个参数即为搜索到的远程设备(RemoteDevice)。
Pu: inquiryCompleted(int discType) :void 获取返回状态,如果搜索结束但未查找到远程设备,或者搜索过程中发生异常的处理在此函数中进行。在这里将异常通知连接类的completeInitialization(boolean)。
搜索服务
可以使用“发现代理”(DiscoveryAgent)的服务发现方法来开始或取消服务发现:
.selectService(),启动服务发现搜索。(根据API手册应为尝试定位一个服务。)
.searchServices(),启动服务发现搜索。本程序用此方法。
.cancelServiceSearch (),取消正在进行中的任何服务发现搜索操作。
DiscoveryAgent类在服务发现阶段的不同时候会分别调用DiscoveryListener(发现监听器)的服务发现回调方法:
Pu: servicesDiscovered(int transID,ServerRecord[] serverRecord) :void 表示是否服务已被发现。将serverRecord集合赋值给records容器。
Pu: serviceSearchCompleted(int transID,int respCode) :void 表示服务发现是否已经完成。主要对respCode进行操作。为简单起见,本程序不做任何事。
Pu: run() :void Client类实现了Runnable接口,线程将完成搜索设备和服务工作,并记录所搜索到的服务id。此方法中主要完成三个阶段:1、获取本地设备和获取代理,2、搜索设备,3、搜索服务。
Pu: sendMessage(String message1,message2) :void 为了简单起见,将消息的收发处理放在一个方法中,客户端发送消息之后就立即接收信息,并传递给Connection(receiveMessage)类。在此方法中直接定义一个线程,让线程去做数据的发送与接收。
Pu: start() :void 创建并启动Client类的接口线程。
18
本类主要要写的方法有3个:run(),start(),sendMessage(),其他方法为虚函数的重写,也主要围绕run()进行的。
6.7棋子Dot类的实现
7 应用程序的安装和部署
将编写好的源程序在集成开发环境或者WTK中编译后打包发布,生成一个.jad文件和.jar文件。.jad文件中存储的是程序的入口信息,.jar中存放着程序字节码等运行程序。将此两个文件存入支持的Java的手机中(注:目录一致),在手机中找到.jad文件,运行即可(有些较高端手机直接可以运行.jar文件)。目前运行此软件建议手机Java的MIDP版本为MIDP-2.0,CLDC版本为CLDC-1.1。
8 结束语
通过对此题目的设计,使我对手机应用程序的开发有了认识。对类、对象以及它们之间的结构关系也有了进一步的认识,对今后面向对象的编程开发有很多帮助。经过一个月的自学,学到了大量的J2ME开发知识,虽然只是冰山一角,19
Object
Dot
BTFIRLogic
Pu: col :int
Pu: row :int
Pu: copyFrom() :void
Pu: Dot() :void
Pu: Dot() :void
Pu: Dot() :void
Pu: isInBoard() :boolean
Pu: setRowCol() :void
BTFIRCanvas
较简单,在此不做简介。
但感受颇丰,受益非浅。在软件设计方面,使我对面向对象编程,从理论到实践有了质的飞跃。虽然这次毕业设计我完成了基本要求,但由于学习的知识还不能运用自如,所以许多功能的设计还不完善,自己也发现了许多不足,在今后时间允许的情况下我会进一步完善。
在本次的毕业设计中,我首先要感谢yz老师对我自选题目的充分支持与信任,但现在发现这个毕业设计的制作并没有给拓宽就业面带来帮助,后悔当初没有认真去听取yz老师的建议,而执意要选此题目,在此也表示深深的歉意。
时间飞逝,希望今后还能有跟yz老师学习的机会,再一次感谢yz老师的精心指导!
20
参考文献
[1] 龚剑等编著.J2ME手机游戏开发详解.北京:电子工业出版社,2008,1.
[2] 郭克华编著.Java ME移动开发实例精讲.北京:清华大学出版社,2010,1.
21
Bluetooth Battle "Five in a Row" game for Mobile Phone of the
application design
Computer and Information Engineering Collage 2008
2006152101x
Directed by YuZhu Professor
Abstract Advances in information technology and wide application is
profoundly affecting every corner of life. Program running environment is not
confined to the computer in. This paper discusses the use of wireless development
tool (WTK) in mobile phones such networked Limited Device Configuration (CLDC)
on the development of Bluetooth Battle 5Child chess game application (MIDlet)
implementation process. Through the implementation of the program, you can learn
the basics of development based on J2ME.
Keywords J2ME; wireless toolkit (WTK); Connected Limited Device
Configuration(CLDC); mobile phone; Bluetooth applications
封面
山东建筑大学
2009级工程造价专业毕业设计任务书
题 目:
山东省职业技术学院办公楼工程项目商务标书
设计期限: 自2011年7月
至2011年10月
22
班 级:
学生姓名:
学 号:
指导教师(签字):任成友
庄春华
23
山东建筑大学毕业设计任务书
班 级
设计题目
学生姓名 指导教师 张琳
山东省职业技术学院办公楼工程项目商务标书
1、工程概况
山东省职业技术学院办公楼项目概况:
(1)建设单位:建达房地产开发有限公司
2)本工程为办公楼,具体位置详见规划总平面图
3)本工程总建筑面积5195.74平方米
4)本工程五层,一层层高4.2m,二-四层高3.9m,五层层高4.2m,建筑高度29.74m,室内外高差0.60m。
5)本工程结构形式:框架结构,抗震设防烈度:6度
6)本工程建筑等级:三级;耐火等级:为二级。
7)本工程设计使用年限:3类(合理使用50年)
8)屋面防水等级:二级
2、工程特点
本工程为重点工程,业主要求尽量采用施工新技术并要求必须按合同工期完工。施工现场狭小,应考虑合理利用现场空间。
3、资金筹措条件
(1)工程合同价C=工程报价;
(2)开工前业主拨付工程备料款A=20% C;
(3)工程进度款,每月末按形象进度延迟一个月拨付;
(4)不足部分通过银行贷款补足,贷款利率=12%(单利);
(5)不考虑保修金的留设。
(6)现场条件:已实现三通一平.
(7)工程量清单
(8)施工图(另附)
1、撰写招标文件,编制工程量清单
以施工图纸为依据,根据国家标准《建设工程工程量清单计价规范》、及山东省现行消耗量定额进行编制。鼓励学生在完成手工预算的全部工作的基础上,另用工程造价编制软件对手算的结果进行校审复核。工程量清单编制的内容有;
(1)封面;
(2)总说明;
(3)分部分项工程量清单;
(4)措施项目清单;
(5)其他项目清单;
2、编制投标文件
投标文件只编写商务标部分
(1)商务部分主要包括下列内容:
1) 投标函:
2) 建安工程唱标单;
24
设 计
原 始
参 数
设 计
工 作
内 容
设 计
工 作
基 本
要 求
3) 法定代表人资格证明书;
4) 法定代表人授权书;
5) 投标保证金。
6)报价单
(2)商务标编制:计算工程量;确定综合单价;进行投标报价;编制报价汇总表,和各类投标报价单价表。
投标报价说明;投标报价汇总表;主要材料清单报价表;分部分项工程量清单报价表;措施项目报价表;其他项目报价表;规费与税金工程量清单项目报价表。
1、毕业设计程序的要求
(1)设计准备阶段
毕业设计题目选定后,应由指导教师向学生下达毕业设计指导书。学生根据毕业设计指导书的选题和指导教师的安排,应该做好如下的准备,包括:认真阅读毕业设计任务书的内容,熟悉施工图纸,调查了解与设计内容相关的资料;收集相关的工具书。包括设计规范、施工规范、预算定额、工程估价表、标准图集、相关的造价文件和有关材料的市场价格等。同时了解毕业设计的进度安排和答辩时间。
(2)毕业设计阶段
1) 根据毕业设计任务书的要求,准备相关资料。
2)根据图纸和相关文件,编制工程量清单。
3)根据图纸和相关资料,编制投标文件。
4)汇总装订,形成毕业设计文件。
(3)毕业答辩阶段
毕业答辩是学生毕业设计的总结和回顾,要求学生做好下列工作:
1)编写毕业设计说明书,内容包括对毕业设计任务书的理解、毕业设计的总体思路、在设计过程中的参考资料及对有关问题的处理意见和毕业设计的体会。要求语言简练,步骤清晰。
2)参加毕业答辩,要求学生应该对毕业答辩做好充分的准备,在答辩时,首先简要的陈述毕业设计的课题名称、设计要求、设计思路及设计过程和设计成果。其次要准备回答答辩教师与设计内容相关的问题。
2、毕业设计成果的要求
毕业设计是学生在校学习的最后阶段,是培养学生综合运用所学知识,发现、提出、分析和解决实际问题,锻炼实践能力的重要环节,是对学生实际工作能力的系统训练和考察过程。毕业设计是学生在老师指导下,对所从事工作和取得成果的完整表述,毕业设计的撰写是学生基本能力训练的过程,应当符合国家及有关行业(部门)指定的有关标准,符合汉语语言规范。
3、毕业设计成果应包括:
①标题 ②摘要 ③关键词 ④目录 ⑤正文 ⑥参考文献等部分。
设计进程安排
第一阶段 完成清单工程和定额消耗量工程,整理好工程量草稿
第二阶段 应该是用广联达编制工程量清单、招标控制价及投标报价
第三阶段 答辩
25
主要
参考
资料
及文献
1.建筑工程项目管理规范(GB/T 50326-2006)
2.相关的建筑标准图集和做法。
3.相关的建筑工程规范和质量标准.
4.工程量清单计价规范、消耗量定额及有关规定。
5.山东建筑大学教师教学工作手册(上)(2006年版).
6.山东建筑大学优秀毕业设计(论文)集。
7.相关建设工程法律、法规。
8.其他相关资料与文献。
26
2024年1月23日发(作者:霍曼云)
需要本论文完整程序源代码,答辩PPT或者更多毕业论文,联系上传者即可
移动电话应用程序蓝牙对战五子棋游戏的设计分析
摘要 信息技术的进步和广泛应用正在深刻地影响着生活中的各个角落。程序的运行环境也不在局限于计算机。本文主要讨论了使用无线开发工具(WTK)在移动电话这类联网的受限配置设备(CLDC)上开发蓝牙对战五子棋游戏的应用程序(MIDlet)的实现过程。通过该程序的实现,可以了解到基于J2ME开发的基本知识。
关键词 J2ME;无线通讯工具包(WTK);联网的受限设备配置(CLDC);移动电话;蓝牙应用
1 引言
从1997年的第一款手机游戏《贪吃蛇》到目前,手机游戏已经不在停留在简单的俄罗斯方块之类的画面简单、规则单一的游戏了,而是发展到了可以与电脑相媲美的、具有很强交互性和娱乐性的复杂形式。
蓝牙对战五子棋游戏,是一个通过蓝牙作为传输信息的工具,实现对战的游戏开发。该游戏在五子棋单机版的基础上加入了蓝牙联网功能,使具备蓝牙功能的手机可以任意互联,不受到空间和时间的限制进行游戏对战,使游戏更具趣味性。
2 可行性分析
适用于蓝牙无线联网技术的JABWT标准(Java APIs for Bluetooth Wireless
Technology),由JSR-82规范所定义,该标准能支持蓝牙应用软件的快速开发,并保证其轻便、安全,以及具有高度的可用性。
目前已经有越来越多的设备支持蓝牙程序的运行,因此,移动应用市场也急切需要有更多的此类游戏出现。蓝牙功能除了收发信息和传输文件外,还能用来玩联机游戏,越来越多的手机支持蓝牙功能,可以预见,蓝牙将成为手机的标准功能。
蓝牙(Bluetooth)是一种支持设备间短距离通信(一般10m以内)的无线电技术。通过蓝牙,人们能在包括移动电话、PDA、无线耳机、笔记本电脑、相关外设等众多设备之间进行无线信息交换。
可以说,蓝牙为手机对战游戏提供了不错的联网平台,使玩家不再玩单机游戏。
目前,大部分的手机都支持Java功能,Java手机游戏很多,但支持蓝牙对战的不多,而且并非所有的Java游戏都能在Java手机上使用,它们之间根据手机品牌和型号不同也有些区别。所以选择Java蓝牙联网游戏时需要认准该游戏是否支持自己的手机。
3 软件需求分析
游戏主要内容为双人联机对战,游戏只支持对战功能,不能进行单机游戏。界面比较简单,但是棋盘大小设计的比较灵活和人性化,可以根据不同手机屏幕自动调整大小。
玩家使用四个方向键的上下左右来移动落子的位置,移动到空白位置使用确定按钮来落子。为简单起见,游戏不涉及悔棋,棋盘采用默认尺寸为15*15,并且客户端先下。在游戏逻辑方面没有人工智能,只有“判赢”算法。
游戏启动时,MIDlet对象会先显示一个提示界面的闪屏,用户按确定后,显示连接选择表单,提示玩家选择联网类型。在玩家选择本机作为服务器或者客户端之后开始游戏。游戏用户界面示意图如下。
开始
游戏闪屏
1
4 开发环境
操作系统:Windows xp
开发环境:JDK-1.6
软件开发工具:J2ME WTK-2.5.2
集成开发开发化境:Eclipse
5 游戏的类结构
Canvas
Server
服务器类
继承
MIDlet
继承
Connection
连接控制类
BTFIRCanvas
画布类
BTFIRMIDlet
主类
逻辑类
Client
客户端类
BTFIRLogic
Dot
棋子类
整个游戏共由7个类组成,如上图所示是游戏的类结构。游戏的BTFIRMIDlet类负责保持display对象,并提供个屏幕的切换。
2
游戏包含3个屏幕:由信息提示框Alert类实现的游戏闪屏欢迎界面;在Form表单上应用ChoiceGroup实现的连接类型选项,连接类型可以是服务器或者客户端;在选定连接类型后进入游戏画布,为了简单起见,默认客户端一方先落子(黑方)。
BTFIRCanvas类实现了游戏画布,BTFIRLogic类实现了游戏逻辑,Dot类代表了五子棋的棋子,Connection类用于网络连接和用户界面之间的交互,这样整个程序架构更加清晰。
Sever类为服务器端联网程序,负责提供服务,等待其他设备接入,并负责服务器一方落子信息的发送和对方信息的接收;Client类为客户端程序,用于搜索设备,搜索服务,并负责客户端一方棋盘行列信息的发送与接收。
各个类之间在程序运行时的组织与联系方式(以建立的是服务器为例):
BTFIRCanvas
key
N
不做任
isMyturn==true
何操作
Y
消息接收
落子; Connection类 Connection类 跟新Logic类;
isMyTurn=false;
发送消息; 接收消息;
isMyTurn=true;
server
()
设置本地蓝牙为可被发现模式;
(client)
开通自己的服务地址(创建服务);
成功则通知connection
(connection再通知画布更新信息);
由“服务”接收连接进来的信息(建
立Conn);
将连接的流对象conn添加到‘客户
处理类’来处理;
server中的‘客户处理类’
queue<-conn;
run(){
处理queue;
3
}
DataOutputStream(dos)<-qu
6 各模块的设计
6.1 主类BTFIRMIDlet类
CommandListener
MIDlet
Alert
ChoiceGroup
4
BTFIRMIDlet
Pr: alert :Alert
Pr: choiceType :ChoiceGroup
IOException
Pr: 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的图片对象,用于欢迎界面上的图片。
Pr: isServer :Boolean 用户选择的的结果存于此布尔变量,服务器为TRUE,客户端为FALSE。
Pr: myCanvas :BTFIRCanvas游戏画布实例对象,根据其构造函数传入是服务器还是客户端的信息。
Pu: BTFIRMIDlet() :void 本类的构造方法,用于初始化alert和form等信息。
Pu: commandAction(Command,Displayable) :void 重写事件监听的虚函数,如点击软键CMD_PLAY则显示画布:构造相应画布,显示画布,让画布打开5
连接,调用画布开局函数对画布初始化创建逻辑;否则退出。
Pu: destroyApp() :void 销毁应用程序的固定的需要重写的方法,本程序中无用,不做定义。
Pu: exit() :void 人为主动销毁程序的方法。
Pu: startApp() :void 启动应用程序的固定的需要重写的方法,调用显示方法显示提示欢迎框,和form。
Pu: getDisplayable() :Displayable 返回form对象。
6.2 逻辑类BTFIRLogic类的实现
BTFIRLogic类是五子棋对战游戏的逻辑类,该类创建了棋盘的状态数组,并根据对战双方的落子情况更新该数组。对战双方落子后,BTFIRLogic类也负责检测双方的获胜情况,并通知游戏画布更新用户界面。
Object
6
BTFIRLogic
Pu: PLAYER_NONE :int
Object
Pu: PLAYER_NONE :int 静态常量0表示空白区域
Pu: PLAYER_BLACK :int 静态常量1表示黑方落子
Pu: PLAYER_WHITE :int 静态常量2表示白方落子
Pu: boardSize :int 静态常量15表示棋盘的大小为15
Pr: isBlack :boolean 是否落子方为黑方标志,在逻辑类构造函数赋值
Pr: isBlackWon :boolean 是否黑方胜利标志,用于传参
Pr: isGameOver :boolean 游戏是否结束标志,用于传参
Pr: lastDot :Dot 最后棋子对象,存放行和列的坐标
7
Pr: triedDot :Dot 棋子对象,相当于棋子的buffer
Pr: 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 黑方落子,调用goAt(row,col,player)落子,落子前首先检测该位置是否为空白区域,并且是否超出棋盘,否则判定为无效落子。落子成功返回的布尔值为真,无效落子返回的布尔值为假,以此作为是否成功落子的判定。落子之后随即检测是否存在“五子连珠”情况(调用isGameOver()检查),更新所有状态,标志。
Pu: playerWhiteGo(int row,col) :boolean 白方落子,同上。
以下方法都是服务于以上两个方法的,所以简单介绍。
Pr: checkFiveInRow(row,col,n) :int 检查某一位置的棋子是否存在五子连珠,存在则返回方向代码,不存在则返回-1。
Pr: goAt() :void 在棋盘上落子就是将数组中的相应位置填充为某方的代码,如1、2
Pr: isGameOver() :boolean调用checkFiveInRow()调用GameEnd(isBlackWon)打印游戏结束;
Pr: moveOneStep(Dot,Direct) :Dot 在某方向(8个方向Direct)上移动一步,由connectedIn1D()等同类方法调用。
8
6.3 游戏画布类BTFIRCanvas的实现
Canvas
CommandListener
BTFIRLogic
BTFIRMIDlet
Connection
BTFIRCanvas
Pr: BLACK :int
Pr: WHITE :int
Pr: midlet :BTFIRMIDlet
Pr: logic :BTFIRLogic
Pr: font :Font
Pr: imgStatus :Image[]
Pr: CMD_STOP :Command
Pr: connection :Connection
Pr: boardLength :int
Pr: boardSize :int
Pr: boardX :int
Pr: boardY :int
Pr: 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
Pr: isBlackFirst :boolean
Pr: isColor :boolean
Pr: isMyTurn :boolean
Pr: isServer :boolean
Pr: isUpSide :boolean
Pu: BTFIRCanvas() :void
Pu: commandAction() :void
Pu: paint() :void
Pro:keyPressed() :void
Pu: repaintAt() :void
Pu: newStage() :void
Pu: notifyGameEnd() :void
Pu: openConnection() :void
Pu: completeInitialization() :void
Pu: receiveMessage() :void
Pu: setStatus() :void
Pr: calcSize() :void
Pr: xByCol() :void
Pr: yByRow() :void
Pr: status :String
9
Dot
IOException
PrintStream
Command
Font
Image
Alert
AlertType
Display
Displayable
Graphics
String
MIDlet
Pr: BLACK :int 定义颜色的常量,置值为0,调用时为黑色。
Pr: WHITE :int 定义颜色的常量,置值为0xffffff,调用时为白色。
Pr: midlet :BTFIRMIDlet 主类的对象,需要主类传来些主类的参数
Pr: logic :BTFIRLogic 定义逻辑类的对象,需要调用逻辑类的方法。
Pr: font :Font 字体对象,字体设置和计算字体大小用到。
Pr: imgStatus :Image[] 定义图片对象的数组,存放图片。
Pr: CMD_STOP :Command 按钮的对象,在画布上添加退出按钮。
Pr: connection :Connection 连接类的对象,创建连接。
Pr: boardLength :int 棋盘长度。
Pr: boardSize :int 棋盘大小默认为15*15
Pr: boardX :int 棋盘左上角的X坐标。
Pr: boardY :int 棋盘左上角的Y坐标。
Pr: 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。
Pr: isColor :boolean 手机是否支持颜色的标志
Pr: isMyTurn :boolean 是否轮到我方落子,初始值为true。
Pr: isServer :boolean 我方是否为服务器,初始值为true。
Pr: isUpSide :boolean 提示字符串位置是否在上方。
Pu: BTFIRCanvas(BTFIRMIDlet,isServer) :void 画布的构造函数,为类结10
构必须有的函数。主要用于加载游戏资源(图片、软键),并初始化参数,包括屏幕尺寸、提示字符串的参数,以及我方是否为服务器,默认情况下客户端先落子,而先落子方采用黑色棋子。
Pu: commandAction(Command,Displayable) :void 由于画布实现了按键监听的接口,所以必须重写此函数。
Pu: paint(Graphics g) :void 为画布类结构必须有的函数。在此函数中绘制所有界面。主要画面包括棋盘、棋子和提示字符串。棋盘根据尺寸属性(calcSize()方法计算所得的所有尺寸保存在属性里)绘制线条并填充棋盘底色,棋子根据BTFIRLogic所保存的棋盘数组中的内容绘制不同颜色的棋子(1为黑色,2为白色)。
Pro:keyPressed(int keyCode) :void 为画布类结构必须有的函数。用户界面的输入部分支持键盘输入,键盘的上下左右键能让引导框移动,当玩家按下确定键(fire)后,进行落子,如果落子成功,则发送消息(ssage())通知对方;如果是无效的落子,则不进行任何操作。
Pu: repaintAt(int row,int col) :void 自定义重新绘制函数。当玩家在某个位置落子时,游戏画布并不重新绘制整个屏幕,而是仅仅绘制发生变化的小范围区域,这样能减少整个绘制操作的的工作量,对提高游戏性能有所帮助。根据指定行和列绘制区域。
Pu: newStage() :void 游戏新开局时(BTFIRMIDlet中)调用此方法,该方法根据己方落子颜色(构造时传入)创建游戏逻辑对象,并设置游戏中使用的标志位,在默认情况下,客户端先手,并且为黑色棋子。开局时在游戏画布中添加退出软键用于退出游戏。
Pu: notifyGameEnd() :void 游戏结束时对画布的修改:设置输赢提示,之后对所有的状态设置进行封锁。
Pu: openConnection() :void 创建连接,在其中构造connection对象,并设置是否为服务器。打开连接。
Pu: completeInitialization(isBTReady) :void 根据参数提示用户,如果连接成功,则提示玩家联网成功,否则连接失败,则跳出提示对话框,并退11
出程序。isBTReady是在客户和服务端处连接成功的标志的赋值。
Pu: receiveMessage() :void 接收对方信息,并处理Canvas。在此方法中由connection获取对方落子行列信息更新游戏逻辑(iteGo()),然后将isMyturn设置为true,等待我方落子。isMyturn相当于此方法的一个锁。
Pu: setStatus(String,color,image) :void 该方法调整状态提示字符串:设置字符串的内容、颜色及相关图片。
Pr: calcSize() :void 在绘制屏幕之前,将首先计算屏幕中各个部分的位置和大小。如果屏幕的宽度小于高度,提示字符串位于屏幕上方;反则侧方。在除掉字符串的宽度和高度后,将屏幕剩余部分的宽或高最小值作为棋盘的边长。该方法被newStage方法调用。
Pr: xByCol(col) :void 返回指定列的x坐标;该方法被calcSize调用。
Pr: yByRow(row) :void 返回指定行的y坐标;该方法被calcSize调用。
Pr: status :String 存放状态字符串,设置状态时就将此字符串调用出去。
6.4 连接控制类Connection类
Connection类负责整个联网过程,在联网方面,游戏画布收发消息只与该类进行交互,然后由它与服务器和客户端进行交互。所以,Connection类介于用户界面和具体联网之间的控制类。
Object
BTFIRCanvas
Client
Server
Connection
Pro: server :Server
Pro: client :Client
Pro: isServer :boolean
Pr: myCanvas :BTFIRCanvas
Pro: selectedR :int
Pro: selectedC :int
Pu: completeInitialization() :void
Pu: Connection() :void
Pu: getSelectedC() :int
Pu: getSelectedR() :int
Pu: receiveMessage() :void
Pu: sendMessage() :void
Pu: start() :void
12
Client.1
PaintStream
Integer
String
System
Pro: server :Server 服务器对象
Pro: client :Client 客户端对象
Pro: isServer :boolean 是否为服务器标志,由画布传进。
Pr: myCanvas :BTFIRCanvas 游戏画布,与画布建立联系
Pro: selectedR :int 传递的行值
Pro: selectedC :int 传递的列值
Pu: completeInitialization(isBTReady) :void 客户端或者服务器连接后,又其反馈连接情况,将连接是否成功的信息反馈给Connection类,然后传递给画布告知玩家,这样做的好处是保持各类结构的明确性。该方法由服务器或客户端调用。
Pu: Connection(BTFIRMIDlet, isServer) :void 构造函数。传递画布,以及设置连接类型。
Pu: getSelectedC() :int 获得selectedC信息
Pu: getSelectedR() :int 获得selectedR信息
Pu: receiveMessage(String messageR, messageC) :void 由服务器或客户端对象调用,将收到的参数消息传递给Connection对象;然后告知画布接收消息:画布调用getSelectedC()和getSelectedR()获取行列信息。
Pu: sendMessage() :void 用于发送消息(己方落子的行列值),如果己方为服务器,则调用服务器对象的sendMessage();如果己方为客户端,则调用客户端对象的sendMessage()。
Pu: start() :void 画布调用start()方法启动连接,如果是服务器,则创建服务器对象并启动服务器连接;如果是客户端,则创建客户端对象并启动客户端连接,根据isSever确定是创建客户端,还是服务器。这样做可以在画布调用时能够统一,使用更简单。
6.5 服务器类Server类
服务器类主要创建蓝牙连接和服务,并等待客户端的连接。创建好连接后进13
行行列数值的收发。
Connection
Processor
DataOutputStream
String
Thread
Vector
oth
LocalDevice
Object
Runnable
DataInputStream
IOException
Server
Pr: accepterThread :Thread
Pr: connection :Connection
Pr: connectionURL :String
Pr: dos :DataOutputStream
Pr: isClosed :boolean
Pr: local :LocalDevice
Pr: messageR :String
Pr: messageC :String
Pr: notifier :StreamConnectionNotifier
Pr: processor :Processor
Pr: queue :Vector
Pu: run() :void
Pu: sendMessage() :void
Pr: readInputString() :void
Pu: Server() :void
Pu: start() :void
Pr: processConnection() :void
StreamConncetion
StreamConncetionNotifier
PrintStream
Exception
System
Connection
Connector
Pr: accepterThread :Thread 线程,在()中调用并启动。
Pr: connection :Connection 连接类
Pr: connectionURL :String 服务器连接地址
Pr: dos :DataOutputStream 数据输出流
Pr: isClosed :boolean 连接标志
Pr: local :LocalDevice 本地设备管理,来自蓝牙包
Pr: messageR :String 行信息
Pr: messageC :String 列信息
Pr: notifier :StreamConnectionNotifier 流连接通告器
14
Pr: processor :Processor 客户端处理
Pr: queue :Vector 连接队列,可保存对象
Pu: Server(Connection) :void 构造函数。将Connection与本类中的connection建立联系。获取Connection对象,该类作为一个连接中枢,起到联网和用户界面之间沟通的作用。
Pu: run() :void Server类实现了Runnable接口,在run()方法中先获取本地蓝牙管理器,将其设置为允许其他设备访问,然后按照指定服务地址开通服务并等待客户端的联入。
Pu: sendMessage(String message1,message2) :void 发送数据。Server类收发的数据位玩家落子的行列信息,这些信息已经被Connection类转化为字符串形式。发送信息既往数据输出流(DataOutputStream)中写入数据。
Pr: readInputString(StreamConnection) :void 接收数据。被内部客户端处理类调用,接收信息则从数据输入流中读取数据,并传递给Connection连接类。
Pu: start() :void 线程的创建和启动。
Pr: processConnection() :void 在线程中调用了ClientProcessor类的processConnection()方法,该方法打开了连接的数据输出流以便数据发送。调用了Server的readInputString。
在Server中使用了内部类ClientProcessor用来处理客户端,该类也实现并启动了一个线程,为的是随时等待加入的客户端;在构造函数中创建并启动该类的线程;在run()方法中等待客户端的连接,在获得客户端后,尝试开启数据流。
本类主要围绕run()展开,依次经行获取蓝牙管理,设置访问权限,开通指定地址的服务,接受连接,在客户连接处理类中添加连接并唤醒处理线程。这时数据流赋值给dos,再由收发数据方法处理。
6.6 客户端类Client类
Client类主要负责搜索设备和服务,并负责客户端的信息收发。Client类引用了较多蓝牙API,并且实现了Runnable和DiscoveryListener接口。
15
Client.1
Connection
String
Thread
Vector
oth
DiscoveryAgent
UUID
StreamConnection
Object
Runnable
oth
oth
DiscoveryListener
Client
pro: conn :StreamConnection
pro: devices :Vector
pro: i :int
pro: messageR :String
pro: messageC :String
pro: records Vector
pro: transIDs :int[]
Pr: connection :Connection
Pr: discoveryAgent : DiscoveryAgent
Pr: discType :int
Pr: ECHO_SERVER_UUID :UUID
Pr: isClosed :boolean
Pr: processorThread :Thread
Pu: Client :void
Pu: deviceDiscovered :void
Pu: inquiryCompleted() :void
Pu: run() :void
Pu: sendMessage() :void
Pu: servicesDiscovered() :void
Pu: serviceSearchCompleted() :void
Pu: start() :void
DataInputStream
DataOutputStream
PrintStream
Exception
InterruptedException
System
Throwable
oth
BluetoothStateException
DeviceClass
LocalDevice
RemoteDevice
ServiceRecord
Connection
Connector
pro: conn :StreamConnection 连接流对象
pro: devices :Vector 向量容器devices存放所有搜索到的设备。
pro: i :int
pro: messageR :String 发出的行信息
pro: messageC :String 发出的列信息
pro: records Vector 服务集合。将搜索到的集合加入服务集合。
pro: transIDs :int[] 服务搜索的事务id集合。
Pr: connection :Connection 连接对象,在构造函数中赋值。
16
Pr: discoveryAgent : DiscoveryAgent 发现代理类的对象,用于发现代理。
Pr: discType :int 参数,返回类型。
Pr: ECHO_SERVER_UUID :UUID 响应服务的UUID(对象)
Pr: isClosed :boolean 连接关闭标志位。
Pr: processorThread :Thread 线程对象,此线程把整个Client作为线程来运行(run())。
Pu: Client(Connection) :void 获取连接类对象。在连接类中创建的Client对象就会和连接类建立联系。
搜索设备
客户端程序使用蓝牙发现API以搜索在其附近的的设备和服务。服务代理类(DiscoveryAgent)同时支持设备与服务的发现。当设备和服务被发现时,想得到通知的客户端应用程序必须实现并注册DiscoveryListener接口,这个接口定义了设备发现通知和服务发现通知的回调(discType)。
使用DiscoveryAgent类,用于搜索设备的相关方法来开始和取消设备发现:
.retrieveDevices(),重新获得已经发现或者附近的已知设备。
.startInquiry(),启动发现附近设备,也叫inquiry。
,计算机范文网 ,.cancelInquiry(),取消当前进行的任何请求。
“蓝牙发现代理”在请求阶段的不同时候会分别调用DiscoveryListener(发现监听器)不同的回调方法:
.deviceDiscovered(),指出是否有设备被发现。
.inquiryCompleted(),指出是否请求已经成功、触发一个错误或已被取消。
设备发现以调用startInquiry()函数开始。在请求进行时,“蓝牙发现代理”会在适当的时候调用回调方法deviceDiscovered()和inquiryCompleted(),此两个方法均为虚函数,需要重写。
Pu: deviceDiscovered(RemoteDevice,DeviceClass) :void 将搜索到的远程设17
备添加到设备集合中。第一个参数即为搜索到的远程设备(RemoteDevice)。
Pu: inquiryCompleted(int discType) :void 获取返回状态,如果搜索结束但未查找到远程设备,或者搜索过程中发生异常的处理在此函数中进行。在这里将异常通知连接类的completeInitialization(boolean)。
搜索服务
可以使用“发现代理”(DiscoveryAgent)的服务发现方法来开始或取消服务发现:
.selectService(),启动服务发现搜索。(根据API手册应为尝试定位一个服务。)
.searchServices(),启动服务发现搜索。本程序用此方法。
.cancelServiceSearch (),取消正在进行中的任何服务发现搜索操作。
DiscoveryAgent类在服务发现阶段的不同时候会分别调用DiscoveryListener(发现监听器)的服务发现回调方法:
Pu: servicesDiscovered(int transID,ServerRecord[] serverRecord) :void 表示是否服务已被发现。将serverRecord集合赋值给records容器。
Pu: serviceSearchCompleted(int transID,int respCode) :void 表示服务发现是否已经完成。主要对respCode进行操作。为简单起见,本程序不做任何事。
Pu: run() :void Client类实现了Runnable接口,线程将完成搜索设备和服务工作,并记录所搜索到的服务id。此方法中主要完成三个阶段:1、获取本地设备和获取代理,2、搜索设备,3、搜索服务。
Pu: sendMessage(String message1,message2) :void 为了简单起见,将消息的收发处理放在一个方法中,客户端发送消息之后就立即接收信息,并传递给Connection(receiveMessage)类。在此方法中直接定义一个线程,让线程去做数据的发送与接收。
Pu: start() :void 创建并启动Client类的接口线程。
18
本类主要要写的方法有3个:run(),start(),sendMessage(),其他方法为虚函数的重写,也主要围绕run()进行的。
6.7棋子Dot类的实现
7 应用程序的安装和部署
将编写好的源程序在集成开发环境或者WTK中编译后打包发布,生成一个.jad文件和.jar文件。.jad文件中存储的是程序的入口信息,.jar中存放着程序字节码等运行程序。将此两个文件存入支持的Java的手机中(注:目录一致),在手机中找到.jad文件,运行即可(有些较高端手机直接可以运行.jar文件)。目前运行此软件建议手机Java的MIDP版本为MIDP-2.0,CLDC版本为CLDC-1.1。
8 结束语
通过对此题目的设计,使我对手机应用程序的开发有了认识。对类、对象以及它们之间的结构关系也有了进一步的认识,对今后面向对象的编程开发有很多帮助。经过一个月的自学,学到了大量的J2ME开发知识,虽然只是冰山一角,19
Object
Dot
BTFIRLogic
Pu: col :int
Pu: row :int
Pu: copyFrom() :void
Pu: Dot() :void
Pu: Dot() :void
Pu: Dot() :void
Pu: isInBoard() :boolean
Pu: setRowCol() :void
BTFIRCanvas
较简单,在此不做简介。
但感受颇丰,受益非浅。在软件设计方面,使我对面向对象编程,从理论到实践有了质的飞跃。虽然这次毕业设计我完成了基本要求,但由于学习的知识还不能运用自如,所以许多功能的设计还不完善,自己也发现了许多不足,在今后时间允许的情况下我会进一步完善。
在本次的毕业设计中,我首先要感谢yz老师对我自选题目的充分支持与信任,但现在发现这个毕业设计的制作并没有给拓宽就业面带来帮助,后悔当初没有认真去听取yz老师的建议,而执意要选此题目,在此也表示深深的歉意。
时间飞逝,希望今后还能有跟yz老师学习的机会,再一次感谢yz老师的精心指导!
20
参考文献
[1] 龚剑等编著.J2ME手机游戏开发详解.北京:电子工业出版社,2008,1.
[2] 郭克华编著.Java ME移动开发实例精讲.北京:清华大学出版社,2010,1.
21
Bluetooth Battle "Five in a Row" game for Mobile Phone of the
application design
Computer and Information Engineering Collage 2008
2006152101x
Directed by YuZhu Professor
Abstract Advances in information technology and wide application is
profoundly affecting every corner of life. Program running environment is not
confined to the computer in. This paper discusses the use of wireless development
tool (WTK) in mobile phones such networked Limited Device Configuration (CLDC)
on the development of Bluetooth Battle 5Child chess game application (MIDlet)
implementation process. Through the implementation of the program, you can learn
the basics of development based on J2ME.
Keywords J2ME; wireless toolkit (WTK); Connected Limited Device
Configuration(CLDC); mobile phone; Bluetooth applications
封面
山东建筑大学
2009级工程造价专业毕业设计任务书
题 目:
山东省职业技术学院办公楼工程项目商务标书
设计期限: 自2011年7月
至2011年10月
22
班 级:
学生姓名:
学 号:
指导教师(签字):任成友
庄春华
23
山东建筑大学毕业设计任务书
班 级
设计题目
学生姓名 指导教师 张琳
山东省职业技术学院办公楼工程项目商务标书
1、工程概况
山东省职业技术学院办公楼项目概况:
(1)建设单位:建达房地产开发有限公司
2)本工程为办公楼,具体位置详见规划总平面图
3)本工程总建筑面积5195.74平方米
4)本工程五层,一层层高4.2m,二-四层高3.9m,五层层高4.2m,建筑高度29.74m,室内外高差0.60m。
5)本工程结构形式:框架结构,抗震设防烈度:6度
6)本工程建筑等级:三级;耐火等级:为二级。
7)本工程设计使用年限:3类(合理使用50年)
8)屋面防水等级:二级
2、工程特点
本工程为重点工程,业主要求尽量采用施工新技术并要求必须按合同工期完工。施工现场狭小,应考虑合理利用现场空间。
3、资金筹措条件
(1)工程合同价C=工程报价;
(2)开工前业主拨付工程备料款A=20% C;
(3)工程进度款,每月末按形象进度延迟一个月拨付;
(4)不足部分通过银行贷款补足,贷款利率=12%(单利);
(5)不考虑保修金的留设。
(6)现场条件:已实现三通一平.
(7)工程量清单
(8)施工图(另附)
1、撰写招标文件,编制工程量清单
以施工图纸为依据,根据国家标准《建设工程工程量清单计价规范》、及山东省现行消耗量定额进行编制。鼓励学生在完成手工预算的全部工作的基础上,另用工程造价编制软件对手算的结果进行校审复核。工程量清单编制的内容有;
(1)封面;
(2)总说明;
(3)分部分项工程量清单;
(4)措施项目清单;
(5)其他项目清单;
2、编制投标文件
投标文件只编写商务标部分
(1)商务部分主要包括下列内容:
1) 投标函:
2) 建安工程唱标单;
24
设 计
原 始
参 数
设 计
工 作
内 容
设 计
工 作
基 本
要 求
3) 法定代表人资格证明书;
4) 法定代表人授权书;
5) 投标保证金。
6)报价单
(2)商务标编制:计算工程量;确定综合单价;进行投标报价;编制报价汇总表,和各类投标报价单价表。
投标报价说明;投标报价汇总表;主要材料清单报价表;分部分项工程量清单报价表;措施项目报价表;其他项目报价表;规费与税金工程量清单项目报价表。
1、毕业设计程序的要求
(1)设计准备阶段
毕业设计题目选定后,应由指导教师向学生下达毕业设计指导书。学生根据毕业设计指导书的选题和指导教师的安排,应该做好如下的准备,包括:认真阅读毕业设计任务书的内容,熟悉施工图纸,调查了解与设计内容相关的资料;收集相关的工具书。包括设计规范、施工规范、预算定额、工程估价表、标准图集、相关的造价文件和有关材料的市场价格等。同时了解毕业设计的进度安排和答辩时间。
(2)毕业设计阶段
1) 根据毕业设计任务书的要求,准备相关资料。
2)根据图纸和相关文件,编制工程量清单。
3)根据图纸和相关资料,编制投标文件。
4)汇总装订,形成毕业设计文件。
(3)毕业答辩阶段
毕业答辩是学生毕业设计的总结和回顾,要求学生做好下列工作:
1)编写毕业设计说明书,内容包括对毕业设计任务书的理解、毕业设计的总体思路、在设计过程中的参考资料及对有关问题的处理意见和毕业设计的体会。要求语言简练,步骤清晰。
2)参加毕业答辩,要求学生应该对毕业答辩做好充分的准备,在答辩时,首先简要的陈述毕业设计的课题名称、设计要求、设计思路及设计过程和设计成果。其次要准备回答答辩教师与设计内容相关的问题。
2、毕业设计成果的要求
毕业设计是学生在校学习的最后阶段,是培养学生综合运用所学知识,发现、提出、分析和解决实际问题,锻炼实践能力的重要环节,是对学生实际工作能力的系统训练和考察过程。毕业设计是学生在老师指导下,对所从事工作和取得成果的完整表述,毕业设计的撰写是学生基本能力训练的过程,应当符合国家及有关行业(部门)指定的有关标准,符合汉语语言规范。
3、毕业设计成果应包括:
①标题 ②摘要 ③关键词 ④目录 ⑤正文 ⑥参考文献等部分。
设计进程安排
第一阶段 完成清单工程和定额消耗量工程,整理好工程量草稿
第二阶段 应该是用广联达编制工程量清单、招标控制价及投标报价
第三阶段 答辩
25
主要
参考
资料
及文献
1.建筑工程项目管理规范(GB/T 50326-2006)
2.相关的建筑标准图集和做法。
3.相关的建筑工程规范和质量标准.
4.工程量清单计价规范、消耗量定额及有关规定。
5.山东建筑大学教师教学工作手册(上)(2006年版).
6.山东建筑大学优秀毕业设计(论文)集。
7.相关建设工程法律、法规。
8.其他相关资料与文献。
26