else if(number>1){
a=displayRecordFromRMS(1); int one=Integer.parseInt(s2); int two=Integer.parseInt(a); if(one>two){ }
else{ }
b="不是最高分 ,要加油哦!!!"; a=s2;
b="真棒!!! 你是最高分"; updateRecordToRMS(a,0,a.length()); a=s2;
}
st1=new StringItem(null,"本次游戏分数:"+s+'\n'+"最高分为: "+a+"分 st2=new StringItem(null,b,Item.PLAIN); Font Font
st1.setFont(f1); st2.setFont(f2);
} catch (RecordStoreNotOpenException e) {
System.out.println("记录存储打开异常"); }
"+'\n',Item.PLAIN);
f1=Font.getFont(Font.FACE_PROPORTIONAL,Font.STYLE_BOLD,Font.SIZE_LARGE); f2=Font.getFont(Font.FACE_SYSTEM,Font.FONT_STATIC_TEXT,Font.SIZE_LARGE);
st1.setLayout(YOUT_CENTER); frm2.append(zgfImg); frm2.append(st1); frm2.append(st2);
Tetris.s_display.setCurrent(frm2); }
3.2.5 按键的判断
图8 游戏运行图
(有网格) (无网格) (帮助)
开始游戏后,方块在游戏容器中实现向左移动、向右移动、下落及旋转变形。这些动作是通过手机导航键上、下、左、右或者数字2、4、6、8实现的,分别对应变形、下落、左移、右移。游戏中帮助键可以进入帮助界面,数字‘1’可以清楚网格,按#可以暂停游戏,按数字*可以重新开始游戏。游戏界面如图8所示,以下是实行代码:
public void keyPressed( int key )
{if (key == 35)
{ isPaused = !isPaused;
}
key = getKeyCode( key ); switch( key ) {
case UP:
//顺时针旋转 //0没有按下
isKeyDown = 0; box_state ++; box_state %= 4; if( !isCanMove() ) {
box_state --;
if (!isPaused){
}
if( box_state<0 )
box_state = 3;
break; case DOWN:
{ }
//向左移动BOX //0没有按下
s_box_y ++; if( !isCanMove() )
s_box_y --;
//向下移动
if( isKeyDown == 2 )
isKeyDown = 1; if( isKeyDown == 1 )
break; case LEFT:
s_box_x --; if( !isCanMove() )
s_box_x ++;
//向右移动BOX
isKeyDown = 0;
break; case RIGHT:
isKeyDown = 0; s_box_x ++; if( !isCanMove() )
s_box_x --;
//0没有按下
break; case -7:
Form frm=new Form("帮助");
frm.append("用导航键上、下、左、右或者数字‘2’ ‘5’ ‘4’
+"\n\n"+"数字‘1’可以清楚网格"+"\n\n"+"按“*”键可+"\n\n"+"按#可以暂停游戏");
‘8’可控制方快移动" 以重新开始游戏"
cmd=new Command(" 返回",Command.STOP,1); frm.addCommand(cmd); frm.setCommandListener(this); Tetris.s_display.setCurrent(frm);
break;
} }
}
case 42:
initGame(); break; case 48:
//新的BOX
break; case 49: break;
//是否显示网格
isShowReseau = !isShowReseau;
setBox();
repaint(); //重新绘制屏幕
3.2.6 边界检测
游戏中可视的游戏操作的区域在程序中定义好了,
private static final int s_width = 240; private static final int s_height
= 288;
如果不处理的话方块会移动到可视范围外,对此我做了个边界检测处理方法,当方块移动到游戏操作区域边界时再移动就会失去效果,是方块不管怎么移动多是在可视界面中,而且当新方块与已在游戏界面中的方块接触时要停下来,不能越过去,
具体实行代码如下:
private boolean isCanMove() {
for( int i=0; i<4; i++ ) //行 { for( int j=0; j<4; j++ ) //列 { if( ( box[box_state] & matrix[i][j] ) == matrix[i][j] ) //是格子 { if( s_box_x+j < 0 ) //左边界检测 { System.out.println( "left s_box_x="+s_box_x+" matrix["+i+"]["+j+"]="+matrix[i][j]);
return false; } if( s_box_x+j > s_box_w_sum-1 ) //右边界检测 { System.out.println( "right s_box_x="+s_box_x+" matrix["+i+"]["+j+"]="+matrix[i][j]);
return false; }
if( s_box_y+i > s_box_h_sum-1 ) //下边界检测 { System.out.println( "down s_box_y="+s_box_y+" matrix["+i+"]["+j+"]="+matrix[i][j]);
return false; } //地图格子检测 if( map[s_box_y+i][s_box_x+j] > 0 ) return false; } } }
return true; } 3.2.7 得分与升级
在游戏中移动方块,当方块可以填满一行时改行就会消去,同时分数会增加,增加的分数值为行数的平方。当分数达到一定的有求后就可以升级,升级后游戏难度会增加,也就是游戏方块下落速度会加快,实际上就是方块下落的延迟时间减短了。
得分升级代码: private void setMap() {
for( int i=0; i<4; i++ ) { }
//检测是否可以消去一行 int line_success = 0;
for( int i=0; i<s_box_h_sum; i++ ) {
if( isFullLine( i ) ) {
setNullLine( i ); line_success++;
//行 //列
for( int j=0; j<4; j++ ) { }
if( ( box[box_state] & matrix[i][j] ) == matrix[i][j] ) //是格子 { }
map[s_box_y+i][s_box_x+j] = boxColor;
//行
//这行可以消去 //设置第i行为空