⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gamecanvas.java

📁 手机版本的加加看游戏
💻 JAVA
字号:
import javax.microedition.lcdui.*;
import java.util.*;

/**
 * <p>Title: </p>
 *
 * <p>Description: </p>
 *
 * <p>Copyright: Copyright (c) 2006</p>
 *
 * <p>Company: </p>
 *
 * @author not attributable
 * @version 1.0
 */
public class GameCanvas extends Canvas implements CommandListener, Runnable {
    Vector v = new Vector(); //存储x,y座标,避免重复选择
    Random rnd = new Random();
    int width, height; //屏幕
    int gamestate;
    final int LOGO = 0; //状态量
    final int PLAY = 1;
    final int OVER = 2;
    final int FINSH = 3;
    final int ROW = 8;
    final int COL = 6;
    final int WIDTH = 20, HEIGHT = 20; //方格尺寸
    final int MAX_SET = 4; //加法最大步骤
    final int ADD_SCORE = 250; //计算正确一步+
    final int DEFAULT_TIME = 10;
    int time; //10 秒倒记时
    int score = 0;
    int number = 0;
    int total_time = 0; //总用时
    int[][] map;
    int x = 0, y = 0; //选框坐标
    int count = 0; //记录加法步骤
    int sum = 0; //用户+和
    Thread t = null;
    Image src; //选框背景
    int total = 0; //总算题目数
    boolean isOver = false;
    boolean error = false; //出错标记
    public GameCanvas() {
        try {
            src = Image.createImage("/pic/1.png");
        } catch (Exception e) {
            System.out.println("error");

        }
        map = new int[ROW][COL];

        setFullScreenMode(true);
        width = getWidth();
        height = getHeight();
        gamestate = LOGO;

    }
    /**
     * 初始化地图
     */
    public void initMap() {
        for (int i = 0; i < map.length; i++) {
            for (int j = 0; j < map[i].length; j++) {
                int temp = Math.abs(rnd.nextInt()) % 10;
                if (temp <= 0) {
                    temp = temp + 1;
                }
                map[i][j] = temp;

            }
        }
    }

    /**
     *
     * 功能:按照透明度画出图片
     */
    public void drawAph(Graphics g, int x, int y) {
        int w, h;
        w = src.getWidth();
        h = src.getHeight();
        int size = w * h;
        int[] rgb = new int[size];
//      int[] des=new int[size];
        src.getRGB(rgb, 0, w, 0, 0, w, h);
        int aph = 100; //透明度
        for (int i = 0; i < size; i++) {
            rgb[i] = (aph << 24) | (rgb[i] & 0x00ffffff);
        }
        g.drawRGB(rgb, 0, w, x, y, w, h, true);
    }

    /**
     * 功能:渲染地图
     *
     */
    public void drawMap(Graphics g) {
        g.setFont(Font.getFont(Font.FACE_SYSTEM, Font.STYLE_BOLD,
                               Font.SIZE_SMALL));

        for (int i = 0; i < map.length; i++) {
            for (int j = 0; j < map[i].length; j++) {
                g.setColor(0xff0000);
                g.drawRect(j * WIDTH + 8,
                           i * HEIGHT + 8, WIDTH,
                           HEIGHT);
                g.setColor(0x000000);
                String s = null;
                if (map[i][j] == 0) {
                    s = "";
                } else {
                    s = String.valueOf(map[i][j]);
                }
                g.drawString("" + s, (j * WIDTH + 8) + (WIDTH / 2),
                             (i * HEIGHT + 8) + (HEIGHT / 2),
                             g.TOP | g.LEFT);
            }
        }

        g.setFont(Font.getDefaultFont());
    }

    public void commandAction(Command command, Displayable displayable) {

        if (command.getCommandType() == Command.EXIT) {

            MainMIDP.quitApp();
        }

    }

