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) {