*设为首页
*加入收藏
热门关键字: JAVA
>>当前位置:Java大本营>J2ME>文章内容
j2me手机游戏开发:俄罗斯方块(增加成绩记录)
作者: 发布时间:2007-12-16 23:06:00

本例为J2SE游戏开发的经典游戏--俄罗斯方块,手机移植版本176*220屏幕手机可用!
记录函数在主midlet类!
工程文件已经打包上传,本人全部游戏代码下载地址
http://download.csdn.net/hicsdn/kome2000
方向键 上下左右ASDW2468都可以游戏,0更换方块,1显示隐藏网格!game over 时5键重新开始,*键退出游戏

游戏图片: 

cGame176x220.java 主要绘图 类

package code;

//import java.awt.*;
//import java.awt.Canvas;
//import java.awt.event.*;
//import javax.swing.*;
import java.util.Random;
import javax.microedition.lcdui.*;            //写界面所需要的包
/**
 * 俄罗斯方块
 * 高雷
 * 2007年11月30日
 
*/

public class cGame176x220 extends Canvas implements Runnable 
{
    
private Random rand;
    
private Thread thread;
    
private Graphics    gb;
    
private Image        buffer;
    
private Image         gameOverImg;                    //游戏结束
    private static final int s_width      = 176;
    
private static final int s_height     = 220;
    
private static final int s_box_w      = 12;
    
private static final int s_box_h      = 12;
    
private static final int s_box_w_sum     = 10;        //操作区域宽 格子数
    private static final int s_box_h_sum     = 18;        //操作区域高 格子数
    private static final int offx     = 0;                //
    private static final int offy     = -(s_height-s_box_h_sum*s_box_h);//控制区偏移
    private static final int s_line_between_x = s_box_w * s_box_w_sum;//分割线x位置

    
public static final int  UP     = -1;
    
public static final int  DOWN     = -2;
    
public static final int  LEFT     = -3;
    
public static final int  RIGHT     = -4;
    
    
public static final int  init_x         = 3;        //当前方块初始化坐标X
    public static final int  init_y         = 0;        //当前方块初始化坐标y
    
    
public static int     s_box_x                = init_x;    //当前方块坐标X
    public static int     s_box_y                = init_y;    //当前方块坐标Y
    private static int    level                = 1;        //等级
    private static int    success                = 0;        //得分
    private static long goDownDelayTime[]    = //1800;    //下降延迟时间
    {
        
1000,    900,    800,    700,
        
600,    500,    400,
        
300,    200,    100
    }
;
    
private static int    level_up            = (int)(goDownDelayTime[0]-goDownDelayTime[level]);        //升级成绩
    private static boolean isShowReseau        = true;        //是否现实网格
    private static short s_next_box            = 0;        //下一个方块编号
    private static short boxColor;                        //当前box的颜色
//    private static final Color gameBG        = new Color( 0x333333 );    //游戏区域背景颜色
    private static final int gameBG            = 0x333333;    //游戏区域背景颜色
//    private static final Color gameColor[]    = new Color[]
    private static final int gameColor[]    = new int[]
    
{
        
0x444444,    //new Color( 0x444444 ),    //网格颜色
        0xEEEEEE,    //new Color( 0xEEEEEE ),    //方块颜色
        0xEE0000,    //new Color( 0xEE0000 ),
        0x00EE00,    //new Color( 0x00EE00 ),
        0x0000EE,    //new Color( 0x0000EE ),
        0xEE00EE,    //new Color( 0xEE00EE ),
        0xEEEE00,    //new Color( 0xEEEE00 ),
        0x00EEEE     //new Color( 0x00EEEE )
    }
;
    
private static final short box_sum[][] = new short[][]    //所有方块图形
    {
        
0x06600x06600x06600x0660 },
        
0x22220x00F00x22220x00F0 },
        
0x02640x06300x02640x0630 },
        
0x04620x03600x04620x0360 },
        
0x02E00x44600x07400x0622 },
        
0x0E200x22600x04700x0644 },
        
0x04640x00E40x04C40x04E0 }
    }
;

    
private static short next_box[] = new short[]0x06600x06600x06600x0660 }
    
private static short box[]          = new short[]0x06600x06600x06600x0660 };
    
private static short map[][];        //地图
    private static short box_state  = 0;//当前BOX的状态//旋转方向
    private static short matrix[][] =    //定义矩阵用来计算出box_sum的方块
    {
        
0x10000x01000x00100x0001 },
        
0x20000x02000x00200x0002 },
        
0x40000x04000x00400x0004 },
        
{ (short)0x80000x08000x00800x0008 }
    }
;

    
public cGame176x220()
    
