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

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

編輯:J2ME
* 繪制當前下落的方塊

   * @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