[Java] 只有335行的完整俄罗斯方块Java代码 →→→→→进入此内容的聊天室

来自 , 2020-04-27, 写在 Java, 查看 154 次.
URL http://www.code666.cn/view/a6a767bb
  1. import java.awt.*;
  2. import java.awt.event.ActionEvent;
  3. import java.awt.event.ActionListener;
  4. import java.awt.event.KeyEvent;
  5. import java.awt.event.KeyListener;
  6. import javax.swing.*;
  7. import javax.swing.Timer;
  8.  
  9.  
  10. public class Tetris extends JFrame {
  11.     public Tetris() {
  12.         Tetrisblok a = new Tetrisblok();
  13.         addKeyListener(a);
  14.         add(a);
  15.     }
  16.  
  17.  
  18.     public static void main(String[] args) {
  19.         Tetris frame = new Tetris();
  20.         JMenuBar menu = new JMenuBar();
  21.         frame.setJMenuBar(menu);
  22.         JMenu game = new JMenu("游戏");
  23.         JMenuItem newgame = game.add("新游戏");
  24.         JMenuItem pause = game.add("暂停");
  25.         JMenuItem goon = game.add("继续");
  26.         JMenuItem exit = game.add("退出");
  27.         JMenu help = new JMenu("帮助");
  28.         JMenuItem about = help.add("关于");
  29.         menu.add(game);
  30.         menu.add(help);
  31.         frame.setLocationRelativeTo(null);
  32.         frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  33.         frame.setSize(220, 275);
  34.         frame.setTitle("Tetris内测版");
  35.         // frame.setUndecorated(true);
  36.         frame.setVisible(true);
  37.         frame.setResizable(false);
  38.  
  39.  
  40.     }
  41. }
  42.  
  43.  
  44. // 创建一个俄罗斯方块类
  45. class Tetrisblok extends JPanel implements KeyListener {
  46.  
  47.  
  48.     // blockType 代表方块类型
  49.     // turnState代表方块状态
  50.     private int blockType;
  51.     private int score = 0;
  52.  
  53.  
  54.     private int turnState;
  55.  
  56.  
  57.     private int x;
  58.  
  59.  
  60.     private int y;
  61.  
  62.  
  63.     private int i = 0;
  64.  
  65.  
  66.     int j = 0;
  67.     int flag = 0;
  68.     // 定义已经放下的方块x=0-11,y=0-21;
  69.     int[][] map = new int[13][23];
  70.  
  71.  
  72.     // 方块的形状 第一组代表方块类型有S、Z、L、J、I、O、T 7种 第二组 代表旋转几次 第三四组为 方块矩阵
  73.     private final int shapes[][][] = new int[][][] {
  74.     // i
  75.             { { 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0 },
  76.                     { 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0 },
  77.                     { 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0 },
  78.                     { 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0 } },
  79.             // s
  80.             { { 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
  81.                     { 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0 },
  82.                     { 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
  83.                     { 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0 } },
  84.             // z
  85.             { { 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
  86.                     { 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0 },
  87.                     { 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
  88.                     { 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0 } },
  89.             // j
  90.             { { 0, 1, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0 },
  91.                     { 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
  92.                     { 1, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0 },
  93.                     { 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 } },
  94.             // o
  95.             { { 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
  96.                     { 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
  97.                     { 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
  98.                     { 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } },
  99.             // l
  100.             { { 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0 },
  101.                     { 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
  102.                     { 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0 },
  103.                     { 0, 0, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 } },
  104.             // t
  105.             { { 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
  106.                     { 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0 },
  107.                     { 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
  108.                     { 0, 1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0 } } };
  109.  
  110.  
  111.     // 生成新方块的方法
  112.     public void newblock() {
  113.         blockType = (int) (Math.random() * 1000) % 7;
  114.         turnState = (int) (Math.random() * 1000) % 4;
  115.         x = 4;
  116.         y = 0;
  117.         if (gameover(x, y) == 1) {
  118.  
  119.  
  120.             newmap();
  121.             drawwall();
  122.             score = 0;
  123.             JOptionPane.showMessageDialog(null, "GAME OVER");
  124.         }
  125.     }
  126.  
  127.  
  128.     // 画围墙
  129.     public void drawwall() {
  130.         for (i = 0; i < 12; i++) {
  131.             map[i][21] = 2;
  132.         }
  133.         for (j = 0; j < 22; j++) {
  134.             map[11][j] = 2;
  135.             map[0][j] = 2;
  136.         }
  137.     }
  138.  
  139.  
  140.     // 初始化地图
  141.     public void newmap() {
  142.         for (i = 0; i < 12; i++) {
  143.             for (j = 0; j < 22; j++) {
  144.                 map[i][j] = 0;
  145.             }
  146.         }
  147.     }
  148.  
  149.  
  150.     // 初始化构造方法
  151.     Tetrisblok() {
  152.         newblock();
  153.         newmap();
  154.         drawwall();
  155.         Timer timer = new Timer(1000, new TimerListener());
  156.         timer.start();
  157.     }
  158.  
  159.  
  160.     // 旋转的方法
  161.     public void turn() {
  162.         int tempturnState = turnState;
  163.         turnState = (turnState + 1) % 4;
  164.         if (blow(x, y, blockType, turnState) == 1) {
  165.         }
  166.         if (blow(x, y, blockType, turnState) == 0) {
  167.             turnState = tempturnState;
  168.         }
  169.         repaint();
  170.     }
  171.  
  172.  
  173.     // 左移的方法
  174.     public void left() {
  175.         if (blow(x - 1, y, blockType, turnState) == 1) {
  176.             x = x - 1;
  177.         }
  178.         ;
  179.         repaint();
  180.     }
  181.  
  182.  
  183.     // 右移的方法
  184.     public void right() {
  185.         if (blow(x + 1, y, blockType, turnState) == 1) {
  186.             x = x + 1;
  187.         }
  188.         ;
  189.         repaint();
  190.     }
  191.  
  192.  
  193.     // 下落的方法
  194.     public void down() {
  195.         if (blow(x, y + 1, blockType, turnState) == 1) {
  196.             y = y + 1;
  197.             delline();
  198.         }
  199.         ;
  200.         if (blow(x, y + 1, blockType, turnState) == 0) {
  201.             add(x, y, blockType, turnState);
  202.             newblock();
  203.             delline();
  204.         }
  205.         ;
  206.         repaint();
  207.     }
  208.  
  209.  
  210.     // 是否合法的方法
  211.     public int blow(int x, int y, int blockType, int turnState) {
  212.         for (int a = 0; a < 4; a++) {
  213.             for (int b = 0; b < 4; b++) {
  214.                 if (((shapes[blockType][turnState][a * 4 + b] == 1) && (map[x
  215.                         + b + 1][y + a] == 1))
  216.                         || ((shapes[blockType][turnState][a * 4 + b] == 1) && (map[x
  217.                                 + b + 1][y + a] == 2))) {
  218.  
  219.  
  220.                     return 0;
  221.                 }
  222.             }
  223.         }
  224.         return 1;
  225.     }
  226.  
  227.  
  228.     // 消行的方法
  229.     public void delline() {
  230.         int c = 0;
  231.         for (int b = 0; b < 22; b++) {
  232.             for (int a = 0; a < 12; a++) {
  233.                 if (map[a][b] == 1) {
  234.  
  235.  
  236.                     c = c + 1;
  237.                     if (c == 10) {
  238.                         score += 10;
  239.                         for (int d = b; d > 0; d--) {
  240.                             for (int e = 0; e < 11; e++) {
  241.                                 map[e][d] = map[e][d - 1];
  242.  
  243.  
  244.                             }
  245.                         }
  246.                     }
  247.                 }
  248.             }
  249.             c = 0;
  250.         }
  251.     }
  252.  
  253.  
  254.     // 判断你挂的方法
  255.     public int gameover(int x, int y) {
  256.         if (blow(x, y, blockType, turnState) == 0) {
  257.             return 1;
  258.         }
  259.         return 0;
  260.     }
  261.  
  262.  
  263.     // 把当前添加map
  264.     public void add(int x, int y, int blockType, int turnState) {
  265.         int j = 0;
  266.         for (int a = 0; a < 4; a++) {
  267.             for (int b = 0; b < 4; b++) {
  268.                 if (map[x + b + 1][y + a] == 0) {
  269.                     map[x + b + 1][y + a] = shapes[blockType][turnState][j];
  270.                 }
  271.                 ;
  272.                 j++;
  273.             }
  274.         }
  275.     }
  276.  
  277.  
  278.     // 画方块的的方法
  279.     public void paintComponent(Graphics g) {
  280.         super.paintComponent(g);
  281.         // 画当前方块
  282.         for (j = 0; j < 16; j++) {
  283.             if (shapes[blockType][turnState][j] == 1) {
  284.                 g.fillRect((j % 4 + x + 1) * 10, (j / 4 + y) * 10, 10, 10);
  285.             }
  286.         }
  287.         // 画已经固定的方块
  288.         for (j = 0; j < 22; j++) {
  289.             for (i = 0; i < 12; i++) {
  290.                 if (map[i][j] == 1) {
  291.                     g.fillRect(i * 10, j * 10, 10, 10);
  292.  
  293.  
  294.                 }
  295.                 if (map[i][j] == 2) {
  296.                     g.drawRect(i * 10, j * 10, 10, 10);
  297.  
  298.  
  299.                 }
  300.             }
  301.         }
  302.         g.setFont(Font.getFont("隶书"));
  303.         g.drawString("score=" + score, 125, 10);
  304.         g.drawString("抵制不良游戏,", 125, 50);
  305.         g.drawString("拒绝盗版游戏。", 125, 70);
  306.         g.drawString("注意自我保护,", 125, 90);
  307.         g.drawString("谨防受骗上当。", 125, 110);
  308.         g.drawString("适度游戏益脑,", 125, 130);
  309.         g.drawString("沉迷游戏伤身。", 125, 150);
  310.         g.drawString("合理安排时间,", 125, 170);
  311.         g.drawString("享受健康生活。", 125, 190);
  312.     }
  313.  
  314.  
  315.     // 键盘监听
  316.     public void keyPressed(KeyEvent e) {
  317.         switch (e.getKeyCode()) {
  318.         case KeyEvent.VK_DOWN:
  319.             down();
  320.             break;
  321.         case KeyEvent.VK_UP:
  322.             turn();
  323.             break;
  324.         case KeyEvent.VK_RIGHT:
  325.             right();
  326.             break;
  327.         case KeyEvent.VK_LEFT:
  328.             left();
  329.             break;
  330.         }
  331.  
  332.  
  333.     }
  334.  
  335.  
  336.     // 无用
  337.     public void keyReleased(KeyEvent e) {
  338.     }
  339.  
  340.  
  341.     // 无用
  342.     public void keyTyped(KeyEvent e) {
  343.     }
  344.  
  345.  
  346.     // 定时器监听
  347.     class TimerListener implements ActionListener {
  348.         public void actionPerformed(ActionEvent e) {
  349.  
  350.  
  351.             repaint();
  352.             if (blow(x, y + 1, blockType, turnState) == 1) {
  353.                 y = y + 1;
  354.                 delline();
  355.             }
  356.             ;
  357.             if (blow(x, y + 1, blockType, turnState) == 0) {
  358.  
  359.  
  360.                 if (flag == 1) {
  361.                     add(x, y, blockType, turnState);
  362.                     delline();
  363.                     newblock();
  364.                     flag = 0;
  365.                 }
  366.                 flag = 1;
  367.             }
  368.             ;
  369.         }
  370.     }
  371. }
  372. //java/6422

回复 "只有335行的完整俄罗斯方块Java代码"

这儿你可以回复上面这条便签

captcha