/**
* File: ErsBlocksGame.java
* User: Administrator
* Date: Dec 15, 2003
* Describe: 俄罗斯方块的 Java 实现
*/
package game;
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
/**
* 游戏主类,继承JFrame类,负责游戏的全局控制。 内含 1, 一个GameCanvas画布类的实例引用, 2,
* 一个保存当前活动块(ErsBlock)实例的引用, 3, 一个保存当前控制面板(ControlPanel)实例的引用;
*/
public class ErsBlocksGame extends GameMenu {
/**
* 每填满一行计多少分
*/
public final static int PER_LINE_SCORE = 100;
/**
* 积多少分以后能升级
*/
public final static int PER_LEVEL_SCORE = PER_LINE_SCORE * 20;
/**
* 最大级数是10级
*/
public final static int MAX_LEVEL = 10;
/**
* 默认级数是5
*/
public final static int DEFAULT_LEVEL = 5;
public static int selfFail = 0;
public static int otherFail = 0;
// 一个GameCanvas画布类的实例引用,
private GameCanvas canvas;
// 一个保存当前活动块(ErsBlock)实例的引用,
private ErsBlock block;
// 一个保存当前控制面板(ControlPanel)实例的引用;
private ControlPanel ctrlPanel;
private boolean playing = false;
/**
* 主游戏类的构造函数
*
* @param title
* String,窗口标题
*/
public ErsBlocksGame(String title) {
super(title);
// 初始窗口的大小,用户可调控
setSize(315, 392);
Dimension scrSize = Toolkit.getDefaultToolkit().getScreenSize();
// 将游戏窗口置于屏幕中央
setLocation((scrSize.width - getSize().width) / 2,
(scrSize.height - getSize().height) / 2);
Container container = getContentPane();
// 布局的水平构件之间有6个象素的距离
container.setLayout(new BorderLayout(6, 0));
// 建立20个方块高,12个方块宽的游戏画布
canvas = new GameCanvas();
// 建立一个控制面板
ctrlPanel = new ControlPanel(this);
ctrlPanel.setPlayButtonEnable(false);
// 游戏画布和控制面板之间左右摆放
container.add(canvas, BorderLayout.CENTER);
container.add(ctrlPanel, BorderLayout.EAST);
// 增加窗口监听器
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent we) {
System.exit(0);
}
});
show(); // setVisiable
// 根据窗口的大小,自动调整方格的尺寸
canvas.fanning();
setResizable(false);
}
/**
* 让游戏“复位”
*/
public void reset() {
ctrlPanel.reset(); // 控制窗口复位
canvas.reset(); // 游戏画板复位
}
public void gameReset() {
ctrlPanel.setPlayButtonEnable(false);
// ctrlPanel.setPauseButtonLabel(true);
getMGame().setEnabled(true);
getMControl().setEnabled(true);
getMInfo().setEnabled(true);
getMiNewGame().setEnabled(true);
getMiConnectGame().setEnabled(true);
}
/**
* 判断游戏是否还在进行
*
* @return boolean, true-还在运行,false-已经停止
*/
public boolean isPlaying() {
return playing;
}
/**
* 得到当前活动的块
*
* @return ErsBlock, 当前活动块的引用
*/
public ErsBlock getCurBlock() {
return block;
}
/**
* 得到当前画布
*
* @return GameCanvas, 当前画布的引用
*/
public GameCanvas getCanvas() {
return canvas;
}
/**
* 开始游戏
*/
public void playGame() {
play();
ctrlPanel.setPlayButtonEnable(false);
// miPlay.setEnabled(false);
ctrlPanel.requestFocus();
}
/**
* 得到当前游戏者设置的游戏难度
*
* @return int, 游戏难度1-MAX_LEVEL=10
*/
public int getLevel() {
return ctrlPanel.getLevel();
}
/**
* 让用户设置游戏难度系数
*
* @param level
* int, 游戏难度系数为1-MAX_LEVEL=10
*/
public void setLevel(int level) {
if (level < 11 && level > 0)
ctrlPanel.setLevel(level);
}
/**
* 得到游戏积分
*
* @return int, 积分。
*/
public int getScore() {
if (canvas != null)
return canvas.getScore();
return 0;
}
/**
* 得到自上次升级以来的游戏积分,升级以后,此积分清零
*
* @return int, 积分。
*/
public int getScoreForLevelUpdate() {
if (canvas != null)
return canvas.getScoreForLevelUpdata();
return 0;
}
/**
* 当分数累计到一定的数量时,升一次级
*
* @return boolean, ture-更新成功, false-更新失败
*/
public boolean levelUpdate() {
int curLevel = getLevel();
if (curLevel < MAX_LEVEL) {
setLevel(curLevel + 1);
canvas.resetScoreForLevelUpdata();
return true;
}
return false;
}
/**
* 游戏开始
*/
private void play() {
reset();
playing = true;
Thread thread = new Thread(new Game());
thread.start();
}
private void reportGameWin() {
JOptionPane.showMessageDialog(this, "你赢了");
}
private void reportGameLose() {
JOptionPane.showMessageDialog(this, "你输了");
}
/**
* 一轮游戏过程,实现了Runnable接口 一轮游戏是一个大循环,在这个循环中,每隔100毫秒, 检查游戏中的当前块是否已经到底了,如果没有,
* 就继续等待。如果到底了,就看有没有全填满的行, 如果有就删除它,并为游戏者加分,同时随机产生一个 新的当前块,让它按所定级别的速度,自动下落。
* 当新产生一个块时,先检查画布最顶端的一行是否已经 被占了,如果是,可以显示“游戏结束”了。
*/
private JDialog serverSuc() {
JDialog dialog = new JDialog(this, "提示信息", false);
JLabel label = new JLabel(" 端口有效,等待其他玩家中......");
dialog.getContentPane().setLayout(new BorderLayout());
dialog.setSize(300, 90);
dialog.setResizable(false);
dialog.getContentPane().add(label);
Dimension scrSize = Toolkit.getDefaultToolkit().getScreenSize();
dialog.setLocation((scrSize.width - getSize().width) / 2,
(scrSize.height - getSize().height) / 2);
return dialog;
}
private JDialog socketSuc() {
JDialog dialog = new JDialog(this, "提示信息", false);
JLabel label = new JLabel("与玩家连接建立成功,10s后开始游戏!");
dialog.getContentPane().setLayout(new BorderLayout());
dialog.setSize(300, 90);
dialog.setResizable(false);
dialog.getContentPane().add(label);
Dimension scrSize = Toolkit.getDefaultToolkit().getScreenSize();
dialog.setLocation((scrSize.width - getSize().width) / 2,
(scrSize.height - getSize().height) / 2);
return dialog;
}
private JDialog showException(Exception e) {
JDialog dialog = new JDialog(this, "提示信息", false);
JLabel label = new JLabel(e.toString());
dialog.getContentPane().setLayout(new BorderLayout());
dialog.setSize(300, 90);
dialog.setResizable(false);
dialog.getContentPane().add(label);
Dimension scrSize = Toolkit.getDefaultToolkit().getScreenSize();
dialog.setLocation((scrSize.width - getSize().width) / 2,
(scrSize.height - getSize().height) / 2);
return dialog;
}
private class Game implements Runnable {
public void run() {
int col = canvas.getCols() - 8;
int style = ErsBlock.STYLES[(int) (Math.random() * 7)][(int) (Math
.random() * 4)];
ServerSocket server = getServer();
JDialog serverSuc = serverSuc();
JDialog socketSuc = socketSuc();
Socket socketOut = null;
Socket socketIn = null;
ObjectInputStream in = null;
ObjectOutputStream out = null;
selfFail = 0;
otherFail = 0;
int numLose = 0;
boolean serverSign = false;
boolean clienSign = false;
int[][] failData;
if (getAddress() != null) {
serverSign = false;
clienSign = true;
try {
socketIn = new Socket(getAddress(), getPortNum());
socketOut = new Socket(getAddress(), getPortNum());
in = new ObjectInputStream(socketIn.getInputStream());
out = new ObjectOutputStream(socketOut.getOutputStream());
} catch (Exception e) {
System.out.println(e.toStrin
没有合适的资源?快使用搜索试试~ 我知道了~
java实现俄罗斯方块对战版
共55个文件
class:34个
java:12个
ini:2个
5星 · 超过95%的资源 需积分: 10 47 下载量 53 浏览量
2009-02-08
20:59:48
上传
评论 1
收藏 110KB ZIP 举报
温馨提示
用java语言实现的两人对战版本的俄罗斯方块程序,添加了相当丰富的注释
资源推荐
资源详情
资源评论
收起资源包目录
turis.zip (55个子文件)
ch02
log
Snapshot.1 229B
Version_Number 4B
Logfile.1 8B
bin
game
gameset
GameControlkeySet$Click.class 859B
GameExitSet$1.class 705B
GameServerSocketSet$2.class 748B
GameControlkeySet$RIGHTkey.class 2KB
GameExitSet$isok.class 825B
GameControlkeySet$UPkey.class 2KB
GameControlkeySet$1.class 736B
GameHardSet.class 3KB
GameExitSet.class 2KB
GameServerSocketSet$1.class 1KB
GameControlkeySet$DOWNkey.class 2KB
GameControlkeySet.class 5KB
GameServerSocketSet.class 5KB
GameExitSet$isno.class 807B
GameHardSet$isOk.class 1KB
GameControlkeySet$LEFTkey.class 2KB
GameHardSet$1.class 700B
GameClienSocketSet$1.class 742B
GameClienSocketSet.class 4KB
ErsBlocksGame.class 7KB
ErsBox.class 1KB
GameMenu$1.class 663B
ControlPanel$ShowPanel.class 2KB
ErsBlocksGame$Game.class 5KB
ControlPanel.class 4KB
GameCanvas.class 5KB
ControlPanel$ControlKeyListener.class 1KB
ErsBlocksGame$1.class 694B
ControlPanel$TipPanel.class 2KB
ControlPanel$2.class 1KB
ErsBlock.class 6KB
GameMenu.class 6KB
Desktop_.ini 8B
ControlPanel$1.class 984B
Date.class 1KB
Desktop_.ini 8B
src
game
gameset
GameExitSet.java 2KB
GameControlkeySet.java 6KB
GameClienSocketSet.java 4KB
GameServerSocketSet.java 4KB
GameHardSet.java 2KB
ControlPanel.java 9KB
ErsBlocksGame.java 12KB
Data.java 1KB
ErsBlock.java 8KB
GameCanvas.java 7KB
GameMenu.java 6KB
ErsBox.java 1KB
.project 380B
game0512_fat.jar 46KB
.fatjar 341B
.classpath 232B
共 55 条
- 1
资源评论
- 毛毛虫丶2014-05-11VS2005+SQL2005俄罗斯方块对战版
长街千堆雪
- 粉丝: 0
- 资源: 3
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功