[Java] java俄罗斯方块 →→→→→进入此内容的聊天室

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

回复 "java俄罗斯方块"

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

captcha