俄罗斯方块(Java实现)

//Box.java 1 package tetris;
 2 public class Box {
 3     private final int M = 30, N = 12;
 4     private int[][] ls = new int[M][N];
 5     private int score=0;
 6     int getM() {
 7         return M;
 8     }
 9     int getN() {
10         return N;
11     }
12     int getScore() {
13         return score;
14     }
15     boolean isOut(int x,int y){
16         return x<0|y<0|x>M-1|y>N-1?true:false;
17     }
18     int getFlag(int x, int y) {
19         return isOut(x,y)?2:ls[x][y];
20     }
21     int clearFlag(int x, int y) {
22         if(isOut(x,y))return -1;
23         ls[x][y]=0;
24         return 0;
25     }
26     int setFlag_1(int x, int y) {
27         if(isOut(x,y))return -1;
28         ls[x][y]=1;
29         return 0;
30     }
31     int setFlag_2(int x, int y) {
32         if(isOut(x,y))return -1;
33         ls[x][y]=2;
34         return 0;
35     }
36     /*boolean isFlag_2(int x, int y) {
37         return isOut(x,y)?true:ls[x][y]== 2 ? true:false ;
38     }*/
39     void clear(int x, int maxX) {
40         if(isOut(x,0)||isOut(maxX,0))return ;
41         for (int i = x; i <= maxX; i++) {
42             boolean isAllNotBlank = true;
43             for (int j = 0; j <= N - 1; j++) {
44                 if (ls[i][j]== 0) {
45                     isAllNotBlank = false;
46                     break;
47                 }
48             }
49             if (isAllNotBlank) {
50                 for (int k = i - 1; k >= 0; k--) {
51                     for (int j = 0; j <= N - 1; j++) {
52                         ls[k + 1][j]=ls[k][j];
53                     }
54                 }
55                 score+=100;
56             }
57         }
58     }
59 }
//Shape.java  1 package tetris;
  2 import java.awt.Point;
  3 import java.util.Random;
  4 public class Shape {
  5     private final Box box;
  6     private Point[] ps = new Point[4];
  7     private Point[] tps = new Point[5];
  8     private final int[][][]shapes={
  9             {{-1,0,0,0,1,0,2,0},{0,0,0,-1,0,2,0,1}},
 10             {{- 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}},
 11             {{-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}},
 12             {{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}},
 13             {{0,0,1,0,0,1,1,1}},
 14             {{-1,0,0,-1,-1,1,0,0},{-1,0,0,0,0,1,1,1}},
 15             {{- 1,0, - 1,- 1,0, 1,0,0},{- 1,1,0,0,0,1,1,0}}
 16     };
 17     private int change = 0,shape,x,y;
 18     int left,down;
 19     private Random random;
 20     boolean isPaused = false;
 21     Shape(Box b) {
 22         box = b;
 23         for (int i = 0; i <= 3; i++) {
 24             ps[i] = new Point();
 25         }
 26         for (int i = 0; i <= 4; i++) {
 27             tps[i] = new Point();
 28         }
 29         random = new Random();
 30         getNewShape();
 31     }
 32     private void clearTpsFlag(){
 33         for (int i = 0; i <= 3; i++) {
 34             box.clearFlag(tps[i].x, tps[i].y);
 35         }
 36     }
 37     private int setPsFlag_1() {
 38         for (int i = 0; i <= 3; i++) {
 39             box.setFlag_1(ps[i].x, ps[i].y);
 40         }
 41         return 0;
 42     }
 43     private int setPsFlag_2() {
 44         for (int i = 0; i <= 3; i++) {
 45             box.setFlag_2(ps[i].x, ps[i].y);
 46         }
 47         return 0;
 48     }
 49     private synchronized int tps() {
 50         for (int i = 0; i <= 3; i++) {
 51             tps[i].x = ps[i].x;
 52             tps[i].y = ps[i].y;
 53         }
 54         tps[4].x=x;
 55         tps[4].y=y;
 56         return 0;
 57     }
 58     private synchronized int backupChange() {
 59         for (int i = 0; i <= 3; i++) {
 60             ps[i].x = tps[i].x;
 61             ps[i].y = tps[i].y;
 62         }
 63         x=tps[4].x;
 64         y=tps[4].y;
 65         return 0;
 66     }
 67     private    synchronized int check() {
 68         System.out.println(ps[0]+","+ps[1]+","+ps[2]+","+ps[3]);
 69         for (int i = 0; i <= 3;i++) {
 70             if (!(box.getFlag(ps[i].x, ps[i].y)==0||box.getFlag(ps[i].x, ps[i].y)==1)){
 71                 backupChange();
 72                 return 5;}
 73         }
 74         return 0;
 75     }
 76     private void  getNewShape(){
 77         System.out.println("lll");
 78         int i = Math.abs(random.nextInt()) % 7;
 79         shape=i;
 80         x=1;
 81         y=box.getN()/2;
 82         for(int j=0;j<=3;j++){
 83             ps[j].setLocation(x+shapes[i][0][j*2], y+shapes[i][0][j*2+1]);
 84         }
 85         left=0;
 86         down=0;
 87         change=0;
 88     }
 89     void changeShape(){
 90         tps();
 91         change++;
 92         change%=shapes[shape].length;
 93         for(int j=0;j<=3;j++){
 94             ps[j].setLocation(x+shapes[shape][change][j*2], y+shapes[shape][change][j*2+1]);
 95         }
 96         int g=check();
 97         if(g==0){
 98             clearTpsFlag();
 99             setPsFlag_1();
100         }
101     }
102     synchronized int move(int dir) {
103         tps();
104         switch(dir){
105                 case 0:for (int i = 0; i <= 3; i++) {ps[i].y--;}y--;break;
106                 case 1:for (int i = 0; i <= 3; i++) {ps[i].y++;}y++;break;
107                 case 2:for (int i = 0; i <= 3; i++) {ps[i].x++;}x++;break;
108                 default:
109             }
110         int g = check();
111         if(g!=0&&dir==2){
112             int x = ps[0].x;
113             int maxX = ps[3].x;// x+4>M-1?M-1:x+4;
114             setPsFlag_2();
115             box.clear(x, maxX);
116             if(x==1){return -1;}
117             getNewShape();
118         }
119         if(g==0){
120             clearTpsFlag();
121             setPsFlag_1();
122         }
123         return 0;
124     }
125 }
//Tetris.java  1 package tetris;
  2
  3 import java.awt.BorderLayout;
  4 import java.awt.Color;
  5 import java.awt.Container;
  6 import java.awt.Graphics;
  7 import java.awt.GridLayout;
  8 import java.awt.event.KeyAdapter;
  9 import java.awt.event.KeyEvent;
 10 import java.io.BufferedReader;
 11 import java.io.BufferedWriter;
 12 import java.io.FileNotFoundException;
 13 import java.io.FileReader;
 14 import java.io.FileWriter;
 15 import java.io.IOException;
 16 import javax.swing.JButton;
 17 import javax.swing.JFrame;
 18 import javax.swing.JOptionPane;
 19 import javax.swing.JPanel;
 20 import javax.swing.JTextField;
 21
 22 public class Tetris extends JFrame implements Runnable{
 23     private static final long serialVersionUID = 279494108361487144L;
 24     final Color BC = Color.GRAY;
 25     final Color FC = Color.LIGHT_GRAY;
 26     Box box;
 27     Shape shape;
 28     int a = 0, b = 0, c = 0;
 29     JPanel panel, scorePanel;
 30     JTextField scoreField, bestScoreField;
 31     JButton[][] bs;
 32     Tetris(Box b) {
 33         super("Tetris");
 34         box = b;
 35         shape =new Shape(b);
 36         bs = new JButton[box.getM()][box.getN()];
 37         for (int i = 0; i <= box.getM() - 1; i++) {
 38             for (int j = 0; j <= box.getN() - 1; j++) {
 39                 bs[i][j] = new JButton();
 40                 bs[i][j].setBackground(BC);
 41             }
 42         }
 43         Container container = getContentPane();
 44         container.setLayout(new BorderLayout());
 45         scorePanel = new JPanel();
 46         scorePanel.setLayout(new BorderLayout());
 47         scoreField = new JTextField(10);
 48         bestScoreField = new JTextField(20);
 49         bestScoreField.setText(getBestScores());
 50         bestScoreField.setEditable(false);
 51         scoreField.setText("SCORE:  " + new Integer(box.getScore()).toString());
 52         scoreField.setEditable(false);
 53         scorePanel.add(scoreField, BorderLayout.NORTH);
 54         scorePanel.add(bestScoreField, BorderLayout.SOUTH);
 55         container.add(scorePanel, BorderLayout.NORTH);
 56         panel = new JPanel();
 57         panel.setLayout(new GridLayout(box.getM(), box.getN()));
 58         for (int i = 0; i <= box.getM() - 1; i++) {
 59             for (int j = 0; j <= box.getN() - 1; j++) {
 60                 panel.add(bs[i][j]);
 61             }
 62         }
 63         container.add(panel, BorderLayout.CENTER);
 64         this.addKeyListener(new KeyAdapter() {
 65             public void keyPressed(KeyEvent e) {
 66                 int c = e.getKeyCode();
 67                 // System.out.print(c);
 68                 switch (c) {
 69                     case KeyEvent.VK_LEFT :
 70                         //shape.left++;
 71                         shape.move(0);
 72                         break;
 73                     case KeyEvent.VK_RIGHT :
 74                         //shape.left--;
 75                         shape.move(1);
 76                         break;
 77                     case KeyEvent.VK_UP :
 78                         shape.changeShape();
 79                         break;
 80                     case KeyEvent.VK_DOWN :
 81                         shape.down++;
 82                         break;
 83                     case KeyEvent.VK_SPACE :
 84                         if (shape.isPaused == true) {
 85                             shape.isPaused = false;
 86                         } else {
 87                             shape.isPaused = true;
 88                         }
 89                         break;
 90                     default :                }
 91             }
 92         });
 93         this.setFocusable(true);
 94         setLocation(200, 10);
 95         setSize(20 * box.getN(), 20 * box.getM() + 20);
 96         setVisible(true);
 97     }
 98     private int down() throws InterruptedException {
 99         System.out.println("ddd");
100         int dd=shape.move(2);
101         scoreField.setText("Score: " + new Integer(box.getScore()).toString());
102         if(dd==-1){gameOver();}
103         return 0;
104     }
105     public void run() {
106         while (true) {
107             try {
108                 if (shape.isPaused == true) {
109                 //    System.out.println("PAUSED");
110                     Thread.sleep(500);
111                 } else {
112                     //System.out.println("start1");
113                     down();
114                     for (int i = 0; i <= box.getM() - 1; i++) {
115                         for (int j = 0; j <= box.getN() - 1; j++) {
116                             if(box.getFlag(i, j)==0)
117                             bs[i][j].setBackground(BC);
118                             else bs[i][j].setBackground(FC);
119                         }
120                     }
121                     if (shape.down >=1) {
122                         shape.down--;
123                         Thread.sleep(50);
124                         continue;
125                     }
126                     Thread.sleep(250);
127                 }
128             } catch (InterruptedException e) {
129                 e.printStackTrace();
130             }
131         }
132     }
133     String getBestScores() {
134         BufferedReader reader = null;
135         try {
136             reader = new BufferedReader(new FileReader("score.txt"));
137         } catch (FileNotFoundException e) {
138             e.printStackTrace();
139         }
140         try {
141             a = Integer.parseInt(reader.readLine());
142             b = Integer.parseInt(reader.readLine());
143             c = Integer.parseInt(reader.readLine());
144         } catch (NumberFormatException e) {
145             e.printStackTrace();
146         } catch (IOException e) {
147             e.printStackTrace();
148         }
149         String bestS = new String("Best Score: " + new Integer(a).toString()
150                 + "   " + new Integer(b).toString() + "   "
151                 + new Integer(c).toString());
152         return bestS;
153     }
154     int gameOver() {
155         JOptionPane.showMessageDialog(null, "你死了~~~.", "GAME OVER",
156                 JOptionPane.PLAIN_MESSAGE);
157         if (box.getScore() > a) {
158             c = b;
159             b = a;
160             a = box.getScore();
161         }
162         else if (box.getScore() > b) {
163             c = b;
164             b = box.getScore();
165         }
166         else if (box.getScore()> c) {
167             c = box.getScore();
168             }
169         save();
170         System.exit(0);
171         return 0;
172     }
173     int save() {
174         BufferedWriter writer = null;
175         try {
176             writer = new BufferedWriter(new FileWriter("score.txt"));
177         } catch (IOException e) {
178             e.printStackTrace();
179         }
180         String d = new Integer(a).toString(), e = new Integer(b).toString(),
181                 f = new Integer(c).toString();
182         try {
183             writer.write(d);
184             writer.newLine();
185             writer.write(e);
186             writer.newLine();
187             writer.write(f);
188             writer.flush();
189             writer.close();
190         } catch (NumberFormatException ev) {
191             ev.printStackTrace();
192         } catch (IOException ev) {
193             ev.printStackTrace();
194         }
195         return 0;
196     }
197     public static void main(String[] args) {
198         Box box = new Box();
199         Tetris tetris = new Tetris(box);
200         tetris.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
201         Thread thread1 = new Thread(tetris);
202         thread1.start();
203     }
204
205 }
时间: 2024-12-15 01:46:12

