package view;
import javax.swing.*;
import javax.swing.border.EtchedBorder;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import util.Constant;
//import javax.swing.Timer;
import java.util.TimerTask;
import java.util.Timer;
import javax.management.*;
import control.MusicPlayer;
import control.PreView;
import model.Block;
import model.Box;
import java.awt.*;
import java.awt.event.*;
public class MyFrame extends JFrame{
JPanel jp_pan=new JPanel();
JPanel jp_pre=new JPanel();
JPanel jp_ctrl=new JPanel();
JPanel jp_scor=new JPanel();
Zidingyi zi;
JRadioButtonMenuItem jr1=new JRadioButtonMenuItem("初级",true);
JRadioButtonMenuItem jr2=new JRadioButtonMenuItem("中级");
JRadioButtonMenuItem jr3=new JRadioButtonMenuItem("高级");
JLabel jt9=new JLabel("得分:0" );
static JLabel jt10=new JLabel("等级:1" );
JMenu m1=new JMenu("游戏");
JMenu m2=new JMenu("帮助");
JCheckBox jc1;
JSlider jsl;
// Dialog dia;//创建对话框
static ImageIcon background = new ImageIcon(Constant.backGround1);
// 把背景图片加到label
static JLabel label = new JLabel(background);
// Dialog dia=new Dialog(this, "自定义", false);
int scor=0;//初始化分数为0
static int rank=0;//初始化等级为0
int highC=0;
boolean upspeed=false;
boolean isTime=true;
boolean runstop;
static boolean isRank=false;
static boolean changeBack=false;
public static boolean playing=false;
static boolean isMusic=true;
static boolean high=false;
PreView pv=new PreView();
JMenuItem ji1=new JMenuItem("开局");
GameCanvas gc=new GameCanvas(20, 12);//画出20行12列
private Block block=new Block();//当前块
private int newspeed=1000;//默认当前等级为1
MusicPlayer mp=new MusicPlayer();
Timer time=new Timer();
MyTask mytask;
int temp=1;
// 游戏主构造函数
public MyFrame(String str){
super(str);
this.setSize(450, 570);
Dimension scrSize =
Toolkit.getDefaultToolkit().getScreenSize();//获取屏幕尺寸
setLocation((scrSize.width - getSize().width) / 2,
(scrSize.height - getSize().height) / 2);//设置屏幕居中
this.setLayout(null);
//label的大小为jframe的大小
label.setBounds(0, 0, this.getWidth(), this.getHeight());
//把label加到jframe的最底层,比jframe上的那个panel还下面
this.getLayeredPane().add(label, new Integer(Integer.MIN_VALUE));
//label比jframe上的那个panel还下面,那需要把那个panel设为透明的,不然就盖住背景了
JPanel imagePanel = (JPanel) this.getContentPane();
imagePanel.setOpaque(false);
addMenu();
//游戏开始按钮
ji1.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
// 如果游戏已经开始,再按一次即显示游戏结束
if (playing == true) {
ji1.setText("开局");
if(isMusic==true)
{mp.playStart();}
gc.setGameOver(true);
gc.repaint();
MyFrame.rank=11-Constant.step;
MyFrame.jt10.setText("等级:"+MyFrame.rank);
runstop=true;
block.isAlive=false;
block=new Block();
mytask.cancel();
playing = false;
} else {
reset();
if(isMusic==true)
{mp.playStart();}
MyFrame.rank=11-Constant.step;
MyFrame.jt10.setText("等级:"+MyFrame.rank);
ji1.setText("结束游戏");
playing = true;
mytask=new MyTask();
time.schedule(mytask, 0, 100);//100毫秒执行一次
Thread thread = new Thread(new play());// 调用开始游戏的方法
thread.start();
}
};
});
this.add(gc);//添加游戏画布
addRight();//添加右边
this.setFocusable(true);//设置可获得焦点
this.requestFocus();//设置焦点
this.addKeyListener(new MyListener());
this.setVisible(true);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public static void setBackGround(){
label.setIcon(background);
}
/**
* 定时下落,用计数方式来实现速度的改变
*
*/
private class MyTask extends TimerTask {
@Override
public void run() {
temp++;
if (temp % Constant.step == 0) {
block.newL = block.x;
block.newH = block.y + 1;
// block.yy();
if (block.pausing == true)
return;
if (high == true) {
block.earse();
highC++;
if (highC == 4) {
gc.addRow();
highC = 0;
}
}
if (block.isMoveAble(block.newH, block.newL)) {
block.earse();
block.y++;
block.display();
gc.repaint();
} else {
block.isAlive = false;
gc.repaint();
// cancel();
} // 取消定时器任务
temp = 1;
}
}
}
private class play implements Runnable {
public void run() {
/* if(killThread==true)
return;*/
int col = (int) (Math.random() * (gc.getCols() - 3));//随即位置生成列
int style = Constant.STYLES[(int) (Math.random() * Block.get_addl())][(int) (Math
.random() * 4)];
while (playing) {
if (block != null) {
//判断当前方块是否死亡
if (block.isAlive) {
try {
Thread.currentThread().sleep(100);
} catch (InterruptedException ie) {
ie.printStackTrace();
}
continue;
}
}
isFullLine();
// if(upspeed)//判断是否加速,是的话则进行调用
// upLevel();
if(isGameOver()){
if(isMusic==true)
{mp.playGameOver();}
gc.setGameOver(true);
gc.repaint();
ji1.setText("开局");
mytask.cancel();
playing=false;
return;
}
block = new Block(style, -1, col, gc);
block.jixu();//防止在暂停时候重新开始游戏,暂停字还不消失
gc.repaint();// 将创建出来的方块显示出来
block.isAlive = true;
col = (int) (Math.random() * (gc.getCols() - 3));//随即位置生成列
style = Constant.STYLES[(int) (Math.random() * Block.get_addl())][(int) (Math
.random() * 4)];
pv.setStyle(style);
}
}
/**
* 增加速度
*/
private void upLevel() {
if(Constant.step-1<1){
return;}
Constant.step=Constant.step-1; //速度增加一级
rank++;
jt10.setText("等级:"+rank);
upspeed=false;//将标志位至为false
}
/**
* 判断是否满行,满行则调用消行方法。
*/
private void isFullLine() {
// TODO Auto-generated method stub
for (int i = 0; i < 20; i++) {
int row = 0;
boolean flag = true;
for (int j = 0; j < 12; j++) {
if (!gc.getBox(i, j).isColorBox()) {
flag = false;
break;
}
}
if (flag == true) {
row = i;
gc.delete(row);//删除行
if(isMusic==true)
{mp.playEraseSound();}
addScor();//增加分数
if(scor%10==0)//设置为10分增加一个等级
upspeed=true;//将速度增加标志位至为true
if(upspeed==true)
upLevel();
}
}
}
/**
* 得分的计算方法
*/
private void addScor() {
scor=scor+10;
jt9.setText("得分:"+scor);
}
}
/**
* 判断最顶层是否有被占用,游戏是否结束
*/
private boolean isGameOver() {
for (int i = 0; i < 12; i++) {
Box box = gc.getBox(0, i);
if (box.isColorBox())
return true;
}return false;
}
private void reset() {
scor=0;
rank=0;
jt10.setText("等级:"+rank);
jt9.setText("得分:"+scor);
upspeed=false;
playing=true;
runstop=false;
// block.pausing=false;
// isTime=true;
// block=new Block();
// block.isAlive=false;
gc.setGameOver(false);
gc.repaint();
gc.reset();
}
/* private class MenuKeyListener extends KeyAdapter{
public void keyPressed(KeyEvent e) {
int i = e.getKeyCode();
switch (i) {
case KeyEvent.VK_C:
System.out.println("111");;
break;
case KeyEvent.VK_DOWN:
block.moveDown();
break;
case KeyEvent.VK_LEFT:
block.moveLeft();
break;
}
}
}*/
/**
*
*按键监听,上下左右。
*/
private class MyListener extends KeyAdapter{
@Override
public void keyPressed(KeyEvent e) {
// TODO Auto-generated method stub
没有合适的资源?快使用搜索试试~ 我知道了~
俄罗斯方块项目是一个基于Java的俄罗斯方块游戏的开发项目,包括方块设计、游戏逻辑实现、界面设计等功能的开发与实现
共47个文件
class:21个
java:9个
wav:7个
需积分: 5 0 下载量 17 浏览量
2024-02-01
15:50:35
上传
评论
收藏 2.3MB ZIP 举报
温馨提示
俄罗斯方块项目是一款经典的益智游戏,旨在通过组合不同形状的方块,填满整行或整列并清除方块来获得分数。本文将介绍基于Java的俄罗斯方块项目的设计与实现。 首先,项目需要设计不同形状的俄罗斯方块,包括L形、J形、S形、Z形、T形、I形和方块形。每种方块由4个小方块组成,可以旋转和移动。方块的设计需要考虑到其旋转规则、移动规则以及与其他方块的碰撞检测。 其次,项目需要实现游戏的逻辑,包括方块的生成、下落、移动、旋转、堆积和消除等功能。游戏逻辑的实现需要考虑到方块的下落速度、堆积规则、消除判定和得分计算等,以确保游戏的流畅性和可玩性。 此外,项目还需要设计游戏界面,包括游戏画面、得分统计、下一个方块预览、游戏暂停等功能。游戏界面的设计需要考虑到用户交互和视觉效果,以提升游戏的可玩性和娱乐性。 最后,项目还需要实现游戏的音效和音乐,包括方块落下的声音、消除方块的音效、背景音乐等。音效和音乐的设计需要考虑到游戏的节奏和氛围,以提升游戏的整体体验。 基于以上设计,我们可以使用Java语言进行俄罗斯方块项目的实现。通过Java的面向对象特性和丰富的类库,可以方便地实现方块设计、游戏逻辑、界
资源推荐
资源详情
资源评论
收起资源包目录
eluosi.zip (47个子文件)
eluosi
lib
jmf.jar 1.99MB
.classpath 351B
music
back1.mid 49KB
boom.mp3 31KB
keydown.wav 1KB
lost.wav 43KB
fixup.wav 16KB
win.wav 87KB
delete.wav 24KB
EndRows.wav 4KB
ReadyGo.WAV 83KB
backmusic.mid 7KB
.settings
org.eclipse.jdt.core.prefs 598B
image
248851_副本.jpg 24KB
zz_副本.jpg 89KB
背景1_副本.jpg 54KB
src
view
MyFrame.java 14KB
GameCanvas.java 5KB
Zidingyi.java 6KB
Version.java 830B
model
Box.java 685B
Block.java 5KB
util
Constant.java 1KB
control
PreView.java 2KB
MusicPlayer.java 2KB
bin
view
MyFrame.class 8KB
MyFrame$2.class 947B
MyFrame$4.class 673B
MyFrame$6.class 1KB
MyFrame$5.class 765B
MyFrame$1.class 2KB
MyFrame$3.class 1KB
MyFrame$MenuActionListener.class 1KB
MyFrame$MyTask.class 1KB
GameCanvas.class 4KB
Zidingyi.class 6KB
Zidingyi$1.class 767B
MyFrame$MyListener.class 1KB
Version.class 1KB
MyFrame$play.class 3KB
model
Block.class 4KB
Box.class 475B
util
Constant.class 1KB
control
PreView.class 1KB
MusicPlayer$1.class 891B
MusicPlayer.class 3KB
.project 386B
共 47 条
- 1
资源评论
霸气小波
- 粉丝: 25
- 资源: 6
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功