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

📄 tetrisgamecanvas.java

📁 基于WINCE5.2的ARM嵌入式手机软件的开发
💻 JAVA
字号:
import javax.microedition.lcdui.*;class TetrisGameCanvas extends Canvas implements Runnable {    Thread t;    private static final int CELLNUM = 7;//方块类型总数    private static final int WIDTH_NUMBER = 10; //宽10方格    private static final int HEIGHT_NUMBER = 16;//高16方格    private static final int WIDTH = 100; //宽10方格    private static final int HEIGHT = 160;//高16方格    private static final int GRIDWIDTH = 10;    private static final int bx = 10;    private static final int by = 10;    private int grid[][];    private int row = 0,  column = 0;//坐标从0开始(row,column) =( 行,列)    private boolean ifhaddown = false;//判断方块是否已经不在下落,false表示不在下落    private int[][] getboardcell = new int[4][4];//存储获得当前得方块    private boolean pause = false;//是否暂停游戏    private boolean begin = false;//是否开始游戏    private int cellstyle;//方块类型    private int totalscore; //得分    private String text = "得分:";    Board board = new Board(WIDTH, HEIGHT, GRIDWIDTH);    BoardCells bcell = new BoardCells();    private Image offScreenImage;    private Graphics offScreenGraphics;    TetrisGameCanvas() {        t = new Thread(this);        t.start();        //		初始化离屏缓冲区        if (offScreenImage == null) {            offScreenImage = Image.createImage(this.getWidth(), this.getHeight());            offScreenGraphics = offScreenImage.getGraphics();        }        //定义方格        grid = new int[HEIGHT_NUMBER][WIDTH_NUMBER];        clearBoard();    }    protected void start() {        pause = false;    }    protected void pause() {        pause = true;    }    private void clearBoard() {        int i, j;        //初始化方块是否显示        for (i = 0; i <= HEIGHT_NUMBER - 1; i++) {            for (j = 0; j <= WIDTH_NUMBER - 1; j++) {                grid[i][j] = 0;            }        }    }    //判断方块占用得行数和列数 ,即存在1的行数和列数    private int[] GetRowColumn(int x, int y, int[][] bcell) {        int[] rtn = new int[2];        int i, j, getx = 4, gety = 4;        boolean isAllZero = false;        //判断方块占用得行数和列数        for (i = 4; i >= 1; i--) {            for (j = 1; j <= 4; j++) {                if (bcell[j - 1][i - 1] == 0) {                    isAllZero = true;                } else {                    isAllZero = false;                    break;                }            }            if (isAllZero == true) {                gety = gety - 1;            }            isAllZero = false;        }        isAllZero = false;        for (i = 4; i >= 1; i--) {            for (j = 1; j <= 4; j++) {                if (bcell[i - 1][j - 1] == 0) {                    isAllZero = true;                } else {                    isAllZero = false;                    break;                }            }            if (isAllZero == true) {                getx = getx - 1;            }            isAllZero = false;        }        rtn[0] = getx;        rtn[1] = gety;        return rtn;    }    //是否可以移动,翻转等;    private boolean Movable(int x, int y, int[][] bcell) {        int i, j, getx, gety;        int[] rtn = new int[2];        //获得方块占用的行数和列数        rtn = GetRowColumn(x, y, bcell);        getx = rtn[0];        gety = rtn[1];        //如果越界,返回不能移动        if ((x + getx > HEIGHT_NUMBER) || (y + gety > 10) || (x < 0) || (y < 0)) {            return false;        }        //是否与以前下落得方块碰撞        for (i = 1; i <= getx; i++) {            for (j = 1; j <= gety; j++) {                if (grid[x + i - 1][y + j - 1] * bcell[i - 1][j - 1] == 1) {                    return false;                }            }        }        return true;    }    //在不会冲突得时候,拷贝单元    private void copycell(int x, int y, int[][] bcell) {        int i, j, getx, gety;        int[] rtn = new int[2];        //获得某一形状的方块的行数和列数        rtn = GetRowColumn(x, y, bcell);        getx = rtn[0];        gety = rtn[1];        for (i = 1; i <= getx; i++) {            for (j = 1; j <= gety; j++) {                if (bcell[i - 1][j - 1] == 1) {                    grid[x + i - 1][y + j - 1] = 1;                }            }        }    }    //清除单元,也就是恢复拷贝单元 前的操作    private void clearcell(int x, int y, int[][] bcell) {        int i, j, getx, gety;        int[] rtn = new int[2];        //获得某一形状的方块的行数和列数        rtn = GetRowColumn(x, y, bcell);        getx = rtn[0];        gety = rtn[1];        for (i = 1; i <= getx; i++) {            for (j = 1; j <= gety; j++) {                if (bcell[i - 1][j - 1] == 1) {                    grid[x + i - 1][y + j - 1] = 0;                }            }        }    }    //清除没有空白的一行方块 ,并把上方的方块下移    //可以消行,返回true    private boolean ClearLine() {        boolean isLine = false, hasline = false;        int i, j, m, n;        for (i = HEIGHT_NUMBER - 1; i >= 4; i--) {            for (j = 0; j <= WIDTH_NUMBER - 1; j++) {                if (grid[i][j] == 0) {                    isLine = false;                    break;                } else {                    isLine = true;                }            }            //如果是整行,移动方块            if (isLine == true) {                for (m = i; m >= 4; m--) {                    for (n = 0; n <= WIDTH_NUMBER - 1; n++) {                        grid[m][n] = grid[m - 1][n];                    }                }                i = i + 1;                totalscore = totalscore + 1;                //显示当前得分                text = "得分:" + String.valueOf(totalscore);                hasline = true;            }        }        return hasline;    }    private boolean GameOver() {        boolean gameover = false;        int i, j;        for (i = HEIGHT_NUMBER - 1; i >= 0; i--) {            for (j = 0; j <= WIDTH_NUMBER - 1; j++) {                if (grid[i][j] == 1) {                    gameover = false;                    break;                } else {                    gameover = true;                }            }            //如果是整行,移动方块            if (gameover == true) {                if (i <= 1) {                    return true;                } else {                    return false;                }            }        }        return false;    }    //画3维方格    public static void drawBrick(int px, int py, int width, Graphics g) {        //画白边        g.setColor(255, 255, 255);        g.fillRect(px, py, 1, width);        g.fillRect(px, py, width, 1);        //画中心        int color = 0x00FFFF00;        g.setColor(color);        g.fillRect(px + 1, py + 1, width - 1, width - 1);        //画灰边        g.setColor(0x00c0c0c0);        g.fillRect(px + width - 1, py + 1, 1, width - 1);        g.fillRect(px + 1, py + width - 1, width - 2, 1);    }    protected void paint(Graphics g) {        offScreenGraphics.setColor(0x000000);        offScreenGraphics.fillRect(0, 0, this.getWidth(), this.getHeight());        board.DrawBoard(offScreenGraphics, bx, by, false);        offScreenGraphics.setColor(0x00FF00FF);        offScreenGraphics.setColor(0x00ffff00);        //绘制提示信息:        offScreenGraphics.drawString("按#新游戏", bx + WIDTH + 10, by, Graphics.TOP | Graphics.LEFT);        //绘制得分信息:        offScreenGraphics.drawString(text, bx + WIDTH + 10, by + 20,                Graphics.TOP | Graphics.LEFT);        int i, j;        for (i = 0; i < HEIGHT_NUMBER; i++) {            for (j = 0; j < WIDTH_NUMBER; j++) {                if (grid[i][j] == 1) {                    drawBrick(bx + j * GRIDWIDTH, by + i * GRIDWIDTH,                            GRIDWIDTH, offScreenGraphics);                }            }        }        g.drawImage(offScreenImage, 0, 0, Graphics.TOP | Graphics.LEFT);    }    public void run() {        while (true) {            try {                Thread.sleep(500);            } catch (InterruptedException e) {                System.out.println("sleep error : " + e.getMessage());            }            if (begin = true && pause == false) {                playGame();            }        }    }    protected synchronized void keyRepeated(int keyCode) {        if (pause == true) {            return;        }        int action = getGameAction(keyCode);        if (action == Canvas.DOWN) {            clearcell(row, column, getboardcell);            if (Movable(row + 1, column, getboardcell)) {                row = row + 1;                copycell(row, column, getboardcell);                repaint();            } else {                copycell(row, column, getboardcell);            }        }    }    protected synchronized void keyPressed(int keyCode) {        //如果游戏暂停,则按键无效        if (pause == true) {            return;        }        int action = getGameAction(keyCode);        switch (action) {            case Canvas.LEFT:                /* 左移 */                clearcell(row, column, getboardcell);                if ((Movable(row, column - 1, getboardcell)) && (ifhaddown == true)) {                    column = column - 1;                    copycell(row, column, getboardcell);                    repaint();                } else {                    copycell(row, column, getboardcell);                }                break;            case Canvas.RIGHT: /* 右移 */                clearcell(row, column, getboardcell);                if ((Movable(row, column + 1, getboardcell)) && (ifhaddown == true)) {                    column = column + 1;                    copycell(row, column, getboardcell);                    repaint();                } else {                    copycell(row, column, getboardcell);                }                break;            case Canvas.UP: /* 下坠块变化 */                clearcell(row, column, getboardcell);                if ((Movable(row, column, bcell.GetWorkcell((cellstyle + 1) % 4 + 1))) && (ifhaddown == true)) {                    cellstyle = (cellstyle + 1) % 4;                    getboardcell = bcell.GetWorkcell(cellstyle + 1);                    copycell(row, column, getboardcell);                    repaint();                } else {                    copycell(row, column, getboardcell);                }                break;            case Canvas.DOWN:/* 下移 */                clearcell(row, column, getboardcell);                if (Movable(row + 1, column, getboardcell)) {                    row = row + 1;                    copycell(row, column, getboardcell);                    repaint();                } else {                    copycell(row, column, getboardcell);                }                break;            case Canvas.FIRE: /* 下坠块变化 */                break;        }        if (keyCode == Canvas.KEY_POUND) {//开始新游戏            clearBoard();            repaint();            ifhaddown = false;            totalscore = 0;            begin = true;        }    }    protected void playGame() {        int i = 0;        int m, n;        //判断是否从新出现新的方块        if (ifhaddown == false) {            row = 0;            column = 4;            ifhaddown = true;            getboardcell = bcell.SetNewCells();            cellstyle = bcell.GetNewCellCount();            copycell(row, column, getboardcell);            repaint();            return;        }        clearcell(row, column, getboardcell);        boolean ifmovable = Movable(row + 1, column, getboardcell);        if (ifmovable == true) //如果能继续下落        {            row++;            copycell(row, column, getboardcell);            repaint();        } else {            copycell(row, column, getboardcell);            ifhaddown = false;            //如果可以消行            if (ClearLine()) {                repaint();            }        }        if ((GameOver() == true) && (ifhaddown == false)) {            begin = false;            //note.setText("游戏 结束! 按S重新开始游戏");            //timer.stop();            return;        }    }}

⌨️ 快捷键说明

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