俄罗斯方块(Java实现)的相关文章

java语言-俄罗斯方块Java源码案例

只提供参考源码 import java.awt.*; import java.applet.Applet; public class Blocks extends Applet implements Runnable { Dimension d; Font largefont= new Font("Helvetica", Font.BOLD, 28); Font smallfont= new Font("Helvetica", Font.BOLD, 10); Col

用JAVA写的俄罗斯方块

业务需求->业务对象模型(对象关系)->数据建模->类的设计->概要编码->详细功能设计 基本规则: 1)首先呢,俄罗斯方块都是由一个个小格子构成的,我们叫它Cell: 行宽:10,列高:20,以每个小正方形为单位 2)其次,所有的俄罗斯方块都是一组由4个小型正方形组成的规则图形,我们叫它Tetromino    分别为:S.Z.L.J.I.O.T这几种 哈哈,有了这样的分析,就可以构建数据结构设计了 数据结构设计: Cell     格子|--     int row 行|

java俄罗斯方块

代码如下 <span style="font-size:18px;">package com.model; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import javax.swing.*; impo

java版 推箱子,俄罗斯方块,诗歌默写,坦克!由瑶哥特改造哦!

其实我发现自己用java还真的写了好多小游戏了,一起刚刚开始学java的时候听学长说,写个俄罗斯方块要看一本搬砖厚的书, 刚开始还不信,不过现在信了,javaSe学完是要有本搬砖候的书了! 这个好像也是大一写的吧,具体时间都记不得了. 这个游戏还是改良了一下咯,我添加了个魔鬼的角色在里面, 魔鬼可以退箱子,而且魔鬼不能碰到你,碰到你,你就over了 .比以前的推箱子好玩些.我自己也经常玩玩. 懒得把自己写的一些java写游戏一个一个发文章了一次性吧,总之如果要代码找我QQ就好了935090232

