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(); } }