天天看點

JAVA遊戲程式設計之二----j2me MIDlet 手機遊戲入門開發--貪吃蛇_1

作者:雷神

QQ:38929568

QQ群:28048051JAVA遊戲程式設計(滿) 28047782(将滿)

修改貪吃蛇一些BUG,主要在cGame.java Gif.java這連個類其他的可以參考上一片 

JAVA遊戲程式設計之二----j2me MIDlet 手機遊戲入門開發--貪吃蛇

本文給出的是程式代碼,需要圖檔才能編譯程式,

Gif.java 這個類是繪制動畫的類,也是蛇的食物類

cGame.java

////////////////////////////////////////////////////////////////////////////////  

//  

// cGame.java  

// Project: Minesweeper  

// Author(s): Gao Lei  

// Create: 2007-10-12  

package code;  

import java.util.Random;  

import javax.microedition.lcdui.*;  

class cGame extends Canvas implements Runnable  

...{  

    private static final int STATEPLAY        = 0;  

    private static final int STATELOST        = 1;  

    private static final int STATEWIN        = 2;  

    private static final int KEY_UP         = 1;  

    private static final int KEY_DOWN         = 2;  

    private static final int KEY_LEFT         = 3;  

    private static final int KEY_RIGHT     = 4;  

    private static final int KEY_FIRE         = 5;  

    public static int     s_width     = 0;  

    public static int     s_height    = 0;  

    public static long    updates        = 0;  

    public static Random rand;              

    private int maxRand = 1000;  

    private int map_x     = 10;  

    private int map_y     = 10;  

    private int map_w     = 16;  

    private int map_h     = 16;  

    private int key_x     = map_x / 2;  

    private int key_y     = map_y / 2;  

    private int snake_w    = 8;  

    private int snake_h    = 8;  

    private int pos_x     = map_x / 2;  

    private int pos_y     = map_y / 2;  

    private int aspect_x= 0;  

    private int aspect_y= 1;  

    private int    snake_max    = 50;  

    private int    snake_min    = 5;  

    private int    snake_n        = snake_min;  

    private int    gameState     = STATEPLAY;  

    private int level        = 1;  

    private long sleepTime    =300;  

    private int[]    snake_x        = new int[ snake_max ];  

    private int[]    snake_y        = new int[ snake_max ];  

    private int[][] map;  

    private boolean isShowInfo    = false;  

    private Font     font         = Font.getFont( Font.FACE_SYSTEM, Font.STYLE_BOLD, Font.SIZE_LARGE );  

    private Thread    thread;                          

    private Image[] imgGameBg    = new Image[4];  

    private Image[] imgItem        = new Image[3];  

    private Gif[]    gold        = new Gif[5];  

    private Gif[]    dung        = new Gif[2];  

    private Gif        fungus;  

    cGame()  

    ...{  

        setFullScreenMode(true);  

        s_width = getWidth();      

        s_height= getHeight();      

        rand    = new Random( System.currentTimeMillis() );  

        try 

        ...{  

            for( int i=0; i<gold.length; i++ )  

            ...{  

                gold[i]= new Gif("gold", 5, 19, 15 );  

            }  

            for( int i=0; i<dung.length; i++ )  

                dung[i]= new Gif("dung", 6, 21, 30 );  

                dung[i].life = -2;    // --life  

            fungus = new Gif("fungus", 12, 25, 23 );  

            fungus.setFormTime  

            (   

                new int[] ...{ 2000,  150,  150,  150,  

                             150,  200,  100,  100,  

                             200,  150,  200,  200 

                }   

            );  

            fungus.life = 5;        // --life +5  

            fungus.isShow = false;  

            for( int i=0; i<imgItem.length; i++ )  

                imgItem[i]=Image.createImage("/pics/item_16_"+i+".png");  

            Image temp     = Image.createImage("/pics/bg_tile_0.png");  

            Graphics gn;                                              

            for( int i=0; i<imgGameBg.length; i++ )      

                imgGameBg[i] = Image.createImage(16, 16);  

                gn = imgGameBg[i].getGraphics();  

                gn.drawImage(temp, -i*16, 0, gn.LEFT|gn.TOP);  

            gn     = null;  

            temp = null;      

            System.gc();  

        }catch(Exception e)...{ e.printStackTrace(); }  

        rePlay( level );  

        thread  = new Thread(this);  

        thread.start();      

    }  

    public void run()  

        while( true )  

            try 

                updates++;              

                repaint();  

                serviceRepaints();  

                thread.sleep(sleepTime);  

            }catch(Exception e)  

                e.printStackTrace();  

        }  

    public void paint(Graphics g)  

        g.setClip(0, 0, s_width, s_height);  

        g.setColor(0x000000);                  

        g.fillRect(0, 0, s_width, s_height);  

        for( int i=0; i<map_x; i++ )              

            for( int j=0; j<map_y; j++ )  

                g.drawImage(imgGameBg[ map[i][j] ], j*map_h, i*map_w, g.LEFT|g.TOP);  

            }      

        for( int i=0; i<gold.length; i++ )  

            gold[i].paint(g);  

        for( int i=0; i<dung.length; i++ )  

            dung[i].paint(g);  

        if( snake_n>20 )  

            fungus.isShow = true;  

            fungus.paint( g );  

        paintSnake( g );  

        if( isShowInfo || gameState != STATEPLAY )      

            g.setColor(0xFFFFFF);                  

            for( int i=0; i<=map_y; i++ )    // |||      

                g.drawLine(i*map_w, 0, i*map_w, map_h*map_x);  

            for( int i=0; i<=map_x; i++ )     // ===      

                g.drawLine(0, i*map_h, map_y*map_w, i*map_h);  

            g.setFont( font );  

        g.setColor( 0xff0000 );  

        g.setFont( font );  

        g.drawString( "life:"+snake_n, 2,  2, 0 );  

        g.drawString( "level:"+level,  2, 18, 0 );  

    void paintSnake( Graphics g )  

        g.setColor(0x0000FF);              

        for( int i=snake_n; i>0; i-- )  

            snake_x[i] = snake_x[i-1];   

            snake_y[i] = snake_y[i-1];  

            g.fillRect(snake_x[i]-snake_w/2, snake_y[i]-snake_h/2, snake_w, snake_h);  

        snake_x[0] += aspect_x*8;  

        snake_y[0] += aspect_y*8;  

        g.setColor(0x6666FF);      

        g.fillRect(snake_x[0]-snake_w/2, snake_y[0]-snake_h/2, snake_w, snake_h);  

        if( snake_x[0]<0 || snake_x[0]>s_width || snake_y[0]<0 ||snake_y[0]>s_height )  

            rePlay(level);  

        for( int i=snake_min; i<snake_n; i++ )  

            if( isIntersect(snake_x[0], snake_y[0],    snake_w, snake_h,   

                            snake_x[i], snake_y[i],    snake_w, snake_h )   

                )  

                rePlay(level);  

            if( isIntersect(snake_x[0],        snake_y[0],        snake_w,    snake_h,   

                            gold[i].pos_x,    gold[i].pos_y,    gold[i].w,     gold[i].h )   

              )  

                addSnake( gold[i].life );  

                gold[i].setPos();  

                            dung[i].pos_x,    dung[i].pos_y,    dung[i].w,     dung[i].h )   

                addSnake( dung[i].life );  

                dung[i].setPos();  

        if( fungus.isShow && isIntersect(snake_x[0],        snake_y[0],        snake_w,    snake_h,   

                fungus.pos_x,    fungus.pos_y,    fungus.w,     fungus.h )   

          )  

            addSnake( fungus.life );  

            fungus.setPos();  

    boolean isIntersect(int x1,int y1, int w1, int h1, int x2, int y2, int w2, int h2)  

        if( Math.abs(x2-x1) < (w1+w2)/2 && Math.abs(y2-y1) < (h1+h2)/2 )  

            return true;  

        else 

            return false;  

    public void keyPressed(int key)  

        key = Math.abs(key);  

        System.out.println("key="+key);  

        switch( key )  

            case KEY_NUM2:  

            case KEY_UP:  

                if( gameState != STATEPLAY )      

                    break;  

                else 

                ...{  

                    if( aspect_y <= 0 )  

                    ...{  

                        aspect_x =  0;  

                        aspect_y = -1;  

                    }  

                }  

            break;  

            case KEY_NUM8:  

            case KEY_DOWN:  

                if( gameState != STATEPLAY )  

                    if( aspect_y >= 0 )  

                        aspect_y = +1;  

            case KEY_NUM4:  

            case KEY_LEFT:  

                    if( aspect_x <= 0 )  

                        aspect_y =  0;  

                        aspect_x = -1;  

            case KEY_NUM6:  

            case KEY_RIGHT:  

                    if( aspect_x >= 0 )  

                        aspect_x = +1;  

            case KEY_FIRE:  

            case KEY_NUM5:  

                if( gameState == STATEPLAY )  

