发布一个Java写的俄罗斯方块源码 算法简单(300行) 注释详细

benpaodelvzi 2010-06-12 03:51:51
加精
有人说过
写代码不但要勤,要沉迷进去,更重要的是要有感动,有感动,就能写出精彩动人的代码。写代码要融入感情,它才生动鲜活起来,才能入神!不然再怎么写,都不能到最高境界,充其量也不过是个机器。这是玄妙而又实实在在的存在。
菜单没写 太麻烦
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.*;
import javax.swing.Timer;

public class Tetris extends JFrame {
public Tetris() {
Tetrisblok a = new Tetrisblok();
addKeyListener(a);
add(a);
}

public static void main(String[] args) {
Tetris frame = new Tetris();
JMenuBar menu = new JMenuBar();
frame.setJMenuBar(menu);
JMenu game = new JMenu("游戏");
JMenuItem newgame = game.add("新游戏");
JMenuItem pause = game.add("暂停");
JMenuItem goon = game.add("继续");
JMenuItem exit = game.add("退出");
JMenu help = new JMenu("帮助");
JMenuItem about = help.add("关于");
menu.add(game);
menu.add(help);
frame.setLocationRelativeTo(null);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(220, 275);
frame.setTitle("Tetris内测版");
// frame.setUndecorated(true);
frame.setVisible(true);
frame.setResizable(false);

}
}

// 创建一个俄罗斯方块类
class Tetrisblok extends JPanel implements KeyListener {

// blockType 代表方块类型
// turnState代表方块状态
private int blockType;
private int score = 0;

private int turnState;

private int x;

private int y;

private int i = 0;

int j = 0;
int flag = 0;
// 定义已经放下的方块x=0-11,y=0-21;
int[][] map = new int[13][23];

// 方块的形状 第一组代表方块类型有S、Z、L、J、I、O、T 7种 第二组 代表旋转几次 第三四组为 方块矩阵
private final int shapes[][][] = new int[][][] {
// i
{ { 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0 },
{ 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0 } },
// s
{ { 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0 },
{ 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0 } },
// z
{ { 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0 },
{ 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0 } },
// j
{ { 0, 1, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0 },
{ 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 1, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0 },
{ 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 } },
// o
{ { 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } },
// l
{ { 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0 },
{ 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 } },
// t
{ { 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0 },
{ 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0 } } };

// 生成新方块的方法
public void newblock() {
blockType = (int) (Math.random() * 1000) % 7;
turnState = (int) (Math.random() * 1000) % 4;
x = 4;
y = 0;
if (gameover(x, y) == 1) {

newmap();
drawwall();
score = 0;
JOptionPane.showMessageDialog(null, "GAME OVER");
}
}

// 画围墙
public void drawwall() {
for (i = 0; i < 12; i++) {
map[i][21] = 2;
}
for (j = 0; j < 22; j++) {
map[11][j] = 2;
map[0][j] = 2;
}
}

// 初始化地图
public void newmap() {
for (i = 0; i < 12; i++) {
for (j = 0; j < 22; j++) {
map[i][j] = 0;
}
}
}

// 初始化构造方法
Tetrisblok() {
newblock();
newmap();
drawwall();
Timer timer = new Timer(1000, new TimerListener());
timer.start();
}

// 旋转的方法
public void turn() {
int tempturnState = turnState;
turnState = (turnState + 1) % 4;
if (blow(x, y, blockType, turnState) == 1) {
}
if (blow(x, y, blockType, turnState) == 0) {
turnState = tempturnState;
}
repaint();
}

// 左移的方法
public void left() {
if (blow(x - 1, y, blockType, turnState) == 1) {
x = x - 1;
}
;
repaint();
}

// 右移的方法
public void right() {
if (blow(x + 1, y, blockType, turnState) == 1) {
x = x + 1;
}
;
repaint();
}

// 下落的方法
public void down() {
if (blow(x, y + 1, blockType, turnState) == 1) {
y = y + 1;
delline();
}
;
if (blow(x, y + 1, blockType, turnState) == 0) {
add(x, y, blockType, turnState);
newblock();
delline();
}
;
repaint();
}

// 是否合法的方法
public int blow(int x, int y, int blockType, int turnState) {
for (int a = 0; a < 4; a++) {
for (int b = 0; b < 4; b++) {
if (((shapes[blockType][turnState][a * 4 + b] == 1) && (map[x
+ b + 1][y + a] == 1))
|| ((shapes[blockType][turnState][a * 4 + b] == 1) && (map[x
+ b + 1][y + a] == 2))) {

return 0;
}
}
}
return 1;
}

// 消行的方法
public void delline() {
int c = 0;
for (int b = 0; b < 22; b++) {
for (int a = 0; a < 12; a++) {
if (map[a][b] == 1) {

c = c + 1;
if (c == 10) {
score += 10;
for (int d = b; d > 0; d--) {
for (int e = 0; e < 11; e++) {
map[e][d] = map[e][d - 1];

}
}
}
}
}
c = 0;
}
}

// 判断你挂的方法
public int gameover(int x, int y) {
if (blow(x, y, blockType, turnState) == 0) {
return 1;
}
return 0;
}

// 把当前添加map
public void add(int x, int y, int blockType, int turnState) {
int j = 0;
for (int a = 0; a < 4; a++) {
for (int b = 0; b < 4; b++) {
if (map[x + b + 1][y + a] == 0) {
map[x + b + 1][y + a] = shapes[blockType][turnState][j];
}
;
j++;
}
}
}

// 画方块的的方法
public void paintComponent(Graphics g) {
super.paintComponent(g);
// 画当前方块
for (j = 0; j < 16; j++) {
if (shapes[blockType][turnState][j] == 1) {
g.fillRect((j % 4 + x + 1) * 10, (j / 4 + y) * 10, 10, 10);
}
}
// 画已经固定的方块
for (j = 0; j < 22; j++) {
for (i = 0; i < 12; i++) {
if (map[i][j] == 1) {
g.fillRect(i * 10, j * 10, 10, 10);

}
if (map[i][j] == 2) {
g.drawRect(i * 10, j * 10, 10, 10);

}
}
}
g.drawString("score=" + score, 125, 10);
g.drawString("抵制不良游戏,", 125, 50);
g.drawString("拒绝盗版游戏。", 125, 70);
g.drawString("注意自我保护,", 125, 90);
g.drawString("谨防受骗上当。", 125, 110);
g.drawString("适度游戏益脑,", 125, 130);
g.drawString("沉迷游戏伤身。", 125, 150);
g.drawString("合理安排时间,", 125, 170);
g.drawString("享受健康生活。", 125, 190);
}

// 键盘监听
public void keyPressed(KeyEvent e) {
switch (e.getKeyCode()) {
case KeyEvent.VK_DOWN:
down();
break;
case KeyEvent.VK_UP:
turn();
break;
case KeyEvent.VK_RIGHT:
right();
break;
case KeyEvent.VK_LEFT:
left();
break;
}

}

// 无用
public void keyReleased(KeyEvent e) {
}

// 无用
public void keyTyped(KeyEvent e) {
}

// 定时器监听
class TimerListener implements ActionListener {
public void actionPerformed(ActionEvent e) {

repaint();
if (blow(x, y + 1, blockType, turnState) == 1) {
y = y + 1;
delline();
}
;
if (blow(x, y + 1, blockType, turnState) == 0) {

if (flag == 1) {
add(x, y, blockType, turnState);
delline();
newblock();
flag = 0;
}
flag = 1;
}
;
}
}
}
...全文
93749 1745 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1745 条回复
切换为时间正序
请发表友善的回复…
发表回复
生死谜 2013-02-18
  • 打赏
  • 举报
回复
很不错,很简洁,很好很强大,不过菜单好像没什么用,值得学习,谢谢楼主分享!
风炎楊 2013-02-17
  • 打赏
  • 举报
回复
mark
X34219010 2013-02-07
  • 打赏
  • 举报
回复
很经典。。再次回味一下很不错的。
feng_zhongzhu 2013-02-05
  • 打赏
  • 举报
回复
不錯,贊一個
  • 打赏
  • 举报
回复
还不如让我们直接下载下来呢
Planet X 2013-02-02
  • 打赏
  • 举报
回复
还不错 支持下..
ProperZhang 2013-02-01
  • 打赏
  • 举报
回复
很不错 我做了好长时间写的代码还没你好呢
XiaoBaiDianZi 2013-02-01
  • 打赏
  • 举报
回复
very good
抢小孩饼干 2013-02-01
  • 打赏
  • 举报
回复
感谢你!为什么?因为现在就会开发了好长时间都没有做像你这种事了。突然看到,感触很深,毕业设计做完还是要好好研究研究基础了,练练逻辑
oJemmyo 2013-01-29
  • 打赏
  • 举报
回复
借參考一用
望舒 2013-01-19
  • 打赏
  • 举报
回复
楼主我可以基于它改改,给没事的时候玩玩吗?
gfzeng 2013-01-19
  • 打赏
  • 举报
回复
这么多好评, 我为什么看不懂这个代码?
「已注销」 2013-01-18
  • 打赏
  • 举报
回复
好强大,好邪恶!
chenxjing 2013-01-18
  • 打赏
  • 举报
回复
马上下载测试了一下,可用。。。。。。。。。。。
_Ataraxia 2013-01-10
  • 打赏
  • 举报
回复


awt和swing起步的经典范例啊 顶一个
v_xiaoming 2013-01-10
  • 打赏
  • 举报
回复
顶一下~~有空好好研究一下~
zenglinfu33 2013-01-07
  • 打赏
  • 举报
回复
好牛呀,我要好好学习一下了
zhangxm2015 2013-01-03
  • 打赏
  • 举报
回复
了得 收藏
  • 打赏
  • 举报
回复
服了!尤其这句话:写代码不但要勤,要沉迷进去,更重要的是要有感动,有感动,就能写出精彩动人的代码。写代码要融入感情,它才生动鲜活起来,才能入神!不然再怎么写,都不能到最高境界,充其量也不过是个机器。这是玄妙而又实实在在的存在。 虽然我水平还是小小的菜鸟,但是我像每个写代码的一样,我爱编程!!!
朽木可雕 2013-01-03
  • 打赏
  • 举报
回复 1
简单的把楼主不愿意写的地方完善了下,哈哈有时间共同探讨。

package org.copyitem.tetris;

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

import javax.swing.*;

public class Tetris extends JFrame {
	/**
	 * 
	 */
	private static final long serialVersionUID = 5005664183437466627L;

	public static Boolean flag = false;
	public static Tetris frame;
	
	private static Tetrisblok a;
	public Tetris() {
		a = new Tetrisblok();
		addKeyListener(a);
		add(a,0);
	}

	public static void main(String[] args) {
		frame = new Tetris();
		JMenuBar menu = new JMenuBar();
		frame.setJMenuBar(menu);
		JMenu game = new JMenu("游戏");
		JMenuItem newgame = game.add("新游戏");
		JMenuItem pause = game.add("暂停");
		JMenuItem goon = game.add("继续");
		JMenuItem exit = game.add("退出");
		JMenu help = new JMenu("帮助");
		JMenuItem about = help.add("关于");
		pause.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				synchronized (Tetris.flag) {
					Tetris.flag = true;
				}
			}
		});
		newgame.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				synchronized (Tetris.flag) {
					Tetris.flag = false;
					a.init();
					a.newblock();
					a.newmap();
					a.drawwall();
				}
			}
		});
		exit.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				synchronized (Tetris.flag) {
					System.exit(0);
				}
			}
		});
		goon.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				synchronized (Tetris.flag) {
					Tetris.flag = false;
				}
			}
		});
	
		menu.add(game);
		menu.add(help);
		frame.setLocationRelativeTo(null);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setSize(220, 275);
		frame.setTitle("Tetris内测版");
		// frame.setUndecorated(true);
		frame.setVisible(true);
		frame.setResizable(false);
		
		
	}
}

// 创建一个俄罗斯方块类
class Tetrisblok extends JPanel implements KeyListener {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1190201578445357828L;
	// blockType 代表方块类型
	// turnState代表方块状态
	private int blockType;
	private int score = 0;
	//下一个方块类型
	private int nextBlockType = -1;
	//下一个方块状态
	private int nextTurnState = -1;
	private int turnState;

	private int x;

	private int y;

	private int i = 0;

	int j = 0;
	int flag = 0;
	// 定义已经放下的方块x=0-11,y=0-21;
	int[][] map = new int[13][23];

	
	public void init() {
		blockType = 0;
		score = 0;

		turnState = 0;

		x = 0;

		y = 0;

		i = 0;

		j = 0;
		flag = 0;
		map = new int[13][23];
	}
	// 方块的形状 第一组代表方块类型有S、Z、L、J、I、O、T 7种 第二组 代表旋转几次 第三四组为 方块矩阵
	//shapes为方块根据变形后的四种不同状态4*4的方格中正好能表示所有的方块形状包括每种方块的4种变形
	private final int shapes[][][] = new int[][][] {
			// i
			//长条
			
			//----
				  { { 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0 },
			// |
			// |
			// |
			// |
					{ 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0 },
			//----
					{ 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0 },
			// |
			// |
			// |
			// |
					{ 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0 } },
			// s
			// --
			//--
				  { { 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
			// |
			//  |
					{ 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0 },
					{ 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
					{ 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0 } },
			// z
				  { { 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
					{ 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0 },
					{ 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
					{ 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0 } },
			// j
				  { { 0, 1, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0 },
					{ 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
					{ 1, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0 },
					{ 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 } },
			// o
				  { { 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
					{ 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
					{ 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
					{ 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } },
			// l
				  { { 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0 },
					{ 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
					{ 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0 },
					{ 0, 0, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 } },
			// t
				  { { 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
					{ 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0 },
					{ 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
					{ 0, 1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0 } } };

	// 生成新方块的方法
	public void newblock() {
		if(-1 == nextBlockType) {
			nextBlockType = (int) (Math.random() * 1000) % 7;
			nextTurnState = (int) (Math.random() * 1000) % 4;
		}
		blockType = nextBlockType;
		turnState = nextTurnState;
		nextBlockType = (int) (Math.random() * 1000) % 7;
		nextTurnState = (int) (Math.random() * 1000) % 4;
		x = 4;
		y = 0;
		if (gameover(x, y) == 1) {

			newmap();
			drawwall();
			score = 0;
			JOptionPane.showMessageDialog(null, "GAME OVER");
		}
	}

	// 画围墙
	public void drawwall() {
		for (i = 0; i < 12; i++) {
			map[i][21] = 2;
		}
		for (j = 0; j < 22; j++) {
			map[11][j] = 2;
			map[0][j] = 2;
		}
	}

	// 初始化地图
	public void newmap() {
		for (i = 0; i < 12; i++) {
			for (j = 0; j < 22; j++) {
				map[i][j] = 0;
			}
		}
	}

	// 初始化构造方法
	Tetrisblok() {
		newblock();
		newmap();
		drawwall();
		Timer timer = new Timer(1000, new TimerListener());
		timer.start();
	}

	// 旋转的方法
	public void turn() {
		int tempturnState = turnState;
		turnState = (turnState + 1) % 4;
		if (blow(x, y, blockType, turnState) == 1) {
		}
		if (blow(x, y, blockType, turnState) == 0) {
			turnState = tempturnState;
		}
		repaint();
	}

	// 左移的方法
	public void left() {
		if (blow(x - 1, y, blockType, turnState) == 1) {
			x = x - 1;
		}
		;
		repaint();
	}

	// 右移的方法
	public void right() {
		if (blow(x + 1, y, blockType, turnState) == 1) {
			x = x + 1;
		}
		;
		repaint();
	}

	// 下落的方法
	public void down() {
		if (blow(x, y + 1, blockType, turnState) == 1) {
			y = y + 1;
			delline();
		}
		;
		if (blow(x, y + 1, blockType, turnState) == 0) {
			add(x, y, blockType, turnState);
			newblock();
			delline();
		}
		;
		repaint();
	}

	//是否合法的方法
	public int blow(int x, int y, int blockType, int turnState) {
		for (int a = 0; a < 4; a++) {
			for (int b = 0; b < 4; b++) {
				if (((shapes[blockType][turnState][a * 4 + b] == 1) && (map[x
						+ b + 1][y + a] == 1))
						|| ((shapes[blockType][turnState][a * 4 + b] == 1) && (map[x
								+ b + 1][y + a] == 2))) {

					return 0;
				}
			}
		}
		return 1;
	}

	// 消行的方法
	public void delline() {
		int c = 0;
		int sc = 0;
		for (int b = 0; b < 22; b++) {
			for (int a = 0; a < 12; a++) {
				if (map[a][b] == 1) {
					c = c + 1;
					if (c == 10) {
						sc++;
						for (int d = b; d > 0; d--) {
							for (int e = 0; e < 11; e++) {
								map[e][d] = map[e][d - 1];

							}
						}
					}
				}
			}
			c = 0;
		}
		
		switch(sc) {
		case 1:score += 10;
			break;
		case 2:score += 25;
			break;
		case 3:score += 50;
			break;
		case 4:
			score += 100;
			break;
		default:break;
		}
	}

	// 判断你挂的方法
	public int gameover(int x, int y) {
		if (blow(x, y, blockType, turnState) == 0) {
			return 1;
		}
		return 0;
	}

	// 把当前添加map
	public void add(int x, int y, int blockType, int turnState) {
		int j = 0;
		for (int a = 0; a < 4; a++) {
			for (int b = 0; b < 4; b++) {
				if (map[x + b + 1][y + a] == 0) {
					map[x + b + 1][y + a] = shapes[blockType][turnState][j];
				}
				;
				j++;
			}
		}
	}
	
	

	// 画方块的的方法
	@Override
	public void paintComponent(Graphics g) {
		super.paintComponent(g);
		// 画当前方块
		for (j = 0; j < 16; j++) {
			if (shapes[blockType][turnState][j] == 1) {
				g.fillRect((j % 4 + x + 1) * 10, (j / 4 + y) * 10, 10, 10);
			}
		}
		// 画已经固定的方块
		for (j = 0; j < 22; j++) {
			for (i = 0; i < 12; i++) {
				if (map[i][j] == 1) {
					g.fillRect(i * 10, j * 10, 10, 10);

				}
				if (map[i][j] == 2) {
					g.drawRect(i * 10, j * 10, 10, 10);

				}
			}
		}
		g.drawString("score=" + score, 125, 10);
		g.drawString("抵制不良游戏,", 125, 50);
		g.drawString("拒绝盗版游戏。", 125, 70);
		g.drawString("注意自我保护,", 125, 90);
		g.drawString("谨防受骗上当。", 125, 110);
		g.drawString("适度游戏益脑,", 125, 130);
		g.drawString("沉迷游戏伤身。", 125, 150);
		g.drawString("下一个方块:", 125, 170);
		
		for (j = 0; j < 16; j++) {
			if (shapes[nextBlockType][nextTurnState][j] == 1) {
				g.fillRect((j % 4 + 1) * 10 + 125, (j / 4 ) * 10 + 180, 10, 10);
			}
		}
	}

	// 键盘监听
	@Override
	public void keyPressed(KeyEvent e) {
		switch (e.getKeyCode()) {
		case KeyEvent.VK_DOWN:
			down();
			break;
		case KeyEvent.VK_UP:
			turn();
			break;
		case KeyEvent.VK_RIGHT:
			right();
			break;
		case KeyEvent.VK_LEFT:
			left();
			break;
		}

	}

	// 无用
	@Override
	public void keyReleased(KeyEvent e) {
	}

	// 无用
	@Override
	public void keyTyped(KeyEvent e) {
	}

	// 定时器监听
	class TimerListener implements ActionListener {
		public void actionPerformed(ActionEvent e) {
			synchronized (Tetris.flag) {
				repaint();
				if(Tetris.flag) {
				}else {
					if (blow(x, y + 1, blockType, turnState) == 1) {
						y = y + 1;
						delline();
					}
					;
					if (blow(x, y + 1, blockType, turnState) == 0) {

						if (flag == 1) {
							add(x, y, blockType, turnState);
							delline();
							newblock();
							flag = 0;
						}
						flag = 1;
					}
				}
			}
		}
	}
}

加载更多回复(1523)

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