    /**
     * 新开一局
     */
    public void newGame() {
        total_time = 0;
        total = 0;
        number = Math.abs(rnd.nextInt()) % 20;
        if (number <= 0) {
            number += 1;
        }
        initMap();
        t = null;
        time = DEFAULT_TIME;
        score = 0;
        sum = 0;
        gamestate = PLAY;
        isOver = false;
        t = new Thread(this);
        t.start();
        v.removeAllElements();
        count = 0;

    }

    /**
     * 一些检测
     */
    public void update() {
        total_time++;
        if (isFinsh()) {
            gamestate = FINSH;
            repaint();
        } else if (time <= 0 && !isFinsh()) { //尝试失败的滋味 :)0
            gamestate = OVER;
            repaint();
        }
        if (time <= 0) {
            t = null;
            isOver = true;
        }

    }

    /**
     *KEY FIRE后是否等于结果
     */
    public void fire() {
        if (!isOver) { //没有GAME OVER的情况
            int _num = map[y % ROW][x % COL];
            if (!isExist(x, y) && v.size() <= 4 && _num != 0) {
                v.addElement(new String(x + "|" + y + "|"));
                if (count > MAX_SET) { //同一答案只能进行4次相加
                    v.removeAllElements();
                    count = 0;
                    sum = 0;
                    return;
                }
                count++; //运算次数++
                sum += _num;
                if (sum > number) {
                    sum = 0;
                    count = 0;
                    v.removeAllElements();
                    error = true;
                    return;
                }
                if (sum == number) {
                    for (int i = 0; i < v.size(); i++) { //清除所选的框内的数字
                        String temp = (String) v.elementAt(i);
                        int _x, _y; //临时存储V内的x,y变量
                        int start = 0;
                        int end = temp.indexOf("|");
                        _x = Integer.parseInt(temp.substring(start, end));
                        start = end + 1;
                        end = temp.indexOf("|", start);
                        _y = Integer.parseInt(temp.substring(start, end));
                        map[_y % ROW][_x % COL] = 0;
                    }

                    score += ADD_SCORE;
                    number = Math.abs(rnd.nextInt()) % 20;
                    if (number <= 0) {
                        number += 1;
                    }
                    total++;
                    count = 0;
                    time = DEFAULT_TIME;
                    sum = 0;
                    v.removeAllElements(); //清空V内所有元素
                }
            }

        } else { //如果game over
            newGame();
        }

    }

    public void keyPressed(int keycode) {
        switch (gamestate) {
        case LOGO:
            switch (getGameAction(keycode)) {
            default:
                newGame();
                break;
            }

            break;
        case PLAY:
            switch (getGameAction(keycode)) {

            case FIRE:
                fire();
                break;
            case UP:
                if (y > 0) {
                    y--;
                }
                break;
            case DOWN:
                if (y < ROW - 1) {
                    y++;
                }
                break;
            case LEFT:
                if (x > 0) {
                    x--;
                }
                break;
            case RIGHT:
                if (x < COL - 1) {
                    x++;
                }
                break;
            }

            break;
        case OVER:
            switch (getGameAction(keycode)) {
            default:
                newGame();
                break;
            }
            break;
        case FINSH:
            switch (getGameAction(keycode)) {
            default:
                newGame();
                break;
            }
            break;
        }
        repaint();
    }

    /**
     * 是否全部消除
     */
    boolean isFinsh() {
        for (int i = 0; i < map.length; i++) {
            for (int j = 0; j < map[i].length; j++) {
                if (map[i][j] != 0) {
                    return false;
                }
            }
        }
        return true;
    }

    public void run() {
        while (!isOver) {
            try {
                Thread.sleep(1000);
            } catch (Exception e) {}
            error = false;
            time--;
            update();
            repaint();
        }
    }

    /**
     *
     * 功能:重复检测选择是否重复
     */
    public boolean isExist(int x, int y) {
        //存储方式 x|y| 字符串方式
        for (int i = 0; i < v.size(); i++) {
            String temp = (String) v.elementAt(i);
            int _x, _y; //临时存储V内的x,y变量
            int start = 0;
            int end = temp.indexOf("|");
            _x = Integer.parseInt(temp.substring(start, end));

            start = end + 1;
            end = temp.indexOf("|", start);
            _y = Integer.parseInt(temp.substring(start, end));
            if (x == _x && y == _y) {
                return true;
            }
        }
        return false;
    }