俄罗斯方块游戏 --- java

俄罗斯方块游戏 如有疑问请查看:http://zh.wikipedia.org/zh-tw/%E4%BF%84%E7%BD%97%E6%96%AF%E6%96%B9%E5%9D%97 更多疑问请参考:http://java.itcast.cn/news/b4c1f433/34fd/4a7b/96bf/f1ae5e00ce70.shtml 游戏的运行结果如下: 代码的整体目录结构如下: 游戏发生的场地是在面板(panel)上,是JFrame框架把面板圈了起来 图形具有自己本身的特征,比如说形状,颜

JAVA SE 框架之俄罗斯方块的效果

Mygame package com.sun.c; import java.awt.event.KeyListener; import com.sun.v.MyJpanel; import com.sun.v.Myjframe; public class Mygame { public Mygame() { // TODO Auto-generated constructor stub } public static void main(String[] args) { // TODO Auto

java swing实现俄罗斯方块游戏源代码下载

原文:java swing实现俄罗斯方块游戏源代码下载 源代码下载:http://www.zuidaima.com/share/1550463372790784.htm 源代码截图:

Java项目--俄罗斯方块

Java项目--俄罗斯方块 一.心得 二.游戏实例 游戏截图 目录结构 三.代码 1.主界面 Tetris.java 1 package com.fry.tetris; 2 3 import java.util.Arrays; 4 import java.util.Random; 5 6 /** 7 * 4格方块 8 */ 9 public class Tetromino { 10 protected Cell[] cells = new Cell[4]; 11 /** 保存旋转的相对于轴位置状

回忆童年的电子游戏 俄罗斯方块的Java代码

import java.awt.*; import java.awt.event.*; import javax.swing.*; public class Tetris extends JFrame { public Tetris() { TetrisPanel a = new TetrisPanel(); addKeyListener(a.listener); add(a); JMenuBar menu = new JMenuBar(); JMenu game = new JMenu("游戏

java swing开发俄罗斯方块游戏

原文:java swing开发俄罗斯方块游戏 源代码下载地址:http://www.zuidaima.com/share/1550463573740544.htm 简单的俄罗斯方块游戏,可以读取记录