package Tetris;
import java.awt.AWTException;
import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.LinkedList;
import javax.imageio.ImageIO;
import javax.swing.JOptionPane;
import javax.swing.Timer;
public class DoubleGameFrame extends GameFrame{
/**
* 双人模式的整体游戏框架
*/
private static final long serialVersionUID = 5L;
private CommunicateView paint;
private Thread sendThread,receiveThread,sendDataThread,receiveDataThread;
private Timer receiveTimer,receiveDataTimer;
private ServerSocket s,sd;
private Socket send,receive,sendData,receiveData;
private int sendPort,receivePort;
private String sendIP;
OutputStream out;
Robot robot;
DoubleGameFrame(String ip,int sp,int rp)
throws Exception{
super();
sendIP = ip;
sendPort = sp;
receivePort = rp;
paint = new CommunicateView(this.getWidth()/2,this.getHeight()/2);
add(paint);
pack();
new LinkedList<Integer>();
try {
robot = new Robot();
} catch (AWTException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
//接受对方战况并绘制的线程
receiveThread = new Thread(){
public void run() {
// compute primes larger than minPrime
try {
s = new ServerSocket(receivePort);
receive = s.accept();
InputStream in = receive.getInputStream();
receiveTimer = new Timer(10, new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
try {
paint.setImage(ImageIO.read(in));
} catch (IOException e1) {
// TODO Auto-generated catch block
//e1.printStackTrace();
receiveTimer.stop();
}
}
});
receiveTimer.start();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
};
//发送己方战况的线程
sendThread = new Thread(){
public void run() {
// compute primes larger than minPrime
while(true)
{
try {
send = new Socket(sendIP,sendPort);
OutputStream out = send.getOutputStream();
while(true)
{
try {
ImageIO.write(creatView(), "png", out);
out.flush();
} catch (IOException e1) {
// TODO Auto-generated catch block
//e1.printStackTrace();
winGame();
break;
}
catch (Exception e1) {
// TODO Auto-generated catch block
//e1.printStackTrace();
break;
}
}
break;
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
};
//接受数据的线程,获取一个输出流
receiveDataThread = new Thread(){
public void run() {
// compute primes larger than minPrime
try {
sd = new ServerSocket(receivePort+1);
receiveData = sd.accept();
InputStream in = receiveData.getInputStream();
receiveDataTimer = new Timer(1000, new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
try {
if(in.available()!=0)
game.addRow(in.read());
} catch (IOException e1) {
// TODO Auto-generated catch block
//e1.printStackTrace();
receiveDataTimer.stop();
}
}
});
receiveDataTimer.start();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
};
//传送数据的线程,必要时为对方增长行数
sendDataThread = new Thread(){
public void run() {
// compute primes larger than minPrime
while(true)
{
try {
sendData = new Socket(sendIP,sendPort+1);
out = sendData.getOutputStream();
break;
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
};
resetGame();
}
//创建并返回己方战况视图
public BufferedImage creatView()
{
int x = this.getBounds().x+game.getBounds().x;
int y = this.getBounds().y+game.getBounds().y;
int w = watch.getBounds().width + watch.getBounds().x;
int h = this.getBounds().height;
return robot.createScreenCapture(new Rectangle(x,y,w,h));
}
@Override
protected int updateData()
{
int i = 0;
try {
i = super.updateData();
}catch (Exception e1){
e1.printStackTrace();
}
if(i>1)
try {
out.write(i-1);
out.flush();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return i;
}
@Override
protected void resetGame()
{
try {
super.resetGame();
}catch (Exception e1){
e1.printStackTrace();
}
this.sendThread.start();
this.receiveThread.start();
this.sendDataThread.start();
this.receiveDataThread.start();
downMoveTimer.start();
}
@Override
protected void restartGame()
{
}
@Override
protected void pauseGame()
{
}
//游戏失败
@Override
protected void stopGame()
{
JOptionPane.showMessageDialog(null, "你输了", "Tetris", JOptionPane.ERROR_MESSAGE);
receiveThread.interrupt();
sendThread.interrupt();
try {
send.close();
receive.close();
s.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//赢得游戏,弹出提示框,释放资源
protected void winGame()
{
JOptionPane.showMessageDialog(null, "你赢了,当前分数是"+watch.score, "Tetris", JOptionPane.OK_OPTION);
game.endGame();
sendThread.interrupt();
receiveThread.interrupt();
try {
send.close();
receive.close();
s.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
没有合适的资源?快使用搜索试试~ 我知道了~
java 俄罗斯方块大作业项目
共42个文件
sample:13个
java:9个
head:4个
0 下载量 107 浏览量
2023-06-14
23:04:56
上传
评论
收藏 1.21MB RAR 举报
温馨提示
java 俄罗斯方块大作业项目
资源推荐
资源详情
资源评论
收起资源包目录
Tetris.rar (42个子文件)
Tetris
.classpath 248B
.settings
org.eclipse.jdt.core.prefs 598B
.gitattributes 395B
src
Tetris
UnitKey.java 3KB
DoubleGameFrame.java 6KB
WatchView.java 2KB
GameFrame.java 5KB
qcde.png 799KB
1.png 120KB
RankingView.java 3KB
Unit.java 1008B
CommunicateView.java 662B
Main.java 2KB
GameView.java 4KB
.git
index 1KB
HEAD 23B
refs
heads
master 41B
tags
remotes
origin
HEAD 32B
objects
pack
pack-60de9e5cff65f21f19fe2804afeaf30baf15f283.idx 5KB
pack-60de9e5cff65f21f19fe2804afeaf30baf15f283.pack 363KB
info
description 73B
packed-refs 114B
info
exclude 240B
logs
HEAD 185B
refs
heads
master 185B
remotes
origin
HEAD 185B
hooks
post-update.sample 189B
prepare-commit-msg.sample 1KB
commit-msg.sample 896B
pre-receive.sample 544B
update.sample 4KB
pre-commit.sample 2KB
pre-rebase.sample 5KB
applypatch-msg.sample 478B
fsmonitor-watchman.sample 5KB
push-to-checkout.sample 3KB
pre-applypatch.sample 424B
pre-push.sample 1KB
pre-merge-commit.sample 416B
config 303B
.project 391B
.gitignore 18B
共 42 条
- 1
资源评论
阿利同学
- 粉丝: 3w+
- 资源: 290
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功