程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> J2ME游戲代碼示例——俄羅斯方塊(2)

J2ME游戲代碼示例——俄羅斯方塊(2)

編輯:關於JAVA

* 繪制當前下落的方塊

* @param g 畫筆
   */
   public void paintBrick(Graphics g){
        for(int row = 0;row < 4;row++){
            for(int col = 0;col < 4;col++){
                 //判斷是否繪制
                 if(brick[brickType][index][row][col] == 1){
                      int cx = (cCol + col) * CELLWIDTH;
                      int cy = (cRow + row) * CELLWIDTH;
                      paintCell(g,cx,cy);
                 }
            }
        }
   }
   /**下一個方塊左上角的x坐標*/
   int nextBrickX = 110;
   /**下一個方塊左上角的y坐標*/
   int nextBrickY = 30;
   /**下一個方塊文字*/
   String str = "下一個方塊";
   /**

* 繪制下一個方塊

* @param g 畫筆
   */
   public void paintNextBrick(Graphics g){
        //繪制文字
        g.drawString(str, nextBrickX, nextBrickY,
                 Graphics.LEFT | Graphics.TOP);
        //繪制方塊
        for(int row = 0;row < 4;row++){
            for(int col = 0;col < 4;col++){
                 //判斷是否繪制
                 if(brick[nextBrickType][0][row][col] == 1){
                      int cx =nextBrickX+ col * CELLWIDTH;
                      int cy =nextBrickY + 20 + row * CELLWIDTH;
                      paintCell(g,cx,cy);
                 }
            }
        }
   }
   String scoreStr = "當前得分:";
   /**

* 繪制游戲得分和關卡

* @param g 畫筆
   */
   public void paintLevelAndScore(Graphics g){
        //繪制得分
        g.drawString(scoreStr,nextBrickX,100,
                 Graphics.TOP | Graphics.LEFT);
        g.drawString(String.valueOf(score), nextBrickX, 115,
                 Graphics.LEFT | Graphics.TOP);
        //繪制關卡
        g.drawString("第" + level + "關", nextBrickX, 150,
                 Graphics.TOP | Graphics.LEFT);
   }
   /**

* 方塊下落

*/
   public void brickDown(){
        //達到底部
        if(reachBottom()){
            addBrickToMap();
            //System.out.println("添加到界面成功");
            gernerateBrick();
            //System.out.println(1);
            //清除滿行
            clearAllFullRow();
        }else{
            cRow++;
            //是否和地圖數據重疊
            if(collisWithMap()){
                 //後退一行
                 cRow--;
                 //添加到地圖中
                 addBrickToMap();
                 //產生新的方塊
                 gernerateBrick();
                 //清除滿行
                 clearAllFullRow();
            }
        }
   }
   /**

* 隨機產生方塊

*/
   public void gernerateBrick(){
        //把下一個方塊的類型賦值給當前方塊
        brickType = nextBrickType;
        //生成下一個的類型
        nextBrickType = Math.abs(r.nextInt() % brick.length);
        //初始化數據
        index = 0;
        //位置
        cRow = -3;
        cCol = 3;
   }
   /**

* 判斷方塊是否下落到游戲區域底部

* @return true代表下落到底部
   */
   private boolean reachBottom(){
        int tempRow = getBottomNotEmptyRow();
        //是否是最後一行
        if(cRow + tempRow >= MAXROW - 1){
            return true;
        }else{
            return false;
        }
   }
   /**

* 添加方塊到地圖數據

*/
   private void addBrickToMap(){
        for(int i = 0;i < 4;i++){
            for(int j = 0;j < 4;j++){
                 //判斷數據未超出地圖邊界
                 if(((cCol+j) >= 0) &&
                          ((cCol + j < MAXCOL)) &&
                          ((cRow + i < MAXROW))){
                      //不添加0的數據
                      if(brick[brickType][index][i][j] == 1){
                          map[cRow + i][cCol + j] =
                               brick[brickType][index][i][j];
                      }
                 }
            }
        }
   }

/**

* 方塊變形

*/
   public void changeShape(){
        //變形到下一種形狀
        index++;
        if(index == brick[brickType].length){
            index = 0;
        }
        //變形以後的位置是否超出邊界
        if(testNewPosition()){
            index--;//退回原來的形狀
        }
        if(index < 0){
            index = brick[brickType].length - 1;
        }
   }
   /**

* 方塊向左移動

* 原則是:方塊左側的第一行非空列貼近邊界
   */
   public void moveToLeft(){
       cCol--;
        //如果新的位置不可用
       if(testNewPosition()){
             cCol++;
       }
   }
   /**

* 獲得方塊左側的非空列的序號

* @return
   */
   private int getLeftNotEmptyLine(){
        for(int col = 0;col < 4;col++){
            for(int row = 0;row < 4;row++){
                 if(brick[brickType][index][row][col] == 1){
                      return col;
                 }
            }
        }
        return 0;
   }
   /**

* 方塊向右移動

*/
   public void moveToRight(){
         cCol++;
        //如果新的位置不可用
         if(testNewPosition()){
              cCol--;
        }
   }
   /**

* 獲得方塊右側第一個非空列的序號

* @return 非空列的序號
   */
   private int getRightNotEmptyLine(){
        for(int col = 3;col >= 0;col--){
            for(int row = 0;row < 4;row++){
                 if(brick[brickType][index][row][col] == 1){
                      return col;
                 }
            }
        }
        return 3;
   }
   /**

* 方塊底部的第一個非空行的行號

* @return 行號
   */
   private int getBottomNotEmptyRow(){
        for(int row = 3;row >= 0;row--){
            for(int col = 0;col < 4;col++){
                 if(brick[brickType][index][row][col] == 1){
                      //System.out.println("底部非空行:" + row);
                      return row;
                 }
            }
        }
        return 3;
   }
   /**

* 測試新的位置是否可用

* @return true代表不可用,false代表可用
   */
   private boolean testNewPosition(){
        //左側
        if((getLeftNotEmptyLine() + cCol) < 0){
            return true;
        }
        //右側
        if(cCol + getRightNotEmptyLine() > MAXCOL - 1){
            return true;
        }
        //下邊界
        if(getBottomNotEmptyRow() + cRow >= MAXROW - 1){
            System.out.println(222);
            return true;
        }
        //是否和地圖重合
        if(collisWithMap()){
            return true;
        }
        return false;
   }
   /**

* 是否和已有的方塊疊加

* @return true代表疊加,false代表未疊加
   */
   private boolean collisWithMap(){
        for(int col = 0;col < 4;col++){
            for(int row = 3;row >= 0;row--){
                 //有格子
                 if(brick[brickType][index][row][col] == 1){
                      //下標未越界
                      if((cRow +row >= 0) && (cRow + row <= MAXROW - 1) &&
                               (cCol + col >= 0) && (cCol + col <= MAXCOL - 1)){
                          //判別地圖數據
                          if(map[cRow + row][cCol + col] == 1){ //重疊
                               return true;
                          }else{
                               break;
                          }
                      }
                 }
            }
        }
        return false;
   }
   /**

* 清除滿行

*/
   private void clearAllFullRow(){
        for(int row = MAXROW - 1;row >= 0;row--){
            //如果是滿行
            if(isFullRow(row)){
                 //增加積分
                 score += 10;
                 //消當前行
                 clearOneFullRow(row);
                 row++; //繼續處理當前行
            }
        }
   }
   /**

* 判斷是否是滿行

* @param row 行號
   * @return true代表是滿行,false代表不是滿行
   */
   private boolean isFullRow(int row){
        int count = 0;
        for(int col = 0;col < MAXCOL;col++){
            if(map[row][col] == 1){
                 count++;
            }
        }
        if(count == MAXCOL){
            return true;
        }else{
            return false;
        }
   }
   /**

* 消掉一個滿行

* @param row 需要消的行號
   */
   private void clearOneFullRow(int row){
        //上面的行全部下落
        for(int i = row - 1;i >= 0;i--){//循環上面所有的行
            for(int col = 0;col < MAXCOL;col++){
                 //下落
                 map[i + 1][col] = map[i][col];
            }
        }
        //把第一行數據全部初始化為空
        for(int col = 0;col < MAXCOL;col++){
            map[0][col] = 0;
        }
   }
   /**

* 游戲是否結束

* @return true代表結束,false代表未結束
   */
   public boolean isGameOver(){
        //下一個位置是否和地圖數據重合
        cRow++;
        if(collisWithMap()){
            cRow--; //還原位置
            //判斷屏幕第一行以上是否有數據
            if(cRow < 0){
                 for(int row = 0;row < 4;row++){
                      for(int col = 0;col < 4;col++){
                          if(row + cRow >= 0){
                               break;
                          }else{ //屏幕上面的行
                               if(brick[brickType][index][row][col] == 1){
                                    return true;
                               }
                          }
                      }
                 }
            }
        }else{
            cRow--;
        }
        return false;
   }
   /**

* 高速下落,速度是正常速度的2倍

*/
   public void highSpeed(){
        times = 5;
   }
   /**
   * 正常速度
   */
   public void normalSpeed(){
        times = 1;
   }
}

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved