caoyinghui

          java版俄羅斯方塊

          package com.shine;
          import java.awt.*;
          import java.awt.event.ActionEvent;
          import java.awt.event.ActionListener;
          import java.awt.event.KeyEvent;
          import java.awt.event.KeyListener;
          import javax.swing.*;
          import javax.swing.Timer;
          
          public class Tetris extends JFrame {
              public Tetris() {
                  Tetrisblok a = new Tetrisblok();
                  addKeyListener(a);
                  add(a);
              }
          
              public static void main(String[] args) {
                  Tetris frame = new Tetris();
                  JMenuBar menu = new JMenuBar();
                  frame.setJMenuBar(menu);
                  JMenu game = new JMenu("游戲");
                  JMenuItem newgame = game.add("新游戲");
                  JMenuItem pause = game.add("暫停");
                  JMenuItem goon = game.add("繼續");
                  JMenuItem exit = game.add("退出");
                  JMenu help = new JMenu("幫助");
                  JMenuItem about = help.add("關于");
                  menu.add(game);
                  menu.add(help);
                  frame.setLocationRelativeTo(null);
                  frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                  frame.setSize(220, 275);
                  frame.setTitle("Tetris內測版");
                  // frame.setUndecorated(true);
                  frame.setVisible(true);
                  frame.setResizable(false);
          
              }
          }
          
          // 創建一個俄羅斯方塊類
          class Tetrisblok extends JPanel implements KeyListener {
          
              // blockType 代表方塊類型
              // turnState代表方塊狀態
              private int blockType;
              private int score = 0;
          
              private int turnState;
          
              private int x;
          
              private int y;
          
              private int i = 0;
          
              int j = 0;
              int flag = 0;
              // 定義已經放下的方塊x=0-11,y=0-21;
              int[][] map = new int[13][23];
          
              // 方塊的形狀 第一組代表方塊類型有S、Z、L、J、I、O、T 7種 第二組 代表旋轉幾次 第三四組為 方塊矩陣
              private final int shapes[][][] = new int[][][] {
              // i
                      { { 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0 },
                              { 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0 },
                              { 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0 },
                              { 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0 } },
                      // s
                      { { 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
                              { 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0 },
                              { 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
                              { 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0 } },
                      // z
                      { { 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
                              { 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0 },
                              { 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
                              { 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0 } },
                      // j
                      { { 0, 1, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0 },
                              { 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
                              { 1, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0 },
                              { 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 } },
                      // o
                      { { 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
                              { 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
                              { 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
                              { 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } },
                      // l
                      { { 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0 },
                              { 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
                              { 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0 },
                              { 0, 0, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 } },
                      // t
                      { { 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
                              { 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0 },
                              { 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
                              { 0, 1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0 } } };
          
              // 生成新方塊的方法
              public void newblock() {
                  blockType = (int) (Math.random() * 1000) % 7;
                  turnState = (int) (Math.random() * 1000) % 4;
                  x = 4;
                  y = 0;
                  if (gameover(x, y) == 1) {
          
                      newmap();
                      drawwall();
                      score = 0;
                      JOptionPane.showMessageDialog(null, "GAME OVER");
                  }
              }
          
              // 畫圍墻
              public void drawwall() {
                  for (i = 0; i < 12; i++) {
                      map[i][21] = 2;
                  }
                  for (j = 0; j < 22; j++) {
                      map[11][j] = 2;
                      map[0][j] = 2;
                  }
              }
          
              // 初始化地圖
              public void newmap() {
                  for (i = 0; i < 12; i++) {
                      for (j = 0; j < 22; j++) {
                          map[i][j] = 0;
                      }
                  }
              }
          
              // 初始化構造方法
              Tetrisblok() {
                  newblock();
                  newmap();
                  drawwall();
                  Timer timer = new Timer(1000, new TimerListener());
                  timer.start();
              }
          
              // 旋轉的方法
              public void turn() {
                  int tempturnState = turnState;
                  turnState = (turnState + 1) % 4;
                  if (blow(x, y, blockType, turnState) == 1) {
                  }
                  if (blow(x, y, blockType, turnState) == 0) {
                      turnState = tempturnState;
                  }
                  repaint();
              }
          
              // 左移的方法
              public void left() {
                  if (blow(x - 1, y, blockType, turnState) == 1) {
                      x = x - 1;
                  }
                  ;
                  repaint();
              }
          
              // 右移的方法
              public void right() {
                  if (blow(x + 1, y, blockType, turnState) == 1) {
                      x = x + 1;
                  }
                  ;
                  repaint();
              }
          
              // 下落的方法
              public void down() {
                  if (blow(x, y + 1, blockType, turnState) == 1) {
                      y = y + 1;
                      delline();
                  }
                  ;
                  if (blow(x, y + 1, blockType, turnState) == 0) {
                      add(x, y, blockType, turnState);
                      newblock();
                      delline();
                  }
                  ;
                  repaint();
              }
          
              // 是否合法的方法
              public int blow(int x, int y, int blockType, int turnState) {
                  for (int a = 0; a < 4; a++) {
                      for (int b = 0; b < 4; b++) {
                          if (((shapes[blockType][turnState][a * 4 + b] == 1) && (map[x
                                  + b + 1][y + a] == 1))
                                  || ((shapes[blockType][turnState][a * 4 + b] == 1) && (map[x
                                          + b + 1][y + a] == 2))) {
          
                              return 0;
                          }
                      }
                  }
                  return 1;
              }
          
              // 消行的方法
              public void delline() {
                  int c = 0;
                  for (int b = 0; b < 22; b++) {
                      for (int a = 0; a < 12; a++) {
                          if (map[a][b] == 1) {
          
                              c = c + 1;
                              if (c == 10) {
                                  score += 10;
                                  for (int d = b; d > 0; d--) {
                                      for (int e = 0; e < 11; e++) {
                                          map[e][d] = map[e][d - 1];
          
                                      }
                                  }
                              }
                          }
                      }
                      c = 0;
                  }
              }
          
              // 判斷你掛的方法
              public int gameover(int x, int y) {
                  if (blow(x, y, blockType, turnState) == 0) {
                      return 1;
                  }
                  return 0;
              }
          
              // 把當前添加map
              public void add(int x, int y, int blockType, int turnState) {
                  int j = 0;
                  for (int a = 0; a < 4; a++) {
                      for (int b = 0; b < 4; b++) {
                          if (map[x + b + 1][y + a] == 0) {
                              map[x + b + 1][y + a] = shapes[blockType][turnState][j];
                          }
                          ;
                          j++;
                      }
                  }
              }
          
              // 畫方塊的的方法
              public void paintComponent(Graphics g) {
                  super.paintComponent(g);
                  // 畫當前方塊
                  for (j = 0; j < 16; j++) {
                      if (shapes[blockType][turnState][j] == 1) {
                          g.fillRect((j % 4 + x + 1) * 10, (j / 4 + y) * 10, 10, 10);
                      }
                  }
                  // 畫已經固定的方塊
                  for (j = 0; j < 22; j++) {
                      for (i = 0; i < 12; i++) {
                          if (map[i][j] == 1) {
                              g.fillRect(i * 10, j * 10, 10, 10);
          
                          }
                          if (map[i][j] == 2) {
                              g.drawRect(i * 10, j * 10, 10, 10);
          
                          }
                      }
                  }
                  g.drawString("score=" + score, 125, 10);
                  g.drawString("抵制不良游戲,", 125, 50);
                  g.drawString("拒絕盜版游戲。", 125, 70);
                  g.drawString("注意自我保護,", 125, 90);
                  g.drawString("謹防受騙上當。", 125, 110);
                  g.drawString("適度游戲益腦,", 125, 130);
                  g.drawString("沉迷游戲傷身。", 125, 150);
                  g.drawString("合理安排時間,", 125, 170);
                  g.drawString("享受健康生活。", 125, 190);
              }
          
              // 鍵盤監聽
              public void keyPressed(KeyEvent e) {
                  switch (e.getKeyCode()) {
                  case KeyEvent.VK_DOWN:
                      down();
                      break;
                  case KeyEvent.VK_UP:
                      turn();
                      break;
                  case KeyEvent.VK_RIGHT:
                      right();
                      break;
                  case KeyEvent.VK_LEFT:
                      left();
                      break;
                  }
          
              }
          
              // 無用
              public void keyReleased(KeyEvent e) {
              }
          
              // 無用
              public void keyTyped(KeyEvent e) {
              }
          
              // 定時器監聽
              class TimerListener implements ActionListener {
                  public void actionPerformed(ActionEvent e) {
          
                      repaint();
                      if (blow(x, y + 1, blockType, turnState) == 1) {
                          y = y + 1;
                          delline();
                      }
                      ;
                      if (blow(x, y + 1, blockType, turnState) == 0) {
          
                          if (flag == 1) {
                              add(x, y, blockType, turnState);
                              delline();
                              newblock();
                              flag = 0;
                          }
                          flag = 1;
                      }
                      ;
                  }
              }
          }
          ?轉自CSDN

          已有 0 人發表留言,猛擊->>這里<<-參與討論


          ITeye推薦



          posted on 2011-09-08 17:30 shine_panda 閱讀(175) 評論(0)  編輯  收藏


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          <2011年9月>
          28293031123
          45678910
          11121314151617
          18192021222324
          2526272829301
          2345678

          導航

          統計

          常用鏈接

          留言簿

          隨筆檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 年辖:市辖区| 台州市| 宁津县| 大港区| 泰兴市| 裕民县| 揭阳市| 大田县| 宜丰县| 东方市| 米脂县| 武夷山市| 定日县| 巴里| 叶城县| 昌黎县| 泊头市| 湟源县| 遵义县| 梁平县| 宜阳县| 修文县| 江山市| 科尔| 西平县| 永修县| 富川| 禹城市| 平罗县| 太康县| 和田县| 天长市| 安多县| 乌海市| 汨罗市| 罗平县| 保定市| 临海市| 洪湖市| 龙山县| 商城县|