⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 俄罗斯方块.java

📁 为移动电话写的俄罗斯方块游戏,没什么特别的,模块化设计是本程序的特色,也是我至今保留着它的原因,当时让我兴奋不已,得益于模块化设计,该程序的编写和改动都非常快捷,我只用了几个小时就完成编写和后期改动,
💻 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 + -