仓酷云

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

[学习教程] JAVA网站制作之J2ME伪妙手前锋开讲―扫雷游戏的计划

[复制链接]
再见西城 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-18 11:35:43 | 显示全部楼层 回帖奖励 |倒序浏览 |阅读模式

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

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

x
还是要自己一点一点写代码,然后编译,改错再编译好那。还有最重要的是.net的编译环境非常好,你甚是不需要了解太多工具,对于简单的系统,你可以之了解一些语法就哦了。计划J2ME伪妙手前锋开讲――扫雷游戏的计划


起首我要装得像妙手一样,来伪装把体系略微剖析一下。

一样平常,依照java得开辟形式,这类程序通常为分为三个模块来开辟。

以下三个:

一个程序运作的主文件,也就是一个midlet的承继;

一个界面的暗示类,也就是一个canvas的承继,界面上应当有些菜单,如new、exit甚么的,那就应当要implements一个commandListener动静监听类(人人能够把java的动静监听了解为一个线程,一向像倭寇那样对看得扎眼的工具虎视耽耽,固然这里指的是他所能触及到的动静,当收到动静的时分,会挪用一个笼统函数publicvoidcommandAction(Commandc,Displayabled),而这个笼统函数使得我们能够经由过程对他的完成来处置收到的动静,即动静呼应)

最初一个固然就是与界面有关的逻辑单位了,在这里我们界说全部游戏的逻辑,做到逻辑与界面分隔。这是我学java的最年夜劳绩,呵呵。

起首正式入手下手第一讲<扫雷游戏的逻辑>

我的假想是,扫雷的舆图通常为一个矩形,由于,圆形屏幕的手机看起来蛮反常的,没有需要姑息他,以是,我用一个a*b的二维数组就完整能够暗示全部舆图。

有了舆图今后舆图内里的类容天然就有一部分是暗示地雷啦,既然如许,那不如就如许<空话来的,小伴侣不要学>

/**

*20标记该地位为地雷

*<=10的数字暗示未打开的方块及四周的地雷数量

*>=10的数字暗示已打开的方块及四周的地雷数量

**/

暗示办法就出来了,逻辑也开阔爽朗起来了。

我要将某个块打开,只需将他加上10就能够了。

Java编程第一步,固然是先要class啊

packagegames;

importjava.util.Random;

importjava.lang.Math;