    protected void paint(Graphics g) {
        g.setColor(0xffffff);
        g.fillRect(0, 0, width, height);
        switch (gamestate) {
        case LOGO:
            g.setColor(0xff0000);
            g.drawString("JIA JIA KAN (S60) ", 30, height / 2, g.TOP | g.LEFT);
            g.setFont(Font.getFont(Font.FACE_SYSTEM, Font.STYLE_PLAIN,
                                   Font.SIZE_SMALL));
            g.drawString("Please any key to continue", 10, height - 20,
                         g.TOP | g.LEFT);
            break;
        case PLAY:
            g.setColor(0xffffff);
            g.fillRect(0, 0, width, height);
            g.setColor(0xff0000);
            g.drawRect(5, 5, width - 50, height - 40);
            g.fillRect(5, height - 30, 10 * time, 15);
            g.setColor(0x0000ff);
            g.setFont(Font.getFont(Font.FACE_SYSTEM, Font.STYLE_PLAIN,
                                   Font.SIZE_LARGE));

            g.drawString("" + number, width - 30, 50, g.TOP | g.LEFT);
            g.setColor(0xff0000);
            g.setFont(Font.getFont(Font.FACE_SYSTEM, Font.STYLE_PLAIN,
                                   Font.SIZE_SMALL));
            g.drawString("Score", width - 40, 120, g.TOP | g.LEFT);
            g.drawString("" + score, width - 40, 140, g.TOP | g.LEFT);
            drawMap(g); //map
            g.setColor(0x00ffff);
            g.drawRect(x * WIDTH + 8, y * HEIGHT + 8, WIDTH, HEIGHT);
            drawAph(g, x * WIDTH + 8, y * HEIGHT + 8);
            drawSelect(g);
            if (error) {
                g.setColor(0xff0000);
                g.drawString("Error!", width - 40, 20, g.TOP | g.LEFT);
            }
            break;
        case OVER:
            int old = g.getColor();
            g.setColor(0xff0000);
            g.drawString("YOU LOSE!", width / 3, height / 2, g.TOP | g.LEFT);
            g.setFont(Font.getFont(Font.FACE_SYSTEM, Font.STYLE_PLAIN,
                                   Font.SIZE_MEDIUM));
            g.drawString("Score: " + score, width / 2 - 10, height / 2 + 40,
                         g.TOP | g.LEFT);
            g.drawString("Count: " + total, width / 2 - 10, height / 2 + 60,
                         g.TOP | g.LEFT);
            g.drawString("Time: " + total_time, width / 2 - 10, height / 2 + 80,
                         g.TOP | g.LEFT);
            g.setColor(old);
            break;
        case FINSH:
            int oldcolor = g.getColor();
            g.setColor(0xff0000);
            g.drawString("very Good!!", width / 3, height / 2,
                         g.TOP | g.LEFT);
            g.drawString("Are you super man ??!", 10, height / 2 + 20,
                         g.TOP | g.LEFT);
            g.setColor(oldcolor);
            break;
        }
    }
    /**
     *
     * 画选框
     */
    public void drawSelect(Graphics g) { //画出被选中的数字
        g.setColor(0x000000);
        for (int i = 0; i < v.size(); i++) {
            String temp = (String) v.elementAt(i);
            int _x, _y; //临时存储V内的x,y变量
            int start = 0;
            int end = temp.indexOf("|");
            _x = Integer.parseInt(temp.substring(start, end));

            start = end + 1;
            end = temp.indexOf("|", start);
            _y = Integer.parseInt(temp.substring(start, end));
            drawAph(g, (_x * WIDTH + 8), (_y * HEIGHT + 8));
            //    g.drawRect(_x * WIDTH + 8, _y * HEIGHT + 8, WIDTH, HEIGHT);
        }
    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -