零打碎敲学Android(三)—俄罗斯,你为什么是方块的

本文介绍了经典游戏俄罗斯方块的历史背景及其核心玩法,包括方块类型、游戏规则等,并提供了使用Java语言实现俄罗斯方块的具体代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

http://blog.csdn.net/cping1982/archive/2009/10/19/4700361.aspx

 

俄罗斯方块原本是前苏联(俄罗斯)科学家阿列克谢·帕基特诺夫(Алексей Леонидович Пажитнов)在1984年6月利用空闲时间所编写的游戏程序 ,据说游戏的作者最喜欢网球(Tennis)运动,于是,他把来源于希腊语的tetra(意为“四”)与其结合,造了“tetris”一词,之后开始提供授权给各个游戏公司。在那个时代,游戏机甚至于计算机的运算能力普遍较低(当时盛行传说中的640KB内存……),游戏堪称匮乏之极,因此简单易写的俄罗斯方块迅速普及, 造成各平台上软件大量发行的“恐怖”现象。

传说中Game Boy版的俄罗斯方块层在日本大卖424万套,是Game Boy史上卖得最好的游戏。海湾战争时,也是前线美军最常拿来消磨时间的游戏之一(如果鄙人没记错的话,GB是美军当时的标准装备之一|||,传说美军是一边玩着口袋妖怪,一边战胜了伊拉克~~~)。

俄罗斯方块的游戏规则:

          * 俄罗斯方块是由下面这几种常见方块构成,全部为四点组成:
          o 长条:一次最多消除四层
          o 7(左右):最多消除三层,或消除二层
          o 田:消除一至二层
          o S(左右):最多二层,容易造成孔洞
          o T:最多二层
          o 部分游戏有单格方块,可以穿透固定的方块到达最下层空位。其他的改版中出现更多特别的造型。

 

游戏方式:

    * 方块会从区域上方开始缓慢继续落下。
    * 玩家可以做的操作有:以90度为单位旋转方块,以格子为单位左右移动方块,让方块加速落下。
    * 方块移到区域最下方或是着地到其他方块上无法移动时,就会固定在该处,而新的方块出现在区域上方开始落下。
    * 当区域中某一列横向格子全部由方块填满,则该列会消失并成为玩家的得分。同时删除的列数越多,得分指数上升。
    * 当固定的方块堆到区域最上方而无法消除层数时,则游戏结束。

一般来说,游戏还会提示下一个要落下的方块,熟练的玩家会计算到下一个方块,评估现在要如何进行。由于游戏能不断进行下去,对商业用游戏不太理想,所以一般还会随着游戏的进行而加速提高难度,通常打到最后时,多眨一次眼就可能牺牲掉……

PS:另外补充一点,俄罗斯方块事实上是有知识产权的。最初的俄罗斯方块知识产权由前苏联外国贸易协会(ELORG)持有,在苏联over之后,由The Tetris Company继承,但由于“非法”使用者数量过大,事实上陷入了无法收取任何使用费的窘态中。自1990年代初期开始,全世界大量流行的小型游戏机,多半都有类似于俄罗斯方块的游戏,不过——9成9都不是授权产品。

闲话少说,既然是如此简单的东东,今天我们也用Java写两个俄罗斯方块好了。

示例源码下载地址: http://code.google.com/p/loon-simple/downloads/list

 


与往常一样,一个例子写两台平台的,首先是PC版的实现,源码如下:

view plaincopy to clipboardprint?
package org.loon.game.test;  
import java.awt.Graphics2D;  
import java.awt.Image;  
/** 
 *  
 * Copyright 2008 - 2009 
 *  
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not 
 * use this file except in compliance with the License. You may obtain a copy of 
 * the License at 
 *  
 * http://www.apache.org/licenses/LICENSE-2.0 
 *  
 * Unless required by applicable law or agreed to in writing, software 
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 
 * License for the specific language governing permissions and limitations under 
 * the License. 
 *  
 * @project loonframework 
 * @author chenpeng 
 * @email:ceponline@yahoo.com.cn 
 * @version 0.1 
 */ 
public class TetrisField {  
    private Block stoneCurrent;  
    private Block stoneNext;  
    private int[][] stonePosition;  
    private int[][] gameFieldStones;  
    private int curLines = 0, curLevel = 1, curPoints = 0, row, col;  
    private boolean gameOver = false;  
    public TetrisField(int row, int col) {  
        int i = 0;  
        int j = 0;  
        this.row = row;  
        this.col = col;  
        stonePosition = new int[4][2];  
        gameFieldStones = new int[row][col];  
        for (i = 0; i < row; i++) {  
            for (j = 0; j < col; j++) {  
                gameFieldStones[i][j] = 0;  
            }  
        }  
    }  
    public int getCol() {  
        return col;  
    }  
    public int getRow() {  
        return row;  
    }  
    public void createCurrentStone(int NextStoneID) {  
        stoneCurrent = stoneNext;  
        createNextStone(NextStoneID);  
        stonePosition = stoneCurrent.getStartPosition();  
        if (gameFieldStones[5][4] != 0) {  
            gameOver = true;  
        }  
        setCurrentStonePosition(stonePosition);  
    }  
    public void createNextStone(int stoneID) {  
        stoneNext = new Block(stoneID);  
    }  
    public void setCurrentStonePosition(int[][] StoneNewPosition) {  
        int i;  
        for (i = 0; i < 4; i++) {  
            gameFieldStones[StoneNewPosition[i][0]][StoneNewPosition[i][1]] = stoneCurrent  
                    .getBlockID();  
        }  
    }  
    public void setCurrentStonePosition(int[][] StoneNewPosition,  
            int[][] StoneOldPosition) {  
        int i;  
        for (i = 0; i < 4; i++) {  
            gameFieldStones[StoneOldPosition[i][0]][StoneOldPosition[i][1]] = 0;  
        }  
        for (i = 0; i < 4; i++) {  
            gameFieldStones[StoneNewPosition[i][0]][StoneNewPosition[i][1]] = stoneCurrent  
                    .getBlockID();  
        }  
        stonePosition = StoneNewPosition;  
    }  
    public boolean incrementPositionY(boolean isThread) {  
        int i;  
        int[][] StoneNewPosition = new int[4][2];  
        int canStart = 0;  
        for (i = 0; i < 4; i++) {  
            if (stonePosition[i][1] > 3) {  
                canStart = 1;  
            }  
        }  
        if (canStart == 1 || isThread) {  
            for (i = 0; i < 4; i++) {  
                StoneNewPosition[i][1] = stonePosition[i][1] + 1;  
                StoneNewPosition[i][0] = stonePosition[i][0];  
            }  
            if (!hasCollision(StoneNewPosition)) {  
                setCurrentStonePosition(StoneNewPosition, stonePosition);  
                return true;  
            } else {  
                setCurrentStonePosition(stonePosition);  
                return false;  
            }  
        }  
        return false;  
    }  
    public void rightPositionX() {  
        int i;  
        int[][] StoneNewPosition = new int[4][2];  
        int canStart = 0;  
        for (i = 0; i < 4; i++) {  
            if (stonePosition[i][1] > 3) {  
                canStart = 1;  
            }  
        }  
        if (canStart == 1) {  
            for (i = 0; i < 4; i++) {  
                StoneNewPosition[i][1] = stonePosition[i][1];  
                StoneNewPosition[i][0] = stonePosition[i][0] + 1;  
            }  
            if (!hasCollision(StoneNewPosition)) {  
                setCurrentStonePosition(StoneNewPosition, stonePosition);  
            } else {  
                setCurrentStonePosition(stonePosition);  
            }  
        }  
    }  
    public void leftPositionX() {  
        int i;  
        int[][] StoneNewPosition = new int[4][2];  
        int canStart = 0;  
        for (i = 0; i < 4; i++) {  
            if (stonePosition[i][1] > 3) {  
                canStart = 1;  
            }  
        }  
        if (canStart == 1) {  
            for (i = 0; i < 4; i++) {  
                StoneNewPosition[i][1] = stonePosition[i][1];  
                StoneNewPosition[i][0] = stonePosition[i][0] - 1;  
            }  
            if (!hasCollision(StoneNewPosition)) {  
                setCurrentStonePosition(StoneNewPosition, stonePosition);  
            } else {  
                setCurrentStonePosition(stonePosition);  
            }  
        }  
    }  
    public void rotateStone() {  
        int[][] StoneNewPosition = new int[4][2];  
        StoneNewPosition = stoneCurrent.rotateStone(stonePosition);  
        if (!hasCollision(StoneNewPosition)) {  
            setCurrentStonePosition(StoneNewPosition, stonePosition);  
        } else {  
            stoneCurrent.noRoate();  
            setCurrentStonePosition(stonePosition);  
        }  
    }  
    public boolean hasCollision(int[][] StoneNewPosition) {  
        int i;  
        for (i = 0; i < 4; i++) {  
            gameFieldStones[stonePosition[i][0]][stonePosition[i][1]] = 0;  
        }  
        for (i = 0; i < 4; i++) {  
            if (StoneNewPosition[i][0] < 0) {  
                return true;  
            } else if (StoneNewPosition[i][0] == row) {  
                return true;  
            } else if (StoneNewPosition[i][1] == col) {  
                return true;  
            } else if (gameFieldStones[StoneNewPosition[i][0]][StoneNewPosition[i][1]] != 0) {  
                return true;  
            }  
        }  
        return false;  
    }  
    public boolean hasLines() {  
        int i = 0;  
        int j = 0;  
        int[] lines = new int[4];  
        int Quantity = 0;  
        boolean isLine = false;  
        for (i = 3; i < col; i++) {  
            for (j = 0; j < row; j++) {  
                isLine = true;  
                if (gameFieldStones[j][i] == 0) {  
                    isLine = false;  
                    break;  
                }  
            }  
            if (isLine == true) {  
                lines[Quantity] = i;  
                Quantity++;  
            }  
        }  
        if (Quantity > 0) {  
            int[][] TempGameField = new int[row][col];  
            int sum = 0;  
            curLines += Quantity;  
            curLevel = Math.round(curLines / row) + 1;  
            //最大等级为20  
            if (curLevel > 20) {  
                curLevel = 20;  
            }  
            curPoints += Math.pow((row * curLevel), Quantity);  
            for (i = col - 1; i > 3; i--) {  
                for (j = 0; j < row; j++) {  
                    isLine = true;  
                    if (gameFieldStones[j][i] == 0) {  
                        isLine = false;  
                        break;  
                    }  
                }  
                if (isLine == false) {  
                    for (j = 0; j < row; j++) {  
                        TempGameField[j][i + sum] = gameFieldStones[j][i];  
                    }  
                } else {  
                    sum++;  
                }  
            }  
            for (i = 0; i < 4; i++) {  
                for (j = 0; j < row; j++) {  
                    TempGameField[j][i] = gameFieldStones[j][i];  
                }  
            }  
            gameFieldStones = TempGameField;  
            return true;  
        } else {  
            return false;  
        }  
    }  
    public int[][] getStonePosition() {  
        return gameFieldStones;  
    }  
    public void draw(Graphics2D g, Image[] stones) {  
        int nextStone = getNextStone();  
        switch (nextStone) {  
        case 1:  
            g.drawImage(stones[1], 240, 60, null);  
            g.drawImage(stones[1], 260, 60, null);  
            g.drawImage(stones[1], 240, 80, null);  
            g.drawImage(stones[1], 260, 80, null);  
            break;  
        case 2:  
            g.drawImage(stones[2], 220, 70, null);  
            g.drawImage(stones[2], 240, 70, null);  
            g.drawImage(stones[2], 260, 70, null);  
            g.drawImage(stones[2], 280, 70, null);  
            break;  
        case 3:  
            g.drawImage(stones[3], 250, 60, null);  
            g.drawImage(stones[3], 230, 80, null);  
            g.drawImage(stones[3], 250, 80, null);  
            g.drawImage(stones[3], 270, 80, null);  
            break;  
        case 4:  
            g.drawImage(stones[4], 270, 60, null);  
            g.drawImage(stones[4], 230, 80, null);  
            g.drawImage(stones[4], 250, 80, null);  
            g.drawImage(stones[4], 270, 80, null);  
            break;  
        case 5:  
            g.drawImage(stones[5], 230, 60, null);  
            g.drawImage(stones[5], 230, 80, null);  
            g.drawImage(stones[5], 250, 80, null);  
            g.drawImage(stones[5], 270, 80, null);  
            break;  
        case 6:  
            g.drawImage(stones[6], 230, 60, null);  
            g.drawImage(stones[6], 250, 60, null);  
            g.drawImage(stones[6], 250, 80, null);  
            g.drawImage(stones[6], 270, 80, null);  
            break;  
        case 7:  
            g.drawImage(stones[7], 250, 60, null);  
            g.drawImage(stones[7], 270, 60, null);  
            g.drawImage(stones[7], 230, 80, null);  
            g.drawImage(stones[7], 250, 80, null);  
            break;  
        }  
    }  
    public int getNextStone() {  
        if (stoneNext == null) {  
            stoneNext = new Block((int) Math.round(Math.random() * 6) + 1);  
        }  
        return stoneNext.getBlockID();  
    }  
    public int getLines() {  
        return curLines;  
    }  
    public int getLevel() {  
        return curLevel;  
    }  
    public int getPoints() {  
        return curPoints;  
    }  
    public boolean isGameOver() {  
        return gameOver;  
    }  
    class Block {  
        private int blockID;  
        private int[][] startPosition = new int[4][2];  
        private int rotatePosition = 0;  
        public Block(int blockID) {  
            setBlockID(blockID);  
            createStone();  
        }  
        private void createStone() {  
            switch (blockID) {  
            case 1:  
                startPosition[0][0] = 4;  
                startPosition[0][1] = 2;  
                startPosition[1][0] = 5;  
                startPosition[1][1] = 2;  
                startPosition[2][0] = 4;  
                startPosition[2][1] = 3;  
                startPosition[3][0] = 5;  
                startPosition[3][1] = 3;  
                break;  
            case 2:  
                startPosition[0][0] = 5;  
                startPosition[0][1] = 0;  
                startPosition[1][0] = 5;  
                startPosition[1][1] = 1;  
                startPosition[2][0] = 5;  
                startPosition[2][1] = 2;  
                startPosition[3][0] = 5;  
                startPosition[3][1] = 3;  
                break;  
            case 3:  
                startPosition[0][0] = 5;  
                startPosition[0][1] = 2;  
                startPosition[1][0] = 4;  
                startPosition[1][1] = 3;  
                startPosition[2][0] = 5;  
                startPosition[2][1] = 3;  
                startPosition[3][0] = 6;  
                startPosition[3][1] = 3;  
                break;  
            case 4:  
                startPosition[0][0] = 4;  
                startPosition[0][1] = 1;  
                startPosition[1][0] = 4;  
                startPosition[1][1] = 2;  
                startPosition[2][0] = 4;  
                startPosition[2][1] = 3;  
                startPosition[3][0] = 5;  
                startPosition[3][1] = 3;  
                break;  
            case 5:  
                startPosition[0][0] = 5;  
                startPosition[0][1] = 1;  
                startPosition[1][0] = 5;  
                startPosition[1][1] = 2;  
                startPosition[2][0] = 5;  
                startPosition[2][1] = 3;  
                startPosition[3][0] = 4;  
                startPosition[3][1] = 3;  
                break;  
            case 6:  
                startPosition[0][0] = 5;  
                startPosition[0][1] = 1;  
                startPosition[1][0] = 4;  
                startPosition[1][1] = 2;  
                startPosition[2][0] = 5;  
                startPosition[2][1] = 2;  
                startPosition[3][0] = 4;  
                startPosition[3][1] = 3;  
                break;  
            case 7:  
                startPosition[0][0] = 4;  
                startPosition[0][1] = 1;  
                startPosition[1][0] = 4;  
                startPosition[1][1] = 2;  
                startPosition[2][0] = 5;  
                startPosition[2][1] = 2;  
                startPosition[3][0] = 5;  
                startPosition[3][1] = 3;  
                break;  
            }  
        }  
        public int[][] rotateStone(int[][] currentPosition) {  
            int[][] newPosition = new int[4][2];  
            int x, y;  
            switch (blockID) {  
            case 2:  
                if (rotatePosition == 0) {  
                    x = currentPosition[3][0];  
                    y = currentPosition[3][1];  
                    newPosition[0][0] = x - 3;  
                    newPosition[0][1] = y;  
                    newPosition[1][0] = x - 2;  
                    newPosition[1][1] = y;  
                    newPosition[2][0] = x - 1;  
                    newPosition[2][1] = y;  
                    newPosition[3][0] = x;  
                    newPosition[3][1] = y;  
                    rotatePosition = 1;  
                } else {  
                    x = currentPosition[3][0];  
                    y = currentPosition[3][1];  
                    newPosition[0][0] = x;  
                    newPosition[0][1] = y - 3;  
                    newPosition[1][0] = x;  
                    newPosition[1][1] = y - 2;  
                    newPosition[2][0] = x;  
                    newPosition[2][1] = y - 1;  
                    newPosition[3][0] = x;  
                    newPosition[3][1] = y;  
                    rotatePosition = 0;  
                }  
                return newPosition;  
            case 3:  
                if (rotatePosition == 0) {  
                    x = currentPosition[2][0];  
                    y = currentPosition[2][1];  
                    newPosition[0][0] = x;  
                    newPosition[0][1] = y - 1;  
                    newPosition[1][0] = x;  
                    newPosition[1][1] = y + 1;  
                    newPosition[2][0] = x;  
                    newPosition[2][1] = y;  
                    newPosition[3][0] = x + 1;  
                    newPosition[3][1] = y;  
                    rotatePosition = 1;  
                } else if (rotatePosition == 1) {  
                    x = currentPosition[2][0];  
                    y = currentPosition[2][1];  
                    newPosition[0][0] = x;  
                    newPosition[0][1] = y + 1;  
                    newPosition[1][0] = x - 1;  
                    newPosition[1][1] = y;  
                    newPosition[2][0] = x;  
                    newPosition[2][1] = y;  
                    newPosition[3][0] = x + 1;  
                    newPosition[3][1] = y;  
                    rotatePosition = 2;  
                } else if (rotatePosition == 2) {  
                    x = currentPosition[2][0];  
                    y = currentPosition[2][1];  
                    newPosition[0][0] = x;  
                    newPosition[0][1] = y - 1;  
                    newPosition[1][0] = x - 1;  
                    newPosition[1][1] = y;  
                    newPosition[2][0] = x;  
                    newPosition[2][1] = y;  
                    newPosition[3][0] = x;  
                    newPosition[3][1] = y + 1;  
                    rotatePosition = 3;  
                } else if (rotatePosition == 3) {  
                    x = currentPosition[2][0];  
                    y = currentPosition[2][1];  
                    newPosition[0][0] = x - 1;  
                    newPosition[0][1] = y;  
                    newPosition[1][0] = x + 1;  
                    newPosition[1][1] = y;  
                    newPosition[2][0] = x;  
                    newPosition[2][1] = y;  
                    newPosition[3][0] = x;  
                    newPosition[3][1] = y - 1;  
                    rotatePosition = 0;  
                }  
                return newPosition;  
            case 4:  
                if (rotatePosition == 0) {  
                    x = currentPosition[2][0];  
                    y = currentPosition[2][1];  
                    newPosition[0][0] = x;  
                    newPosition[0][1] = y;  
                    newPosition[1][0] = x + 1;  
                    newPosition[1][1] = y;  
                    newPosition[2][0] = x + 2;  
                    newPosition[2][1] = y;  
                    newPosition[3][0] = x + 2;  
                    newPosition[3][1] = y - 1;  
                    rotatePosition = 1;  
                } else if (rotatePosition == 1) {  
                    x = currentPosition[2][0];  
                    y = currentPosition[2][1];  
                    newPosition[0][0] = x - 1;  
                    newPosition[0][1] = y - 2;  
                    newPosition[1][0] = x;  
                    newPosition[1][1] = y - 2;  
                    newPosition[2][0] = x;  
                    newPosition[2][1] = y - 1;  
                    newPosition[3][0] = x;  
                    newPosition[3][1] = y;  
                    rotatePosition = 2;  
                } else if (rotatePosition == 2) {  
                    x = currentPosition[1][0];  
                    y = currentPosition[1][1];  
                    newPosition[0][0] = x - 2;  
                    newPosition[0][1] = y + 1;  
                    newPosition[1][0] = x - 2;  
                    newPosition[1][1] = y;  
                    newPosition[2][0] = x - 1;  
                    newPosition[2][1] = y;  
                    newPosition[3][0] = x;  
                    newPosition[3][1] = y;  
                    rotatePosition = 3;  
                } else if (rotatePosition == 3) {  
                    x = currentPosition[1][0];  
                    y = currentPosition[1][1];  
                    newPosition[0][0] = x;  
                    newPosition[0][1] = y;  
                    newPosition[1][0] = x;  
                    newPosition[1][1] = y + 1;  
                    newPosition[2][0] = x;  
                    newPosition[2][1] = y + 2;  
                    newPosition[3][0] = x + 1;  
                    newPosition[3][1] = y + 2;  
                    rotatePosition = 0;  
                }  
                return newPosition;  
            case 5:  
                if (rotatePosition == 0) {  
                    x = currentPosition[1][0];  
                    y = currentPosition[1][1];  
                    newPosition[0][0] = x - 2;  
                    newPosition[0][1] = y - 1;  
                    newPosition[1][0] = x - 1;  
                    newPosition[1][1] = y - 1;  
                    newPosition[2][0] = x;  
                    newPosition[2][1] = y - 1;  
                    newPosition[3][0] = x;  
                    newPosition[3][1] = y;  
                    rotatePosition = 1;  
                } else if (rotatePosition == 1) {  
                    x = currentPosition[0][0];  
                    y = currentPosition[0][1];  
                    newPosition[0][0] = x;  
                    newPosition[0][1] = y;  
                    newPosition[1][0] = x + 1;  
                    newPosition[1][1] = y;  
                    newPosition[2][0] = x;  
                    newPosition[2][1] = y + 1;  
                    newPosition[3][0] = x;  
                    newPosition[3][1] = y + 2;  
                    rotatePosition = 2;  
                } else if (rotatePosition == 2) {  
                    x = currentPosition[2][0];  
                    y = currentPosition[2][1];  
                    newPosition[0][0] = x;  
                    newPosition[0][1] = y;  
                    newPosition[1][0] = x;  
                    newPosition[1][1] = y + 1;  
                    newPosition[2][0] = x + 1;  
                    newPosition[2][1] = y + 1;  
                    newPosition[3][0] = x + 2;  
                    newPosition[3][1] = y + 1;  
                    rotatePosition = 3;  
                } else if (rotatePosition == 3) {  
                    x = currentPosition[2][0];  
                    y = currentPosition[2][1];  
                    newPosition[0][0] = x;  
                    newPosition[0][1] = y;  
                    newPosition[1][0] = x + 1;  
                    newPosition[1][1] = y;  
                    newPosition[2][0] = x + 1;  
                    newPosition[2][1] = y - 1;  
                    newPosition[3][0] = x + 1;  
                    newPosition[3][1] = y - 2;  
                    rotatePosition = 0;  
                }  
                return newPosition;  
            case 6:  
                if (rotatePosition == 0) {  
                    x = currentPosition[2][0];  
                    y = currentPosition[2][1];  
                    newPosition[0][0] = x - 1;  
                    newPosition[0][1] = y;  
                    newPosition[1][0] = x;  
                    newPosition[1][1] = y + 1;  
                    newPosition[2][0] = x;  
                    newPosition[2][1] = y;  
                    newPosition[3][0] = x + 1;  
                    newPosition[3][1] = y + 1;  
                    rotatePosition = 1;  
                } else {  
                    x = currentPosition[2][0];  
                    y = currentPosition[2][1];  
                    newPosition[0][0] = x;  
                    newPosition[0][1] = y - 1;  
                    newPosition[1][0] = x - 1;  
                    newPosition[1][1] = y;  
                    newPosition[2][0] = x;  
                    newPosition[2][1] = y;  
                    newPosition[3][0] = x - 1;  
                    newPosition[3][1] = y + 1;  
                    rotatePosition = 0;  
                }  
                return newPosition;  
            case 7:  
                if (rotatePosition == 0) {  
                    x = currentPosition[2][0];  
                    y = currentPosition[2][1];  
                    newPosition[0][0] = x - 1;  
                    newPosition[0][1] = y - 1;  
                    newPosition[1][0] = x - 1;  
                    newPosition[1][1] = y;  
                    newPosition[2][0] = x;  
                    newPosition[2][1] = y;  
                    newPosition[3][0] = x;  
                    newPosition[3][1] = y + 1;  
                    rotatePosition = 1;  
                } else {  
                    x = currentPosition[2][0];  
                    y = currentPosition[2][1];  
                    newPosition[0][0] = x + 1;  
                    newPosition[0][1] = y;  
                    newPosition[1][0] = x - 1;  
                    newPosition[1][1] = y + 1;  
                    newPosition[2][0] = x;  
                    newPosition[2][1] = y;  
                    newPosition[3][0] = x;  
                    newPosition[3][1] = y + 1;  
                    rotatePosition = 0;  
                }  
                return newPosition;  
            default:  
                return currentPosition;  
            }  
        }  
        public void noRoate() {  
            rotatePosition--;  
            if (rotatePosition == -1) {  
                rotatePosition = 3;  
            }  
        }  
        public int[][] getStartPosition() {  
            return startPosition;  
        }  
        public void setBlockID(int blockID) {  
            this.blockID = blockID;  
        }  
        public int getBlockID() {  
            return blockID;  
        }  
    }  

package org.loon.game.test;
import java.awt.Graphics2D;
import java.awt.Image;
/**
 *
 * Copyright 2008 - 2009
 *
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not
 * use this file except in compliance with the License. You may obtain a copy of
 * the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 * License for the specific language governing permissions and limitations under
 * the License.
 *
 * @project loonframework
 * @author chenpeng
 * @email:ceponline@yahoo.com.cn
 * @version 0.1
 */
public class TetrisField {
 private Block stoneCurrent;
 private Block stoneNext;
 private int[][] stonePosition;
 private int[][] gameFieldStones;
 private int curLines = 0, curLevel = 1, curPoints = 0, row, col;
 private boolean gameOver = false;
 public TetrisField(int row, int col) {
  int i = 0;
  int j = 0;
  this.row = row;
  this.col = col;
  stonePosition = new int[4][2];
  gameFieldStones = new int[row][col];
  for (i = 0; i < row; i++) {
   for (j = 0; j < col; j++) {
    gameFieldStones[i][j] = 0;
   }
  }
 }
 public int getCol() {
  return col;
 }
 public int getRow() {
  return row;
 }
 public void createCurrentStone(int NextStoneID) {
  stoneCurrent = stoneNext;
  createNextStone(NextStoneID);
  stonePosition = stoneCurrent.getStartPosition();
  if (gameFieldStones[5][4] != 0) {
   gameOver = true;
  }
  setCurrentStonePosition(stonePosition);
 }
 public void createNextStone(int stoneID) {
  stoneNext = new Block(stoneID);
 }
 public void setCurrentStonePosition(int[][] StoneNewPosition) {
  int i;
  for (i = 0; i < 4; i++) {
   gameFieldStones[StoneNewPosition[i][0]][StoneNewPosition[i][1]] = stoneCurrent
     .getBlockID();
  }
 }
 public void setCurrentStonePosition(int[][] StoneNewPosition,
   int[][] StoneOldPosition) {
  int i;
  for (i = 0; i < 4; i++) {
   gameFieldStones[StoneOldPosition[i][0]][StoneOldPosition[i][1]] = 0;
  }
  for (i = 0; i < 4; i++) {
   gameFieldStones[StoneNewPosition[i][0]][StoneNewPosition[i][1]] = stoneCurrent
     .getBlockID();
  }
  stonePosition = StoneNewPosition;
 }
 public boolean incrementPositionY(boolean isThread) {
  int i;
  int[][] StoneNewPosition = new int[4][2];
  int canStart = 0;
  for (i = 0; i < 4; i++) {
   if (stonePosition[i][1] > 3) {
    canStart = 1;
   }
  }
  if (canStart == 1 || isThread) {
   for (i = 0; i < 4; i++) {
    StoneNewPosition[i][1] = stonePosition[i][1] + 1;
    StoneNewPosition[i][0] = stonePosition[i][0];
   }
   if (!hasCollision(StoneNewPosition)) {
    setCurrentStonePosition(StoneNewPosition, stonePosition);
    return true;
   } else {
    setCurrentStonePosition(stonePosition);
    return false;
   }
  }
  return false;
 }
 public void rightPositionX() {
  int i;
  int[][] StoneNewPosition = new int[4][2];
  int canStart = 0;
  for (i = 0; i < 4; i++) {
   if (stonePosition[i][1] > 3) {
    canStart = 1;
   }
  }
  if (canStart == 1) {
   for (i = 0; i < 4; i++) {
    StoneNewPosition[i][1] = stonePosition[i][1];
    StoneNewPosition[i][0] = stonePosition[i][0] + 1;
   }
   if (!hasCollision(StoneNewPosition)) {
    setCurrentStonePosition(StoneNewPosition, stonePosition);
   } else {
    setCurrentStonePosition(stonePosition);
   }
  }
 }
 public void leftPositionX() {
  int i;
  int[][] StoneNewPosition = new int[4][2];
  int canStart = 0;
  for (i = 0; i < 4; i++) {
   if (stonePosition[i][1] > 3) {
    canStart = 1;
   }
  }
  if (canStart == 1) {
   for (i = 0; i < 4; i++) {
    StoneNewPosition[i][1] = stonePosition[i][1];
    StoneNewPosition[i][0] = stonePosition[i][0] - 1;
   }
   if (!hasCollision(StoneNewPosition)) {
    setCurrentStonePosition(StoneNewPosition, stonePosition);
   } else {
    setCurrentStonePosition(stonePosition);
   }
  }
 }
 public void rotateStone() {
  int[][] StoneNewPosition = new int[4][2];
  StoneNewPosition = stoneCurrent.rotateStone(stonePosition);
  if (!hasCollision(StoneNewPosition)) {
   setCurrentStonePosition(StoneNewPosition, stonePosition);
  } else {
   stoneCurrent.noRoate();
   setCurrentStonePosition(stonePosition);
  }
 }
 public boolean hasCollision(int[][] StoneNewPosition) {
  int i;
  for (i = 0; i < 4; i++) {
   gameFieldStones[stonePosition[i][0]][stonePosition[i][1]] = 0;
  }
  for (i = 0; i < 4; i++) {
   if (StoneNewPosition[i][0] < 0) {
    return true;
   } else if (StoneNewPosition[i][0] == row) {
    return true;
   } else if (StoneNewPosition[i][1] == col) {
    return true;
   } else if (gameFieldStones[StoneNewPosition[i][0]][StoneNewPosition[i][1]] != 0) {
    return true;
   }
  }
  return false;
 }
 public boolean hasLines() {
  int i = 0;
  int j = 0;
  int[] lines = new int[4];
  int Quantity = 0;
  boolean isLine = false;
  for (i = 3; i < col; i++) {
   for (j = 0; j < row; j++) {
    isLine = true;
    if (gameFieldStones[j][i] == 0) {
     isLine = false;
     break;
    }
   }
   if (isLine == true) {
    lines[Quantity] = i;
    Quantity++;
   }
  }
  if (Quantity > 0) {
   int[][] TempGameField = new int[row][col];
   int sum = 0;
   curLines += Quantity;
   curLevel = Math.round(curLines / row) + 1;
   //最大等级为20
   if (curLevel > 20) {
    curLevel = 20;
   }
   curPoints += Math.pow((row * curLevel), Quantity);
   for (i = col - 1; i > 3; i--) {
    for (j = 0; j < row; j++) {
     isLine = true;
     if (gameFieldStones[j][i] == 0) {
      isLine = false;
      break;
     }
    }
    if (isLine == false) {
     for (j = 0; j < row; j++) {
      TempGameField[j][i + sum] = gameFieldStones[j][i];
     }
    } else {
     sum++;
    }
   }
   for (i = 0; i < 4; i++) {
    for (j = 0; j < row; j++) {
     TempGameField[j][i] = gameFieldStones[j][i];
    }
   }
   gameFieldStones = TempGameField;
   return true;
  } else {
   return false;
  }
 }
 public int[][] getStonePosition() {
  return gameFieldStones;
 }
 public void draw(Graphics2D g, Image[] stones) {
  int nextStone = getNextStone();
  switch (nextStone) {
  case 1:
   g.drawImage(stones[1], 240, 60, null);
   g.drawImage(stones[1], 260, 60, null);
   g.drawImage(stones[1], 240, 80, null);
   g.drawImage(stones[1], 260, 80, null);
   break;
  case 2:
   g.drawImage(stones[2], 220, 70, null);
   g.drawImage(stones[2], 240, 70, null);
   g.drawImage(stones[2], 260, 70, null);
   g.drawImage(stones[2], 280, 70, null);
   break;
  case 3:
   g.drawImage(stones[3], 250, 60, null);
   g.drawImage(stones[3], 230, 80, null);
   g.drawImage(stones[3], 250, 80, null);
   g.drawImage(stones[3], 270, 80, null);
   break;
  case 4:
   g.drawImage(stones[4], 270, 60, null);
   g.drawImage(stones[4], 230, 80, null);
   g.drawImage(stones[4], 250, 80, null);
   g.drawImage(stones[4], 270, 80, null);
   break;
  case 5:
   g.drawImage(stones[5], 230, 60, null);
   g.drawImage(stones[5], 230, 80, null);
   g.drawImage(stones[5], 250, 80, null);
   g.drawImage(stones[5], 270, 80, null);
   break;
  case 6:
   g.drawImage(stones[6], 230, 60, null);
   g.drawImage(stones[6], 250, 60, null);
   g.drawImage(stones[6], 250, 80, null);
   g.drawImage(stones[6], 270, 80, null);
   break;
  case 7:
   g.drawImage(stones[7], 250, 60, null);
   g.drawImage(stones[7], 270, 60, null);
   g.drawImage(stones[7], 230, 80, null);
   g.drawImage(stones[7], 250, 80, null);
   break;
  }
 }
 public int getNextStone() {
  if (stoneNext == null) {
   stoneNext = new Block((int) Math.round(Math.random() * 6) + 1);
  }
  return stoneNext.getBlockID();
 }
 public int getLines() {
  return curLines;
 }
 public int getLevel() {
  return curLevel;
 }
 public int getPoints() {
  return curPoints;
 }
 public boolean isGameOver() {
  return gameOver;
 }
 class Block {
  private int blockID;
  private int[][] startPosition = new int[4][2];
  private int rotatePosition = 0;
  public Block(int blockID) {
   setBlockID(blockID);
   createStone();
  }
  private void createStone() {
   switch (blockID) {
   case 1:
    startPosition[0][0] = 4;
    startPosition[0][1] = 2;
    startPosition[1][0] = 5;
    startPosition[1][1] = 2;
    startPosition[2][0] = 4;
    startPosition[2][1] = 3;
    startPosition[3][0] = 5;
    startPosition[3][1] = 3;
    break;
   case 2:
    startPosition[0][0] = 5;
    startPosition[0][1] = 0;
    startPosition[1][0] = 5;
    startPosition[1][1] = 1;
    startPosition[2][0] = 5;
    startPosition[2][1] = 2;
    startPosition[3][0] = 5;
    startPosition[3][1] = 3;
    break;
   case 3:
    startPosition[0][0] = 5;
    startPosition[0][1] = 2;
    startPosition[1][0] = 4;
    startPosition[1][1] = 3;
    startPosition[2][0] = 5;
    startPosition[2][1] = 3;
    startPosition[3][0] = 6;
    startPosition[3][1] = 3;
    break;
   case 4:
    startPosition[0][0] = 4;
    startPosition[0][1] = 1;
    startPosition[1][0] = 4;
    startPosition[1][1] = 2;
    startPosition[2][0] = 4;
    startPosition[2][1] = 3;
    startPosition[3][0] = 5;
    startPosition[3][1] = 3;
    break;
   case 5:
    startPosition[0][0] = 5;
    startPosition[0][1] = 1;
    startPosition[1][0] = 5;
    startPosition[1][1] = 2;
    startPosition[2][0] = 5;
    startPosition[2][1] = 3;
    startPosition[3][0] = 4;
    startPosition[3][1] = 3;
    break;
   case 6:
    startPosition[0][0] = 5;
    startPosition[0][1] = 1;
    startPosition[1][0] = 4;
    startPosition[1][1] = 2;
    startPosition[2][0] = 5;
    startPosition[2][1] = 2;
    startPosition[3][0] = 4;
    startPosition[3][1] = 3;
    break;
   case 7:
    startPosition[0][0] = 4;
    startPosition[0][1] = 1;
    startPosition[1][0] = 4;
    startPosition[1][1] = 2;
    startPosition[2][0] = 5;
    startPosition[2][1] = 2;
    startPosition[3][0] = 5;
    startPosition[3][1] = 3;
    break;
   }
  }
  public int[][] rotateStone(int[][] currentPosition) {
   int[][] newPosition = new int[4][2];
   int x, y;
   switch (blockID) {
   case 2:
    if (rotatePosition == 0) {
     x = currentPosition[3][0];
     y = currentPosition[3][1];
     newPosition[0][0] = x - 3;
     newPosition[0][1] = y;
     newPosition[1][0] = x - 2;
     newPosition[1][1] = y;
     newPosition[2][0] = x - 1;
     newPosition[2][1] = y;
     newPosition[3][0] = x;
     newPosition[3][1] = y;
     rotatePosition = 1;
    } else {
     x = currentPosition[3][0];
     y = currentPosition[3][1];
     newPosition[0][0] = x;
     newPosition[0][1] = y - 3;
     newPosition[1][0] = x;
     newPosition[1][1] = y - 2;
     newPosition[2][0] = x;
     newPosition[2][1] = y - 1;
     newPosition[3][0] = x;
     newPosition[3][1] = y;
     rotatePosition = 0;
    }
    return newPosition;
   case 3:
    if (rotatePosition == 0) {
     x = currentPosition[2][0];
     y = currentPosition[2][1];
     newPosition[0][0] = x;
     newPosition[0][1] = y - 1;
     newPosition[1][0] = x;
     newPosition[1][1] = y + 1;
     newPosition[2][0] = x;
     newPosition[2][1] = y;
     newPosition[3][0] = x + 1;
     newPosition[3][1] = y;
     rotatePosition = 1;
    } else if (rotatePosition == 1) {
     x = currentPosition[2][0];
     y = currentPosition[2][1];
     newPosition[0][0] = x;
     newPosition[0][1] = y + 1;
     newPosition[1][0] = x - 1;
     newPosition[1][1] = y;
     newPosition[2][0] = x;
     newPosition[2][1] = y;
     newPosition[3][0] = x + 1;
     newPosition[3][1] = y;
     rotatePosition = 2;
    } else if (rotatePosition == 2) {
     x = currentPosition[2][0];
     y = currentPosition[2][1];
     newPosition[0][0] = x;
     newPosition[0][1] = y - 1;
     newPosition[1][0] = x - 1;
     newPosition[1][1] = y;
     newPosition[2][0] = x;
     newPosition[2][1] = y;
     newPosition[3][0] = x;
     newPosition[3][1] = y + 1;
     rotatePosition = 3;
    } else if (rotatePosition == 3) {
     x = currentPosition[2][0];
     y = currentPosition[2][1];
     newPosition[0][0] = x - 1;
     newPosition[0][1] = y;
     newPosition[1][0] = x + 1;
     newPosition[1][1] = y;
     newPosition[2][0] = x;
     newPosition[2][1] = y;
     newPosition[3][0] = x;
     newPosition[3][1] = y - 1;
     rotatePosition = 0;
    }
    return newPosition;
   case 4:
    if (rotatePosition == 0) {
     x = currentPosition[2][0];
     y = currentPosition[2][1];
     newPosition[0][0] = x;
     newPosition[0][1] = y;
     newPosition[1][0] = x + 1;
     newPosition[1][1] = y;
     newPosition[2][0] = x + 2;
     newPosition[2][1] = y;
     newPosition[3][0] = x + 2;
     newPosition[3][1] = y - 1;
     rotatePosition = 1;
    } else if (rotatePosition == 1) {
     x = currentPosition[2][0];
     y = currentPosition[2][1];
     newPosition[0][0] = x - 1;
     newPosition[0][1] = y - 2;
     newPosition[1][0] = x;
     newPosition[1][1] = y - 2;
     newPosition[2][0] = x;
     newPosition[2][1] = y - 1;
     newPosition[3][0] = x;
     newPosition[3][1] = y;
     rotatePosition = 2;
    } else if (rotatePosition == 2) {
     x = currentPosition[1][0];
     y = currentPosition[1][1];
     newPosition[0][0] = x - 2;
     newPosition[0][1] = y + 1;
     newPosition[1][0] = x - 2;
     newPosition[1][1] = y;
     newPosition[2][0] = x - 1;
     newPosition[2][1] = y;
     newPosition[3][0] = x;
     newPosition[3][1] = y;
     rotatePosition = 3;
    } else if (rotatePosition == 3) {
     x = currentPosition[1][0];
     y = currentPosition[1][1];
     newPosition[0][0] = x;
     newPosition[0][1] = y;
     newPosition[1][0] = x;
     newPosition[1][1] = y + 1;
     newPosition[2][0] = x;
     newPosition[2][1] = y + 2;
     newPosition[3][0] = x + 1;
     newPosition[3][1] = y + 2;
     rotatePosition = 0;
    }
    return newPosition;
   case 5:
    if (rotatePosition == 0) {
     x = currentPosition[1][0];
     y = currentPosition[1][1];
     newPosition[0][0] = x - 2;
     newPosition[0][1] = y - 1;
     newPosition[1][0] = x - 1;
     newPosition[1][1] = y - 1;
     newPosition[2][0] = x;
     newPosition[2][1] = y - 1;
     newPosition[3][0] = x;
     newPosition[3][1] = y;
     rotatePosition = 1;
    } else if (rotatePosition == 1) {
     x = currentPosition[0][0];
     y = currentPosition[0][1];
     newPosition[0][0] = x;
     newPosition[0][1] = y;
     newPosition[1][0] = x + 1;
     newPosition[1][1] = y;
     newPosition[2][0] = x;
     newPosition[2][1] = y + 1;
     newPosition[3][0] = x;
     newPosition[3][1] = y + 2;
     rotatePosition = 2;
    } else if (rotatePosition == 2) {
     x = currentPosition[2][0];
     y = currentPosition[2][1];
     newPosition[0][0] = x;
     newPosition[0][1] = y;
     newPosition[1][0] = x;
     newPosition[1][1] = y + 1;
     newPosition[2][0] = x + 1;
     newPosition[2][1] = y + 1;
     newPosition[3][0] = x + 2;
     newPosition[3][1] = y + 1;
     rotatePosition = 3;
    } else if (rotatePosition == 3) {
     x = currentPosition[2][0];
     y = currentPosition[2][1];
     newPosition[0][0] = x;
     newPosition[0][1] = y;
     newPosition[1][0] = x + 1;
     newPosition[1][1] = y;
     newPosition[2][0] = x + 1;
     newPosition[2][1] = y - 1;
     newPosition[3][0] = x + 1;
     newPosition[3][1] = y - 2;
     rotatePosition = 0;
    }
    return newPosition;
   case 6:
    if (rotatePosition == 0) {
     x = currentPosition[2][0];
     y = currentPosition[2][1];
     newPosition[0][0] = x - 1;
     newPosition[0][1] = y;
     newPosition[1][0] = x;
     newPosition[1][1] = y + 1;
     newPosition[2][0] = x;
     newPosition[2][1] = y;
     newPosition[3][0] = x + 1;
     newPosition[3][1] = y + 1;
     rotatePosition = 1;
    } else {
     x = currentPosition[2][0];
     y = currentPosition[2][1];
     newPosition[0][0] = x;
     newPosition[0][1] = y - 1;
     newPosition[1][0] = x - 1;
     newPosition[1][1] = y;
     newPosition[2][0] = x;
     newPosition[2][1] = y;
     newPosition[3][0] = x - 1;
     newPosition[3][1] = y + 1;
     rotatePosition = 0;
    }
    return newPosition;
   case 7:
    if (rotatePosition == 0) {
     x = currentPosition[2][0];
     y = currentPosition[2][1];
     newPosition[0][0] = x - 1;
     newPosition[0][1] = y - 1;
     newPosition[1][0] = x - 1;
     newPosition[1][1] = y;
     newPosition[2][0] = x;
     newPosition[2][1] = y;
     newPosition[3][0] = x;
     newPosition[3][1] = y + 1;
     rotatePosition = 1;
    } else {
     x = currentPosition[2][0];
     y = currentPosition[2][1];
     newPosition[0][0] = x + 1;
     newPosition[0][1] = y;
     newPosition[1][0] = x - 1;
     newPosition[1][1] = y + 1;
     newPosition[2][0] = x;
     newPosition[2][1] = y;
     newPosition[3][0] = x;
     newPosition[3][1] = y + 1;
     rotatePosition = 0;
    }
    return newPosition;
   default:
    return currentPosition;
   }
  }
  public void noRoate() {
   rotatePosition--;
   if (rotatePosition == -1) {
    rotatePosition = 3;
   }
  }
  public int[][] getStartPosition() {
   return startPosition;
  }
  public void setBlockID(int blockID) {
   this.blockID = blockID;
  }
  public int getBlockID() {
   return blockID;
  }
 }
}
 

view plaincopy to clipboardprint?
package org.loon.game.test;  
import java.awt.Color;  
import java.awt.Graphics2D;  
import java.awt.Image;  
import java.awt.event.KeyEvent;  
import java.awt.event.MouseEvent;  
import org.loon.framework.game.simple.GameScene;  
import org.loon.framework.game.simple.core.Deploy;  
import org.loon.framework.game.simple.core.LTimer;  
import org.loon.framework.game.simple.core.LTimerContext;  
import org.loon.framework.game.simple.core.Screen;  
import org.loon.framework.game.simple.utils.GraphicsUtils;  
/** 
 * Copyright 2008 - 2009 
 *  
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not 
 * use this file except in compliance with the License. You may obtain a copy of 
 * the License at 
 *  
 * http://www.apache.org/licenses/LICENSE-2.0 
 *  
 * Unless required by applicable law or agreed to in writing, software 
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 
 * License for the specific language governing permissions and limitations under 
 * the License. 
 *  
 * @project loonframework 
 * @author chenpeng 
 * @email��ceponline@yahoo.com.cn 
 * @version 0.1 
 */ 
public class Main extends Screen {  
    private int curLevel = 1, blockSize = 20;  
    private boolean gameStart;  
    private final static Color emptyColor = new Color(120, 120, 190, 90),  
            gridColor = new Color(255, 255, 255, 25);  
    private LTimer delay;  
    private TetrisField gameField;  
    private Image[] stones = new Image[8];  
    private Image background, styleImage;  
    public int positionX;  
    public int positionY;  
    public Main() {  
        // 背景图  
        background = GraphicsUtils.loadImage("images/background2.jpg");  
        // 装饰图  
        styleImage = GraphicsUtils.loadImage("images/metalayer.png");  
        // 获得俄罗斯方块小图  
        Image[] blocks = GraphicsUtils.getSplitImages("images/block.png",  
                blockSize, blockSize);  
        for (int i = 0; i < blocks.length; i++) {  
            stones[i + 1] = blocks[i];  
        }  
        setBackground(background);  
        delay = new LTimer(100);  
    }  
    public void initialize() {  
        gameStart = true;  
        // 默认游戏区域(网格)大小为横10,竖24  
        gameField = new TetrisField(10, 24);  
        gameField.createNextStone(((int) Math.round(Math.random() * 6) + 1));  
        gameField.createCurrentStone(((int) Math.round(Math.random() * 6) + 1));  
    }  
    public void alter(LTimerContext timer) {  
        // 自动计时  
        if (delay.action(timer.getTimeSinceLastUpdate())) {  
            // 已初始化并且非游戏失败  
            if (gameStart && !gameField.isGameOver()) {  
                if (!gameField.incrementPositionY(true)) {  
                    gameField.createCurrentStone(((int) Math.round(Math  
                            .random() * 6) + 1));  
                    if (gameField.hasLines()) {  
                        curLevel = gameField.getLevel();  
                    }  
                }  
                delay.setDelay(300 / curLevel);  
            }  
        }  
    }  
    /** 
     * 绘制游戏画面 
     */ 
    public void draw(Graphics2D g) {  
        if (gameStart) {  
            int x, y;  
            // 默认游戏区域(网格)大小为横10,竖24  
            int[][] arrayStones = gameField.getStonePosition();  
            for (x = 0; x < gameField.getRow(); x++) {  
                for (y = 0; y < gameField.getCol(); y++) {  
                    g.setColor(emptyColor);  
                    g.fillRect(x * blockSize, y * blockSize, blockSize, blockSize);  
                    g.setColor(gridColor);  
                    g.drawRect(x * blockSize, y * blockSize, blockSize, blockSize);  
                    if (arrayStones[x][y] != 0) {  
                        g.drawImage(stones[arrayStones[x][y]], x * blockSize, y * blockSize,  
                                null);  
                    }  
                }  
            }  
            if (gameField.isGameOver()) {  
                g.setColor(Color.white);  
                g.drawString("GAME OVER", 120, 160);  
                return;  
            }  
            g.drawImage(styleImage, 210, 30, null);  
            // 绘制游戏方块  
            gameField.draw(g, stones);  
            g.setColor(Color.white);  
            g.drawString("等级:" + Integer.toString(gameField.getLevel()), 240,  
                    220);  
            g.drawString("消层:" + Integer.toString(gameField.getLines()), 240,  
                    260);  
            g.drawString("得分:" + Integer.toString(gameField.getPoints()), 240,  
                    300);  
        } else {  
            g.setColor(Color.white);  
            g.drawString("GAME START", 110, 160);  
            g.drawString("请按下 [ENTER]", 105, 200);  
        }  
    }  
    /** 
     * 点击鼠标 
     */ 
    public void leftClick(MouseEvent e) {  
    }  
    public void middleClick(MouseEvent e) {  
    }  
    public void rightClick(MouseEvent e) {  
    }  
    /** 
     * 点击键盘 
     */ 
    public void onKey(KeyEvent e) {  
        int key = e.getKeyCode();  
        if (gameStart) {  
            // 转换方向  
            if (key == KeyEvent.VK_UP) {  
                gameField.rotateStone();  
                // 向右  
            } else if (key == KeyEvent.VK_RIGHT) {  
                gameField.rightPositionX();  
                // 向左  
            } else if (key == KeyEvent.VK_LEFT) {  
                gameField.leftPositionX();  
                // 加速向下  
            } else if (key == KeyEvent.VK_DOWN) {  
                gameField.incrementPositionY(true);  
                // 重启游戏  
            } else if (key == KeyEvent.VK_ESCAPE) {  
                if (gameField != null && gameField.isGameOver()) {  
                    initialize();  
                }  
            }  
        } else {  
            // 开始游戏  
            if (key == KeyEvent.VK_ENTER) {  
                initialize();  
            }  
        }  
    }  
    public void onKeyUp(KeyEvent e) {  
    }  
    public static void main(String[] args) {  
        GameScene frame = new GameScene("俄罗斯方块", 320, 480);  
        Deploy deploy = frame.getDeploy();  
        deploy.setScreen(new Main());  
        deploy.setShowFPS(true);  
        deploy.setLogo(false);  
        deploy.setFPS(100);  
        deploy.mainLoop();  
        frame.showFrame();  
    }  

package org.loon.game.test;
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.event.KeyEvent;
import java.awt.event.MouseEvent;
import org.loon.framework.game.simple.GameScene;
import org.loon.framework.game.simple.core.Deploy;
import org.loon.framework.game.simple.core.LTimer;
import org.loon.framework.game.simple.core.LTimerContext;
import org.loon.framework.game.simple.core.Screen;
import org.loon.framework.game.simple.utils.GraphicsUtils;
/**
 * Copyright 2008 - 2009
 *
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not
 * use this file except in compliance with the License. You may obtain a copy of
 * the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 * License for the specific language governing permissions and limitations under
 * the License.
 *
 * @project loonframework
 * @author chenpeng
 * @email��ceponline@yahoo.com.cn
 * @version 0.1
 */
public class Main extends Screen {
 private int curLevel = 1, blockSize = 20;
 private boolean gameStart;
 private final static Color emptyColor = new Color(120, 120, 190, 90),
   gridColor = new Color(255, 255, 255, 25);
 private LTimer delay;
 private TetrisField gameField;
 private Image[] stones = new Image[8];
 private Image background, styleImage;
 public int positionX;
 public int positionY;
 public Main() {
  // 背景图
  background = GraphicsUtils.loadImage("images/background2.jpg");
  // 装饰图
  styleImage = GraphicsUtils.loadImage("images/metalayer.png");
  // 获得俄罗斯方块小图
  Image[] blocks = GraphicsUtils.getSplitImages("images/block.png",
    blockSize, blockSize);
  for (int i = 0; i < blocks.length; i++) {
   stones[i + 1] = blocks[i];
  }
  setBackground(background);
  delay = new LTimer(100);
 }
 public void initialize() {
  gameStart = true;
  // 默认游戏区域(网格)大小为横10,竖24
  gameField = new TetrisField(10, 24);
  gameField.createNextStone(((int) Math.round(Math.random() * 6) + 1));
  gameField.createCurrentStone(((int) Math.round(Math.random() * 6) + 1));
 }
 public void alter(LTimerContext timer) {
  // 自动计时
  if (delay.action(timer.getTimeSinceLastUpdate())) {
   // 已初始化并且非游戏失败
   if (gameStart && !gameField.isGameOver()) {
    if (!gameField.incrementPositionY(true)) {
     gameField.createCurrentStone(((int) Math.round(Math
       .random() * 6) + 1));
     if (gameField.hasLines()) {
      curLevel = gameField.getLevel();
     }
    }
    delay.setDelay(300 / curLevel);
   }
  }
 }
 /**
  * 绘制游戏画面
  */
 public void draw(Graphics2D g) {
  if (gameStart) {
   int x, y;
   // 默认游戏区域(网格)大小为横10,竖24
   int[][] arrayStones = gameField.getStonePosition();
   for (x = 0; x < gameField.getRow(); x++) {
    for (y = 0; y < gameField.getCol(); y++) {
     g.setColor(emptyColor);
     g.fillRect(x * blockSize, y * blockSize, blockSize, blockSize);
     g.setColor(gridColor);
     g.drawRect(x * blockSize, y * blockSize, blockSize, blockSize);
     if (arrayStones[x][y] != 0) {
      g.drawImage(stones[arrayStones[x][y]], x * blockSize, y * blockSize,
        null);
     }
    }
   }
   if (gameField.isGameOver()) {
    g.setColor(Color.white);
    g.drawString("GAME OVER", 120, 160);
    return;
   }
   g.drawImage(styleImage, 210, 30, null);
   // 绘制游戏方块
   gameField.draw(g, stones);
   g.setColor(Color.white);
   g.drawString("等级:" + Integer.toString(gameField.getLevel()), 240,
     220);
   g.drawString("消层:" + Integer.toString(gameField.getLines()), 240,
     260);
   g.drawString("得分:" + Integer.toString(gameField.getPoints()), 240,
     300);
  } else {
   g.setColor(Color.white);
   g.drawString("GAME START", 110, 160);
   g.drawString("请按下 [ENTER]", 105, 200);
  }
 }
 /**
  * 点击鼠标
  */
 public void leftClick(MouseEvent e) {
 }
 public void middleClick(MouseEvent e) {
 }
 public void rightClick(MouseEvent e) {
 }
 /**
  * 点击键盘
  */
 public void onKey(KeyEvent e) {
  int key = e.getKeyCode();
  if (gameStart) {
   // 转换方向
   if (key == KeyEvent.VK_UP) {
    gameField.rotateStone();
    // 向右
   } else if (key == KeyEvent.VK_RIGHT) {
    gameField.rightPositionX();
    // 向左
   } else if (key == KeyEvent.VK_LEFT) {
    gameField.leftPositionX();
    // 加速向下
   } else if (key == KeyEvent.VK_DOWN) {
    gameField.incrementPositionY(true);
    // 重启游戏
   } else if (key == KeyEvent.VK_ESCAPE) {
    if (gameField != null && gameField.isGameOver()) {
     initialize();
    }
   }
  } else {
   // 开始游戏
   if (key == KeyEvent.VK_ENTER) {
    initialize();
   }
  }
 }
 public void onKeyUp(KeyEvent e) {
 }
 public static void main(String[] args) {
  GameScene frame = new GameScene("俄罗斯方块", 320, 480);
  Deploy deploy = frame.getDeploy();
  deploy.setScreen(new Main());
  deploy.setShowFPS(true);
  deploy.setLogo(false);
  deploy.setFPS(100);
  deploy.mainLoop();
  frame.showFrame();
 }
}
 

 

然后,是Android版的(TetrisField部分除Image与Graphics2D外完全一致,故不再粘贴):

view plaincopy to clipboardprint?
package org.loon.framework.android.game;  
import android.graphics.Color;  
import android.view.KeyEvent;  
import android.view.MotionEvent;  
/** 
 *  
 * Copyright 2008 - 2009 
 *  
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not 
 * use this file except in compliance with the License. You may obtain a copy of 
 * the License at 
 *  
 * http://www.apache.org/licenses/LICENSE-2.0 
 *  
 * Unless required by applicable law or agreed to in writing, software 
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 
 * License for the specific language governing permissions and limitations under 
 * the License. 
 *  
 * @project loonframework 
 * @author chenpeng 
 * @email:ceponline@yahoo.com.cn 
 * @version 0.1 
 */ 
public class ScreenTest2 extends LAScreen {  
    private int curLevel = 1, blockSize = 20;  
    private boolean gameStart;  
    private final static int emptyColor = Color.argb(90, 120, 120, 190),  
            gridColor = Color.argb(25, 255, 255, 255);  
    private LTimer delay;  
    private TetrisField gameField;  
    private LAImage[] stones = new LAImage[8];  
    private LAImage background, styleImage;  
    public int positionX;  
    public int positionY;  
    public ScreenTest2() {  
        // 背景图  
        background = getLAImage("background2.jpg");  
        // 装饰图  
        styleImage = getLAImage("metalayer.png");  
        // 获得俄罗斯方块小图  
        LAImage[] blocks = getSplitLAImages("block.png", blockSize,  
                blockSize);  
        for (int i = 0; i < blocks.length; i++) {  
            stones[i + 1] = blocks[i];  
        }  
        delay = new LTimer(100);  
    }  
    public void initialize() {  
        gameStart = true;  
        // 默认游戏区域(网格)大小为横10,竖24  
        gameField = new TetrisField(10, 24);  
        gameField.createNextStone(((int) Math.round(Math.random() * 6) + 1));  
        gameField.createCurrentStone(((int) Math.round(Math.random() * 6) + 1));  
    }  
    public void alter(LTimerContext timer) {  
        // 自动计时  
        if (delay.action(timer.getTimeSinceLastUpdate())) {  
            // 已初始化并且非游戏失败  
            if (gameStart && !gameField.isGameOver()) {  
                if (!gameField.incrementPositionY(true)) {  
                    gameField.createCurrentStone(((int) Math.round(Math  
                            .random() * 6) + 1));  
                    if (gameField.hasLines()) {  
                        curLevel = gameField.getLevel();  
                    }  
                }  
                delay.setDelay(300 / curLevel);  
            }  
        }  
    }  
    /** 
     * 绘制拼图 
     */ 
    public void draw(LAGraphics g) {  
        g.drawImage(background, 0, 0);  
        if (gameStart) {  
            int x, y;  
            // 默认游戏区域(网格)大小为横10,竖24  
            int[][] arrayStones = gameField.getStonePosition();  
            for (x = 0; x < gameField.getRow(); x++) {  
                for (y = 0; y < gameField.getCol(); y++) {  
                    g.setColor(emptyColor);  
                    g.fillRect(x * blockSize, y * blockSize, blockSize,  
                            blockSize);  
                    g.setColor(gridColor);  
                    g.drawRect(x * blockSize, y * blockSize, blockSize,  
                            blockSize);  
                    if (arrayStones[x][y] != 0) {  
                        g.setAlpha(1.0F);  
                        g.drawImage(stones[arrayStones[x][y]], x * blockSize, y  
                                * blockSize);  
                    }  
                }  
            }  
            g.setAlpha(1.0F);  
            if (gameField.isGameOver()) {  
                g.setColor(Color.WHITE);  
                g.drawString("GAME OVER", 120, 160);  
                return;  
            }  
            g.drawImage(styleImage, 210, 30);  
            // 绘制游戏方块  
            gameField.draw(g, stones);  
            g.setColor(Color.WHITE);  
            g.drawString("等级:" + Integer.toString(gameField.getLevel()), 240,  
                    220);  
            g.drawString("消层:" + Integer.toString(gameField.getLines()), 240,  
                    260);  
            g.drawString("得分:" + Integer.toString(gameField.getPoints()), 240,  
                    300);  
        } else {  
            g.setColor(Color.WHITE);  
            g.drawString("GAME START", 110, 160);  
            g.drawString("请按下 [ENTER]", 105, 200);  
        }  
    }  
    /** 
     * 点击触摸屏 
     */ 
    public boolean onTouchDown(MotionEvent e) {  
        return false;  
    }  
    /** 
     * 点击按键 
     */ 
    public boolean onKeyDown(int keyCode, KeyEvent e) {  
        int key = e.getKeyCode();  
        if (gameStart) {  
            // 转换方向  
            if (key == KeyEvent.KEYCODE_DPAD_UP) {  
                gameField.rotateStone();  
                // 向右  
            } else if (key == KeyEvent.KEYCODE_DPAD_RIGHT) {  
                gameField.rightPositionX();  
                // 向左  
            } else if (key == KeyEvent.KEYCODE_DPAD_LEFT) {  
                gameField.leftPositionX();  
                // 加速向下  
            } else if (key == KeyEvent.KEYCODE_DPAD_DOWN) {  
                gameField.incrementPositionY(true);  
                // 重启游戏  
            } else if (key == KeyEvent.KEYCODE_ENTER) {  
                if (gameField != null && gameField.isGameOver()) {  
                    initialize();  
                }  
            }  
        } else {  
            // 开始游戏  
            if (key == KeyEvent.KEYCODE_ENTER) {  
                initialize();  
            }  
        }  
        return false;  
    }  
    public boolean onKeyUp(int keyCode, KeyEvent e) {  
        return false;  
    }  
    public boolean onTouchMove(MotionEvent e) {  
        return false;  
    }  
    public boolean onTouchUp(MotionEvent e) {  
        return false;  
    }  

package org.loon.framework.android.game;
import android.graphics.Color;
import android.view.KeyEvent;
import android.view.MotionEvent;
/**
 *
 * Copyright 2008 - 2009
 *
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not
 * use this file except in compliance with the License. You may obtain a copy of
 * the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 * License for the specific language governing permissions and limitations under
 * the License.
 *
 * @project loonframework
 * @author chenpeng
 * @email:ceponline@yahoo.com.cn
 * @version 0.1
 */
public class ScreenTest2 extends LAScreen {
 private int curLevel = 1, blockSize = 20;
 private boolean gameStart;
 private final static int emptyColor = Color.argb(90, 120, 120, 190),
   gridColor = Color.argb(25, 255, 255, 255);
 private LTimer delay;
 private TetrisField gameField;
 private LAImage[] stones = new LAImage[8];
 private LAImage background, styleImage;
 public int positionX;
 public int positionY;
 public ScreenTest2() {
  // 背景图
  background = getLAImage("background2.jpg");
  // 装饰图
  styleImage = getLAImage("metalayer.png");
  // 获得俄罗斯方块小图
  LAImage[] blocks = getSplitLAImages("block.png", blockSize,
    blockSize);
  for (int i = 0; i < blocks.length; i++) {
   stones[i + 1] = blocks[i];
  }
  delay = new LTimer(100);
 }
 public void initialize() {
  gameStart = true;
  // 默认游戏区域(网格)大小为横10,竖24
  gameField = new TetrisField(10, 24);
  gameField.createNextStone(((int) Math.round(Math.random() * 6) + 1));
  gameField.createCurrentStone(((int) Math.round(Math.random() * 6) + 1));
 }
 public void alter(LTimerContext timer) {
  // 自动计时
  if (delay.action(timer.getTimeSinceLastUpdate())) {
   // 已初始化并且非游戏失败
   if (gameStart && !gameField.isGameOver()) {
    if (!gameField.incrementPositionY(true)) {
     gameField.createCurrentStone(((int) Math.round(Math
       .random() * 6) + 1));
     if (gameField.hasLines()) {
      curLevel = gameField.getLevel();
     }
    }
    delay.setDelay(300 / curLevel);
   }
  }
 }
 /**
  * 绘制拼图
  */
 public void draw(LAGraphics g) {
  g.drawImage(background, 0, 0);
  if (gameStart) {
   int x, y;
   // 默认游戏区域(网格)大小为横10,竖24
   int[][] arrayStones = gameField.getStonePosition();
   for (x = 0; x < gameField.getRow(); x++) {
    for (y = 0; y < gameField.getCol(); y++) {
     g.setColor(emptyColor);
     g.fillRect(x * blockSize, y * blockSize, blockSize,
       blockSize);
     g.setColor(gridColor);
     g.drawRect(x * blockSize, y * blockSize, blockSize,
       blockSize);
     if (arrayStones[x][y] != 0) {
      g.setAlpha(1.0F);
      g.drawImage(stones[arrayStones[x][y]], x * blockSize, y
        * blockSize);
     }
    }
   }
   g.setAlpha(1.0F);
   if (gameField.isGameOver()) {
    g.setColor(Color.WHITE);
    g.drawString("GAME OVER", 120, 160);
    return;
   }
   g.drawImage(styleImage, 210, 30);
   // 绘制游戏方块
   gameField.draw(g, stones);
   g.setColor(Color.WHITE);
   g.drawString("等级:" + Integer.toString(gameField.getLevel()), 240,
     220);
   g.drawString("消层:" + Integer.toString(gameField.getLines()), 240,
     260);
   g.drawString("得分:" + Integer.toString(gameField.getPoints()), 240,
     300);
  } else {
   g.setColor(Color.WHITE);
   g.drawString("GAME START", 110, 160);
   g.drawString("请按下 [ENTER]", 105, 200);
  }
 }
 /**
  * 点击触摸屏
  */
 public boolean onTouchDown(MotionEvent e) {
  return false;
 }
 /**
  * 点击按键
  */
 public boolean onKeyDown(int keyCode, KeyEvent e) {
  int key = e.getKeyCode();
  if (gameStart) {
   // 转换方向
   if (key == KeyEvent.KEYCODE_DPAD_UP) {
    gameField.rotateStone();
    // 向右
   } else if (key == KeyEvent.KEYCODE_DPAD_RIGHT) {
    gameField.rightPositionX();
    // 向左
   } else if (key == KeyEvent.KEYCODE_DPAD_LEFT) {
    gameField.leftPositionX();
    // 加速向下
   } else if (key == KeyEvent.KEYCODE_DPAD_DOWN) {
    gameField.incrementPositionY(true);
    // 重启游戏
   } else if (key == KeyEvent.KEYCODE_ENTER) {
    if (gameField != null && gameField.isGameOver()) {
     initialize();
    }
   }
  } else {
   // 开始游戏
   if (key == KeyEvent.KEYCODE_ENTER) {
    initialize();
   }
  }
  return false;
 }
 public boolean onKeyUp(int keyCode, KeyEvent e) {
  return false;
 }
 public boolean onTouchMove(MotionEvent e) {
  return false;
 }
 public boolean onTouchUp(MotionEvent e) {
  return false;
 }
}
 

 

示例源码下载地址: http://code.google.com/p/loon-simple/downloads/list

与前面的实例一样,都是先在PC上通过LGame-Simple调好,而后做函数替换移植到Android,写PC版用了一个小时,移植过去5分钟不到,吼吼吼……

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/cping1982/archive/2009/10/19/4700361.aspx

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值