package eluosiBlock.view;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.Timer;
/**
*<p>Title: EluosiBlock.java</p>
* @author LQ
* @version 1.0 创建时间:May 19, 2017 4:58:59 PM
*/
public class EluosiBlock extends JPanel implements KeyListener{
/**方块的类型,共有七种类型*/
private int blockType;
/**每种方块的翻转类型*/
private int turnState;
/**得分*/
private int score = 0;
/**下一个方块*/
private int nextblockType = -1;
/**下一个方块的翻转类型*/
private int nextturnState = -1;
/**位置坐标*/
private int x, y;
private Timer timer;// 定时器
/**游戏地图,存放空白处(0),已经放下的方块(1),围墙(2)*/
int[][] map = new int[12][21];
/**方块的形状,有Z、倒Z、L、J、I、田和T七种,使用三维数组shapes存储每种形状及其旋转变形*/
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 }, },
// 倒Z字形
{ { 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 }, },
// 田字形
{ { 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 }, }, };
/**
* 产生一个新的下落方块,同时启动定时器,每800毫秒触发一次,同时进行是否消除的判断
*/
public EluosiBlock() {
newblock();
map();
timer = new Timer(800, new TimerListener());// 0.5s
timer.start();
}
public Timer getTimer() {
return timer;
}
public void setTimer(Timer timer) {
this.timer = timer;
}
/**
* 生成一个新的方块
*/
public void newblock() {
// 没有下一方块
if (nextblockType == -1 && nextturnState == -1) {
blockType = (int) (Math.random() * 1000) % 7;
turnState = (int) (Math.random() * 1000) % 4;
nextblockType = (int) (Math.random() * 1000) % 7;
nextturnState = (int) (Math.random() * 1000) % 4;
}
// 已经有下一方块
else {
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)// 游戏结束
{
map();
score = 0;
JOptionPane.showMessageDialog(null, "GAME OVER");
}
}
/**
* 地图初始化
*/
public void map() {
for (int i = 0; i < 12; i++) {
for (int j = 0; j < 21; j++) {
map[i][j] = 0;
}
}
for (int i = 0; i < 12; i++) {
map[i][20] = 2;
}
for (int j = 0; j < 21; j++) {
map[11][j] = 2;
map[0][j] = 2;
}
}
/**
* 时间监听器
*每800秒下落一次同时判断能否下落,如果可以下落则纵坐标减1 如果不能则固定住当前方
*同时判断是否能够消除满行
*最后屏幕重画
*/
class TimerListener implements ActionListener {
public void actionPerformed(ActionEvent e) {
if (blow(x, y + 1, blockType, turnState) == 1)// 判断为可以下落
{
y = y + 1;
}
if (blow(x, y + 1, blockType, turnState) == 0)// 判断为不能下落
{
add(x, y, blockType, turnState);// 固定当前方块
deline();// 消除满行
newblock();// 产生新的方块
}
repaint();// 屏幕重画
}
}
/**翻转方块*/
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;
}
if (blow(x, y + 1, blockType, turnState) == 0) {
add(x, y, blockType, turnState);
newblock();
deline();
}
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 deline() {
int c = 0;
for (int b = 0; b < 21; 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 < 12; 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;
}
/**当方块下落到不能下落 固定方块*/
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 (shapes[blockType][turnState][j] == 1) {
map[x + b + 1][y + a] = shapes[blockType][turnState][j];
}
j++;
}
}
}
/**屏幕绘制 围墙用矩形表示 方块用实心矩形表示*/
public void paint(Graphics g) {
super.paint(g);// 调用父类paint()方法,实现初始化清屏
int i, j;
// 画当前方块
for (j = 0; j < 16; j++) {
if (shapes[blockType][turnState][j] == 1) {
g.fillRect((j % 4 + x + 1) * 15, (j / 4 + y) * 15, 15, 15);
}
}
// 画已固定的方块和围墙
for (j = 0; j < 21; j++) {
for (i = 0; i < 12; i++) {
if (map[i][j] == 1) {
g.fillRect(i * 15, j * 15, 15, 15);
}
if (map[i][j] == 2) {
g.drawRect(i * 15, j * 15, 15, 15);
}
}
}
g.drawString("score=" + score, 225, 15);
g.drawString("下一方块形状", 225, 50);
// 在窗口的右侧区域绘制下一块方块
for (j = 0; j < 16; j++) {
if (shapes[nextblockType][nextturnState][j] == 1) {
g.fillRect(225 + (j % 4) * 15, (j / 4) * 15 + 100, 15, 15);
}
}
}
/**键盘监听 方向键功能设置 右键代表右移 左键代表左移 上键代表方块翻转 下键代表下落*/
@Override
public void keyPressed(KeyEvent e) {
switch (e.getKeyCode()) {
case KeyEvent.VK_DOWN:
down();
break;
case KeyEvent.VK
java小游戏 俄罗斯方块
版权申诉
5星 · 超过95%的资源 153 浏览量
2022-06-23
09:01:37
上传
评论 2
收藏 65KB RAR 举报
金枝玉叶9
- 粉丝: 125
- 资源: 7640
最新资源
- 基于matlab实现夜间车牌识别程序(1).rar
- 基于matlab实现无线传感器网络无需测距定位算法matlab源代码 包括apit,dv-hop,amorphous在内的共7个
- 基于python的yolov5实现的旋转目标检测
- 基于matlab实现无线传感器网络 CAB定位仿真程序 这是无线传感器节点定位CAB算法的仿真程序,由matlab完成.rar
- 基于matlab实现图像处理,本程序使用背景差分法对来往车辆进行检测和跟踪.rar
- 基于matlab实现视频监控中车型识别代码,自己写的,希望和大家多多交流.rar
- springcodespringcodespringcodespringcode
- 基于matlab实现权值的MAXDEV无线传感器网络定位算法研究 MAXDEV 无线传感器 定位 算法.rar
- sdk.config
- 基于matlab实现配电网三相潮流计算方法,对几种常用的配电网潮流计算方法进行了对比分析.rar
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
- 1
- 2
- 3
前往页