classgamelogic{

/**暗示一个10*10的棋盘*/

privateint[][]pan=newint;

privateRandomrandom;//一个随机变量,次要感化是用来指定哪些地位为地雷

privateintBombNum=0;//统计地雷总数

/**游戏是不是停止*/

privatebooleanGameOver;
接上去就是要初始化舆图了,舆图起首要扔一个雷在下面啊,否则怎样叫扫雷呢,扔完了地雷今后接上去固然是遍历一次舆图(我们仍是很善良地,我们得告知扫雷的同道,某某地位,有几雷,好比如许:"01、01、12点中偏向有地雷,14点钟偏向有幺鸡,2点钟偏向有春风之类的啊")。

/**初始化数组,天生舆图*/

publicvoidInitArray(){
for(inti=0;i<8;i++){
for(intj=0;j<8;j++){
pan[i][j]=0;
}
}

RandomArray();
CountBomb();
BombNum=Bomb();
}


/**统计地雷总数
*@returnint前往地雷总数*/

privateintBomb(){
intcount=0;
for(inti=0;i<8;i++){
for(intj=0;j<8;j++){
if(pan[i][j]==20){
count+=1;
}
}
}

returncount;
}


/**随机决意地雷的地位*/

privatevoidRandomArray(){
inti,j,k;

//先扔15个摆布的地雷吧,注重,这里纷歧定有15个哦,由于随机值大概反复,我不论啦
for(intr=0;r<15;r++){
k=java.lang.Math.abs(random.nextInt())%64;//random.nextInt(100);
i=k/8;
j=k%8;
this.pan[i][j]=20;//指定该地位为地雷
}
}


/**统计棋盘上的数据*/

privatevoidCountBomb(){
for(inti=0;i<8;i++){
for(intj=0;j<8;j++){
intcount=0;

//当必要检测的单位格自己无地雷的情形下,统计四周的地雷个数
if(pan[i][j]!=20){
if((i-1>=0)&&(j-1>=0)){
if(pan[i-1][j-1]==20){
count+=1;//检测左上方空格是不是是地雷
}
}

if((i-1>=0)){
if(pan[i-1][j]==20){
count+=1;//检测上方空格是不是为地雷
}
}

if((i-1>=0)&&(j+1<=7)){
if(pan[i-1][j+1]==20){
count+=1;//检测右上方是不是为地雷
}
}

if((j-1>=0)){
if(pan[i][j-1]==20){
count+=1;//检测右边是不是为地雷
}
}

if((i>=0)&&(j+1<=7)){
if(pan[i][j+1]==20){
count+=1;//右侧
}
}

if((j-1>=0)&&(i+1<=7)){
if(pan[i+1][j-1]==20){
count+=1;//左下
}
}

if((i+1<=7)){
if(pan[i+1][j]==20){
count+=1;//下
}
}

if((j+1<=7)&&(i+1<=7)){
if(pan[i+1][j+1]==20){
count+=1;//右下
}
}

pan[i][j]=count;
}
}
}
}
/**检测已被揭开的地位总和

*@return前往被揭开的数目*/

privateintcountOpen(){
intcount=0;
for(inti=0;i<8;i++){
for(intj=0;j<8;j++){
if(pan[i][j]<20&&pan[i][j]>9){
count+=1;
}
}
}

returncount;
}



/**检测是不是成功

*@return是不是成功boolean值*/

publicbooleanisWin(){

//System.out.println(BombNum+""+countOpen());
if((BombNum+countOpen())==64){
this.GameOver=true;
returntrue;
}
else{
returnfalse;
}
}

/**选中棋盘上的地位,并打开

*@parammatrix地位*/

publicvoidopenpan(intmatrix){
switch(getBomb(matrix)){
case20://中选中的地位为地雷,游戏停止
setGameOver();
break;
case0:
isNull(matrix);//中选中的地位为空,则打开四周的舆图
break;
default:
this.isNotNull(matrix);//不然,打开以后地位,并作上打开的标志
}
}

/**中选中的地位为空,则打开四周的舆图

*@parammatrix地位*/

privatevoidisNull(intmatrix){
inti,j;
i=matrix/8;
j=matrix%8;

if(pan[i][j]<9){
pan[i][j]+=10;
}

if((i-1>=0)&&(j-1>=0)){//检测左上方空格是不是是空
if(pan[i-1][j-1]==0){
isNull((i-1)*8+(j-1));
}
if(pan[i-1][j-1]<9){
pan[i-1][j-1]+=10;
}
}


if((i-1>=0)){//检测上方空格是不是为空
if(pan[i-1][j]==0){
isNull((i-1)*8+j);
}
if(pan[i-1][j]<9){
pan[i-1][j]+=10;
}
}

if((i-1>=0)&&(j+1<=7)){//检测右上方是不是为空
if(pan[i-1][j+1]==0){
isNull((i-1)*8+(j+1));
}
if(pan[i-1][j+1]<9){
pan[i-1][j+1]+=10;
}
}

if((j-1>=0)){//检测右边是不是为空
if(pan[i][j-1]==0){
isNull(i*8+(j-1));
}
if(pan[i][j-1]<9){
pan[i][j-1]+=10;
}
}

if((i>=0)&&(j+1<=7)){//右侧
if(pan[i][j+1]==0){
isNull(i*8+(j+1));
}
if(pan[i][j+1]<9){
pan[i][j+1]+=10;
}
}

if((j-1>=0)&&(i+1<=7)){//左下
if(pan[i+1][j-1]==0){
isNull((i+1)*8+(j-1));
}
if(pan[i+1][j-1]<9){
pan[i+1][j-1]+=10;
}
}

if((i+1<=7)){//下
if(pan[i+1][j]==0){
isNull((i+1)*8+j);
}
if(pan[i+1][j]<9){
pan[i+1][j]+=10;
}
}
if((j+1<=7)&&(i+1<=7)){//右下
if(pan[i+1][j+1]==0){
isNull((i+1)*8+(j+1));
}
if(pan[i+1][j+1]<9){
pan[i+1][j+1]+=10;
}
}
}



/**选中棋盘上的地位,并打开以后地位

*@parammatrix地位*/

privatevoidisNotNull(intmatrix){
inti,j;
i=matrix/8;
j=matrix%8;
pan[i][j]+=10;
}


/**获得指定地位的数据

*@parammatrix地位

*@returnint数据*/

publicintgetBomb(intmatrix){
inti,j;
i=matrix/8;
j=matrix%8;
returnthis.pan[i][j];
}


/**检测游戏是不是停止

*@returnboolean游戏是不是停止的形态*/

publicbooleanisGameOver(){
returnGameOver;
}


/**设置游戏停止*/

privatevoidsetGameOver(){
GameOver=true;
}


/**开新局*/

publicvoidsetNewGame(){
this.GameOver=false;
}


/**指定地位是不是被揭开

*@parammatrix地位

*@returnboolean前往是不是能够被揭开*/

publicbooleanisFree(intmatrix){
inti,j;
i=matrix/8;
j=matrix%8;
returnpan[i][j]<8||pan[i][j]==20;
}

}
publicvoidopenpan(intmatrix)是全部程序的中心地点,他形貌了一切的举措,

1、有大概你踩到屎,踩到屎固然就gameover啦

2、有大概踩到钱,有一年夜片旷地给你玩

3、命好,没有炸逝世你,持续探究
程序源码:

//gamecCanvans.java

packagegames;

importjava.lang.System.*;

importjava.util.Random;

importjava.util.Vector;

importjavax.microedition.midlet.*;

importjavax.microedition.lcdui.*;

/**游戏举措类*/

classgameCanvas

extendsCanvas

implementsCommandListener{

/**黑*/
privatestaticfinalintBLACK=0x00000000;

/**白*/
privatestaticfinalintWHITE=0x00FFFFFF;

/**红*/
privatestaticfinalintRED=0x00FF0000;

/**蓝*/
privatestaticfinalintBLUE=0x000000FF;

/**没有挪动的标记*/
privatestaticfinalintNO_MOVE=-1;

/**主窗体类*/
privatefinalcontrolmidlet;

/**逻辑类*/
privatefinalgamelogicgame;

/**加入菜单*/
privatefinalCommandexitCommand;

/**从头入手下手菜单*/
privatefinalCommandnewGameCommand;

/**随机数*/
privatefinalRandomrandom=newRandom();
/**屏幕宽度*/
privateintscreenWidth;

/**屏幕高度*/
privateintscreenHeight;


/**boardCellSize正方形单位格的巨细,
*boardTop棋盘top的地位,
*boardLeft棋盘left地位*/
privateintboardCellSize,boardTop,boardLeft;


/**preCursorPosition前一次光标选择的地位,cursorPosition以后光标选择的地位*/
privateintpreCursorPosition,cursorPosition;

/**用于存储被标志的地雷的地位*/
privateVectorBombVector=newVector();

privatebooleanisRestart;


/**机关器

*@parammidlet主窗体类*/

publicgameCanvas(controlmidlet){
this.midlet=midlet;
game=newgamelogic(random);
initializeBoard();

/**初始化菜单*/
exitCommand=newCommand("加入",Command.EXIT,1);
newGameCommand=newCommand("新游戏",Command.SCREEN,2);
addCommand(exitCommand);
addCommand(newGameCommand);
setCommandListener(this);

/**入手下手游戏*/
initialize();
}



/**增加一个地雷地位标志

*@parammatrix地位标志*/

privatevoidaddBomb(intmatrix){
BombVector.addElement(Integer.toString(matrix));
}



/**删除一个地雷地位标志

*@parammatrix地位标志*/

privatevoiddelBomb(intmatrix){
BombVector.removeElement(Integer.toString(matrix));
}


/**搜刮该地位是不是被标志

*@parammatrix地位标志

*@returnboolean该地位是不是被纪录,false为被纪录*/

privatebooleansearchBomb(intmatrix){
returnBombVector.indexOf(Integer.toString(matrix))==-1;//-1暗示没有找到该地位的信息
}


/**初始化屏幕,获得棋盘的初始地位*/

privatevoidinitializeBoard(){
screenWidth=getWidth();//获得屏幕宽度
screenHeight=getHeight();//获得屏幕高度
if(screenWidth>screenHeight){
boardCellSize=(screenHeight-1)/8;
boardLeft=(screenWidth-(boardCellSize*8))/2;
boardTop=1;
}
else{
boardCellSize=(screenWidth-1)/8;
boardLeft=1;
boardTop=(screenHeight-boardCellSize*8)/2;
}
}



/**初始化游戏和屏幕.使游戏从头启动*/

privatevoidinitialize(){
preCursorPosition=cursorPosition=0;
game.setNewGame();
game.InitArray();
isRestart=true;
BombVector.removeAllElements();
repaint();
}



/**重画canvas

*@paramg重画的Graphics对象*/

publicvoidpaint(Graphicsg){
game.isWin();

if(!game.isGameOver()){
paintGame(g);
}
else{
paintGameOver(g);
}
}

未知转贴自:everenter.com



JAVA是一种可以撰写跨平台应用软件的面向对象的程序设计语言,由升阳(SunMicrosystems)公司的詹姆斯·高斯林(JamesGosling)等人于1990年代初开发。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-6-8 22:47

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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