最近在学习JAVA,就学参考学着写了一个俄罗斯方块,代码有详细注释,这里就不多做说明了。
可以用键盘,空格控制,或者用界面上的按钮。
1import java.awt.*;
2import java.awt.event.*;
3import javax.swing.*;
4import javax.swing.event.*;
5
6class Block implements Runnable// 方块类
7{
8 static final int type = 7, state = 4;
9
10 static final int[][] patten = { // 16进制代表每种方块
11 { 0x0f00, 0x4444, 0x0f00, 0x4444 },// 长条
12 { 0x6600, 0x6600, 0x6600, 0x6600 },// 正方块
13 { 0x04e0, 0x0464, 0x00e4, 0x04c4 },// 三角
14 { 0x08e0, 0x0644, 0x00e2, 0x044c },// 弯折一下,1、3,1左
15 { 0x02e0, 0x0446, 0x00e8, 0x0c44 },// 弯折一下,1、3,1右
16 { 0x0462, 0x006c, 0x0462, 0x006c },// 弯折两下,1、2、1,1左上;1右下
17 { 0x0264, 0x00c6, 0x0264, 0x00c6 } // 弯折两下,1、2、1,1右上;1左下
18 };
19
20 private int blockType = -1; // 方块类型,7种,大小范围0-6
21
22 private int blockState;// 方块状态,4种,大小范围0-3
23
24 private int row, col; // 方块所在的行数,列数
25
26 private int oldRow, oldCol; // 记录方块变化前所在的行数,列数
27
28 private int oldType = -1, oldState; // 记录方块变化前的类型和状态
29
30 private int isfall = 1; // 标记若画,画成什么颜色的,
31
32 // 1表示可以下落,画为红色;0表示不可下落,画为蓝色
33
34 private boolean end = false;// 结束标记,为true时表示结束
35
36 LeftShowCanvas lsc;
37
38 public Block(LeftShowCanvas lsc)
39 {
40 this.lsc = lsc;
41 row = 0;
42 col = 3;
43 oldRow = row;
44 oldCol = col;
45 }
46
47 public void reInit() // 一个方块无法下落后,重新初始化
48 {
49 blockType = -1;
50 isfall = 1;
51 }
52
53 public void reInitRowCol() // 初始化方块起始点
54 {
55 row = 0;
56 col = 3;
57 }
58
59 public void run() // 下落线程
60 {
61 lsc.requestFocusInWindow(); // 获得焦点
62 while (!end)
63 {
64 int blocktype = (int) (Math.random() * 100) % 7;
65 drawBlock(blocktype);
66 do
67 {
68 try
69 {
70 Thread.sleep(500); // 控制下落速度
71 } catch (InterruptedException e)
72 {
73
74 }
75 } while (fallMove()); // 下落
76 for (int j = 0; j < lsc.maxcols; j++)
77 // 判断是否结束
78 if (lsc.unitState[3][j] == 2)
79 end = true;
80 }
81 }
82
83 public synchronized void draw