`
会飞的不倒翁
  • 浏览: 2516 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

一个俄罗斯方块的源码

阅读更多
package mypack;

import java.awt.*;
import java.awt.event.*;

//俄罗斯方块类 
public class ERS_Block extends Frame {
	/**
	 * 
	 */
	private static final long serialVersionUID = -1443760309099067025L;

	public static boolean isPlay = false;

	public static int level = 1, score = 0;

	public static TextField scoreField, levelField;

	public static MyTimer timer;

	GameCanvas gameScr;

	public static void main(String[] argus) {
		ERS_Block ers = new ERS_Block("俄罗斯方块游戏 V1.0 Author:Vincent");
		WindowListener win_listener = new WinListener();
		ers.addWindowListener(win_listener);
	}

	// 俄罗斯方块类的构造方法
	ERS_Block(String title) {
		super(title);

		setSize(600, 480);
		setLayout(new GridLayout(1, 2));

		gameScr = new GameCanvas();
		gameScr.addKeyListener(gameScr);

		timer = new MyTimer(gameScr);
		timer.setDaemon(true);
		timer.start();
		timer.suspend();

		add(gameScr);

		Panel rightScr = new Panel();
		rightScr.setLayout(new GridLayout(2, 1, 0, 30));
		rightScr.setSize(120, 500);
		add(rightScr);

		// 右边信息窗体的布局
		MyPanel infoScr = new MyPanel();
		infoScr.setLayout(new GridLayout(4, 1, 0, 5));
		infoScr.setSize(120, 300);
		rightScr.add(infoScr);

		// 定义标签和初始值
		Label scorep = new Label("分数:", Label.LEFT);
		Label levelp = new Label("级数:", Label.LEFT);
		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(new Dimension(20, 60));
		scoreField.setSize(new Dimension(20, 60));
		levelp.setSize(new Dimension(20, 60));
		levelField.setSize(new Dimension(20, 60));
		scoreField.setText("0");
		levelField.setText("1");

		// 右边控制按钮窗体的布局
		MyPanel controlScr = new MyPanel();
		controlScr.setLayout(new GridLayout(5, 1, 0, 5));
		rightScr.add(controlScr);

		// 定义按钮play
		Button play_b = new Button("开始游戏");
		play_b.setSize(new Dimension(50, 200));
		play_b.addActionListener(new Command(Command.button_play, gameScr));

		// 定义按钮Level UP
		Button level_up_b = new Button("提高级数");
		level_up_b.setSize(new Dimension(50, 200));
		level_up_b.addActionListener(new Command(Command.button_levelup,
				gameScr));

		// 定义按钮Level Down
		Button level_down_b = new Button("降低级数");
		level_down_b.setSize(new Dimension(50, 200));
		level_down_b.addActionListener(new Command(Command.button_leveldown,
				gameScr));

		// 定义按钮Level Pause
		Button pause_b = new Button("游戏暂停");
		pause_b.setSize(new Dimension(50, 200));
		pause_b.addActionListener(new Command(Command.button_pause, gameScr));

		// 定义按钮Quit
		Button quit_b = new Button("退出游戏");
		quit_b.setSize(new Dimension(50, 200));
		quit_b.addActionListener(new Command(Command.button_quit, 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();
	}
}

// 重写MyPanel类,使Panel的四周留空间
class MyPanel extends Panel {
	public Insets getInsets() {
		return new Insets(30, 50, 30, 50);
	}
}

// 游戏画布类
class GameCanvas extends Canvas implements KeyListener {
	final int unitSize = 30; // 小方块边长

	int rowNum; // 正方格的行数

	int columnNum; // 正方格的列数

	int maxAllowRowNum; // 允许有多少行未削

	int blockInitRow; // 新出现块的起始行坐标

	int blockInitCol; // 新出现块的起始列坐标

	int[][] scrArr; // 屏幕数组

	Block b; // 对方快的引用

	// 画布类的构造方法
	GameCanvas() {
		rowNum = 15;
		columnNum = 10;
		maxAllowRowNum = rowNum - 2;
		b = new Block(this);
		blockInitRow = rowNum - 1;
		blockInitCol = columnNum / 2 - 2;
		scrArr = new int[32][32];
	}

	// 初始化屏幕,并将屏幕数组清零的方法
	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) {
		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.magenta);
			break; // 画已经落下的方法
		}
		g.fill3DRect(col * unitSize, getSize().height - (row + 1) * unitSize,
				unitSize, unitSize, true);
		g.dispose();
	}

	public Block 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;

			L1: for (int j = 0; j < columnNum; j++)
				if (scrArr[i][j] == 0) {
					k++;
					isfull = false;
					break L1;
				}
			if (isfull)
				full_line_num++;
			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;
			}
		}
		ERS_Block.score += full_line_num;
		ERS_Block.scoreField.setText("" + ERS_Block.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) {
		if (!ERS_Block.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;
		}
	}
}

// 处理控制类
class 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; // 当前按钮

	GameCanvas scr;

	// 控制按钮类的构造方法
	Command(int button, GameCanvas scr) {
		curButton = button;
		this.scr = scr;
	}

	// 按钮执行方法
	public void actionPerformed(ActionEvent e) {
		switch (curButton) {
		case button_play:
			if (!ERS_Block.isPlay) {
				scr.initScr();
				ERS_Block.isPlay = true;
				ERS_Block.score = 0;
				ERS_Block.scoreField.setText("0");
				ERS_Block.timer.resume();
			}
			scr.requestFocus();
			break;
		case button_levelup:
			if (ERS_Block.level < 10) {
				ERS_Block.level++;
				ERS_Block.levelField.setText("" + ERS_Block.level);
				ERS_Block.score = 0;
				ERS_Block.scoreField.setText("" + ERS_Block.score);
			}
			scr.requestFocus();
			break;
		case button_leveldown:
			if (ERS_Block.level > 1) {
				ERS_Block.level--;
				ERS_Block.levelField.setText("" + ERS_Block.level);
				ERS_Block.score = 0;
				ERS_Block.scoreField.setText("" + ERS_Block.score);
			}
			scr.requestFocus();
			break;
		case button_pause:
			if (pause_resume) {
				ERS_Block.timer.suspend();
				pause_resume = false;
			} else {
				ERS_Block.timer.resume();
				pause_resume = true;
			}
			scr.requestFocus();
			break;
		case button_quit:
			System.exit(0);
		}
	}
}

// 方块类
class Block {
	static int[][] pattern = {
			{ 0x0f00, 0x4444, 0x0f00, 0x4444 },// 用十六进至表示,本行表示长条四种状态
			{ 0x04e0, 0x0464, 0x00e4, 0x04c4 },
			{ 0x4620, 0x6c00, 0x4620, 0x6c00 },
			{ 0x2640, 0xc600, 0x2640, 0xc600 },
			{ 0x6220, 0x1700, 0x2230, 0x0740 },
			{ 0x6440, 0x0e20, 0x44c0, 0x8e00 },
			{ 0x0660, 0x0660, 0x0660, 0x0660 } };

	int blockType; // 块的模式号(0-6)

	int turnState; // 块的翻转状态(0-3)

	int blockState; // 快的下落状态

	int row, col; // 块在画布上的坐标

	GameCanvas scr;

	// 块类的构造方法
	Block(GameCanvas scr) {
		this.scr = scr;
		blockType = (int) (Math.random() * 1000) % 7;
		turnState = (int) (Math.random() * 1000) % 4;
		blockState = 1;
		row = scr.getInitRow();
		col = scr.getInitCol();
	}

	// 重新初始化块,并显示新块
	public void reset() {
		blockType = (int) (Math.random() * 1000) % 7;
		turnState = (int) (Math.random() * 1000) % 4;
		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 >> 1;
			}
		}
		return true;
	}

	// 同步显示的方法
	public synchronized void dispBlock(int s) {
		int k = 0x8000;
		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 >> 1;
			}
		}
	}
}

// 定时线程
class MyTimer extends Thread {
	GameCanvas scr;

	public MyTimer(GameCanvas scr) {
		this.scr = scr;
	}

	public void run() {
		while (true) {
			try {
				sleep((10 - ERS_Block.level + 1) * 100);
			} catch (InterruptedException e) {
			}
			if (!scr.getBlock().fallDown()) {
				scr.deleteFullLine();
				if (scr.isGameEnd()) {
					ERS_Block.isPlay = false;
					suspend();
				} else
					scr.getBlock().reset();
			}
		}
	}
}

class WinListener extends WindowAdapter {
	public void windowClosing(WindowEvent l) {
		System.exit(0);
	}
}
分享到:
评论

相关推荐

    python基于pygame的俄罗斯方块小游戏源码.zip

    python基于pygame的俄罗斯方块小游戏源码。python基于pygame的俄罗斯方块小游戏源码。python基于pygame的俄罗斯方块小游戏源码。python基于pygame的俄罗斯方块小游戏源码。python基于pygame的俄罗斯方块小游戏源码。...

    c语言俄罗斯方块完整源码

    c语言俄罗斯方块完整源码 c语言俄罗斯方块完整源码 c语言俄罗斯方块完整源码 c语言俄罗斯方块完整源码 c语言俄罗斯方块完整源码 c语言俄罗斯方块完整源码 c语言俄罗斯方块完整源码 c语言俄罗斯方块完整源码 c语言...

    俄罗斯方块源码.zip

    今天我们将详细探讨一个基于Java和Swing库实现的“俄罗斯方块”小游戏的源码。这个项目不仅小巧易懂,而且逻辑结构清晰,是学习Java图形用户界面(GUI)编程和游戏开发的理想实例。 首先,让我们从“Shape.java”...

    c语言俄罗斯方块源码(完整源码)

    c语言俄罗斯方块源码(完整源码)c语言俄罗斯方块源码(完整源码)c语言俄罗斯方块源码(完整源码)c语言俄罗斯方块源码(完整源码)c语言俄罗斯方块源码(完整源码)c语言俄罗斯方块源码(完整源码)c语言俄罗斯...

    android俄罗斯方块源码

    《Android版俄罗斯方块源码解析》 在深入探讨Android版俄罗斯方块源码之前,我们首先要理解什么是俄罗斯方块,以及它在游戏历史上的重要地位。俄罗斯方块是一款起源于1984年的经典电子游戏,由苏联的阿列克谢·帕基...

    俄罗斯方块源码 java

    《深入解析Java版俄罗斯方块源码》 俄罗斯方块是一款经典的益智游戏,自1984年诞生以来,其简洁的设计和无尽的挑战性吸引了无数玩家。本篇文章将详细探讨一款基于Java编程语言实现的俄罗斯方块源码,帮助读者理解其...

    C# 俄罗斯方块 源码 非常好 学习用

    总的来说,这个C#实现的俄罗斯方块源码是一个很好的学习资源,无论你是初学者还是有一定经验的开发者,都能从中获益。通过对源码的深入研究,你可以将理论知识转化为实践技能,进一步提升自己的编程能力。

    Cocos开发微信小游戏俄罗斯方块源码

    你需要注册成为微信开发者,获取AppID,然后在开发工具中创建一个新的项目,将Cocos源码导入。 “俄罗斯方块”的核心逻辑包括方块生成、旋转、下落、消除行以及得分计算。在Cocos中,我们可以使用精灵(Sprite)来...

    Cocos 俄罗斯方块 游戏 源码

    【Cocos 俄罗斯方块游戏源码解析】 Cocos 是一款强大的游戏开发框架,它提供了丰富的功能和便捷的工具,让开发者能够轻松地创建2D和3D游戏。本源码是基于Cocos Creator构建的俄罗斯方块游戏,Cocos Creator是Cocos...

    C#俄罗斯方块源码

    本篇将深入探讨一个使用C#语言编写的俄罗斯方块源码,通过分析代码,我们可以学习到C#的基本语法、游戏逻辑设计以及面向对象编程思想的应用。 首先,C#是一种由微软开发的面向对象的编程语言,广泛应用于Windows...

    Qt 俄罗斯方块源码

    【Qt 俄罗斯方块源码】是一个基于Qt框架开发的经典游戏——俄罗斯方块的源代码实现。Qt是一个跨平台的应用程序开发框架,广泛应用于桌面、移动以及嵌入式设备上,支持C++语言,同时也提供了QML进行UI设计。这个项目...

    俄罗斯方块01.rar_俄罗斯方块源码

    总的来说,VB编写的“俄罗斯方块”源码是一份宝贵的教育资源,不仅能让初学者体验游戏开发的乐趣,还能在实践中巩固和提升VB编程能力。深入研究这份源码,不仅能让你掌握VB的基本语法,还能培养解决问题和优化代码的...

    俄罗斯方块    C#源码

    本篇将围绕“俄罗斯方块C#源码”这一主题,深入解析游戏的核心逻辑,并为初学者提供一个学习C#编程和游戏开发的良好起点。 首先,C#是一种面向对象的、类型安全的、高性能的编程语言,被广泛应用于Windows平台的...

    android安卓俄罗斯方块源码

    《安卓版俄罗斯方块源码解析与实现》 在安卓平台上,俄罗斯方块是一款非常经典的休闲游戏,其源码分析对于学习安卓应用开发和游戏编程具有很高的价值。本篇文章将深入探讨这款安卓版俄罗斯方块游戏的源码,揭示其...

    MFC俄罗斯方块源码

    《MFC俄罗斯方块源码解析与学习指南》 MFC(Microsoft Foundation Classes)是微软提供的一个C++类库,用于构建Windows应用程序。它封装了Windows API,使得开发者能够更方便地进行图形用户界面(GUI)编程。在这个...

    Java俄罗斯方块源码

    Java语言在游戏开发领域有着广泛的应用,而"Java俄罗斯方块源码"就是一个典型的实例,它可以帮助初学者或有经验的开发者深入理解游戏编程的基本原理和Java编程技巧。以下是这个项目中涉及的一些关键知识点: 1. **...

    Delphi编写的俄罗斯方块游戏源码

    《Delphi实现的俄罗斯方块游戏源码解析》 Delphi是一种基于Object Pascal语言的集成开发环境,以其高效、简洁的编程风格深受程序员喜爱。在游戏开发领域,尽管不如Unity或Unreal Engine等大型引擎常见,但Delphi...

    tetris俄罗斯方块cocoscreator源码

    总结,这个“tetris俄罗斯方块cocoscreator源码”项目是一个很好的学习案例,它展示了如何使用typescript和CocosCreator构建一个经典游戏。通过分析和实践,开发者不仅可以掌握typescript编程,还能深入理解游戏开发...

    俄罗斯方块源码

    《Linux环境下C语言实现的俄罗斯方块源码解析》 在计算机编程的世界中,经典游戏“俄罗斯方块”一直是学习新技能和理解编程原理的绝佳案例。本项目以C语言在Linux操作系统下实现了这一著名游戏,涉及的知识点包括...

Global site tag (gtag.js) - Google Analytics