{
        setFullScreenMode(
true);        //设置游戏为全屏幕模式,该函数只能在支持midp2.0的手机上使用
//        s_width = getWidth();            //得到屏幕尺寸     宽
//        s_height= getHeight();            //得到屏幕尺寸     高
        rand = new Random( System.currentTimeMillis() );
        
try
        
{
            
//gameOverImg = Toolkit.getDefaultToolkit().getImage("src/pics/laser.png");
            gameOverImg = Image.createImage("/pics/laser.png");
        }
catch(Exception e){}
        
//setSize( s_width, s_height );    //设置画布
        initGame();                        //游戏初始化
        thread  = new Thread(this);
        thread.start();
    }

    
    
private void initGame()
    
{
        level        
= 1;                //等级
        success        = 0;                //得分
        map     = new short[s_box_h_sum][s_box_w_sum];
        setNextBox();                    
//设置下一个BOX
        setBox();                        //将下一个BOX设置成当前BOX
        setGameOver( false );            //恢复游戏
    }

    
    
private void setBox()                //将next_box设置成当前可控制box
    {
        box_state         
= 0;                                        //box 状态
        s_box_x            = init_x;                                    //当前方块坐标X
        s_box_y            = init_y;                                    //当前方块坐标Y
        boxColor        = s_next_box;                                //设置当前BOX颜色
        System.arraycopy( next_box, 0, box, 0, next_box.length );    //box = next_box
        goDownPreTime     = System.currentTimeMillis();                //设置好当前BOX后 计时
        setNextBox();                                                //设置下一个BOX
        if!isCanMove() )
        
{
            setGameOver( 
true );
        }

    }


    
public static boolean isGameOver = false;
    
public static long updatas     = 0;
    
public static long fps         = 0;
    
private long     startTime, beginTime, endTime;
    
private long     delay         = 25;
    
private long     upTime         = 25;
    
public void run() 
    
{
        
while ( true ) 
        
{
            
try
            
{
                beginTime 
= System.currentTimeMillis();
                updatas
++;
                updata( updatas );
                repaint();
                endTime 
= System.currentTimeMillis();
                upTime  
= endTime-beginTime;
                
if( upTime<delay )
                
{
                    fps 
= 1000/delay;
                    thread.sleep(delay
-upTime);
                }

                
else
                    fps 
= 1000/upTime;
            }
catch(Exception e){ }
        }

    }

    
void setGameOver( boolean _isGameOver )
    
{
        isGameOver 
= _isGameOver;
        
if( isGameOver )
        
{
            setRecord( successSort() );
        }

    }

    
public void updata( long updatas )
    
{

    }

    
public void update(Graphics g) 
    
{
        paint(g);
    }

    
public void paint(Graphics g)
    
{
        
try
        
{
            
if( buffer == null )
            
{
                buffer 
= Image.createImage( s_width, s_height );    //设置画布缓冲区
                gb = buffer.getGraphics();                    //得到绘图设备
            }

//            gb.translate( offx, offy );
//            gb.setColor( new Color( 0x0 ) );                //初始化 画布颜色
            gb.setColor( 0x0 );                                //初始化 画布颜色
            gb.setClip ( 00, s_width, s_height);            //初始化 画布区域
            gb.fillRect( 00, s_width, s_height);            //初始化 画布填充
            paintReseau( gb );                                //绘制网格
            paintNextBox( gb );                                //绘制下一BOX
            paintMap( gb );                                    //绘制地图上不可以动BOX
            paintBox( gb, s_box_x, s_box_y );                //绘制当前可控制BOX
//            gb.setColor( new Color( 0xFF3333 ) );            //分割线颜色
            gb.setColor( 0xFF3333 );                        //分割线颜色
            gb.drawLine( s_line_between_x, 0, s_line_between_x, s_height );    //分割线
//            gb.drawString( "FPS:"+fps,             s_line_between_x+10,10 );    //祯数
//            gb.drawString( "等级:"+level,         s_line_between_x+10,30 );    //等级
//            gb.drawString( "得分:"+success,         s_line_between_x+10,50 );    //分数
            gb.drawString( "FPS:"+fps,             s_line_between_x+1010, g.TOP|g.LEFT );//祯数
            gb.drawString( "级:"+level,         s_line_between_x+1030, g.TOP|g.LEFT );//等级
            gb.drawString( "分:"+success,         s_line_between_x+1050, g.TOP|g.LEFT );//分数
            if( isGameOver )
            
{
//                gb.drawImage( gameOverImg, (getWidth()-offx-gameOverImg.getWidth(null))/2, (getHeight()-gameOverImg.getHeight(null))/2 , null );
//                gb.drawImage( gameOverImg,    s_width>>1, s_height>>1, g.HCENTER|g.VCENTER );
                paintRecord( gb );
            }

//            gb.translate( -offx, -offy );
        }

        
catch(Exception e)
        

            System.out.println(
"err at paint.e====="+e);
        }

//