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

📄 ketrismap.java

📁 手机版俄罗斯方块,结合了网上的一部分源码
💻 JAVA
字号:
/*
 * KetrisMap.java
 *
 * Created on 2007年9月20日, 下午5:45
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */

package com.j2me.game.ketris;

import javax.microedition.lcdui.*;
import java.io.IOException;
import javax.microedition.media.Manager;

import javax.microedition.media.MediaException;
import javax.microedition.media.Player;
import java.io.InputStream;

/**
 * 游戏地图,地图高16个小砖块,宽16小砖块,但是游戏容器高16,宽12(包括左右2堵墙)
 * 所以容器的内直径为10
 * <p>Title: </p>
 * <p>Description: </p>
 * <p>Copyright: Copyright (c) 2004</p>
 * <p>Company: </p>
 * @author: an unknown Japanese,Jagie
 * @version 1.0
 */

public class KetrisMap {

  //地图数据
  protected int mapdata[][];
  protected boolean mapBlockExist[]; //长度为16的boolean数组,如果mapBlockExist[i]=true,则第i+1行有砖块
  private int score; //分数
  public static final Font SCOREFONT = Font.getFont(Font.FACE_SYSTEM,
      Font.STYLE_PLAIN,
      Font.SIZE_LARGE);

  public static Player player;

  static {
  /*  try {
      InputStream is =
          KetrisMap.class.getResourceAsStream("/chimes.wav");

      player = Manager.createPlayer(is, "audio/x-wav");

    }
    catch (IOException ioe) {
      ioe.printStackTrace();
    }
    catch (MediaException me) {
      me.printStackTrace();
    }
*/
  }

  public KetrisMap() {
    mapdata = new int[16][12];
    mapBlockExist = new boolean[16];

  }

  public void init() {
    //清除计分
    score = 0;
    //先把全部元素清0
    for (int i = 0; i < 16; i++) {
      for (int j = 0; j < 12; j++) {
        mapdata[i][j] = 0;
      }
      mapBlockExist[i] = false;
    }

    //设置2堵墙
    for (int i = 0; i < 16; i++) {
      mapdata[i][0] = 8;
      mapdata[i][11] = 8;
    }

    //设置容器底
    for (int i = 0; i < 12; i++) {
      mapdata[15][i] = 8;
    }

    mapBlockExist[15] = true;
  }

  /**
   * 获取地图某行某列的数据
   * @param x int 行号
   * @param y int 列号
   * @return int 地图数据,非0表示有砖块
   */
  public int get(int x, int y) {
    int data = mapdata[y][x];

    return data;
  }

  /* 设置地图数据 */
  public void set(int x, int y, int val) {
    if (x >= 0 && y >= 0) {
      mapdata[y][x] = val;
      mapBlockExist[y] = true;
    }

  }

  /**
   * 该方法其实只负责非运动砖块
   * @param g Graphics
   */
  public void paint(Graphics g) {
    //清屏
    KetrisCanvas.clear(g);

    for (int i = 0; i < 16; i++) {
      for (int j = 0; j < 12; j++) {
        if (mapdata[i][j] == 8) {
          KetrisBlock.drawBrick(KetrisCanvas.GAMEAREA_X +
                                j * KetrisCanvas.BRICK_WIDTH,
                                KetrisCanvas.GAMEAREA_Y +
                                i * KetrisCanvas.BRICK_WIDTH, g, 7);
        }
      }
    }
  }

  public boolean check(Graphics g, int row) {
    boolean deleteFlag = false;

    //最多可以连消4行
    int tmpRowNo;
    if (row + 4 >= 15) {
      tmpRowNo = 15;
    }
    else {
      tmpRowNo = row + 4;
    }

    for (int y = row; y < tmpRowNo; y++) {
      boolean flag = true;

      for (int x = 1; x < 11; x++) {
        if (mapdata[y][x] == 0) { /* 空白区 */
          flag = false;
        }
      }

      /* 需要消行 */
      if (flag) {
        mapBlockExist[y] = false;
        for (int x = 1; x < 11; x++) {
          mapdata[y][x] = 0;
        }

        deleteRow(g, y);

        deleteFlag = true;
        //加分
        score += 10;
        paintScore(g);
        //发声
        try {
          if (player != null) {
            player.start();
          }

        }
        catch (MediaException me) {
          System.out.println("sound not availible");
        }

      }
    }

    return deleteFlag;
  }

  //删除行,只是简单的把该行置黑
  protected void deleteRow(Graphics g, int y) {
    g.setColor(KetrisCanvas.BACKGROUD);
    g.fillRect(KetrisCanvas.GAMEAREA_X + KetrisCanvas.BRICK_WIDTH,
               KetrisCanvas.GAMEAREA_Y + y * KetrisCanvas.BRICK_WIDTH,
               10 * KetrisCanvas.BRICK_WIDTH, KetrisCanvas.BRICK_WIDTH);

  }

  /* 该方法在有消去行为后调用 */
  public void repaintMap(Graphics g) {
    //从容启底开始
    for (int i = 14; i > 0; i--) {
      int tmp;

      //有砖块的行才移动
      if (mapBlockExist[i]) {
        //只有下一行为空白行才进行移动
        if (!mapBlockExist[i + 1]) {
          tmp = i + 1;

          if (!mapBlockExist[i + 2]) {
            tmp = i + 2;

            if (!mapBlockExist[i + 3]) {
              tmp = i + 3;
            }
          }
          deleteRow(g, i);
          //行复制
          for (int j = 1; j < 11; j++) {
            mapdata[tmp][j] = mapdata[i][j];
            mapdata[i][j] = 0;
          }
          mapBlockExist[i] = false;
          mapBlockExist[tmp] = true;

          drawBlock(g, tmp);
        }
      }
    }
  }

  public void drawBlock(Graphics g, int y) {
    for (int x = 1; x < 11; x++) {
      if (mapdata[y][x] != 0) {
        KetrisBlock.drawBrick(KetrisCanvas.GAMEAREA_X +
                              x * KetrisCanvas.BRICK_WIDTH,
                              KetrisCanvas.GAMEAREA_Y +
                              y * KetrisCanvas.BRICK_WIDTH, g,
                              mapdata[y][x] - 1);

      }
    }
  }

  private void paintScore(Graphics g) {
    //清除记分牌
    g.setColor(KetrisCanvas.BACKGROUD);
    g.fillRect(KetrisCanvas.GAMEAREA_X + 12 * KetrisCanvas.BRICK_WIDTH,
               KetrisCanvas.GAMEAREA_Y + 6 * KetrisCanvas.BRICK_WIDTH,
               KetrisCanvas.BRICK_WIDTH * 4, KetrisCanvas.BRICK_WIDTH * 4);
    //计分
    g.setColor(0, 255, 0);
    g.setFont(SCOREFONT);
    g.drawString("" + score,
                 KetrisCanvas.GAMEAREA_X + 14 * KetrisCanvas.BRICK_WIDTH,
                 KetrisCanvas.GAMEAREA_Y + 8 * KetrisCanvas.BRICK_WIDTH,
                 g.BASELINE | g.HCENTER);
  }

}

⌨️ 快捷键说明

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