填写俄罗斯方块程序!急急急!!!
什么是俄罗斯方块
俄罗斯方块是一款风靡全球的电视游戏机和掌上游戏机游戏,它曾经造成的轰动与造成的经济价值可以说是游戏史上的一件大事。这款游戏最初是由苏联的游戏制作人Alex Pajitnov制作的,它看似简单但却变化无穷,令人上瘾。
究其历史,俄罗斯方块最早还是出现在PC机上,而在国内大家都是通过红白机了解、喜欢上它的。对一般人来说,它的规则简单,容易上手,且游戏过程变化无穷,使人们既能感受到游戏中的乐趣,也给人们提供了一个展现自己高超技艺的场所。
俄罗斯方块的作用
作为一款曾经风靡全球的游戏,俄罗斯方块主要还是用于休闲娱乐。不过由于其思路简单,而且容易实现,所以现在很多初学者都以它做为练习的对象。
通过俄罗斯方块能学到什么
通过此次练习我们可以有以下几点收益:
1. 了解如何使用Java来开发图形界面应用程序
2. 了解如何用Java中实现事件监听
3. 了解如何在Java中使用多线程
部分代码
RussiaPanel.java
import javax.swing.JPanel;
import java.awt.Graphics2D;
import java.awt.Color;
import java.awt.Graphics;
class RussiaPanel extends JPanel {
int activeArray[][] = new int[25][15]; //用于存储当然活动的方块
int backArray[][] = new int[25][15]; //用于存储已固定的方块
public void paint(Graphics g) {
Graphics2D g2 = (Graphics2D) g;
super.paint(g2);
int height = this.getHeight(); //获取当前Panel的高度
int width = this.getWidth(); //获取当前Panel的宽度
//设置每个方块的大小
int size = (height / 25 < width / 15) ? height / 25 : width / 15;
for (int i = 0; i < 25; i++) {
for (int j = 0; j < 15; j++) {
switch (activeArray[i][j] + backArray[i][j]) {
/*
将所有方块绘制在Panel中
g2.setColor(Color) 用来选择颜色
要求在switch条件为0,1,3,5,7,9,11,13时
使用不同颜色来表示
*/
}
g2.fill3DRect(j * size, i * size, size - 1, size - 1, true);
}
}
}
}
Russia.java
import java.util.Arrays;
import java.util.Timer;
import java.util.TimerTask;
import java.awt.Container;
import java.awt.event.KeyListener;
import java.awt.event.KeyEvent;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
class MyFrame extends JFrame implements KeyListener {
Container c = new Container();
RussiaPanel p = new RussiaPanel();
int x, y;
//重构新的方块
public void Restart() {
x = 0; //定义方块初始的x坐标
y = 7; //定义方块初始的y坐标
/*
此方法中使用随机数构造出几种随机的方块
为配合RussiaPanel.java中的颜色设置,这里
要做七种不同形状的方块并分别给其赋值为
1,3,5,7,9,11,13
随机数的使用:
Math.random()
Returns a double value with a positive sign,
greater than or equal to 0.0 and less than 1.0.
*/
//当Panel的内容有所变化时要调用repaint()方法将变化内容重新显示
repaint();
}
//方块固定
public void Fall() {
/*
当活动方块落到底部或是落到已固定方块
上时,将活动方块变为固定方块。
*/
GameOver();
Clear();
Restart();
}
//填充空行 功能:将二维数组y中的第x行覆盖掉
public void Sorts(int y[][], int x) {
for (int i = x; i > 0; i--) {
System.arraycopy(y[i - 1], 0, y[i], 0, 15);
}
Arrays.fill(y[0], 0);
}
//行满消除判断
public void Clear() {
/*
判断是否某一行已填满,如已满将该行消
去,并调用填充空行方法将空行填充
*/
}
//矩阵旋转
public void change(int x, int y, int size) {
/*
当按下上箭头时要将活动方块90度旋转
参数:x方块的X坐标,y方块的Y坐标,
size方块所占矩阵大小。
*/
}
//左右移障碍物判断
/*
参数:y为相对位移,当按左时传-1,按
右时传1。
返回:当有障碍物时返回true
*/
public boolean Obstacle(int y) {
for (int i = 1; i < 24; i++) {
for (int j = 1; j < 14; j++) {
if (p.backArray[i][j + y] != 0 && p.activeArray[i][j] != 0) {
return true;
}
}
}
return false;
}
//下移障碍物判断
public boolean ObsDown() {
/*
判断活动方块向下移动时是否有
障碍物。(同左右移障碍物判断)
返回:当有障碍物时返回true
*/
}
//构造函数
public MyFrame() {
Restart();
this.setTitle("Test");
this.setSize(300, 500);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setLocation(200, 200);
c = this.getContentPane();
addKeyListener(this);
c.add(p);
this.setVisible(true);
this.go();
}
public void keyTyped(KeyEvent kev) {}
public void keyReleased(KeyEvent kev) {}
//键盘监听
//实现接口KeyListener 的一个方法,用于监听键盘
//当使用者按下某键时会触发该方法
public void keyPressed(KeyEvent evt) {
int key = evt.getKeyCode(); //获取使用者按键信息
/*
通过key来判断使用者按下的是(上,下,左,
右)中的哪个键,并执行相应操作。
例:if (key == KeyEvent.VK_LEFT)判断是否按下
左箭头。
*/
}
/*
左移,右移,下落三个方法功能:
当使用者按下左,右,下箭头时,按照按键移动活动方块
*/
//左移
public void MoveLeft() {
}
//右移
public void MoveRight() {
}
//下落
public void MoveDown() {
}
//时间线程 用一个Timer类来控制方块的自动下落时间
public void go() {
TimerTask task = new TimerTask() {
public void run() {
if (!ObsDown()) {
x++;
MoveDown();
} else {
Fall();
}
}
};
Timer timer = new Timer();
timer.schedule(task, 1000, 1000);
}
//Game Over
public void GameOver() {
for (int i = 0; i < 25; i++) {
for (int j = 0; j < 15; j++) {
if (p.backArray[i][j] % 2 == 0 && p.backArray[i][j] != 0) {
JOptionPane.showMessageDialog(this, "Game Over", "提示",
JOptionPane.WARNING_MESSAGE);
System.exit(0);
}
}
}
}
}
//主函数
public class Russia {
public static void main(String[] args) {
JFrame.setDefaultLookAndFeelDecorated(true);
new MyFrame();
}
}