仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1343|回复: 19
打印 上一主题 下一主题

[学习教程] JAVA教程之J2ME-MIDP1.0游戏完全完成-双人扫雷1.0...

[复制链接]
活着的死人 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-18 11:35:43 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
微软什么都提供了。你可以试想一下,如果你是新手,你是希望你点一下按钮程序就能运行那,还是想自己一点一点的组织结构,然后打包发部,调错再打包......yinowl
2005年2月

媒介
我的上一篇也是第一篇文章《J2ME-MIDP1.0小游戏进门-五子棋》贴出今后,有很多多少的伴侣发邮件、加QQ、加MSN和我聊有关J2ME的内容,我很高兴也很感伤,高兴并非由于本人文章写得怎样怎样而有良多人接洽我,而是有这么多的伴侣在学J2ME,我本来觉得如今已没有人再见接洽文章的作者,看来我错了;感伤是由于,我晓得我的第一篇文章实在很差的,从人人的反响,我能感到出网上的原创材料的缺少,官方大概书本固然威望且,但总感到学的时分和实践的情形有点间隔,我在看这些材料的时分,也常常会想,实践游戏开辟公司里为怎样处置、会怎样写这个代码、程序的布局流程会怎样等等。原创文章的最年夜有点就是它包括了作者的履历,实践开辟中的履历。介于人人对我的撑持而且网上原创文章无限,我十分愿意持续写一些本人的履历和手艺,充分我们的中文资本。以是我接着写了这篇文档,文档内容即程序的开辟历程都是实在的,不是为写文章而写文章,完整是近一段工夫里先完成的程序,如今再把它写成教授教养文章。愿人人学J顺遂,多多交换(MSN:yinowl@163.comQQ:47599318E-mail:yinowl@163.com)

注重
平台:这个游戏我是在Nokia的平台上计划的,也就是说利用了FullCanvas类和针对Nokia-60系列(7650)的屏幕计划的,稍作修正就可以运转在其他型号的手机上(我已制造了Siemens-C65,Nokia-7210,和一切撑持尺度midp1.0/2.0、屏幕128x128的手机的几个移植版本,有必要能够和我接洽)
代码:同我的前一篇文章《J2ME-MIDP1.0小游戏进门-五子棋》一样,代码列出注释的情势模仿《J2MEGameProgramming》一书,依照程序功效思绪给出相干代码,一个文件的代码会依据功效在分歧的大节给出,文章停止了,代码也就完全了。这分歧于一般书中的代码以文件为单元一次全体给出,我以为如许更有助于让人人懂得一个程序从计划到最初完成的思绪。

游戏先容
扫雷这个游戏人人必定再熟习不外了,但这个双人扫雷游戏的扫雷新弄法人人大概就没见过了,实在这就是MSN软件中的一个收集联机小游戏,人人天天在利用MSN,但都很少注重或玩MSN中的游戏吧,能够说我就是把MSN上的联机双人扫雷移植到的手机上,千篇一律。假如你如今不便利上彀大概没有人和你联机看一下这个游戏的界面和弄法,不妨,我如今就来先容一下,游戏区(雷区)中一共有16x16共256个格子,个中有52颗雷,操纵除高低摆布键(固然电脑上是用鼠标点的)只必要一个挖雷键,你要做的是挖出雷,而不是用另外一个键往标示雷。两个玩家,一方入手下手挖雷,假如挖到(点到)雷,则加一分,没挖到,就和典范的扫雷一样,显现这个地位四周一圈有几个雷,假如一个雷都没有,和典范的扫雷一样,会把和这一格相连的一切四周没有雷的格子和再表面一圈格子翻开,然后另外一位玩家挖雷,谁先挖到对折以上(年夜于26颗)的雷谁就得胜,实在很复杂吧,游戏的界面以下:





游戏逻辑计划
数据布局:这个游戏属于二维棋类游戏,以是我们天然而然想到计划一个Bomb类暗示每颗雷位,用一个Bomb范例的二维数组暗示全部雷区的一切雷位,每个雷位(即每个Bomb实例)包括一个暗示该雷位是不是是雷的boolean范例的变量,一个暗示该雷位是不是已被挖的boolean范例的变量,一个暗示是不是是被玩家一挖的boolean范例的变量(否暗示是被玩家二挖),一个暗示该雷位四周八个雷位共有几颗雷的int范例变量。如许全部雷区的形态就完整被形貌出来了,然后就依据这个二维表来绘制游戏界面
游戏流程:全部游戏只利用独一一个FullCanvas类,用独一一个暗示形态的变量来把持全部游戏的形态,全部游戏也只利用自己的独一线程
玩家切换:用一个boolean范例的变量来暗示以后实行的玩家,用游戏的外框色彩及右下角的旌旗色彩来暗示出来

接上去就入手下手具体先容并列出游戏程序的各部分代码,文章的停止,全部游戏也就完成了

使用程序类:MiningMIDlet.java
起首就是一个MIDlet类。MiningMIDlet类承继自MIDlet类,用于毗连设备的使用程序办理器(ApplicationManager),经由过程办法startApp,pauseApp,destroyApp来关照游戏的入手下手,停息和烧毁停止。源代码以下:

packagecom.imy.yinowl.miningscroll;
importjavax.microedition.lcdui.Display;
importjavax.microedition.midlet.MIDlet;
publicclassMiningMIDletextendsMIDlet{
MiningCanvasminingCanvas;
//界说游戏界面的FullCanvas类MiningCanvas的对象miningCanvas
publicMiningMIDlet(){
display=Display.getDisplay(this);
miningCanvas=newMiningCanvas(this);
//天生MiningCanvas类的对象miningCanvas
}
protectedvoidstartApp(){
MiningMIDlet.display.setCurrent(miningCanvas);
//在屏幕上绘出游戏会晤miningCanvas
}
protectedvoidpauseApp(){
}
protectedvoiddestroyApp(booleanarg0){
notifyDestroyed();
}
}


地雷类:Bomb.java
Bomb类界说了二维雷区内每个雷位的一切信息,如许用一个Bomb范例的二维表就可以完整形貌全部雷区的形态。我在Bomb类中,用了三个boolean型变量和一个int型变量来形貌一个雷位:boolean型变量isBomb:形貌这个地位是不是是雷;boolean型变量hasFound:形貌这个地位是不是已被发掘;boolean型变量isPlayer1:形貌假如这个地位是雷,并且已被发掘,那末是不是是玩家一发掘,假如值是false,暗示是被玩家二发掘,只要在isBomb和hasFound都为true时,这个变量的值才成心义;int型变量bombaround:形貌此地位四周八个地位共有几颗雷,这个变量除用来告知玩家四周雷数还能够用来翻开成片的非雷地区。经由过程这四个变量共同分歧的图片就能够把全部雷区的分歧形态的图形界面出现在玩家眼前。Bomb类的源代码以下:

packagecom.imy.yinowl.miningscroll;
publicclassBomb{
intbombaround;
booleanisPlayer1;
booleanhasFound;
booleanisBomb;

publicBomb(){
bombaround=0;
isBomb=false;
hasFound=false;
isPlayer1=true;
}
}


界面逻辑类框架:MiningCanvas.java
一样平常游戏会呈现良多的界面,比方游戏的LOGO(也称作闪屏或启动界面)、入手下手菜单(主菜单)、设置界面、游戏界面、匡助界面、关于界面、游戏时匡助菜单等等,我的这个游戏不必要设置以是没有设置界面,一切的这些界面我们都整合在这一承继自Nokia-API中的FullCanvas类中,我们要尽量的较少类的数量以削减资本的开支,详细是怎样整合的,我们会再稍候具体先容。FullCanvas不撑持Command及CommandListener,以是我们不克不及再利用本来的命令办法;我们会必要经由过程线程把持启动界面的停止工夫,以是会用到游戏本人的主线程。
全部游戏我们经由过程一个int型变量gamestate共同switch布局来把持游戏中所处的界面形态,也就是以后所显现界面,在switch布局中依据gamestate分歧的值,绘制分歧的界面,在响应的工夫改动gamestate的值,然后repaint,也就改动了接上去玩家所瞥见的界面,也一样用这个办法在keyPressed办法中把持玩家按键的响应
框架源代码以下:

packagecom.imy.yinowl.miningscroll;

importjava.io.IOException;
importjava.util.Random;
importjava.util.Vector;
importjavax.microedition.lcdui.Alert;
importjavax.microedition.lcdui.AlertType;
importjavax.microedition.lcdui.Font;
importjavax.microedition.lcdui.Graphics;importjavax.microedition.lcdui.Image;importcom.nokia.mid.ui.FullCanvas;
publicclassMiningCanvasextendsFullCanvasimplementsRunnable{
MiningMIDletminingMIDlet;
intgamestate;
staticfinalintGAMESTATE_SPLASH=0;
staticfinalintGAMESTATE_MENU=1;
staticfinalintGAMESTATE_GAMEING=2;
staticfinalintGAMESTATE_HELP=3;
staticfinalintGAMESTATE_SETTING=4;
staticfinalintGAMESTATE_ABOUT=5;
staticfinalintGAMESTATE_GAMEMENU=6;
staticfinalintGAMESTATE_COUNT=7;
publicMiningCanvas(MiningMIDletminingMIDlet){
super();
this.miningMIDlet=miningMIDlet;
gamestate=0;//游戏加载时默许界面为启动界面
}
protectedvoidpaint(Graphicsg){
g.setColor(0x00FFFFFF);
g.fillRect(0,0,canvasW,canvasH);
switch(gamestate){
caseGAMESTATE_SPLASH:
paintSplashScreen(g);//绘制游戏启动界面
break;
caseGAMESTATE_MENU:
paintMenuScreen(g);//绘制游戏主菜单
break;
caseGAMESTATE_HELP:
paintHelpScreen(g);//绘制匡助界面
break;
caseGAMESTATE_GAMEING:
paintGameScreen(g);//绘制游戏界面
break;
caseGAMESTATE_GAMEMENU:
paintGameMenuScreen(g);//绘制游戏时菜单界面
break;
default:
paintMenuScreen(g);//绘制游戏主菜单
break;
}
publicvoidrun(){
}
protectedsynchronizedvoidkeyPressed(intkeyCode){
intaction=getGameAction(keyCode);
switch(gamestate){
}
}
}


接上去就入手下手计划绘制游戏的每个界面了

启动画面
一样平常启动画面是一个静态的或静态的图片(静态占多数),显现了游戏的LOGO和游戏的刊行或制造商的称号,停止工夫为三秒,并且不克不及经由过程按键跳过,假如游戏必要举行一些费时的初始化,能够在这三秒中同时举行。这停止的三秒经由过程把持本线程来完成。图片:源代码以下:

在MiningCanvas.java中增加以下代码

Threadthread;
ImagesplashImage;
intsplashDelayTime;
publicMiningCanvas(MiningMIDletminingMIDlet){
...
splashDelayTime=3000;
try{
splashImage=Image.createImage("/occo.png");
}catch(IOExceptione){}
thread=newThread(this);
thread.start();
}
privatevoidpaintSplashScreen(Graphicsg){
g.setColor(0x00000000);
g.drawImage(splashImage,getWidth()/2,getHeight()/2-5,Graphics.HCENTER|Graphics.VCENTER);
}
publicvoidrun(){
try{
Thread.sleep(splashDelayTime);
}catch(InterruptedExceptione){}
gamestate=GAMESTATE_MENU;//在启动动画停止3秒后,改动游戏形态变量值,跳转到主菜单形态
repaint();
}


游戏主菜单界面
主菜单经由过程分歧巨细的两种字体来显现选中和未选中的菜单项,用一个int型变量暗示以后选中的菜单项,用一个String型的一维数组贮存菜单项的内容,在keyPresseed办法中依据菜单选项变量menuIdx来响应的改动游戏的形态,从而使游戏跳转到响应的形态。需增加的源代码以下:

在MiningCanvas.java中增加以下代码
staticfinalFontlowFont=Font.getFont(Font.FACE_MONOSPACE,Font.STYLE_PLAIN,Font.SIZE_SMALL);
staticfinalFonthighFont=Font.getFont(Font.FACE_MONOSPACE,Font.STYLE_BOLD,Font.SIZE_MEDIUM);
//两种字体,分离是未选中和选中形态的字体
staticfinalintlowColor=0x000000FF;//未选中形态的色彩staticfinalinthighColor=0x00FF0000;//选中形态的色彩staticfinalinthighBGColor=0x00CCCCCC;//选中形态的背景色彩
staticfinalintMAIN_NEW_GAME=0;staticfinalintMAIN_SETTINGS=1;staticfinalintMAIN_HELP=2;staticfinalintMAIN_ABOUT=3;staticfinalintMAIN_EXIT=4;staticfinalintMAIN_MENU_ITEM_COUNT=5;staticString[]mainMenu=newString[MAIN_MENU_ITEM_COUNT];
staticintcanvasW;//屏幕宽staticintcanvasH;//屏幕高staticintstartHeight;//菜单列表的肇端高度staticintspacing;//菜单项间宽度staticintmenuIdx;//以后选中的菜单项
publicMiningCanvas(MiningMIDletminingMIDlet){
...
menuIdx=0;
canvasW=getWidth();canvasH=getHeight();
spacing=highFont.getHeight()/2;
startHeight=(canvasH-(lowFont.getHeight()*mainMenu.length)-(mainMenu.length-1)*spacing)/2;
mainMenu[0]="NewGame";
mainMenu[1]="Settings";
mainMenu[2]="Help";
mainMenu[3]="About";
mainMenu[4]="Exit";
}
privatevoidpaintMenuScreen(Graphicsg){
for(inti=0;i<mainMenu.length;i++){
if(i==menuIdx){
g.setColor(highBGColor);
g.fillRect(0,startHeight+i*(lowFont.getHeight()+spacing)-(highFont.getHeight()
-lowFont.getHeight())/2,canvasW,highFont.getHeight());
g.setFont(highFont);
g.setColor(highColor);
g.drawString(mainMenu[i],(canvasW-highFont.stringWidth(mainMenu[i]))/2,
startHeight+i*(lowFont.getHeight()+spacing)-(highFont.getHeight()-lowFont.getHeight())/2,
Graphics.TOP|Graphics.LEFT);
}else{
g.setFont(lowFont);
g.setColor(lowColor);
g.drawString(mainMenu[i],(canvasW-lowFont.stringWidth(mainMenu[i]))/2,
startHeight+i*(lowFont.getHeight()+spacing),Graphics.TOP|Graphics.LEFT);
}
}
}
在keyPressed办法中的switch布局中增加
caseGAMESTATE_MENU:
{
if(getGameAction(keyCode)==FullCanvas.UP&&menuIdx-1>=0){
menuIdx--;
}
elseif(getGameAction(keyCode)==FullCanvas.DOWN&&menuIdx+1<mainMenu.length){
menuIdx++;
}
elseif(getGameAction(keyCode)==FullCanvas.FIRE){
switch(menuIdx){//选中后,依照选项值改动游戏形态值,跳转到响应的形态
caseMAIN_NEW_GAME:
gamestate=GAMESTATE_GAMEING;
break;
caseMAIN_SETTINGS:
gamestate=GAMESTATE_SETTING;
break;
caseMAIN_HELP:
gamestate=GAMESTATE_HELP;
break;
caseMAIN_ABOUT:
gamestate=GAMESTATE_ABOUT;
break;
caseMAIN_EXIT:
miningMIDlet.destroyApp(false);
break;
}
}
break;
}
}





微软什么都提供了。你可以试想一下,如果你是新手,你是希望你点一下按钮程序就能运行那,还是想自己一点一点的组织结构,然后打包发部,调错再打包......
小魔女 该用户已被删除
沙发
发表于 2015-1-21 10:41:04 | 只看该作者
一直感觉JAVA很大,很杂,找不到学习方向,前两天在网上找到了这篇文章,感觉不错,给没有方向的我指了一个方向,先不管对不对,做下来再说。
谁可相欹 该用户已被删除
板凳
发表于 2015-1-21 11:48:07 | 只看该作者
Jive的资料在很多网站上都有,大家可以找来研究一下。相信你读完代码后,会有脱胎换骨的感觉。遗憾的是Jive从2.5以后就不再无条件的开放源代码,同时有licence限制。不过幸好还有中国一流的Java程序员关注它,外国人不开源了,中国人就不能开源吗?这里向大家推荐一个汉化的Jive版本—J道。Jive(J道版)是由中国Java界大名 鼎鼎的banq在Jive 2.1版本基础上改编而成, 全中文,增加了一些实用功能,如贴图,用户头像和用户资料查询等,而且有一个开发团队在不断升级。你可以访问banq的网站
不帅 该用户已被删除
地板
发表于 2015-1-29 06:45:32 | 只看该作者
如果你学过HTML,那么事情要好办的多,如果没有,那你快去补一补HTML基础吧。其实JSP中的Java语法也不多,它更象一个脚本语言,有点象ASP。
乐观 该用户已被删除
5#
发表于 2015-2-5 21:44:40 | 只看该作者
你一定会高兴地说,哈哈,原来成为Java高手就这么简单啊!记得Tomjava也曾碰到过一个项目经理,号称Java很简单,只要三个月就可以学会。
灵魂腐蚀 该用户已被删除
6#
发表于 2015-2-7 09:09:43 | 只看该作者
一直感觉JAVA很大,很杂,找不到学习方向,前两天在网上找到了这篇文章,感觉不错,给没有方向的我指了一个方向,先不管对不对,做下来再说。
飘灵儿 该用户已被删除
7#
发表于 2015-2-21 09:12:00 | 只看该作者
有时间再研究一下MVC结构(把Model-View-Control分离开的设计思想)
只想知道 该用户已被删除
8#
发表于 2015-2-28 15:58:48 | 只看该作者
另外编写和运行Java程序需要JDK(包括JRE),在sun的官方网站上有下载,thinking in java第三版用的JDK版本是1.4,现在流行的版本1.5(sun称作J2SE 5.0,汗),不过听说Bruce的TIJ第四版国外已经出来了,是专门为J2SE 5.0而写的。
金色的骷髅 该用户已被删除
9#
发表于 2015-3-6 22:35:53 | 只看该作者
是一种由美国SUN计算机公司(Sun Microsystems, Inc.)所研究而成的语言
愤怒的大鸟 该用户已被删除
10#
发表于 2015-3-7 21:50:43 | 只看该作者
其实说这种话的人就如当年小日本号称“三个月拿下中国”一样大言不惭。不是Tomjava泼你冷水,你现在只是学到了Java的骨架,却还没有学到Java的精髓。接下来你得研究设计模式了。
活着的死人 该用户已被删除
11#
 楼主| 发表于 2015-3-10 17:13:38 | 只看该作者
《JAVA语言程序设计》或《JAVA从入门到精通》这两本书开始学,等你编程有感觉的时候也可以回看一下。《JAVA读书笔记》这本书,因为讲的代码很多,也很容易看懂,涉及到面也到位。是你学习技术巩固的好书,学完后就看看《JAVA编程思想》这本书,找找一个自己写的代码跟书上的代码有什么不一样。
小妖女 该用户已被删除
12#
发表于 2015-3-11 03:12:05 | 只看该作者
你就该学一学Servlet了。Servlet就是服务器端小程序,他负责生成发送给客户端的HTML文件。JSP在执行时,也是先转换成Servlet再运行的。虽说JSP理论上可以完全取代Servlet,这也是SUN推出JSP的本意,可是Servlet用来控制流程跳转还是挺方便的,也令程序更清晰。接下来你应该学习一下Javabean了,可能你早就看不管JSP在HTML中嵌Java代码的混乱方式了,这种方式跟ASP又有什么区别呢?
admin 该用户已被删除
13#
发表于 2015-3-15 22:19:26 | 只看该作者
另外编写和运行Java程序需要JDK(包括JRE),在sun的官方网站上有下载,thinking in java第三版用的JDK版本是1.4,现在流行的版本1.5(sun称作J2SE 5.0,汗),不过听说Bruce的TIJ第四版国外已经出来了,是专门为J2SE 5.0而写的。
第二个灵魂 该用户已被删除
14#
发表于 2015-3-22 16:55:32 | 只看该作者
你一定会高兴地说,哈哈,原来成为Java高手就这么简单啊!记得Tomjava也曾碰到过一个项目经理,号称Java很简单,只要三个月就可以学会。
柔情似水 该用户已被删除
15#
发表于 2015-4-16 23:57:02 | 只看该作者
任职于太阳微系统的詹姆斯·高斯林等人于1990年代初开发Java语言的雏形,最初被命名为Oak,目标设置在家用电器等小型系统的程序语言
若天明 该用户已被删除
16#
发表于 2015-4-20 19:42:44 | 只看该作者
一直感觉JAVA很大,很杂,找不到学习方向,前两天在网上找到了这篇文章,感觉不错,给没有方向的我指了一个方向,先不管对不对,做下来再说。
山那边是海 该用户已被删除
17#
发表于 2015-4-29 17:27:31 | 只看该作者
一般学编程语言都是从C语开始学的,我也不例外,但还是可能不学过程语言而直接学面向对象语言的,你是刚接触语言,还是从C开始学比较好,基础会很深点,如果你直接学习JAVA也能上手,一般大家在学语言的时候都记一些语言的关键词,常有的包和接口等。再去做逻辑代码的编写,以后的学习过程都是从逻辑代码编写中提升的,所以这方面都是经验积累的。你要开始学习就从
老尸 该用户已被删除
18#
发表于 2015-5-1 14:10:48 | 只看该作者
我大二,Java也只学了一年,觉得还是看thinking in java好,有能力的话看英文原版(中文版翻的不怎么好),还能提高英文文档阅读能力。
变相怪杰 该用户已被删除
19#
发表于 2015-5-4 15:26:49 | 只看该作者
学Java必读的两个开源程序就是Jive和Pet Store.。 Jive是国外一个非常著名的BBS程序,完全开放源码。论坛的设计采用了很多先进的技术,如Cache、用户认证、Filter、XML等,而且论坛完全屏蔽了对数据库的访问,可以很轻易的在不同数据库中移植。论坛还有方便的安装和管理程序,这是我们平时编程时容易忽略的一部份(中国程序员一般只注重编程的技术含量,却完全不考虑用户的感受,这就是我们与国外软件的差距所在)。
兰色精灵 该用户已被删除
20#
发表于 2015-5-6 00:11:33 | 只看该作者
Java 不同于一般的编译执行计算机语言和解释执行计算机语言。它首先将源代码编译成二进制字节码(bytecode),然后依赖各种不同平台上的虚拟机来解释执行字节码。从而实现了“一次编译、到处执行”的跨平台特性。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-12-23 02:22

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表