發新話題

一個簡單的遊戲源代碼

一個簡單的遊戲源代碼

       實現一個簡單的翻牌遊戲,每次最多翻開兩個數字,如果數字相同則消失,否則兩個數字不顯示,可以繼續遊戲。
       遊戲規則如下:
       1、遊戲資料使用兩個一維數組存儲:
u       map存儲邏輯資料
u       displayMap存儲繪製的資料,-1代表已經翻開,0代表未翻開,大於0代表已經翻開。
2、繪製規則:
u       在螢幕中心繪製圖形
u       每個單元格寬度和高度都是20,每個單元格之間間隔4
3、遊戲結束判別規則:
u       單元格全部消失或者只有一個單元格剩餘


實現代碼如下:
引用:
package simplegame;

import java.util.Random;
import javax.microedition.lcdui.*;

/**
* 翻圖遊戲
* 遊戲資料分別存儲在兩個數組,
*      1、數組map存放實際的地圖資料,每行顯示的資料長度為關卡數字+1
*      2、已經翻開的地圖資料存儲在displayMap數組中,-1代表已經翻開,0代表未翻開,大於0代表已經翻開
* @author 陳躍峰
* @version 1.0
*/
public class SimpleGameCanvas extends Canvas implements Runnable {
    /**地圖資料,地圖資料的長度是(level + 1) * (level + 1)*/
    private int[] map;
    /**顯示的資料,0代表未顯示,-1代表消失,大於0代表翻開的資料*/
    private int[] displayMap;
    /**關卡*/
    private int level = 1;
    /**已經翻開的數字數量*/
    int num = 0;
    /**選擇框序號,編號規則為從左到右,從上到下*/
    int index = 0;
    /**第一個被翻開的方塊*/
    int firstIndex = 0;
    /**第二個被翻開的方塊*/
    int secondIndex = 0;
    /**螢幕寬度*/
    private int width;
    /**螢幕高度*/
    private int height;
    /**每個單元格寬度*/
    private final int TILE_WIDTH = 20;
    /**每個單元格高度*/
    private final int TILE_HEIGHT = 20;
    /**每個單元格之間的間隔*/
    private final int INNER_WIDTH = 4;

    /**
     * 預設構造方法
     */
    public SimpleGameCanvas() {
        //初始化資料
        width = this.getWidth();
        height = this.getHeight();
        init(level);
        //啟動執行緒
        new Thread(this).start();
    }

    protected void paint(Graphics g) {
        //清屏
        g.setColor(0xffffff);
        g.fillRect(0、0、width、height);
        g.setColor(0);
        //繪製數字
        drawNumber(g);
        //繪製關卡數字
        g.drawString("第" + level + "關"、this.getWidth() / 2、15,
                     Graphics.BASELINE | Graphics.HCENTER);
    }

    private void drawNumber(Graphics g) {
        //螢幕中心點坐標
        int xCenter = width / 2;
        int yCenter = height / 2;
        //左上坐標
        int x = xCenter -
                ((level + 1) * TILE_WIDTH + ((level + 1) - 1) * INNER_WIDTH) /
                2;
        int y = yCenter -
                ((level + 1) * TILE_HEIGHT + ((level + 1) - 1) * INNER_WIDTH) /
                2;
        //循環繪製
        for (int i = 0; i < displayMap.length; i++) {
            //繪製邊框和數字
            g.setColor(0);
            if (displayMap >= 0) {
                g.fillRect(x + (i % (level + 1)) * (TILE_WIDTH + INNER_WIDTH),
                           y + (i / (level + 1)) * (TILE_HEIGHT + INNER_WIDTH),
                           TILE_WIDTH,
                           TILE_HEIGHT);
                //繪製內部的數字
                if (displayMap > 0) {
                    g.setColor(0xffffff);
                    g.drawString(String.valueOf(displayMap)、
                                 x +
                                 (i % (level + 1)) * (TILE_WIDTH + INNER_WIDTH) +
                                 7、
                                 y +
                                 (i / (level + 1)) * (TILE_HEIGHT + INNER_WIDTH) +
                                 2、
                                 Graphics.TOP | Graphics.LEFT
                            );
                }
            }
        }
        //繪製選擇框
        g.setColor(0xff0000);
        g.drawRect(x + index % (level + 1) * (TILE_WIDTH + INNER_WIDTH) - 1,
                   y + (index / (level + 1)) * (TILE_HEIGHT + INNER_WIDTH) - 1,
                   TILE_WIDTH + 1,
                   TILE_HEIGHT + 1);

    }

    /**
     * 根據關卡初始化地圖資料
     * @param level 等級
     */
    private void init(int level) {
        //初始化地圖資料大小
        map = new int[(level + 1) * (level + 1)];
        //初始化地圖資料
        for (int i = 0; i < map.length; i++) {
            map = i % (map.length / 2) + 1;
        }
        //隨機打亂地圖資料
        Random ran = new Random();
        int index = 0;
        int temp;
        for (int i = 0; i < map.length; i++) {
            index = Math.abs(ran.nextInt() % map.length);
            //交換資料
            temp = map;
            map = map[index];
            map[index] = temp;
        }

        //初始化顯示地圖資料大小
        displayMap = new int[(level + 1) * (level + 1)];
    }

    public void keyPressed(int keyCode) {
        int action = this.getGameAction(keyCode);
        switch (action) {
        case UP:
            if (index - level - 1 >= 0) {
                index = index - level - 1;
            }
            break;
        case DOWN:
            if (index + level + 1 <= (level + 1) * (level + 1) - 1) {
                index = index + level + 1;
            }
            break;
        case LEFT:
            if (index > 0) {
                index--;
            }
            break;
        case RIGHT:
            if (index < (level + 1) * (level + 1) - 1) {
                index++;
            }
            break;
        case FIRE: //確定
            if (num < 2 && displayMap[index] >= 0) { //翻開的數量小於2
                num++; //翻開的數量增加1
                //記錄索引值
                if (num == 1) {
                    firstIndex = index;
                } else if (num == 2 && index != firstIndex) {
                    secondIndex = index;
                }

                //顯示該數字
                displayMap[index] = map[index];
            }
        }
        repaint();
    }

    /**
     * 是否升級
     * 剩餘1個或者是全部消失則升級
     * @return true代表升級
     */
    private boolean isLevelUp() {
        int n = 0; //存儲沒有翻開的方塊數量
        for (int i = 0; i < displayMap.length; i++) {
            if (displayMap != -1) {
                n++;
            }
        }
        if (n > 1) {
            return false;
        } else {
            return true;
        }
    }

    public void run() {
        try {
            while (true) {
                //暫停
                Thread.sleep(100);
                //邏輯處理
                //處理邏輯
                if (num == 2) {
                    try {
                        Thread.sleep(500);
                    } catch (Exception e) {}

                    if (map[firstIndex] == map[secondIndex]) { //內容相同
                        displayMap[firstIndex] = -1;
                        displayMap[secondIndex] = -1;
                    } else {
                        displayMap[firstIndex] = 0;
                        displayMap[secondIndex] = 0;
                    }
                    num = 0;
                }
                //升級
                if (isLevelUp()) {
                    level++; //等級+1
                    init(level); //初始化地圖資料
                    num = 0; //翻開的數量歸零
                    index = 0; //預設選擇第一個方塊
                }
                //重新繪製
                repaint();
            }
        } catch (Exception e) {}
    }
}

TOP

發新話題

本站所有圖文均屬網友發表,僅代表作者的觀點與本站無關,如有侵權請通知版主會盡快刪除。