A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© pzfpang449 中级黑马   /  2013-2-9 14:02  /  2293 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

有人说过
写代码不但要勤,要沉迷进去,更重要的是要有感动,有感动,就能写出精彩动人的代码。写代码要融入感情,它才生动鲜活起来,才能入神!不然再怎么写,都不能到最高境界,充其量也不过是个机器。这是玄妙而又实实在在的存在。

这个人说的好。。写的代码也帮。。向他学习


  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. public class Tetris extends JFrame {
  9.     public Tetris() {
  10.         Tetrisblok a = new Tetrisblok();
  11.         addKeyListener(a);
  12.         add(a);
  13.     }

  14.     public static void main(String[] args) {
  15.         Tetris frame = new Tetris();
  16.         JMenuBar menu = new JMenuBar();
  17.         frame.setJMenuBar(menu);
  18.         JMenu game = new JMenu("游戏");
  19.         JMenuItem newgame = game.add("新游戏");
  20.         JMenuItem pause = game.add("暂停");
  21.         JMenuItem goon = game.add("继续");
  22.         JMenuItem exit = game.add("退出");
  23.         JMenu help = new JMenu("帮助");
  24.         JMenuItem about = help.add("关于");
  25.         menu.add(game);
  26.         menu.add(help);
  27.         frame.setLocationRelativeTo(null);
  28.         frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  29.         frame.setSize(220, 275);
  30.         frame.setTitle("Tetris内测版");
  31.         // frame.setUndecorated(true);
  32.         frame.setVisible(true);
  33.         frame.setResizable(false);

  34.     }
  35. }

  36. // 创建一个俄罗斯方块类
  37. class Tetrisblok extends JPanel implements KeyListener {

  38.     // blockType 代表方块类型
  39.     // turnState代表方块状态
  40.     private int blockType;
  41.     private int score = 0;

  42.     private int turnState;

  43.     private int x;

  44.     private int y;

  45.     private int i = 0;

  46.     int j = 0;
  47.     int flag = 0;
  48.     // 定义已经放下的方块x=0-11,y=0-21;
  49.     int[][] map = new int[13][23];

  50.     // 方块的形状 第一组代表方块类型有S、Z、L、J、I、O、T 7种 第二组 代表旋转几次 第三四组为 方块矩阵
  51.     private final int shapes[][][] = new int[][][] {
  52.     // i
  53.             { { 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0 },
  54.                     { 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0 },
  55.                     { 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0 },
  56.                     { 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0 } },
  57.             // s
  58.             { { 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
  59.                     { 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0 },
  60.                     { 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
  61.                     { 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0 } },
  62.             // z
  63.             { { 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
  64.                     { 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0 },
  65.                     { 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
  66.                     { 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0 } },
  67.             // j
  68.             { { 0, 1, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0 },
  69.                     { 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
  70.                     { 1, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0 },
  71.                     { 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 } },
  72.             // o
  73.             { { 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
  74.                     { 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
  75.                     { 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
  76.                     { 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } },
  77.             // l
  78.             { { 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0 },
  79.                     { 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
  80.                     { 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0 },
  81.                     { 0, 0, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 } },
  82.             // t
  83.             { { 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
  84.                     { 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0 },
  85.                     { 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
  86.                     { 0, 1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0 } } };

  87.     // 生成新方块的方法
  88.     public void newblock() {
  89.         blockType = (int) (Math.random() * 1000) % 7;
  90.         turnState = (int) (Math.random() * 1000) % 4;
  91.         x = 4;
  92.         y = 0;
  93.         if (gameover(x, y) == 1) {

  94.             newmap();
  95.             drawwall();
  96.             score = 0;
  97.             JOptionPane.showMessageDialog(null, "GAME OVER");
  98.         }
  99.     }

  100.     // 画围墙
  101.     public void drawwall() {
  102.         for (i = 0; i < 12; i++) {
  103.             map[i][21] = 2;
  104.         }
  105.         for (j = 0; j < 22; j++) {
  106.             map[11][j] = 2;
  107.             map[0][j] = 2;
  108.         }
  109.     }

  110.     // 初始化地图
  111.     public void newmap() {
  112.         for (i = 0; i < 12; i++) {
  113.             for (j = 0; j < 22; j++) {
  114.                 map[i][j] = 0;
  115.             }
  116.         }
  117.     }

  118.     // 初始化构造方法
  119.     Tetrisblok() {
  120.         newblock();
  121.         newmap();
  122.         drawwall();
  123.         Timer timer = new Timer(1000, new TimerListener());
  124.         timer.start();
  125.     }

  126.     // 旋转的方法
  127.     public void turn() {
  128.         int tempturnState = turnState;
  129.         turnState = (turnState + 1) % 4;
  130.         if (blow(x, y, blockType, turnState) == 1) {
  131.         }
  132.         if (blow(x, y, blockType, turnState) == 0) {
  133.             turnState = tempturnState;
  134.         }
  135.         repaint();
  136.     }

  137.     // 左移的方法
  138.     public void left() {
  139.         if (blow(x - 1, y, blockType, turnState) == 1) {
  140.             x = x - 1;
  141.         }
  142.         ;
  143.         repaint();
  144.     }

  145.     // 右移的方法
  146.     public void right() {
  147.         if (blow(x + 1, y, blockType, turnState) == 1) {
  148.             x = x + 1;
  149.         }
  150.         ;
  151.         repaint();
  152.     }

复制代码

5 个回复

倒序浏览
   // 下落的方法
    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);

                }
            }
        }
回复 使用道具 举报
能运行吗?
回复 使用道具 举报
估计以后会用到,先留个名
回复 使用道具 举报
感觉很不错
回复 使用道具 举报
哥们,不能运行啊
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马