📄 俄罗斯方块.java
字号:
//package 方块;
/**
俄罗斯方块.java
功能:俄罗斯方块游戏的主类
@author Joedan hongguangming@sohu.com
*/
import java.awt.*;
import javax.swing.*;
import java.awt.image.*;
import java.awt.event.*;
class 俄罗斯方块 extends JFrame implements Runnable, KeyListener
{
private int 难度 = 1;
private 活动方块 当前操作的方块,//控制中的方块
下一方块;//下一方块
private 建筑体 建筑;//存放方块堆积情况
//用于判定活动方块活动能力的对象
private 活动方块与建筑体关系 关系;
private boolean 游戏结束标志 = false;
private boolean 暂停 = false;
private static Rectangle 界面大小,//整个游戏界面的大小
下一方块区域,//绘画下一方块的区域
建筑体区域,//绘画建筑体的区域
难度标题区域,
难度区域,
分数标题区域,
分数区域;
static//规划整个界面布局
{
界面大小 = new Rectangle(400, 300);
建筑体区域 = new Rectangle(100, 50, 120, 200);
下一方块区域 = new Rectangle(50, 50, 30, 30);
}
private int 间歇 = 1000 / 难度;
public void 游戏开始()
{
当前操作的方块 = new 活动方块();
下一方块 = new 活动方块();
建筑 = new 建筑体();
关系 = new 活动方块与建筑体关系(当前操作的方块, 建筑);
游戏结束标志 = false;
new Thread(this).start();//启动游戏线程
}//游戏开始()
/****************************************************/
// 游戏动态处理部分开始
/****************************************************/
//游戏线程,定时功能
public void run()
{
while(true)//每隔一段时间对活动方块进行下移...
{
try
{
if (暂停)//暂停时不动作
{
Thread.sleep(间歇);
continue;
}
if (关系.允许下移())
当前操作的方块.下移();
else//不能下移就是碰底了
活动方块碰底处理();
if (游戏结束标志)//游戏结束,停止进程
return;
repaint();
Thread.sleep(间歇);
}
catch(InterruptedException e)
{
e.printStackTrace();
}
}
}//run()
//用户按键处理
public void keyPressed(KeyEvent e)
{
int keyCode = e.getKeyCode();
暂停 = keyCode == KeyEvent.VK_P;
if (暂停)//按p键时暂停
return;
if (游戏结束标志)//游戏已经结束,不响应用户键盘
return;
switch(keyCode)
{
case KeyEvent.VK_UP:
if (关系.允许变形())
当前操作的方块.变形();
break;
case KeyEvent.VK_DOWN:
if (关系.允许下移())
当前操作的方块.下移();
break;
case KeyEvent.VK_LEFT:
if (关系.允许左移())
当前操作的方块.左移();
break;
case KeyEvent.VK_RIGHT:
if (关系.允许右移())
当前操作的方块.右移();
break;
case KeyEvent.VK_SPACE:
while(关系.允许下移())//移到不能移为止
当前操作的方块.下移();
活动方块碰底处理();
break;
}
repaint();
}//keyPressed
//活动方块到达底部后进行的一系列工作,如:是否消行,
//活动方块,下一方块更新,判定是否游戏结束
private void 活动方块碰底处理()
{
//将活动方块加入建筑体
建筑.加入方块(当前操作的方块);
当前操作的方块 = 下一方块;//装入新的方块
下一方块 = new 活动方块();//装入新的下一方块
//更新关系为建筑体和新活动方块的关系
关系 = new 活动方块与建筑体关系(当前操作的方块, 建筑);
//删行处理
for (int i = 0, j; i < 建筑体.建筑物长; i++)//遍历所有行
{
for (j = 0; j < 建筑体.建筑物宽; j++)//遍历所有列
if (!建筑.取得位置状态(i, j))//如果该位置没有块,该行不能删除
break;
if (j == 建筑体.建筑物宽)//如果所有列都有块,删除该行
建筑.删除某行(i);
}
//判断游戏是否结束
if (关系.结束了吗())
{
游戏结束标志 = true;
}
}//活动方块碰底处理()
/****************************************************/
// 游戏动态处理部分结束
/****************************************************/
/********************************************************/
// 画面处理部分开始
/********************************************************/
public void paint(Graphics g)
{
重绘界面(g);
}//paint
public void update(Graphics g)
{
重绘界面(g);
}//update
//绘制界面
private void 重绘界面(Graphics g)
{
//绘制缓冲
BufferedImage buf = new BufferedImage(界面大小.width, 界面大小.height, BufferedImage.TYPE_INT_RGB);
//提取缓冲画板
Graphics buf_g = buf.getGraphics();
//画底图
buf_g.setColor(new Color(160, 160, 160));
buf_g.fillRect(0, 0, 界面大小.width, 界面大小.height);
buf_g.setColor(Color.black);
buf_g.fillRect(建筑体区域.x, 建筑体区域.y, 建筑体区域.width, 建筑体区域.height);
//画难度
//画分数
//画下一方块
下一方块.paintIn(buf_g.create(下一方块区域.x, 下一方块区域.y, 下一方块区域.width, 下一方块区域.height));
//画建筑体
建筑.paint(buf_g.create(建筑体区域.x, 建筑体区域.y, 建筑体区域.width, 建筑体区域.height));
if (游戏结束标志)//如果游戏结束,画结束标志
;
else//否则画当前方块
当前操作的方块.paint(buf_g.create(建筑体区域.x, 建筑体区域.y, 建筑体区域.width, 建筑体区域.height));
//如果暂停画暂停标志
if (暂停)
;
//把缓冲画到界面
g.drawImage(buf, 0, 0, null);
}//重绘界面
/********************************************************/
// 画面处理部分结束
/********************************************************/
public void keyReleased(KeyEvent e)
{
}
public void keyTyped(KeyEvent e)
{
}
public 俄罗斯方块()
{
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
addKeyListener(this);
setBounds(400, 300, 400, 300);
setVisible(true);
游戏开始();
}//俄罗斯方块()
public static void main(String args[])
{
new 俄罗斯方块();
}
};
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -