Java实现俄罗斯方块游戏简单版
- 格式:pdf
- 大小:136.60 KB
- 文档页数:6
Java实现俄罗斯⽅块游戏简单版
本⽂实例为⼤家分享了Java实现俄罗斯⽅块游戏的具体代码,供⼤家参考,具体内容如下游戏页⾯效果如下:
俄罗斯⽅块游戏本⾝的逻辑:
俄罗斯⽅块游戏的逻辑是⽐较简单的。它就类似于堆砌房⼦⼀样,各种各样的⽅地形状是不同的。但是,俄罗斯⽅块游戏的界
⾯被等均的分为若⼲⾏和若⼲列,因此⽅块的本质就是占⽤了多少个单元。
⾸先来考虑⼀下数据的问题。对于界⾯来说,需要⼀个⼆维的 int 型数组,它保存着那些地⽅应该有着⾊,哪些没有;然后是
⽅块本⾝,尽管它们的形状不统⼀,但是它们可以⽤⼀个4X4⽐例的⽅块所包围,因此⽤16个字节就可以把⼀个 ⽅块的信息
保存者,
注意:其实⽅块的数据也可以⽤int 数组表⽰,但是涉及到效率问题,⽤位操作⽐⽤普通的算术运算要快⼀点。
接下来思考⼀下动作具体有下⾯⼏点:
(1)⽅块的诞⽣。它的诞⽣是需要⽤随机原理的,另外,它如何初始化的被放置在游戏界⾯的顶部?
(2)⽅块是需要⾃动的往下掉的,它在掉的过程中,还需要判断它是否与周围的环境是否发⽣了冲突,能不能继续往下。
(3)⽅块本⾝还可以变形,变形以后的⽅块具有不同的数据,判断的⽅式⼜会不⼀样。(4)当⽤户⼀直按住s键的时候,⽅
块还需要持续往下掉。
然后就是过程,玩家主要操作的地⽅有以下⼏个⽅⾯:
(1) 左右操作。需要监听KeyEvent,让⽅块左右移动,直到碰到边界。
(2) 变形操作。也要监听KeyEvent,让⽅块⾃动的变形。
(3) 下降操作。也要监听KeyEvent,让⽅块快速的下降。
⾄于游戏的结束,只有⼀种情况, 那就是诞⽣的⽅块出世就与其他⽅块冲突了。
源程序代码如下:注释详细
package tetris;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.GridLayout;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.JTextField;
public class Main extends JFrame implements KeyListener {
private JTextArea[][] grids;// 把整个界⾯变为⼀个⽂本区域,整个游戏在⾥⾯进⾏
private int data[][]; // 对于每个格⼦的数据,1代表有⽅块,0代表为空⽩区
private int[] allRect; // 所有的⽅块类型,⽤16个字节来存储,俄罗斯⽅块图形都是在4*4格⼦⾥
private int rect; // 当前游戏下落的⽅块类型;
private int x, y; // 当前⽅块的坐标位置,x代表⾏,y代表列
private int score = 0; // 记录当前游戏得分情况,每消⼀层得10分
private JLabel label; // 显⽰分数的标签
private JLabel label1;// 显⽰游戏是否结束
private boolean running; // ⽤于判断游戏是否结束
/*⽆参构造函数*/
public Main() {
grids = new JTextArea[26][12];//设置游戏区域⾏和列
data = new int[26][12];//开辟data数组空间与游戏区域⾏和列⼀致
allRect = new int[] { 0x00cc, 0x8888, 0x000f, 0x0c44, 0x002e, 0x088c, 0x00e8, 0x0c88, 0x00e2, 0x044c, 0x008e,
0x08c4, 0x006c, 0x04c8, 0x00c6, 0x08c8, 0x004e, 0x04c4, 0x00e4 };//19种⽅块形状,如0x00cc就是 0000 表⽰⼀个2*2的正⽅形⽅块
//0000
//1100 //1100
label = new JLabel("score: 0"); //此标签存放得分情况,初始化为0分
label1 = new JLabel("开始游戏"); //此标签为提⽰游戏状态:开始还是结束
running = false; //为标志变量,false为游戏结束,true为游戏正在进⾏
init(); // 游戏界⾯初始化
}
/*游戏界⾯初始化函数*/
public void init() {
JPanel center = new JPanel(); //此⾯板为游戏核⼼区域
JPanel right = new JPanel(); //此⾯板为游戏说明区域
center.setLayout(new GridLayout(26, 12, 1, 1)); //给游戏核⼼区域划分⾏、列共26⾏,12列
for (int i = 0; i < grids.length; i++) {//初始化⾯板
for (int j = 0; j < grids[i].length; j++) {
grids[i][j] = new JTextArea(20, 20);
grids[i][j].setBackground(Color.WHITE);
grids[i][j].addKeyListener(this);// 添加键盘监听事件
//初始化游戏边界
if (j == 0 || j == grids[i].length - 1 || i == grids.length - 1) {
grids[i][j].setBackground(Color.PINK);
data[i][j] = 1;
}
grids[i][j].setEditable(false);// ⽂本区域不可编辑
center.add(grids[i][j]); //把⽂本区域添加到主⾯板上
}
}
//初始化游戏说明⾯板
right.setLayout(new GridLayout(4, 1));
right.add(new JLabel(" a : left d : right"));
right.add(new JLabel(" s : down w : change"));
right.add(label);
label1.setForeground(Color.RED);// 设置标签内容为红⾊字体
right.add(label1);
//把主⾯板和说明⾯板添加到窗体中
this.setLayout(new BorderLayout());
this.add(center, BorderLayout.CENTER);
this.add(right, BorderLayout.EAST);
running = true; //初始化running状态为true,表⽰程序运⾏即游戏开始
this.setSize(600, 850);// 设置窗体⼤⼩
this.setVisible(true);// 窗体可见
this.setLocationRelativeTo(null);// 设置窗体居中
this.setResizable(false);// 窗体⼤⼩不可改变
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);// 释放窗体
}
/*主函数*/
public static void main(String[] args) {
Main m = new Main(); //创建Main对象,主要⽤于初始化数据
m.go();// 开始游戏
}
/*开始游戏*/
public void go() {// 开始游戏
while (true) {//游戏开始直到游戏失败才结束,否则⼀直执⾏
if (running == false) {//如果游戏失败
break;
}
ranRect();// 绘制下落⽅格形状
start();// 开始游戏
}
label1.setText("游戏结束!");//则游戏结束
}
/*绘制下落⽅格形状*/
public void ranRect() {
rect = allRect[(int) (Math.random() * 19)];// 随机⽣成⽅块类型(共7种,19个形状)
}
/*游戏开始函数*/
public void start() {
x = 0;
y = 5; //初始化下落⽅块的位置
for (int i = 0; i < 26; i++) {//共26层,⼀层⼀层下落
try {
Thread.sleep(1000);//每层延时1秒
if (canFall(x, y) == false) {// 如果不可以掉落
saveData(x, y);//把此⽅块区域data[][]标志为1,表⽰有数据
for (int k = x; k < x + 4; k++) {//循环遍历4层,看是否有哪⼀层都有⽅块的情况,以便消除那⼀⾏⽅格和统计得分
int sum = 0;
for (int j = 1; j <= 10; j++) {
if (data[k][j] == 1) {