| 注册
请输入搜索内容

热门搜索

Java Linux MySQL PHP JavaScript Hibernate jQuery Nginx
d4nd
9年前发布

java编写俄罗斯方块

Game_Box.java    //方块类  public class Game_Box{  static int[][] pattern = {  { 0x0f00, 0x4444, 0x0f00, 0x4444 },// 长条形  { 0x04e0, 0x0464, 0x00e4, 0x04c4 },//T型  { 0x4620, 0x6c00, 0x4620, 0x6c00 },//右Z型  { 0x2640, 0xc600, 0x2640, 0xc600 },//Z型  { 0x6220, 0x1700, 0x2230, 0x0740 },//L型  { 0x6440, 0x0e20, 0x44c0, 0x8e00 },//左L型  { 0x0660, 0x0660, 0x0660, 0x0660 }  //田字形  };  int blockType; // 块的模式号(0-6)  int turnState; // 块的翻转状态(0-3)  int blockState; // 块的下落状态  int row;//行  int col;//列  Game_Draw scr; //声明类型      // 块类的构造方法  Game_Box(Game_Draw game_scr) {  this.scr = game_scr;  blockType =(int)(Math.random()*7);  //turnState = (int) Math.random()*3 ;  blockState = 1;  row = game_scr.getInitRow();  col = game_scr.getInitCol();  }      // 重新初始化块,并显示新块  public void reset() {  blockType = (int)(Math.random()*7) ;//随机从7中生成一中方块  //turnState = (int) (Math.random()*3) ;  blockState = 1;  row = scr.getInitRow();  col = scr.getInitCol();  dispBlock(1);  }      // 实现“块”翻转的方法  public void leftTurn() {  if (assertValid(blockType, (turnState + 1) % 4, row, col)) {  dispBlock(0);  turnState = (turnState + 1) % 4;  dispBlock(1);  }  }      // 实现“块”的左移的方法  public void leftMove() {  if (assertValid(blockType, turnState, row, col - 1)) {  dispBlock(0);  col--;  dispBlock(1);  }  }      // 实现块的右移  public void rightMove() {  if (assertValid(blockType, turnState, row, col + 1)) {  dispBlock(0);  col++;  dispBlock(1);  }  }      // 实现块落下的操作的方法  public boolean fallDown() {  if (blockState == 2)  return false;  if (assertValid(blockType, turnState, row - 1, col)) {  dispBlock(0);  row--;  dispBlock(1);  return (true);  } else {  blockState = 2;  dispBlock(2);  return false;  }  }      // 判断是否正确的方法  boolean assertValid(int t, int s, int row, int col) {  int k =0x8000;  for (int i = 0; i < 4; i++) {  for (int j = 0; j < 4; j++) {  if ((int) (pattern[t][s] & k) != 0) {  int temp = scr.getScrArrXY(row - i, col + j);  if (temp < 0 || temp == 2)  return false;  }  k = k/2;  }  }  return true;  }      // 同步显示的方法  public synchronized void dispBlock(int s) {  int k =0x8000;  System.out.println((int) pattern[blockType][turnState]);  for (int i = 0; i < 4; i++) {  for (int j = 0; j < 4; j++) {  if (((int) pattern[blockType][turnState] & k) != 0) {  scr.drawUnit(row - i, col + j, s);  }  k = k /2;  }  }  }    }    Game_Command.java    import java.awt.event.ActionEvent;  import java.awt.event.ActionListener;      public class Game_Command implements ActionListener {      static final int button_play = 1; // 给按钮分配编号  static final int button_levelup = 2;  static final int button_leveldown = 3;  static final int button_quit = 4;  static final int button_pause = 5;  static boolean pause_resume = true;  int curButton; // 当前按钮  Game_Draw scr;      // 控制按钮类的构造方法  Game_Command(int button, Game_Draw scr) {  curButton = button;  this.scr = scr;  }      // 按钮执行方法  public void actionPerformed(ActionEvent e) {  switch (curButton) {  case 1:  if (!Game_Layout.isPlay) {  scr.initScr();  Game_Layout.isPlay = true;  Game_Layout.score = 0;  Game_Layout.scoreField.setText("0");  Game_Layout.timer.resume();  }  scr.requestFocus();  break;  case 2:  if (Game_Layout.level < 10) {  Game_Layout.level++;  Game_Layout.levelField.setText("" + Game_Layout.level);  Game_Layout.score = 0;  Game_Layout.scoreField.setText("" + Game_Layout.score);  }  scr.requestFocus();  break;  case 3:  if (Game_Layout.level > 1) {  Game_Layout.level--;  Game_Layout.levelField.setText("" + Game_Layout.level);  Game_Layout.score = 0;  Game_Layout.scoreField.setText("" + Game_Layout.score);  }  scr.requestFocus();  break;  case 4:  System.exit(0);  }  }    }    Game_Draw.java    import java.awt.Canvas;  import java.awt.Color;  import java.awt.Graphics;  import java.awt.event.KeyEvent;  import java.awt.event.KeyListener;  public class Game_Draw extends Canvas implements KeyListener{    final int unitSize = 30; // 小方块边长  int rowNum; // 正方格的行数  int columnNum; // 正方格的列数  int maxAllowRowNum; // 允许有多少行未削  int blockInitRow; // 新出现块的起始行坐标  int blockInitCol; // 新出现块的起始列坐标  int[][] scrArr; // 屏幕数组  Game_Box b=new Game_Box(this); // 对方快的引用  Game_MyTimer time;      // 画布类的构造方法  Game_Draw() {  rowNum = 15;  columnNum = 10;  maxAllowRowNum = rowNum - 2;  blockInitRow = rowNum ;  blockInitCol = columnNum -7;  scrArr = new int[32][32];  }      // 初始化屏幕,并将屏幕数组清零的方法  public void initScr() {  for (int i = 0; i < rowNum; i++)  for (int j = 0; j < columnNum; j++)  scrArr[i][j] = 0;  b.reset();  repaint();  }      // 重新刷新画布方法  public void paint(Graphics g) {  for (int i = 0; i < rowNum; i++)  for (int j = 0; j < columnNum; j++)  drawUnit(i, j, scrArr[i][j]);  }      // 画方块的方法  public void drawUnit(int row, int col, int type) {       System.out.println(getSize().height);  scrArr[row][col] = type;  Graphics g = getGraphics();  switch (type) { // 表示画方快的方法  case 0:  g.setColor(Color.BLACK);  break; // 以背景为颜色画  case 1:  g.setColor(Color.blue);  break; // 画正在下落的方块  case 2:  g.setColor(Color.GRAY);  break; // 画已经落下的方法  }  g.fill3DRect(col * unitSize, getSize().height - (row + 1) * unitSize,  unitSize, unitSize, true);  g.dispose();  }      public Game_Box getBlock() {  return b; // 返回block实例的引用  }      // 返回屏幕数组中(row,col)位置的属性值  public int getScrArrXY(int row, int col) {  if (row < 0 || row >= rowNum || col < 0 || col >= columnNum)  return (-1);  else  return (scrArr[row][col]);  }      // 返回新块的初始行坐标方法  public int getInitRow() {  return (blockInitRow); // 返回新块的初始行坐标  }      // 返回新块的初始列坐标方法  public int getInitCol() {  return (blockInitCol); // 返回新块的初始列坐标  }      // 满行删除方法  void deleteFullLine() {  int full_line_num = 0;  int k = 0;  for (int i = 0; i < rowNum; i++) {  boolean isfull = true;  for (int j = 0; j < columnNum; j++)  if (scrArr[i][j] == 0) {  k++;  isfull = false;  break ;  }  if (isfull)  full_line_num+=100;  if (k != 0 && k - 1 != i && !isfull)  for (int j = 0; j < columnNum; j++) {  if (scrArr[i][j] == 0)  drawUnit(k - 1, j, 0);  else  drawUnit(k - 1, j, 2);  scrArr[k - 1][j] = scrArr[i][j];  }  }  for (int i = k - 1; i < rowNum; i++) {  for (int j = 0; j < columnNum; j++) {  drawUnit(i, j, 0);  scrArr[i][j] = 0;  }  }  Game_Layout.score += full_line_num;  Game_Layout.scoreField.setText("" + Game_Layout.score);  }      // 判断游戏是否结束方法  boolean isGameEnd() {  for (int col = 0; col < columnNum; col++) {  if (scrArr[maxAllowRowNum][col] != 0)  return true;  }  return false;  }      public void keyTyped(KeyEvent e) {  }      public void keyReleased(KeyEvent e) {  }      // 处理键盘输入的方法  public void keyPressed(KeyEvent e) {  //boolean T=true;  if (!Game_Layout.isPlay)  return;  switch (e.getKeyCode()) {  case KeyEvent.VK_DOWN:  b.fallDown();  break;  case KeyEvent.VK_LEFT:  b.leftMove();  break;  case KeyEvent.VK_RIGHT:  b.rightMove();  break;  case KeyEvent.VK_SPACE:  b.leftTurn();  break;  }    }    }    Game_Layout.java    import java.awt.Button;  import java.awt.Dimension;  import java.awt.GridLayout;  import java.awt.Label;  import java.awt.Panel;  import java.awt.TextField;  import java.awt.event.WindowListener;  import javax.swing.JButton;  import javax.swing.JFrame;  import javax.swing.JLabel;  import javax.swing.JPanel;  public class Game_Layout extends JFrame {  public static int level = 1;  public static int score = 0;  public static TextField scoreField;  public static TextField levelField;  public static boolean isPlay = false;  public static Game_MyTimer timer;    Game_Draw gameScr=new Game_Draw();//实例主屏    // 俄罗斯方块类的构造方法  Game_Layout() {  setTitle("俄罗斯方块");  setSize(620, 480);  setLayout(new GridLayout(1, 2));//整体分为两个部分  gameScr.addKeyListener(gameScr);//就收键盘监听,监听的内容是游戏主界面  timer = new Game_MyTimer(gameScr);  timer.setDaemon(true);  timer.start();  timer.suspend();  add(gameScr);  JPanel rightScr = new JPanel();  rightScr.setLayout(new GridLayout(2, 1, 0,0));  //rightScr.setSize(120, 480);  //LeftScr.setSize(1000, 40);  add(rightScr);  //add(LeftScr);  // 右边信息窗体的布局  Game_MyPanel infoScr = new Game_MyPanel();  infoScr.setLayout(new GridLayout(4, 1, 0, 0));//4行一列 水平0 垂直5  //infoScr.setSize(120, 300);  rightScr.add(infoScr);  // 定义标签和初始值  JLabel scorep = new JLabel("分数:");  JLabel levelp = new JLabel("级数:");  scoreField = new TextField(8);//定义文本长度  levelField = new TextField(8);  scoreField.setEditable(false);//文本不可以编辑  levelField.setEditable(false);  infoScr.add(scorep);  infoScr.add(scoreField);  infoScr.add(levelp);  infoScr.add(levelField);  //scorep.setSize(10,10);  //scoreField.setSize(new Dimension(20, 60));  //levelp.setSize(new Dimension(20, 60));  //levelField.setSize(new Dimension(20, 60));  scoreField.setText("0");  levelField.setText("1");  // 右边控制按钮窗体的布局  Game_MyPanel controlScr = new Game_MyPanel(); //控制面板  controlScr.setLayout(new GridLayout(4, 1, 0, 10));//5行 1列 水平间隔为0 垂直为 5  rightScr.add(controlScr);  // 定义按钮play  JButton play_b = new JButton("开始游戏");  //play_b.setSize(new Dimension(50, 20));  play_b.addActionListener(new Game_Command(1, gameScr));  // 定义按钮Level UP  JButton level_up_b = new JButton("提高级数");  level_up_b.addActionListener(new Game_Command(2,gameScr));  // 定义按钮Level Down  JButton level_down_b = new JButton("降低级数");  level_down_b.addActionListener(new Game_Command(3,gameScr));  // 定义按钮Quit  JButton quit_b = new JButton("退出游戏");  quit_b.addActionListener(new Game_Command(4, gameScr));  controlScr.add(play_b);  controlScr.add(level_up_b);  controlScr.add(level_down_b);  //controlScr.add(pause_b);  controlScr.add(quit_b);  setVisible(true);  gameScr.requestFocus();  }  }    Game_MyPanel.java    import java.awt.Insets;  import java.awt.Panel;  class Game_MyPanel extends Panel {  public Insets getInsets() {  return new Insets(30, 60, 30, 60);//顶 左 底 右  }  }    Game_MyTime.java    public class Game_MyTimer extends Thread{      Game_Draw scr;      public Game_MyTimer(Game_Draw scr) {  this.scr = scr;  }      public void run() {  while (true) {  try {  sleep((10 - Game_Layout.level + 1) * 100);  } catch (InterruptedException e) {  }  if (!scr.getBlock().fallDown()) {  scr.deleteFullLine();  if (scr.isGameEnd()) {  Game_Layout.isPlay = false;  stop();  } else  scr.getBlock().reset();  }  }  }    }    Game_Main.java    public class Game_Main {  public static void main(String args[]){  Game_Layout ers = new Game_Layout();  }  }