j2me可开发的象棋游戏文档.docx
- 文档编号:8674840
- 上传时间:2023-02-01
- 格式:DOCX
- 页数:18
- 大小:1.16MB
j2me可开发的象棋游戏文档.docx
《j2me可开发的象棋游戏文档.docx》由会员分享,可在线阅读,更多相关《j2me可开发的象棋游戏文档.docx(18页珍藏版)》请在冰豆网上搜索。
j2me可开发的象棋游戏文档
《游戏程序设计》
课程大作业
专业:
统专软件
班级:
1001班
学号:
103110040127
姓名:
孙东升
指导教师姓名:
张文胜
报告日期:
2012年6月
成绩评定
得分要求
分值
得分
游戏引擎的设计分析
20
游戏的开发步骤设计分析
20
游戏算法设计分析
20
游戏素材资源分析
20
游戏关键知识点分析
15
格式是否正确
5
总成绩
基于J2ME手机的网络象棋游戏源代码的阅读分析
1游戏简介
随着通信技术的高速发展,移动通信技术规模的不断扩大,手机越来越普及。
手机已从最初的通信工具,演变成今天的一个多功能的电子设备,通话功能只不过是手机的基本功能,如今,游戏、上网、音乐、摄像等功能才是用户购买手机产品时的参考因素。
在琳琅满目的手机应用程序中,手机游戏所占的份额是很大的。
近几年来,伴随着移动网络和移动终端性能的不断提高与完善,其增长势头远远超过其他移动数据业务,已经逐渐成为一个生机勃勃而又潜力巨大的文化产业。
手机游戏极高的普及率和巨大的使用量使得这个市场商机无限,并已经成为移动运营商、服务提供商、内容提供商的重要收入来源,可以说是一座名副其实的“金矿”。
目前,手机游戏的收费模式主要包含三类。
一类是单机下载的收费模式,通过下载的不同游戏收取一定的费用。
另一类是联网游戏的收费模式。
还有一种模式,游戏本身是免费的,但用户为了能够获得更为丰富的游戏体验,需要在游戏进行过程中支付一定的费用购买商品、用品、增值服务、服装、道具等。
即将开通的3G网络,也将为手机网游带来全新的发展。
但是根据目前手机硬件的制约,网络游戏时间的延缓,导致很多手机用户并不愿为手机网游付费。
蓝牙手机游戏的出现,缓解了这种矛盾。
蓝牙与手机结合体现了其低成本和便捷性的特点,适用范围广。
拥有蓝牙功能的手机越来越普遍,具有强大游戏功能的手机越来越多,用户对游戏的要求也越来越高,具有交互性质的蓝牙游戏必定能获得用户青睐。
近年来在世界范围内,随着手机的日渐普及,手机游戏已经成为整个视频游戏领域发展速度最快的部分。
与PC游戏不同,手机游戏摆脱了线缆的束缚,具有随时、随地、随身的特点,更适合人们在移动中休闲和娱乐。
显然,手机游戏产业一旦启动,其能量将不亚于目前的电脑网络游戏。
根据信息产业部公布的最新统计结果,截止到2008年12月底,我国移动电话用户数已经达到64123万户,即使考虑一个以上电话号码的手机用户,国内的手机用户数量也是居世界前列[1]。
国内有着庞大的手机用户数量,即使只有10%的用户,每月只下载一款游戏,也足以使其形成一个规模庞大的产业。
但是目前仅有不足1%的用户下载过手机游戏,这使得这块被无数人看好的市场并没有达到和人们预期相吻合的水平。
人们似乎更容易接受其他的增值业务(比如彩信、彩铃等),而对手机游戏的认知度却相当低。
JAVA手机游戏在国内大约开始于2004年,经过多年的发展,已经形成了一定的规模。
据统计,2007年中国手机游戏市场超过8亿人民币,目前手机游戏市场活跃用户已经达到了500多万,随着手机网游用户数量和产品大规模增加,预测至2011年中国手机游戏市场规模将达37亿元[2]。
目前国内手机游戏己走过了从最初的文字类游戏、嵌入式游戏、可下载的单机版游戏到大型手机网络游戏的发展历程,手机游戏的业务形态日益成熟。
开发环境:
装有jdk的xp及其以上系统的电脑1台,eclipse工具,WirelessToolkit2.5.2模拟器。
2游戏组成
图1连接网络服务图2红方走棋
图3选择游戏房间
图4两个玩家对战
图5两个玩家对战
图6比赛完胜后的截图
3代码分析
3.1游戏引擎的设计分析
3.1.1发送信息等待用户读取:
publicvoidsendMessage(Playerp,Stringstr){//发送信息,等待用户读取
p.data.push(newString(str));}
3.1.2更新所有客户桌面:
publicvoidupdateClientsDesk(intdeskid){//更新所有客户桌面
for(Enumerationen=players.elements();en.hasMoreElements();){
Playerplayer=(Player)en.nextElement();
if(player!
=null)updateDesk(player,deskid);}}
3.1.3更新单个桌面:
publicvoidupdateDesk(Playerisa,intdeskid){//更新单个桌面
Stringmessage="updatedesk,"+deskid;
Stringstr="";
for(inti=0;i if(i==0){if(desks[deskid].isEmpty(i))str="0"; elsestr="1";}else{ if(desks[deskid].isEmpty(i))str=str+",0"; elsestr=str+",1";}} message=message+": "+str; sendMessage(isa,message);} 3.1.4获得桌面列表: publicvoidsendDeskList(Playerplayer){//获得桌面列表 Stringmessage="desks,"+DESKNUM; for(inti=0;i for(intj=0;j if(j==0){ if(desks[i].isEmpty(j))str="0"; elsestr="1"; }else{if(desks[i].isEmpty(j)) str=str+",0"; elsestr=str+",1"; }}message=message+": "+str;} sendMessage(player,message);} 3.1.5处理登陆信息: publicvoiddenglu(HttpServletRequestrequest){//处理登陆信息 Playerplayer=newPlayer(request.getRemoteAddr(),request.getRemotePort()); player.setID(counter); counter++; players.put(request.getRemoteAddr()+": "+request.getRemotePort(), player); sendMessage(player,"port="+request.getRemotePort()); sendDeskList(player);}//发送大厅信息 3.1.6处理落座信息: publicvoidluozuo(Stringmessage,Playerplayer){//处理落座信息 try{intindex1=message.indexOf(","); intindex2=message.indexOf(",",index1+1); intdindex=Integer.parseInt(message.substring(index1+1,index2)); intpindex=Integer.parseInt(message.substring(index2+1)); if(dindex if(desks[dindex].isEmpty(pindex)){ desks[dindex].setPlayer(pindex,player); player.setDesk(desks[dindex]); sendMessage(player,"takeseat"); updateClientsDesk(dindex);}}}catch(Exceptionexc){}} 3.1.7处理开始信息: publicvoidtryStart(Playerplayer){//处理开始信息 player.start(); Deskd1=player.getDesk(); if(d1.isReady()){d1.start();}} 3.1.8返回玩家座位: publicintgetPlayerSeat(Playerp)//返回玩家座位 {for(inti=0;i if(players[i]==null)continue; if(players[i].equals(p))returni;} return-1;} 3.1.9设定玩家做的pos座位: publicvoidsetPlayer(intpos,Playern){//设定玩家n坐在pos座位上 if(pos>=NUM)return; players[pos]=n;} 3.1.10移除玩家: publicvoidremovePlayer(Playerp){//移除玩家p for(inti=0;i if(players[i]==null)continue; elseif(players[i].equals(p))players[i]=null;}} 3.1.11获取玩家总数: publicintgetPlayersCounter(){//获得玩家总数 returnNUM;} 3.1.12判断座号是否是空: publicbooleanisEmpty(intpos){//座号pos是否空 if(pos>=NUM) returnfalse; returnplayers[pos]==null;} 3.1.13判断本桌是否坐满: publicbooleanisReady()//本桌是否坐满,并且都开始 {for(inti=0;i if(players[i]==null) returnfalse; elseif(! players[i].isStart()) returnfalse;} umpire.init(); returntrue;} 3.1.14发送信息: publicvoidsendMessage(Stringmessage){//发送信息函数 System.out.println("sendmessage: "+message);//打印发送的信息 try{urlSend="http: //localhost: 8080/XiangQiServer/XiangQi? message="+message+"&"+port;//连接到服务器上显示信息 HttpConnectiondc=(HttpConnection)Connector.open(urlSend,Connector.READ);//获取发送来的地址,并设置颜色 InputStreamis=null; is=dc.openInputStream();//打开数据流 is.close();//关闭流 dc.close();}catch(Exceptionex){ ex.printStackTrace();}} 3.1.15返回玩家列表: publicListgetPlayerList(){//返回玩家列表 returnplayerList;} 3.1.16更新桌面: publicvoidupdateDesk(Stringstr){//更新桌面 intindex1=str.indexOf(","); intindex2=str.indexOf(": ",index1+1); intindex3=str.indexOf(",",index2+1); try{intd=Integer.parseInt(str.substring(index1+1,index2)); desks[d][0]=Integer.parseInt(str.substring(index2+1,index3)); desks[d][1]=Integer.parseInt(str.substring(index3+1)); playerList.set(d,d+"-"+desks[d][0]+"-"+desks[d][1],null); }catch(Exceptionexc){}} 3.1.17处理落座: publicvoidtakeSeat(){//处理落座信息的方法 if(canvas==null)//如果游戏界面对象未初始化 canvas=newGameCanvas(this,client);//初始化游戏界面对象 elsecanvas.init();//调用游戏界面的init()方法 canvas.setSeatPos(trySeat);//设置玩家座位 canvas.setDeskIndex(tryDesk);//设置玩家卓号 display.setCurrent(canvas);//显示游戏界面 } 3.1.18游戏桌面设置: publicGame(){//对属性进行初始化 display=Display.getDisplay(this); playerList=newList("桌面列表",Choice.EXCLUSIVE); CommandexitCommand=newCommand("退出",Command.EXIT,0); playerList.addCommand(exitCommand); okCommand=newCommand("落座",Command.OK,0); playerList.addCommand(okCommand); playerList.setCommandListener(this); display.setCurrent(playerList); client=newClient(this);} 3.1.19退出游戏: protectedvoiddestroyApp(booleanp0)throwsMIDletStateChangeException{client.sendMessage("exit");//销毁,如果用户点exit则推出游戏 display.setCurrent(null);} 3.2游戏的开发步骤设计分析 3.2.1游戏开发步骤 1定义玩家属性,以及设置房间号,得到房间号,判断是不是同一个房间的类Player(此类设置房间号,判断玩家是否进入同一个房间,假如是同一个房间号玩家可以开始游戏,不是同一个房间不可以开始游戏。 ) 2处理游戏的算法类Queue(用队列算法对游戏的流程进行处理。 ) 3设置桌面Desk类(此类主要设置桌面的一些属性,并判断本桌面是否坐满,加入坐满不可以开始游戏,没有坐满可以选择房间号进行开始游戏。 ) 4定义棋盘布局的类GameCanvas(此类画出棋盘各个棋子的位置,并画出棋盘的布局,以及棋盘的颜色,并判断改那个玩家走棋,以及定义各个棋子的走棋规则,定义选择棋的框子,是对棋盘定义的一个很重要的类。 ) 5处理用户点击按钮的类Game(此类为处理玩家点击按钮的类,当玩家选择好房间后可以按开始按钮进行玩,当玩家不想玩游戏的时候可以点击退出按钮退出游戏。 ) 6返回游戏信息的类Client(此类用来返回玩家玩游戏信息的提示,提示该哪位玩家走棋,以及玩家点击按钮是的信息,输出到控制台。 ) 7游戏服务器类Server(此类是处理用户登录信息以及用户推出信息,处理移动棋子的信息,开始信息以及游戏落座的信息,并将之显示在控制台上面,此类非常重要,假若没有此类的话游戏将不可以顺利的进行。 ) 游戏的几大类进行相互的合作,互相调用各自的一些属性和方法完成各自的功能,共同使整个游戏运行起来。 3.3游戏算法设计分析 “先进先出”(LIFO)的存储结构。 数据元素只能从队尾进入,从队首取出。 在队列中, 数据元素可以任意增减,但数据元素的次序不会改变。 每当有数据元素从队列中被取出, 后面的数据元素依次向前移动一位。 所以,任何时候从队列中读到的都是队首的数据。 根据这些特点,对队列定义了以下六种操作: push(x)向队列插入一个值为x的元素; publicsynchronizedvoidpush(Objectx){ super.addElement(x);} pop()从队列中取出一个元素; publicsynchronizedObjectpop(){/*队列若为空,引发EmptyQueueException异常*/ if(this.empty()) thrownewEmptyQueueException(); Objectx=super.elementAt(0); super.removeElementAt(0); returnx;} front()从队列中读一个元素,但队列保持不变; publicsynchronizedObjectfront(){ if(this.empty())/*队列若为空,引发EmptyQueueException异常*/ thrownewEmptyQueueException(); returnsuper.elementAt(0);} empty()判断队列是否为空,空则返回真; publicbooleanempty(){ returnthis.isEmpty();} clear()清空队列; publicsynchronizedvoidclear(){ super.removeAllElements();} search(x)查找距队首最近的元素的位置,若不存在,返回-1 publicintsearch(Objectx){ returnsuper.indexOf(x);} 3.4游戏素材资源分析 游戏用代码写了一些游戏素材: chess=newString[][]{//布置象棋棋子摆放位置 {"车","马","象","士","将","士","象","马","车",}, {"空","空","空","空","空","空","空","空","空",}, {"空","炮","空","空","空","空","空","炮","空",}, {"卒","空","卒","空","卒","空","卒","空","卒",}, {"空","空","空","空","空","空","空","空","空",}, {"空","空","空","空","空","空","空","空","空",}, {"卒","空","卒","空","卒","空","卒","空","卒",}, {"空","炮","空","空","空","空","空","炮","空",}, {"空","空","空","空","空","空","空","空","空",}, {"车","马","象","士","将","士","象","马","车",},};} protectedvoidpaintChessboardUp(Graphicsg){//画上半部棋盘 for(intk=0;k<4;k++){ for(intl=0;l<8;l++){ g.setColor(lineColor); g.drawRect(x+l*gridWidth,x+k*gridWidth,gridWidth, gridWidth);}} g.setColor(lineColor);//设置画棋盘线的颜色 g.drawLine(x+3*gridWidth,x,x+5*gridWidth,x+2*gridWidth); g.drawLine(x+5*gridWidth,x,x+3*gridWidth,x+2*gridWidth); //画左上方的炮{g.drawLine(x+d,x+gridWidth+c,x+d,x+gridWidth+d);//左上竖 g.drawLine(x+c,x+gridWidth+d,x+d,x+gridWidth+d);//左上横 g.drawLine(x+d+2*b,x+gridWidth+c,x+d+2*b,x +gridWidth+d);//右上竖 g.drawLine(x+gridWidth+b,x+gridWidth+d,x+gridWidth+a,x+gridWidth+d);//右上横 g.drawLine(x+d,x+2*gridWidth+b,x+d,x+2*gridWidth +a);//左下竖 g.drawLine(x+c,x+gridWidth+d+2*b,x+d,x+gridWidth +d+2*b);//左下横 g.drawLine(x+d+2*b,x+2*gridWidth+b,x+d+2*b,x+2*gridWidth+a);//右下竖 g.drawLine(x+gridWidth+
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- j2me 开发 象棋 游戏 文档