俄罗斯方块(Java实现)
程序效果:

代码:
//Box.java
1 package tetris;
public class Box {
private final int M = 30, N = 12;
private int[][] ls = new int[M][N];
private int score=0;
int getM() {
return M;
}
int getN() {
return N;
}
int getScore() {
return score;
}
boolean isOut(int x,int y){
return x<0|y<0|x>M-1|y>N-1?true:false;
}
int getFlag(int x, int y) {
return isOut(x,y)?2:ls[x][y];
}
int clearFlag(int x, int y) {
if(isOut(x,y))return -1;
ls[x][y]=0;
return 0;
}
int setFlag_1(int x, int y) {
if(isOut(x,y))return -1;
ls[x][y]=1;
return 0;
}
int setFlag_2(int x, int y) {
if(isOut(x,y))return -1;
ls[x][y]=2;
return 0;
}
/*boolean isFlag_2(int x, int y) {
return isOut(x,y)?true:ls[x][y]== 2 ? true:false ;
}*/
void clear(int x, int maxX) {
if(isOut(x,0)||isOut(maxX,0))return ;
for (int i = x; i <= maxX; i++) {
boolean isAllNotBlank = true;
for (int j = 0; j <= N - 1; j++) {
if (ls[i][j]== 0) {
isAllNotBlank = false;
break;
}
}
if (isAllNotBlank) {
for (int k = i - 1; k >= 0; k--) {
for (int j = 0; j <= N - 1; j++) {
ls[k + 1][j]=ls[k][j];
}
}
score+=100;
}
}
}
}
//Shape.java
1 package tetris;
import java.awt.Point;
import java.util.Random;
public class Shape {
private final Box box;
private Point[] ps = new Point[4];
private Point[] tps = new Point[5];
private final int[][][]shapes={
{{-1,0,0,0,1,0,2,0},{0,0,0,-1,0,2,0,1}},
{{- 1,0, 1, - 1,0,0,1,0},{0,- 1,1,-1,1,1,1,0},{-1,0,0,0,-1,1,1,0},{0,0,0,-1,0,1,1,1}},
{{-1,0,0,0,1,1,1,0},{0,1,1,-1,1,1,1,0},{-1,0,-1,-1,0,0,1,0},{0,0,0,-1,0,1,1,-1}},
{{0,0,1,-1,1,1,1,0},{0,0,1,-1,1,0,2,0},{0,0,0,-1,0,1,1,0},{0,0,1,0,1,1,2,0}},
{{0,0,1,0,0,1,1,1}},
{{-1,0,0,-1,-1,1,0,0},{-1,0,0,0,0,1,1,1}},
{{- 1,0, - 1,- 1,0, 1,0,0},{- 1,1,0,0,0,1,1,0}}
};
private int change = 0,shape,x,y;
int left,down;
private Random random;
boolean isPaused = false;
Shape(Box b) {
box = b;
for (int i = 0; i <= 3; i++) {
ps[i] = new Point();
}
for (int i = 0; i <= 4; i++) {
tps[i] = new Point();
}
random = new Random();
getNewShape();
}
private void clearTpsFlag(){
for (int i = 0; i <= 3; i++) {
box.clearFlag(tps[i].x, tps[i].y);
}
}
private int setPsFlag_1() {
for (int i = 0; i <= 3; i++) {
box.setFlag_1(ps[i].x, ps[i].y);
}
return 0;
}
private int setPsFlag_2() {
for (int i = 0; i <= 3; i++) {
box.setFlag_2(ps[i].x, ps[i].y);
}
return 0;
}
private synchronized int tps() {
for (int i = 0; i <= 3; i++) {
tps[i].x = ps[i].x;
tps[i].y = ps[i].y;
}
tps[4].x=x;
tps[4].y=y;
return 0;
}
private synchronized int backupChange() {
for (int i = 0; i <= 3; i++) {
ps[i].x = tps[i].x;
ps[i].y = tps[i].y;
}
x=tps[4].x;
y=tps[4].y;
return 0;
}
private synchronized int check() {
System.out.println(ps[0]+","+ps[1]+","+ps[2]+","+ps[3]);
for (int i = 0; i <= 3;i++) {
if (!(box.getFlag(ps[i].x, ps[i].y)==0||box.getFlag(ps[i].x, ps[i].y)==1)){
backupChange();
return 5;}
}
return 0;
}
private void getNewShape(){
System.out.println("lll");
int i = Math.abs(random.nextInt()) % 7;
shape=i;
x=1;
y=box.getN()/2;
for(int j=0;j<=3;j++){
ps[j].setLocation(x+shapes[i][0][j*2], y+shapes[i][0][j*2+1]);
}
left=0;
down=0;
change=0;
}
void changeShape(){
tps();
change++;
change%=shapes[shape].length;
for(int j=0;j<=3;j++){
ps[j].setLocation(x+shapes[shape][change][j*2], y+shapes[shape][change][j*2+1]);
}
int g=check();
if(g==0){
clearTpsFlag();
setPsFlag_1();
}
}
synchronized int move(int dir) {
tps();
switch(dir){
case 0:for (int i = 0; i <= 3; i++) {ps[i].y--;}y--;break;
case 1:for (int i = 0; i <= 3; i++) {ps[i].y++;}y++;break;
case 2:for (int i = 0; i <= 3; i++) {ps[i].x++;}x++;break;
default:
}
int g = check();
if(g!=0&&dir==2){
int x = ps[0].x;
int maxX = ps[3].x;// x+4>M-1?M-1:x+4;
setPsFlag_2();
box.clear(x, maxX);
if(x==1){return -1;}
getNewShape();
}
if(g==0){
clearTpsFlag();
setPsFlag_1();
}
return 0;
}
}
//Tetris.java
1 package tetris; import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.Graphics;
import java.awt.GridLayout;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField; public class Tetris extends JFrame implements Runnable{
private static final long serialVersionUID = 279494108361487144L;
final Color BC = Color.GRAY;
final Color FC = Color.LIGHT_GRAY;
Box box;
Shape shape;
int a = 0, b = 0, c = 0;
JPanel panel, scorePanel;
JTextField scoreField, bestScoreField;
JButton[][] bs;
Tetris(Box b) {
super("Tetris");
box = b;
shape =new Shape(b);
bs = new JButton[box.getM()][box.getN()];
for (int i = 0; i <= box.getM() - 1; i++) {
for (int j = 0; j <= box.getN() - 1; j++) {
bs[i][j] = new JButton();
bs[i][j].setBackground(BC);
}
}
Container container = getContentPane();
container.setLayout(new BorderLayout());
scorePanel = new JPanel();
scorePanel.setLayout(new BorderLayout());
scoreField = new JTextField(10);
bestScoreField = new JTextField(20);
bestScoreField.setText(getBestScores());
bestScoreField.setEditable(false);
scoreField.setText("SCORE: " + new Integer(box.getScore()).toString());
scoreField.setEditable(false);
scorePanel.add(scoreField, BorderLayout.NORTH);
scorePanel.add(bestScoreField, BorderLayout.SOUTH);
container.add(scorePanel, BorderLayout.NORTH);
panel = new JPanel();
panel.setLayout(new GridLayout(box.getM(), box.getN()));
for (int i = 0; i <= box.getM() - 1; i++) {
for (int j = 0; j <= box.getN() - 1; j++) {
panel.add(bs[i][j]);
}
}
container.add(panel, BorderLayout.CENTER);
this.addKeyListener(new KeyAdapter() {
public void keyPressed(KeyEvent e) {
int c = e.getKeyCode();
// System.out.print(c);
switch (c) {
case KeyEvent.VK_LEFT :
//shape.left++;
shape.move(0);
break;
case KeyEvent.VK_RIGHT :
//shape.left--;
shape.move(1);
break;
case KeyEvent.VK_UP :
shape.changeShape();
break;
case KeyEvent.VK_DOWN :
shape.down++;
break;
case KeyEvent.VK_SPACE :
if (shape.isPaused == true) {
shape.isPaused = false;
} else {
shape.isPaused = true;
}
break;
default : }
}
});
this.setFocusable(true);
setLocation(200, 10);
setSize(20 * box.getN(), 20 * box.getM() + 20);
setVisible(true);
}
private int down() throws InterruptedException {
System.out.println("ddd");
int dd=shape.move(2);
scoreField.setText("Score: " + new Integer(box.getScore()).toString());
if(dd==-1){gameOver();}
return 0;
}
public void run() {
while (true) {
try {
if (shape.isPaused == true) {
// System.out.println("PAUSED");
Thread.sleep(500);
} else {
//System.out.println("start1");
down();
for (int i = 0; i <= box.getM() - 1; i++) {
for (int j = 0; j <= box.getN() - 1; j++) {
if(box.getFlag(i, j)==0)
bs[i][j].setBackground(BC);
else bs[i][j].setBackground(FC);
}
}
if (shape.down >=1) {
shape.down--;
Thread.sleep(50);
continue;
}
Thread.sleep(250);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
String getBestScores() {
BufferedReader reader = null;
try {
reader = new BufferedReader(new FileReader("score.txt"));
} catch (FileNotFoundException e) {
e.printStackTrace();
}
try {
a = Integer.parseInt(reader.readLine());
b = Integer.parseInt(reader.readLine());
c = Integer.parseInt(reader.readLine());
} catch (NumberFormatException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
String bestS = new String("Best Score: " + new Integer(a).toString()
+ " " + new Integer(b).toString() + " "
+ new Integer(c).toString());
return bestS;
}
int gameOver() {
JOptionPane.showMessageDialog(null, "你死了~~~.", "GAME OVER",
JOptionPane.PLAIN_MESSAGE);
if (box.getScore() > a) {
c = b;
b = a;
a = box.getScore();
}
else if (box.getScore() > b) {
c = b;
b = box.getScore();
}
else if (box.getScore()> c) {
c = box.getScore();
}
save();
System.exit(0);
return 0;
}
int save() {
BufferedWriter writer = null;
try {
writer = new BufferedWriter(new FileWriter("score.txt"));
} catch (IOException e) {
e.printStackTrace();
}
String d = new Integer(a).toString(), e = new Integer(b).toString(),
f = new Integer(c).toString();
try {
writer.write(d);
writer.newLine();
writer.write(e);
writer.newLine();
writer.write(f);
writer.flush();
writer.close();
} catch (NumberFormatException ev) {
ev.printStackTrace();
} catch (IOException ev) {
ev.printStackTrace();
}
return 0;
}
public static void main(String[] args) {
Box box = new Box();
Tetris tetris = new Tetris(box);
tetris.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Thread thread1 = new Thread(tetris);
thread1.start();
} }
程序写于大三上学期。
2016.4.12更新博客。
END
俄罗斯方块(Java实现)的更多相关文章
- 201604-2 俄罗斯方块 Java
大家谁能帮我看看是哪里不对,提交到系统中是0分,在Eclipse中可以得出例子中的结果 思路: 题目中有两个关键点:如何模拟下落的过程,如何判断方块下落在哪里停止. 在数据的存储上,需要保存整个&qu ...
- Spark案例分析
一.需求:计算网页访问量前三名 import org.apache.spark.rdd.RDD import org.apache.spark.{SparkConf, SparkContext} /* ...
- java俄罗斯方块游戏代码
java俄罗斯方块游戏代码: package com; import java.awt.Color; import java.awt.Graphics; import java.awt.event.K ...
- 俄罗斯方块游戏 --- java
俄罗斯方块游戏 如有疑问请查看:http://zh.wikipedia.org/zh-tw/%E4%BF%84%E7%BD%97%E6%96%AF%E6%96%B9%E5%9D%97 更多疑问请参考: ...
- Java课设--俄罗斯方块Tetris
Java程序设计课程作业报告 作业:俄罗斯方块游戏 姓名 赵璐媛 学号 程序得分 90% 作业报告 得分10% 实验总分 100% 作业目的: 掌握基本的图形程序设计方法 掌握Java事件处理程序编写 ...
- Java项目--俄罗斯方块
Java项目--俄罗斯方块 百度盘链接 链接:http://pan.baidu.com/s/1mhQ9SYc 密码:9ujo 一.心得 二.游戏实例 游戏截图 目录结构 三.代码 1.主界面 Tetr ...
- Java实例---俄罗斯方块
代码分析 定义格子 package com.ftl.tetris; /** * 定义格子 */ import java.awt.image.BufferedImage; public class Ce ...
- 台哥原创:java 俄罗斯方块源码
大四的时候,用java开发,耗时一周 界面参照当时用的联想手机里的俄罗斯方块 这里的级别,标识难度,1是初级,方块下降速度很慢,5是最高级,下降速度最快 得分:每消除一行,会给10分,同时消除 ...
- JAVA SE 框架之俄罗斯方块的效果
Mygame package com.sun.c; import java.awt.event.KeyListener; import com.sun.v.MyJpanel; import com.s ...
随机推荐
- Java关于Properties用法(二)——替换配置文件中的参数
上一章讲了配置文件的基本用法,虽然上一章已经可以解决一些需求,但还不些不足之处.假如,配置文件里面的字符串有一部分需要经常变动,另外一些不需要,上一章的方法就不方便了,所以这章主要讲如何在配置文件中使 ...
- 从零开始学 Java - 数据库连接池的选择 Druid
我先说说数据库连接 数据库大家都不陌生,从名字就能看出来它是「存放数据的仓库」,那我们怎么去「仓库」取东西呢?当然需要钥匙啦!这就是我们的数据库用户名.密码了,然后我们就可以打开门去任意的存取东西了. ...
- JSTL标签功能集锦
1.<fmt:parseNumber integerOnly="true" value="2/3" /> 结果为0 功能:fmt:parseNumb ...
- entityframework学习笔记--003-使用model first
首先,我个人觉得这(model first 即模型优先)是一个鸡肋似的功能.当赞扬着他的强大的功能的同时,你也会觉得这个功能好像是不是不怎么需要,也很少使用. 1.右键你的项目,选择"添加& ...
- restful是什么
resful是什么 rest是一种开发的风格,他不是框架,也没有类库,是一种约定 有什么不同 非restful的开发方式 当没有接触restful的时候,URL通常是动词,比如127.0.0.1:80 ...
- Eclipse如何发布web项目
目录结构: // contents structure [-] 需要的环境 下载和配置JDK 下载和配置Tomcat 下载Eclipse Eclipse 4.4.0 发布Web步骤 创建server ...
- How to Operate SharePoint User Alerts with PowerShell
When you migrate list or site, the user alerts in the site will not be migrated together with the co ...
- IOS开发基础知识--碎片26
1:UICollectionView如果在数据不够一屏时上下滚动 当数据不多,collectionView.contentSize小于collectionView.frame.size的时候,UICo ...
- 支付宝alipay使用小结 调用支付宝程序被杀死说明
一. 准备阶段 如果没有蚂蚁金服开放平台的注册账号,则需要实现注册一个,这里多说一点,就是当我们以公司名义注册账号时,需要预备公司的营业执照等物品(需要上传照片等信息审核).账号申请成功之后,我们需要 ...
- [转]CTO、技术总监、首席架构师的区别
经常有创业公司老板来拜访我,常常会拜托给我一句话:帮我找一个CTO. 我解释的多了,所以想把这个写下来,看看你到底需要的应该是啥. 一.高级程序员 如果你是一个刚刚创业的公司,公司没有专职产品经理和项 ...