java编写俄罗斯方块详解编程语言

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

原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/10163.html

(0)
上一篇 2021年7月19日
下一篇 2021年7月19日

相关推荐

发表回复

登录后才能评论