//                    addSnake();  

//                    System.out.println("snake_n="+snake_n);  

            case KEY_NUM1:          

            case KEY_NUM3:          

                isShowInfo = !isShowInfo;  

            case KEY_NUM0:          

                rePlay( level );          

        repaint();  

    private void addSnake(int life)  

        int s_n = snake_n;  

        snake_n += life;  

        if( snake_n >= snake_max )  

            level++;  

        else if( snake_n < snake_min )        //game over  

        else if( life>0 )  

            for( int i=s_n; i<snake_n; i++ )  

                snake_x[i] = -snake_w;  

                snake_y[i] = -snake_h;  

    public void rePlay( int level )  

        sleepTime     = 300-level*20;  

        map_x        = s_height/16;  

        map_y        = s_width/16;  

        key_x         = map_x>>1;  

        key_y         = map_y>>1;  

        gameState    = STATEPLAY;  

        map          = new int[map_x][map_y];  

        isShowInfo    = false;  

        snake_n        = snake_min;  

        aspect_x    = 0;  

        aspect_y    = 0;  

            Image temp     = Image.createImage("/pics/bg_tile_"+(level%2)+".png");  

        for( int i=0; i<map_x; i++ )    //draw bg  

                int r = rand.nextInt(maxRand);  

                for( int k=0; k<imgGameBg.length; k++ )  

                    if( r < (maxRand>>(k+1)) )  

                        map[i][j] = k;  

        for( int i=0; i<snake_n; i++ )    //init snake  

            snake_x[i] = s_width >>1;  

            snake_y[i] = s_height>>1;    //-(i*snake_h);  

<a href="http://down.51cto.com/data/2358280" target="_blank">附件:http://down.51cto.com/data/2358280</a>

本文轉自 kome2000 51CTO部落格,原文連結:http://blog.51cto.com/kome2000/578512