3一个JAVA编写的俄罗斯方块游戏代码

return 0; } } }
return 1; }
// 消行的方法 public void delline() {
int c = 0; for (int b = 0; b < 22; b++) {
for (int a = 0; a < 12; a++) { if (map[a][b] == 1) {
turnState = tempturnState; } repaint(); }
// 左移的方法 public void left() {
if (blow(x - 1, y, blockType, turnState) == 1) {
x = x - 1; } ; repaint(); }
// 右移的方法 public void right() {
如图
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.*; import javax.swing.Timer;
// 方块的形状 第一组代表方块类型有 S、Z、L、J、I、O、T 7 种 第二组 代表旋转几 次 第三四组为 方块矩阵
private final int shapes[][][] = new int[][][] { // i
{ { 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0 }, { 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0 } },
// 生成新方块的方法 public void newblock() {
blockType = (int) (Math.random() * 1000) % 7; turnState = (int) (Math.random() * 1000) % 4; x = 4; y = 0; if (gameover(x, y) == 1) {
} }
// 初始化构造方法 Tetrisblok() {
newblock(); newmap(); drawwall(); Timer timer = new Timer(1000, new TimerListener()); timer.start(); }
// 旋转的方法 public void turn() {
for (int a = 0; a < 4; a++) { for (int b = 0; b < 4; b++) { if (((shapes[blockType][turnState][a * 4 + b] == 1) && (map[x + b + 1][y + a] == 1)) || ((shapes[blockType][turnState][a * 4 + b] == 1) && (map[x + b + 1][y + a] == 2))) {
// s { { 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0 }, { 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0 } }, // z { { 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0 }, { 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0 } }, // j { { 0, 1, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0 }, { 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 1, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0 }, { 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, // o { { 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, // l { { 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0 }, { 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0 }, { 0, 0, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, // t { { 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0 }, { 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0 } } };
if (blow(x, y, blockType, turnState) == 0) { return 1;
} return 0; }
// 把当前添加 map public void add(int x, int y, int blockType, int turnState) {
int j = 0; for (int a = 0; a < 4; a++) {
private int turnState;
private int x;
private int y;
private int i = 0;
int j = 0; int flag = 0; // 定义已经放下的方块 x=0-11,y=0-21; int[][] map = new int[13][23];
menu.add(game); menu.add(help); frame.setLocationRelativeTo(null); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setSize(220, 275); frame.setTitle("Tetris 内测版"); // frame.setUndecorated(true); frame.setVisible(true); frame.setResizable(false);
newmap(); drawwall(); sБайду номын сангаасore = 0; JOptionPane.showMessageDialog(null, "GAME OVER"); } }
// 画围墙 public void drawwall() {
for (i = 0; i < 12; i++) { map[i][21] = 2;
for (int b = 0; b < 4; b++) { if (map[x + b + 1][y + a] == 0) { map[x + b + 1][y + a] = shapes[blockType][turnState][j]; } ; j++;
} for (j = 0; j < 22; j++) {
map[11][j] = 2; map[0][j] = 2; } }
// 初始化地图 public void newmap() {
for (i = 0; i < 12; i++) { for (j = 0; j < 22; j++) { map[i][j] = 0; }
} ; if (blow(x, y + 1, blockType, turnState) == 0) {
add(x, y, blockType, turnState); newblock(); delline(); } ; repaint(); }
// 是否合法的方法 public int blow(int x, int y, int blockType, int turnState) {
public class Tetris extends JFrame { public Tetris() { Tetrisblok a = new Tetrisblok(); addKeyListener(a); add(a); }
合集下载

小游戏俄罗斯方块代码(JAVA)

小游戏俄罗斯方块代码(JAVA)

东西绝对不多说,直接看!看了拷贝就懂了!!,直接可以拷贝下面的东西,然后记得把那个BLOCK的名字改成你自己的类名,这个很关键哦,不然是错的可别怪我,呵呵~~import java.awt.*;import java.awt.event.*;import javax.swing.*;import java.applet.*;import ng.String.*;import ng.*;import java.io.*;public class Block extends JPanel implements ActionListener,KeyListener//应该是继承JPanel{static Button but[] = new Button[6];static Button noStop = new Button("取消暂停");static Label scoreLab = new Label("分数:");static Label infoLab = new Label("提示:");static Label speedLab = new Label("级数:");static Label scoreTex = new Label("0");static Label infoTex = new Label(" ");static Label speedTex = new Label("1");static JFrame jf = new JFrame();static MyTimer timer;static ImageIcon icon=new ImageIcon("resource/Block.jpg");static JMenuBar mb = new JMenuBar();static JMenu menu0 = new JMenu("游戏");static JMenu menu1 = new JMenu("帮助");static JMenuItem mi0 = new JMenuItem("新游戏");static JMenuItem mi1 = new JMenuItem("退出");static JMenuItem mi1_0 = new JMenuItem("关于");static JDialog dlg_1;static JTextArea dlg_1_text = new JTextArea();static int startSign = 0;//游戏开始标志0 未开始1 开始2 暂停static String butLab[] = {"开始游戏","重新开始","降低级数","提高级数","游戏暂停","退出游戏"};static int game_body[][] = new int[19][10];static int game_sign_x[] = new int[4];//用于记录4个方格的水平位置static int game_sign_y[] = new int[4];//用于记录4个方格的垂直位置static boolean downSign = false;//是否落下static int blockNumber = 1;//砖块的编号static int gameScore = 0;//游戏分数static int speedMark = 1;public static void main(String args[]) {Block myBlock = new Block();mb.add(menu0);mb.add(menu1);menu0.add(mi0);menu0.add(mi1);menu1.add(mi1_0);jf.setJMenuBar(mb);myBlock.init();jf.add(myBlock);jf.setSize(565,501);jf.setResizable(false);jf.setTitle("俄罗斯方块");jf.setIconImage(icon.getImage());jf.setLocation(200,100);jf.show();timer = new MyTimer(myBlock); //启动线程timer.setDaemon(true);timer.start();timer.suspend();}public void init(){setLayout(null);for(int i = 0;i < 6;i++){but[i] = new Button(butLab[i]);add(but[i]);but[i].addActionListener(this);but[i].addKeyListener(this);but[i].setBounds(360,(240 + 30 * i),160,25); }add(scoreLab);add(scoreTex);add(speedLab);add(speedTex);add(infoLab);add(infoTex);add(scoreLab);scoreLab.setBounds(320,15,30,20); scoreTex.setBounds(360,15,160,20);scoreTex.setBackground(Color.white); speedLab.setBounds(320,45,30,20); speedTex.setBounds(360,45,160,20); speedTex.setBackground(Color.white);but[1].setEnabled(false);but[4].setEnabled(false);infoLab.setBounds(320,75,30,20); infoTex.setBounds(360,75,160,20); infoTex.setBackground(Color.white); noStop.setBounds(360,360,160,25); noStop.addActionListener(this);noStop.addKeyListener(this);mi0.addActionListener(this);mi1.addActionListener(this);mi1_0.addActionListener(this);num_csh_game();rand_block();}public void actionPerformed(ActionEvent e){if(e.getSource() == but[0])//开始游戏{startSign = 1;infoTex.setText("游戏已经开始!");but[0].setEnabled(false);but[1].setEnabled(true);but[4].setEnabled(true);timer.resume();}if(e.getSource() == but[1]||e.getSource() == mi0)//重新开始游戏{startSign = 0;gameScore = 0;timer.suspend();num_csh_restart();repaint();rand_block();scoreTex.setText("0");infoTex.setText("新游戏!");but[0].setEnabled(true);but[1].setEnabled(false);but[4].setEnabled(false);}if(e.getSource() == but[2])//降低级数{infoTex.setText("降低级数!"); speedMark--;if(speedMark <= 1){speedMark = 1;infoTex.setText("已经是最低级数!"); }speedTex.setText(speedMark + ""); }if(e.getSource() == but[3])//提高级数{infoTex.setText("提高级数!"); speedMark++;if(speedMark >= 9){speedMark = 9;infoTex.setText("已经是最高级数!"); }speedTex.setText(speedMark + "");}if(e.getSource() == but[4])//游戏暂停{this.add(noStop);this.remove(but[4]);infoTex.setText("游戏暂停!");timer.suspend();}if(e.getSource() == noStop)//取消暂停{this.remove(noStop);this.add(but[4]);infoTex.setText("继续游戏!");timer.resume();}if(e.getSource() == but[5]||e.getSource() == mi1)//退出游戏{jf.dispose();}if(e.getSource() == mi1_0)//退出游戏{dlg_1 = new JDialog(jf,"关于");try{FileInputStream io = new FileInputStream("resource/guanyu.txt");//得到路径byte a[] = new byte[io.available()];io.read(a);io.close();String str = new String(a);dlg_1_text.setText(str);}catch(Exception g){}dlg_1_text.setEditable(false);dlg_1.add(dlg_1_text);dlg_1.pack();dlg_1.setResizable(false);dlg_1.setSize(200, 120);dlg_1.setLocation(400, 240);dlg_1.show();}}public void rand_block()//随机产生砖块{int num;num = (int)(Math.random() * 6) + 1;//产生0~6之间的随机数blockNumber = num;switch(blockNumber){case 1: block1(); blockNumber = 1; break;case 2: block2(); blockNumber = 2; break;case 3: block3(); blockNumber = 3; break;case 4: block4(); blockNumber = 4; break;case 5: block5(); blockNumber = 5; break;case 6: block6(); blockNumber = 6; break;case 7: block7(); blockNumber = 7; break;}}public void change_body(int blockNumber)//改变砖块状态{dingwei();if(blockNumber == 1&&downSign == false)//变换长条2种情况{if(game_sign_y[0] == game_sign_y[1]&&game_sign_y[3] <= 16)//说明长条是横着的{if(game_body[game_sign_y[0] - 1][game_sign_x[0] + 1] != 2&&game_body[game_sign_y[3] + 2][game_sign_x[3] - 2] != 2){num_csh_game();game_body[game_sign_y[0] - 1][game_sign_x[0] + 1] = 1;game_body[game_sign_y[1]][game_sign_x[1]] = 1;game_body[game_sign_y[2] + 1][game_sign_x[2] - 1] = 1;game_body[game_sign_y[3] + 2][game_sign_x[3] - 2] = 1;infoTex.setText("游戏进行中!");repaint();}}if(game_sign_x[0] == game_sign_x[1]&&game_sign_x[0] >= 1&&game_sign_x[3] <= 7)//说明长条是竖着的{if(game_body[game_sign_y[0] + 1][game_sign_x[0]-1] != 2&&game_body[game_sign_y[3] - 2][game_sign_x[3] + 2] != 2){num_csh_game();game_body[game_sign_y[0] + 1][game_sign_x[0] - 1] = 1;game_body[game_sign_y[1]][game_sign_x[1]]=1;game_body[game_sign_y[2] - 1][game_sign_x[2] + 1] = 1;game_body[game_sign_y[3] - 2][game_sign_x[3] + 2] = 1;infoTex.setText("游戏进行中!");repaint();}}}if(blockNumber == 3&&downSign == false)//变换转弯1有4种情况{if(game_sign_x[0] == game_sign_x[1]&&game_sign_x[0] == game_sign_x[2]&&game_sign_y[2] == game_sign_y[3]&&game_sign_x[0] >= 1) {if(game_body[game_sign_y[0] + 1][game_sign_x[0] - 1] != 2&&game_body[game_sign_y[2] - 1][game_sign_x[2] + 1] != 2&&game_body[game_sign_y[3] - 2][game_sign_x[3]] != 2){num_csh_game();game_body[game_sign_y[0] + 1][game_sign_x[0] - 1] = 1;game_body[game_sign_y[1]][game_sign_x[1]] = 1;game_body[game_sign_y[2] - 1][game_sign_x[2] + 1] = 1;game_body[game_sign_y[3] - 2][game_sign_x[3]] = 1;infoTex.setText("游戏进行中!");repaint();}}if(game_sign_y[1] == game_sign_y[2]&&game_sign_y[2] == game_sign_y[3]&&game_sign_x[0] == game_sign_x[3]&&game_sign_y[1] <= 17) {if(game_body[game_sign_y[0]][game_sign_x[0] - 2] != 2&&game_body[game_sign_y[1] + 1][game_sign_x[1] + 1] != 2&&game_body[game_sign_y[3] - 1][game_sign_x[3] - 1] != 2){num_csh_game();game_body[game_sign_y[0]][game_sign_x[0] - 2] = 1;game_body[game_sign_y[1] + 1][game_sign_x[1] + 1] = 1;game_body[game_sign_y[2]][game_sign_x[2]] = 1;game_body[game_sign_y[3] - 1][game_sign_x[3] - 1] = 1;infoTex.setText("游戏进行中!");repaint();}}if(game_sign_x[1] == game_sign_x[2]&&game_sign_x[1] == game_sign_x[3]&&game_sign_y[0] == game_sign_y[1]&&game_sign_x[3] <= 8) {if(game_body[game_sign_y[0] + 2][game_sign_x[0]] != 2&&game_body[game_sign_y[1] + 1][game_sign_x[1] - 1] != 2&&game_body[game_sign_y[3] - 1][game_sign_x[3] + 1] != 2){num_csh_game();game_body[game_sign_y[0] + 2][game_sign_x[0]] = 1;game_body[game_sign_y[1] + 1][game_sign_x[1] - 1] = 1;game_body[game_sign_y[2]][game_sign_x[2]] = 1;game_body[game_sign_y[3] - 1][game_sign_x[3] + 1] = 1;infoTex.setText("游戏进行中!");repaint();}}if(game_sign_y[0] == game_sign_y[1]&&game_sign_y[1] == game_sign_y[2]&&game_sign_x[0] == game_sign_x[3]){if(game_body[game_sign_y[0] + 1][game_sign_x[0] + 1] !=2&&game_body[game_sign_y[2] - 1][game_sign_x[2] - 1] != 2&&game_body[game_sign_y[3]][game_sign_x[3] + 2] != 2){num_csh_game();game_body[game_sign_y[0] + 1][game_sign_x[0] + 1] = 1;game_body[game_sign_y[1]][game_sign_x[1]] = 1;game_body[game_sign_y[2] - 1][game_sign_x[2] - 1] = 1;game_body[game_sign_y[3]][game_sign_x[3] + 2] = 1;infoTex.setText("游戏进行中!");repaint();}}}if(blockNumber == 4&&downSign == false)//变换转弯2有4种情况{if(game_sign_x[0] == game_sign_x[1]&&game_sign_x[0] == game_sign_x[3]&&game_sign_y[1] == game_sign_y[2]&&game_sign_x[3] <= 7) {if(game_body[game_sign_y[0] + 2][game_sign_x[0]] != 2&&game_body[game_sign_y[1] + 1][game_sign_x[1] + 1] != 2&&game_body[game_sign_y[3]][game_sign_x[3] + 2] != 2){num_csh_game();game_body[game_sign_y[0] + 2][game_sign_x[0]] = 1;game_body[game_sign_y[1] + 1][game_sign_x[1] + 1] = 1;game_body[game_sign_y[2]][game_sign_x[2]] = 1;game_body[game_sign_y[3]][game_sign_x[3] + 2] = 1;infoTex.setText("游戏进行中!");repaint();}}if(game_sign_y[1] == game_sign_y[2]&&game_sign_y[1] == game_sign_y[3]&&game_sign_x[0] == game_sign_x[2]){if(game_body[game_sign_y[1]][game_sign_x[1] + 2] != 2&&game_body[game_sign_y[2] - 1][game_sign_x[2] + 1] != 2&&game_body[game_sign_y[3] - 2][game_sign_x[3]] != 2){num_csh_game();game_body[game_sign_y[0]][game_sign_x[0]] = 1;game_body[game_sign_y[1]][game_sign_x[1] + 2] = 1;game_body[game_sign_y[2] - 1][game_sign_x[2] + 1] = 1;game_body[game_sign_y[3] - 2][game_sign_x[3]] = 1;infoTex.setText("游戏进行中!");repaint();}}if(game_sign_x[0] == game_sign_x[2]&&game_sign_x[0] == game_sign_x[3]&&game_sign_y[1] == game_sign_y[2]&&game_sign_x[0] >= 2) {if(game_body[game_sign_y[0]][game_sign_x[0] - 2] != 2&&game_body[game_sign_y[2] - 1][game_sign_x[2] - 1] != 2&&game_body[game_sign_y[3] - 2][game_sign_x[3]] != 2){num_csh_game();game_body[game_sign_y[0]][game_sign_x[0] - 2] = 1;game_body[game_sign_y[1]][game_sign_x[1]] = 1;game_body[game_sign_y[2] - 1][game_sign_x[2] - 1] = 1;game_body[game_sign_y[3] - 2][game_sign_x[3]] = 1;infoTex.setText("游戏进行中!");repaint();}}if(game_sign_y[0] == game_sign_y[1]&&game_sign_y[0] == game_sign_y[2]&&game_sign_x[1] == game_sign_x[3]&&game_sign_y[0] <= 16) {if(game_body[game_sign_y[0] + 2][game_sign_x[0]] != 2&&game_body[game_sign_y[1] + 1][game_sign_x[1] - 1] != 2&&game_body[game_sign_y[2]][game_sign_x[2] - 2] != 2){num_csh_game();game_body[game_sign_y[0] + 2][game_sign_x[0]] = 1;game_body[game_sign_y[1] + 1][game_sign_x[1] - 1] = 1;game_body[game_sign_y[2]][game_sign_x[2] - 2] = 1;game_body[game_sign_y[3]][game_sign_x[3]] = 1;infoTex.setText("游戏进行中!");repaint();}}}if(blockNumber == 5&&downSign == false)//变换转弯3有4种情况{if(game_sign_x[0] == game_sign_x[2]&&game_sign_x[2] == game_sign_x[3]&&game_sign_y[0] == game_sign_y[1]&&game_sign_x[1] >= 2) {if(game_body[game_sign_y[0] + 1][game_sign_x[0] - 1] != 2&&game_body[game_sign_y[1]][game_sign_x[1] - 2] != 2&&game_body[game_sign_y[3] - 1][game_sign_x[3] + 1] != 2){num_csh_game();game_body[game_sign_y[0] + 1][game_sign_x[0] - 1] = 1;game_body[game_sign_y[1]][game_sign_x[1] - 2] = 1;game_body[game_sign_y[2]][game_sign_x[2]] = 1;game_body[game_sign_y[3] - 1][game_sign_x[3] + 1] = 1;infoTex.setText("游戏进行中!");repaint();}}if(game_sign_y[1] == game_sign_y[2]&&game_sign_y[2] ==game_sign_y[3]&&game_sign_x[0] == game_sign_x[1]&&game_sign_y[0] <= 16) {if(game_body[game_sign_y[0] + 2][game_sign_x[0]] != 2&&game_body[game_sign_y[1] + 1][game_sign_x[1] + 1] != 2&&game_body[game_sign_y[3] - 1][game_sign_x[3] - 1] != 2){num_csh_game();game_body[game_sign_y[0] + 2][game_sign_x[0]] = 1;game_body[game_sign_y[1] + 1][game_sign_x[1] + 1] = 1;game_body[game_sign_y[2]][game_sign_x[2]] = 1;game_body[game_sign_y[3] - 1][game_sign_x[3] - 1] = 1;infoTex.setText("游戏进行中!");repaint();}}if(game_sign_x[0] == game_sign_x[1]&&game_sign_x[1] == game_sign_x[3]&&game_sign_y[2] == game_sign_y[3]){if(game_body[game_sign_y[0] + 1][game_sign_x[0] - 1] != 2&&game_body[game_sign_y[2]][game_sign_x[2] + 2] !=2&&game_body[game_sign_y[3] - 1][game_sign_x[3] + 1] != 2){num_csh_game();game_body[game_sign_y[0] + 1][game_sign_x[0] - 1] = 1;game_body[game_sign_y[1]][game_sign_x[1]] = 1;game_body[game_sign_y[2]][game_sign_x[2] + 2] = 1;game_body[game_sign_y[3] - 1][game_sign_x[3] + 1] = 1;infoTex.setText("游戏进行中!");repaint();}}if(game_sign_y[0] == game_sign_y[1]&&game_sign_y[1] == game_sign_y[2]&&game_sign_x[2] == game_sign_x[3]){if(game_body[game_sign_y[0] + 1][game_sign_x[0] + 1] != 2&&game_body[game_sign_y[2] - 1][game_sign_x[2] - 1] != 2&&game_body[game_sign_y[3] - 2][game_sign_x[3]] != 2){num_csh_game();game_body[game_sign_y[1]][game_sign_x[1]] = 1;game_body[game_sign_y[2] - 1][game_sign_x[2] - 1] = 1;game_body[game_sign_y[3] - 2][game_sign_x[3]] = 1;infoTex.setText("游戏进行中!");repaint();}}}if(blockNumber == 6&&downSign == false)//变换两层砖块1的2种情况{if(game_sign_x[0] == game_sign_x[2]&&game_sign_x[0] >= 2){if(game_body[game_sign_y[0]][game_sign_x[0] - 2] != 2&&game_body[game_sign_y[2] - 1][game_sign_x[2] -1 ] != 2&&game_body[game_sign_y[3] - 1][game_sign_x[3] + 1] != 2){num_csh_game();game_body[game_sign_y[0]][game_sign_x[0] - 2] = 1;game_body[game_sign_y[1]][game_sign_x[1]] = 1;game_body[game_sign_y[3] - 1][game_sign_x[3] + 1] = 1;infoTex.setText("游戏进行中!");repaint();}}if(game_sign_y[0] == game_sign_y[1]&&game_sign_y[3] <= 17){if(game_body[game_sign_y[0]][game_sign_x[0] + 2] != 2&&game_body[game_sign_y[1] + 1][game_sign_x[1] + 1] != 2&&game_body[game_sign_y[3] + 1][game_sign_x[3] - 1] != 2){num_csh_game();game_body[game_sign_y[0]][game_sign_x[0] + 2] = 1;game_body[game_sign_y[1] + 1][game_sign_x[1] + 1] = 1;game_body[game_sign_y[2]][game_sign_x[2]] = 1;game_body[game_sign_y[3] + 1][game_sign_x[3] - 1] = 1;infoTex.setText("游戏进行中!");repaint();}}if(blockNumber == 7&&downSign == false)//变换两层砖块2的2种情况{if(game_sign_x[0] == game_sign_x[1]&&game_sign_x[0] <= 16){if(game_body[game_sign_y[0]][game_sign_x[0] + 2] != 2&&game_body[game_sign_y[1] - 1][game_sign_x[1] + 1] != 2&&game_body[game_sign_y[3] - 1][game_sign_x[3] - 1] != 2){num_csh_game();game_body[game_sign_y[0]][game_sign_x[0] + 2] = 1;game_body[game_sign_y[1] - 1][game_sign_x[1] + 1] = 1;game_body[game_sign_y[2]][game_sign_x[2]] = 1;game_body[game_sign_y[3] - 1][game_sign_x[3] - 1] = 1;infoTex.setText("游戏进行中!");repaint();}}if(game_sign_y[0] == game_sign_y[1]&&game_sign_y[2] <= 17)if(game_body[game_sign_y[0] + 1][game_sign_x[0] - 1] != 2&&game_body[game_sign_y[1]][game_sign_x[1] - 2] != 2&&game_body[game_sign_y[2] + 1][game_sign_x[2] + 1] != 2){num_csh_game();game_body[game_sign_y[0] + 1][game_sign_x[0] - 1] = 1;game_body[game_sign_y[1]][game_sign_x[1] - 2] = 1;game_body[game_sign_y[2] + 1][game_sign_x[2] + 1] = 1;game_body[game_sign_y[3]][game_sign_x[3]] = 1;infoTex.setText("游戏进行中!");repaint();}}}}public void num_csh_game()//数组清零{for(int i = 0;i < 19;i++)for(int j = 0;j < 10;j++){if(game_body[i][j] == 2){game_body[i][j] = 2;}else{game_body[i][j] = 0;}}}}public void num_csh_restart()//重新开始时数组清零{for(int i = 0;i < 19;i++){for(int j = 0;j < 10;j++){game_body[i][j] = 0;}}public void keyTyped(KeyEvent e){}public void keyPressed(KeyEvent e){if(e.getKeyCode() == KeyEvent.VK_DOWN&&startSign == 1)//处理下键{this.down();}if(e.getKeyCode() == KeyEvent.VK_LEFT&&startSign == 1)//处理左键{this.left();}if(e.getKeyCode() == KeyEvent.VK_RIGHT&&startSign == 1)//处理右键{this.right();}if(e.getKeyCode() == KeyEvent.VK_UP&&startSign == 1)//处理上键转换{this.change_body(blockNumber);}if(startSign == 0){infoTex.setText("游戏未开始或已结束!"); }}public void keyReleased(KeyEvent e){}public void paint(Graphics g){g.setColor(Color.black);g.fill3DRect(0,0,300,450,true);for(int i = 0;i < 19;i++){for(int j = 0;j < 10;j++){if(game_body[i][j] == 1){g.setColor(Color.blue);g.fill3DRect(30*j,30*(i-4),30,30,true);if(game_body[i][j] == 2){g.setColor(Color.magenta);g.fill3DRect(30*j,30*(i-4),30,30,true);}}}}public void left()//向左移动{int sign = 0;dingwei();for(int k = 0;k < 4;k++){if(game_sign_x[k] == 0||game_body[game_sign_y[k]][game_sign_x[k] - 1] == 2) {sign = 1;}}if(sign == 0&&downSign == false)num_csh_game();for(int k = 0;k < 4;k++){game_body[game_sign_y[k]][game_sign_x[k] - 1] = 1;}infoTex.setText("向左移动!");repaint();}}public void right()//向右移动{int sign = 0;dingwei();for(int k = 0;k < 4;k++){if(game_sign_x[k] == 9||game_body[game_sign_y[k]][game_sign_x[k] + 1] == 2) {sign = 1;}}if(sign == 0&&downSign == false){num_csh_game();for(int k = 0;k < 4;k++){game_body[game_sign_y[k]][game_sign_x[k] + 1] = 1;}infoTex.setText("向右移动!");repaint();}}public void down()//下落{int sign = 0;dingwei();for(int k = 0;k < 4;k++){if(game_sign_y[k] == 18||game_body[game_sign_y[k] + 1][game_sign_x[k]] == 2) {sign = 1;downSign = true;changeColor();cancelDW();getScore();if(game_over() == false){rand_block();repaint();}}}if(sign == 0){num_csh_game();for(int k = 0;k < 4;k++){game_body[game_sign_y[k] + 1][game_sign_x[k]] = 1; }infoTex.setText("游戏进行中!");repaint();}}public boolean game_over()//判断游戏是否结束{int sign=0;for(int i = 0;i < 10;i++){if(game_body[4][i] == 2){sign = 1;}}if(sign == 1){infoTex.setText("游戏结束!");changeColor();repaint();startSign = 0;timer.suspend();return true;}elsereturn false;}public void getScore()//满行消除方法{for(int i = 0;i < 19;i++){int sign = 0;for(int j = 0;j < 10;j++){if(game_body[i][j] == 2){sign++;}}if(sign == 10){gameScore += 100; scoreTex.setText(gameScore+""); infoTex.setText("恭喜得分!");for(int j = i;j >= 1;j--){for(int k = 0;k < 10;k++){game_body[j][k] = game_body[j - 1][k];}}}}}public void changeColor()//给已经落下的块换色{downSign = false;for(int k = 0;k < 4;k++){game_body[game_sign_y[k]][game_sign_x[k]] = 2; }}public void dingwei()//确定其位置{int k = 0;cancelDW();for(int i = 0;i < 19;i++){for(int j = 0;j < 10;j++){if(game_body[i][j] == 1){game_sign_x[k] = j;game_sign_y[k] = i;k++;}}}}public void cancelDW()//将定位数组初始化{for(int k = 0;k < 4;k++){game_sign_x[k] = 0;game_sign_y[k] = 0;}}public void block1()//长条game_body[0][4] = 1; game_body[1][4] = 1; game_body[2][4] = 1; game_body[3][4] = 1;}public void block2()//形{game_body[3][4] = 1; game_body[2][4] = 1; game_body[3][5] = 1; game_body[2][5] = 1;}public void block3()//3加1(下) {game_body[1][4] = 1; game_body[2][4] = 1; game_body[3][4] = 1; game_body[3][5] = 1;}public void block4()//3加1(中)game_body[1][4] = 1; game_body[2][4] = 1; game_body[3][4] = 1; game_body[2][5] = 1;}public void block5()//3加1(上) {game_body[1][4] = 1; game_body[2][4] = 1; game_body[3][4] = 1; game_body[1][5] = 1;}public void block6()//转折1 {game_body[1][5] = 1; game_body[2][5] = 1; game_body[2][4] = 1; game_body[3][4] = 1;}public void block7()//转折2 {game_body[1][4] = 1;game_body[2][4] = 1;game_body[2][5] = 1;game_body[3][5] = 1;}}//定时线程class MyTimer extends Thread{Block myBlock;public MyTimer(Block myBlock){this.myBlock = myBlock;}public void run(){while(myBlock.startSign == 1){try{sleep((10-myBlock.speedMark + 1)*100);myBlock.down();}catch(InterruptedException e){} }}}。

俄罗斯方块JAVA小程序

俄罗斯方块JAVA小程序
3 个不同的类 SingleTetris.java,SuperBrick.java,Tetris.java。分别对应单一俄罗斯方块 游戏类,方块组数据类和俄罗斯方块控制窗口。用 Netbeans 调试运行即可。
以下是源代码:
/*程序:SingleTetris.java *说明:单一俄罗斯方块游戏类 */
//产生下一组砖块 public void createNextBrick(){
//产生预备砖块组编号 NextBrickArray.add(new Integer((int)(Math.random()*BrickArray.size()))); //产生预备砖块组颜色 NextBrickColorArray.add(new Color((int)(Math.random()*128+127),
createNextBrick(); }
//建立绘出砖块组对象 d=new Draw(this);
//画出外框 d.DrawMapFrame(0,0,GRIDX*BRICK_WIDTH+2*5,GRIDY*BRICK_WIDTH+2*5,5) ; d.DrawMapFrame(290,0,200,350,5);//预备方块外框 d.DrawMapFrame(290,350,200,140,5);//游戏数据外框
int NOW_BRICK_X;//现在动作砖块组的 x 坐标 int NOW_BRICK_Y;//现在动作砖块组的 y 坐标 SuperBrick NowBrick;//现在动作的砖块组 Color NOW_BRICK_COLOR;//现在动作砖块组的颜色
ArrayList BrickArray;//所有砖块组类数组 ArrayList NextBrickArray;//下一个砖块组储存数组 ArrayList NextBrickColorArray;//下一个砖块组储存数组

俄罗斯方块完整源代码

俄罗斯方块完整源代码

//不多说,直接可以拷贝下面的东西,就可以运行。

package day04;import java.awt.*;import java.awt.event.*;import javax.swing.*;import java.applet.*;import ng.String.*;import ng.*;import java.io.*;public class ERSBlock extends JPanel implements ActionListener,KeyListener//应该是继承JPanel{static Button but[] = new Button[6];static Button noStop = new Button("取消暂停"); static Label scoreLab = new Label("分数:");static Label infoLab = new Label("提示:");static Label speedLab = new Label("级数:");static Label scoreTex = new Label("0");static Label infoTex = new Label(" ");static Label speedTex = new Label("1");static JFrame jf = new JFrame();static MyTimer timer;static ImageIcon icon=new ImageIcon("resource/Block.jpg");static JMenuBar mb = new JMenuBar();static JMenu menu0 = new JMenu("游戏 ");static JMenu menu1 = new JMenu("帮助 ");static JMenuItem mi0 = new JMenuItem("新游戏"); static JMenuItem mi1 = new JMenuItem("退出");static JMenuItem mi1_0 = new JMenuItem("关于"); static JDialog dlg_1;static JTextArea dlg_1_text = new JTextArea(); static int startSign= 0;//游戏开始标志 0 未开始 1 开始 2 暂停static String butLab[] = {"开始游戏","重新开始","降低级数","提高级数","游戏暂停","退出游戏"};static int game_body[][] = new int[19][10];static int game_sign_x[] = new int[4];//用于记录4个方格的水平位置static int game_sign_y[] = new int[4];//用于记录4个方格的垂直位置static boolean downSign = false;//是否落下static int blockNumber = 1;//砖块的编号static int gameScore = 0;//游戏分数static int speedMark = 1;public static void main(String args[]) {ERSBlock myBlock = new ERSBlock();mb.add(menu0);mb.add(menu1);menu0.add(mi0);menu0.add(mi1);menu1.add(mi1_0);jf.setJMenuBar(mb);myBlock.init();jf.add(myBlock);jf.setSize(565,501);jf.setResizable(false);jf.setTitle("俄罗斯方块");jf.setIconImage(icon.getImage());jf.setLocation(200,100);jf.show();timer = new MyTimer(myBlock); //启动线程timer.setDaemon(true);timer.start();timer.suspend();}public void init(){setLayout(null);for(int i = 0;i < 6;i++){but[i] = new Button(butLab[i]);add(but[i]);but[i].addActionListener(this);but[i].addKeyListener(this);but[i].setBounds(360,(240 + 30 * i),160,25); }add(scoreLab);add(scoreTex);add(speedLab);add(speedTex);add(infoLab);add(infoTex);add(scoreLab);scoreLab.setBounds(320,15,30,20); scoreTex.setBounds(360,15,160,20); scoreTex.setBackground(Color.white); speedLab.setBounds(320,45,30,20); speedTex.setBounds(360,45,160,20); speedTex.setBackground(Color.white);but[1].setEnabled(false);but[4].setEnabled(false);infoLab.setBounds(320,75,30,20); infoTex.setBounds(360,75,160,20); infoTex.setBackground(Color.white); noStop.setBounds(360,360,160,25); noStop.addActionListener(this); noStop.addKeyListener(this);mi0.addActionListener(this);mi1.addActionListener(this);mi1_0.addActionListener(this);num_csh_game();rand_block();}public void actionPerformed(ActionEvent e){if(e.getSource() == but[0])//开始游戏{startSign = 1;infoTex.setText("游戏已经开始!");but[0].setEnabled(false);but[1].setEnabled(true);but[4].setEnabled(true);timer.resume();}if(e.getSource() == but[1]||e.getSource() == mi0)//重新开始游戏{startSign = 0;gameScore = 0;timer.suspend();num_csh_restart();repaint();rand_block();scoreTex.setText("0");infoTex.setText("新游戏!");but[0].setEnabled(true);but[1].setEnabled(false);but[4].setEnabled(false);}if(e.getSource() == but[2])//降低级数 {infoTex.setText("降低级数!"); speedMark--;if(speedMark <= 1){speedMark = 1;infoTex.setText("已经是最低级数!"); }speedTex.setText(speedMark + ""); }if(e.getSource() == but[3])//提高级数 {infoTex.setText("提高级数!");speedMark++;if(speedMark >= 9){speedMark = 9;infoTex.setText("已经是最高级数!"); }speedTex.setText(speedMark + ""); }if(e.getSource() == but[4])//游戏暂停 {this.add(noStop);this.remove(but[4]);infoTex.setText("游戏暂停!"); timer.suspend();}if(e.getSource() == noStop)//取消暂停 {this.remove(noStop);this.add(but[4]);infoTex.setText("继续游戏!"); timer.resume();}if(e.getSource() == but[5]||e.getSource() == mi1)//退出游戏{jf.dispose();}if(e.getSource() == mi1_0)//退出游戏{dlg_1 = new JDialog(jf,"关于");try{FileInputStream io = new FileInputStream("resource/guanyu.txt");//得到路径byte a[] = new byte[io.available()];io.read(a);io.close();String str = new String(a);dlg_1_text.setText(str);}catch(Exception g){}dlg_1_text.setEditable(false);dlg_1.add(dlg_1_text);dlg_1.pack();dlg_1.setResizable(false);dlg_1.setSize(200, 120);dlg_1.setLocation(400, 240);dlg_1.show();}}public void rand_block()//随机产生砖块{int num;num = (int)(Math.random() * 6) + 1;//产生0~6之间的随机数blockNumber = num;switch(blockNumber){case 1: block1(); blockNumber = 1; break;case 2: block2(); blockNumber = 2; break;case 3: block3(); blockNumber = 3; break;case 4: block4(); blockNumber = 4; break;case 5: block5(); blockNumber = 5; break;case 6: block6(); blockNumber = 6; break;case 7: block7(); blockNumber = 7; break;}}public void change_body(int blockNumber)//改变砖块状态{dingwei();if(blockNumber == 1&&downSign == false)//变换长条2种情况{if(game_sign_y[0] == game_sign_y[1]&&game_sign_y[3] <= 16)//说明长条是横着的{if(game_body[game_sign_y[0] - 1][game_sign_x[0] + 1] != 2&&game_body[game_sign_y[3] + 2][game_sign_x[3] - 2] != 2){num_csh_game();game_body[game_sign_y[0] - 1][game_sign_x[0] + 1] = 1;game_body[game_sign_y[1]][game_sign_x[1]] = 1;game_body[game_sign_y[2] + 1][game_sign_x[2] - 1] = 1;game_body[game_sign_y[3] + 2][game_sign_x[3] - 2] = 1;infoTex.setText("游戏进行中!");repaint();}}if(game_sign_x[0] == game_sign_x[1]&&game_sign_x[0] >= 1&&game_sign_x[3] <= 7)//说明长条是竖着的{if(game_body[game_sign_y[0] +1][game_sign_x[0]-1] != 2&&game_body[game_sign_y[3] -2][game_sign_x[3] + 2] != 2){num_csh_game();game_body[game_sign_y[0] + 1][game_sign_x[0] - 1] = 1;game_body[game_sign_y[1]][game_sign_x[1]]=1;game_body[game_sign_y[2] - 1][game_sign_x[2] + 1] = 1;game_body[game_sign_y[3] - 2][game_sign_x[3] + 2] = 1;infoTex.setText("游戏进行中!");repaint();}}}if(blockNumber == 3&&downSign == false)//变换转弯1有4种情况{if(game_sign_x[0] == game_sign_x[1]&&game_sign_x[0] == game_sign_x[2]&&game_sign_y[2] == game_sign_y[3]&&game_sign_x[0] >= 1){if(game_body[game_sign_y[0] + 1][game_sign_x[0] - 1] != 2&&game_body[game_sign_y[2] - 1][game_sign_x[2] + 1] != 2&&game_body[game_sign_y[3] - 2][game_sign_x[3]] != 2){num_csh_game();game_body[game_sign_y[0] + 1][game_sign_x[0] - 1] = 1;game_body[game_sign_y[1]][game_sign_x[1]] = 1;= 1;game_body[game_sign_y[3] - 2][game_sign_x[3]] = 1;infoTex.setText("游戏进行中!");repaint();}}if(game_sign_y[1] == game_sign_y[2]&&game_sign_y[2] == game_sign_y[3]&&game_sign_x[0] == game_sign_x[3]&&game_sign_y[1] <= 17){if(game_body[game_sign_y[0]][game_sign_x[0] - 2] != 2&&game_body[game_sign_y[1] + 1][game_sign_x[1] + 1] != 2&&game_body[game_sign_y[3] - 1][game_sign_x[3] - 1] != 2){num_csh_game();game_body[game_sign_y[0]][game_sign_x[0] - 2] = 1;game_body[game_sign_y[1] + 1][game_sign_x[1] + 1] = 1;game_body[game_sign_y[2]][game_sign_x[2]] = 1;= 1;infoTex.setText("游戏进行中!");repaint();}}if(game_sign_x[1] == game_sign_x[2]&&game_sign_x[1] == game_sign_x[3]&&game_sign_y[0] == game_sign_y[1]&&game_sign_x[3] <= 8){if(game_body[game_sign_y[0] + 2][game_sign_x[0]] != 2&&game_body[game_sign_y[1] + 1][game_sign_x[1] - 1] != 2&&game_body[game_sign_y[3] - 1][game_sign_x[3] + 1] != 2){num_csh_game();game_body[game_sign_y[0] + 2][game_sign_x[0]] = 1;game_body[game_sign_y[1] + 1][game_sign_x[1] - 1] = 1;game_body[game_sign_y[2]][game_sign_x[2]] = 1;game_body[game_sign_y[3] - 1][game_sign_x[3] + 1]= 1;infoTex.setText("游戏进行中!");repaint();}}if(game_sign_y[0] == game_sign_y[1]&&game_sign_y[1] == game_sign_y[2]&&game_sign_x[0] == game_sign_x[3]) {if(game_body[game_sign_y[0] + 1][game_sign_x[0] + 1] != 2&&game_body[game_sign_y[2] - 1][game_sign_x[2] - 1] != 2&&game_body[game_sign_y[3]][game_sign_x[3] + 2] != 2){num_csh_game();game_body[game_sign_y[0] + 1][game_sign_x[0] + 1] = 1;game_body[game_sign_y[1]][game_sign_x[1]] = 1;game_body[game_sign_y[2] - 1][game_sign_x[2] - 1] = 1;game_body[game_sign_y[3]][game_sign_x[3] + 2] = 1;infoTex.setText("游戏进行中!");repaint();}}}if(blockNumber == 4&&downSign == false)//变换转弯2有4种情况{if(game_sign_x[0] == game_sign_x[1]&&game_sign_x[0] == game_sign_x[3]&&game_sign_y[1] == game_sign_y[2]&&game_sign_x[3] <= 7){if(game_body[game_sign_y[0] + 2][game_sign_x[0]] != 2&&game_body[game_sign_y[1] + 1][game_sign_x[1] + 1] != 2&&game_body[game_sign_y[3]][game_sign_x[3] + 2] != 2){num_csh_game();game_body[game_sign_y[0] + 2][game_sign_x[0]] = 1;game_body[game_sign_y[1] + 1][game_sign_x[1] + 1] = 1;game_body[game_sign_y[2]][game_sign_x[2]] = 1;game_body[game_sign_y[3]][game_sign_x[3] + 2] = 1;infoTex.setText("游戏进行中!");repaint();}}if(game_sign_y[1] == game_sign_y[2]&&game_sign_y[1] == game_sign_y[3]&&game_sign_x[0] == game_sign_x[2]) {if(game_body[game_sign_y[1]][game_sign_x[1] + 2] != 2&&game_body[game_sign_y[2] - 1][game_sign_x[2] + 1] != 2&&game_body[game_sign_y[3] - 2][game_sign_x[3]] != 2){num_csh_game();game_body[game_sign_y[0]][game_sign_x[0]] = 1;game_body[game_sign_y[1]][game_sign_x[1] + 2] = 1;game_body[game_sign_y[2] - 1][game_sign_x[2] + 1] = 1;game_body[game_sign_y[3] - 2][game_sign_x[3]] = 1;infoTex.setText("游戏进行中!");repaint();}}if(game_sign_x[0] == game_sign_x[2]&&game_sign_x[0] == game_sign_x[3]&&game_sign_y[1] == game_sign_y[2]&&game_sign_x[0] >= 2){if(game_body[game_sign_y[0]][game_sign_x[0] - 2] != 2&&game_body[game_sign_y[2] - 1][game_sign_x[2] - 1] != 2&&game_body[game_sign_y[3] - 2][game_sign_x[3]] != 2){num_csh_game();game_body[game_sign_y[0]][game_sign_x[0] - 2] = 1;game_body[game_sign_y[1]][game_sign_x[1]] = 1;game_body[game_sign_y[2] - 1][game_sign_x[2] - 1] = 1;game_body[game_sign_y[3] - 2][game_sign_x[3]] = 1;infoTex.setText("游戏进行中!");repaint();}}if(game_sign_y[0] == game_sign_y[1]&&game_sign_y[0] == game_sign_y[2]&&game_sign_x[1] == game_sign_x[3]&&game_sign_y[0] <= 16){if(game_body[game_sign_y[0] + 2][game_sign_x[0]] != 2&&game_body[game_sign_y[1] + 1][game_sign_x[1] - 1] != 2&&game_body[game_sign_y[2]][game_sign_x[2] - 2] != 2){num_csh_game();game_body[game_sign_y[0] + 2][game_sign_x[0]] = 1;game_body[game_sign_y[1] + 1][game_sign_x[1] - 1] = 1;game_body[game_sign_y[2]][game_sign_x[2] - 2] = 1;game_body[game_sign_y[3]][game_sign_x[3]] = 1;infoTex.setText("游戏进行中!");repaint();}}}if(blockNumber == 5&&downSign == false)//变换转弯3有4种情况{if(game_sign_x[0] == game_sign_x[2]&&game_sign_x[2] == game_sign_x[3]&&game_sign_y[0] == game_sign_y[1]&&game_sign_x[1] >= 2){if(game_body[game_sign_y[0] + 1][game_sign_x[0] -1] != 2&&game_body[game_sign_y[1]][game_sign_x[1] -2] != 2&&game_body[game_sign_y[3] - 1][game_sign_x[3] + 1] != 2){num_csh_game();game_body[game_sign_y[0] + 1][game_sign_x[0] - 1] = 1;game_body[game_sign_y[1]][game_sign_x[1] - 2] = 1;game_body[game_sign_y[2]][game_sign_x[2]] = 1;game_body[game_sign_y[3] - 1][game_sign_x[3] + 1] = 1;infoTex.setText("游戏进行中!");repaint();}}if(game_sign_y[1] == game_sign_y[2]&&game_sign_y[2] == game_sign_y[3]&&game_sign_x[0] == game_sign_x[1]&&game_sign_y[0] <= 16){if(game_body[game_sign_y[0] + 2][game_sign_x[0]] != 2&&game_body[game_sign_y[1] + 1][game_sign_x[1] + 1] != 2&&game_body[game_sign_y[3] - 1][game_sign_x[3] - 1] != 2){num_csh_game();game_body[game_sign_y[0] + 2][game_sign_x[0]] = 1;game_body[game_sign_y[1] + 1][game_sign_x[1] + 1] = 1;game_body[game_sign_y[2]][game_sign_x[2]] = 1;game_body[game_sign_y[3] - 1][game_sign_x[3] - 1] = 1;infoTex.setText("游戏进行中!");repaint();}}if(game_sign_x[0] == game_sign_x[1]&&game_sign_x[1] == game_sign_x[3]&&game_sign_y[2] == game_sign_y[3]) {if(game_body[game_sign_y[0] + 1][game_sign_x[0] -1] != 2&&game_body[game_sign_y[2]][game_sign_x[2] +2] != 2&&game_body[game_sign_y[3] - 1][game_sign_x[3] + 1] != 2){num_csh_game();game_body[game_sign_y[0] + 1][game_sign_x[0] - 1] = 1;game_body[game_sign_y[1]][game_sign_x[1]] = 1;game_body[game_sign_y[2]][game_sign_x[2] + 2] = 1;game_body[game_sign_y[3] - 1][game_sign_x[3] + 1] = 1;infoTex.setText("游戏进行中!");repaint();}}if(game_sign_y[0] == game_sign_y[1]&&game_sign_y[1] == game_sign_y[2]&&game_sign_x[2] == game_sign_x[3]){if(game_body[game_sign_y[0] + 1][game_sign_x[0] + 1] != 2&&game_body[game_sign_y[2] - 1][game_sign_x[2] - 1] != 2&&game_body[game_sign_y[3] - 2][game_sign_x[3]] != 2){num_csh_game();game_body[game_sign_y[0] + 1][game_sign_x[0] + 1] = 1;game_body[game_sign_y[1]][game_sign_x[1]] = 1;game_body[game_sign_y[2] - 1][game_sign_x[2] - 1] = 1;game_body[game_sign_y[3] - 2][game_sign_x[3]] = 1;infoTex.setText("游戏进行中!");repaint();}}}if(blockNumber == 6&&downSign == false)//变换两层砖块1的2种情况{if(game_sign_x[0] == game_sign_x[2]&&game_sign_x[0] >= 2){if(game_body[game_sign_y[0]][game_sign_x[0] - 2] != 2&&game_body[game_sign_y[2] - 1][game_sign_x[2] -1 ] != 2&&game_body[game_sign_y[3] - 1][game_sign_x[3] + 1] != 2){num_csh_game();game_body[game_sign_y[0]][game_sign_x[0] - 2] = 1;game_body[game_sign_y[1]][game_sign_x[1]] = 1;game_body[game_sign_y[2] - 1][game_sign_x[2] - 1] = 1;game_body[game_sign_y[3] - 1][game_sign_x[3] + 1] = 1;infoTex.setText("游戏进行中!");repaint();}}if(game_sign_y[0] == game_sign_y[1]&&game_sign_y[3] <= 17){if(game_body[game_sign_y[0]][game_sign_x[0] + 2] != 2&&game_body[game_sign_y[1] + 1][game_sign_x[1] + 1] != 2&&game_body[game_sign_y[3] + 1][game_sign_x[3] - 1] != 2){num_csh_game();game_body[game_sign_y[0]][game_sign_x[0] + 2] = 1;game_body[game_sign_y[1] + 1][game_sign_x[1] + 1] = 1;game_body[game_sign_y[2]][game_sign_x[2]] = 1;game_body[game_sign_y[3] + 1][game_sign_x[3] - 1] = 1;infoTex.setText("游戏进行中!");repaint();}}}if(blockNumber == 7&&downSign == false)//变换两层砖块2的2种情况{if(game_sign_x[0] == game_sign_x[1]&&game_sign_x[0] <= 16){if(game_body[game_sign_y[0]][game_sign_x[0] + 2] != 2&&game_body[game_sign_y[1] - 1][game_sign_x[1] + 1] != 2&&game_body[game_sign_y[3] - 1][game_sign_x[3] - 1] != 2){num_csh_game();game_body[game_sign_y[0]][game_sign_x[0] + 2] = 1;game_body[game_sign_y[1] - 1][game_sign_x[1] + 1] = 1;game_body[game_sign_y[2]][game_sign_x[2]] = 1;game_body[game_sign_y[3] - 1][game_sign_x[3] - 1] = 1;infoTex.setText("游戏进行中!");repaint();}}if(game_sign_y[0] == game_sign_y[1]&&game_sign_y[2] <= 17)if(game_body[game_sign_y[0] + 1][game_sign_x[0] -1] != 2&&game_body[game_sign_y[1]][game_sign_x[1] -2] != 2&&game_body[game_sign_y[2] + 1][game_sign_x[2] + 1] != 2){num_csh_game();game_body[game_sign_y[0] + 1][game_sign_x[0] - 1] = 1;game_body[game_sign_y[1]][game_sign_x[1] - 2] = 1;game_body[game_sign_y[2] + 1][game_sign_x[2] + 1] = 1;game_body[game_sign_y[3]][game_sign_x[3]] = 1;infoTex.setText("游戏进行中!");repaint();}}}}public void num_csh_game()//数组清零for(int i = 0;i < 19;i++){for(int j = 0;j < 10;j++){if(game_body[i][j] == 2){game_body[i][j] = 2;}else{game_body[i][j] = 0;}}}}public void num_csh_restart()//重新开始时数组清零 {for(int i = 0;i < 19;i++){for(int j = 0;j < 10;j++)game_body[i][j] = 0;}}}public void keyTyped(KeyEvent e){}public void keyPressed(KeyEvent e){if(e.getKeyCode() == KeyEvent.VK_DOWN&&startSign == 1)//处理下键{this.down();}if(e.getKeyCode() == KeyEvent.VK_LEFT&&startSign == 1)//处理左键{this.left();}if(e.getKeyCode() == KeyEvent.VK_RIGHT&&startSign== 1)//处理右键{this.right();}if(e.getKeyCode() == KeyEvent.VK_UP&&startSign== 1)//处理上键转换{this.change_body(blockNumber);}if(startSign == 0){infoTex.setText("游戏未开始或已结束!");}}public void keyReleased(KeyEvent e){}public void paint(Graphics g){g.setColor(Color.black);g.fill3DRect(0,0,300,450,true);for(int i = 0;i < 19;i++){for(int j = 0;j < 10;j++){if(game_body[i][j] == 1){g.setColor(Color.blue);g.fill3DRect(30*j,30*(i-4),30,30,true); }if(game_body[i][j] == 2){g.setColor(Color.magenta);g.fill3DRect(30*j,30*(i-4),30,30,true); }}}}public void left()//向左移动{int sign = 0;dingwei();for(int k = 0;k < 4;k++){if(game_sign_x[k] == 0||game_body[game_sign_y[k]][game_sign_x[k] - 1] == 2){sign = 1;}}if(sign == 0&&downSign == false){num_csh_game();for(int k = 0;k < 4;k++){game_body[game_sign_y[k]][game_sign_x[k] - 1] = 1; }infoTex.setText("向左移动!");repaint();}}public void right()//向右移动{int sign = 0;dingwei();for(int k = 0;k < 4;k++){if(game_sign_x[k] == 9||game_body[game_sign_y[k]][game_sign_x[k] + 1] == 2){sign = 1;}}if(sign == 0&&downSign == false){num_csh_game();for(int k = 0;k < 4;k++){game_body[game_sign_y[k]][game_sign_x[k] + 1] = 1; }infoTex.setText("向右移动!");repaint();}}public void down()//下落{int sign = 0;dingwei();for(int k = 0;k < 4;k++){if(game_sign_y[k] == 18||game_body[game_sign_y[k] + 1][game_sign_x[k]] == 2){sign = 1;downSign = true;changeColor();cancelDW();getScore();if(game_over() == false){rand_block();repaint();}}}if(sign == 0){num_csh_game();for(int k = 0;k < 4;k++){game_body[game_sign_y[k] + 1][game_sign_x[k]] = 1;}infoTex.setText("游戏进行中!");repaint();}}public boolean game_over()//判断游戏是否结束{int sign=0;for(int i = 0;i < 10;i++){if(game_body[4][i] == 2){sign = 1;}}if(sign == 1){infoTex.setText("游戏结束!");changeColor();repaint();startSign = 0;timer.suspend();return true;}elsereturn false;}public void getScore()//满行消除方法{for(int i = 0;i < 19;i++){int sign = 0;for(int j = 0;j < 10;j++){if(game_body[i][j] == 2){sign++;}}if(sign == 10){gameScore += 100;scoreTex.setText(gameScore+"");infoTex.setText("恭喜得分!");for(int j = i;j >= 1;j--){for(int k = 0;k < 10;k++){game_body[j][k] = game_body[j - 1][k];}}}}}public void changeColor()//给已经落下的块换色{downSign = false;for(int k = 0;k < 4;k++){game_body[game_sign_y[k]][game_sign_x[k]] = 2; }}public void dingwei()//确定其位置{int k = 0;cancelDW();for(int i = 0;i < 19;i++){for(int j = 0;j < 10;j++){if(game_body[i][j] == 1){game_sign_x[k] = j;game_sign_y[k] = i;k++;}}}}public void cancelDW()//将定位数组初始化{for(int k = 0;k < 4;k++){game_sign_x[k] = 0;game_sign_y[k] = 0;}}public void block1()//长条{game_body[0][4] = 1;game_body[1][4] = 1;game_body[2][4] = 1;game_body[3][4] = 1;}public void block2()//正方形{game_body[3][4] = 1;game_body[3][5] = 1;game_body[2][5] = 1;}public void block3()//3加1(下) {game_body[1][4] = 1;game_body[2][4] = 1;game_body[3][4] = 1;game_body[3][5] = 1;}public void block4()//3加1(中) {game_body[1][4] = 1;game_body[2][4] = 1;game_body[3][4] = 1;game_body[2][5] = 1;}public void block5()//3加1(上) {game_body[1][4] = 1;game_body[2][4] = 1;game_body[1][5] = 1;}public void block6()//转折1 {game_body[1][5] = 1;game_body[2][5] = 1;game_body[2][4] = 1;game_body[3][4] = 1;}public void block7()//转折2 {game_body[1][4] = 1;game_body[2][4] = 1;game_body[2][5] = 1;game_body[3][5] = 1;}}//定时线程class MyTimer extends Thread {ERSBlock myBlock;public MyTimer(ERSBlock myBlock){this.myBlock = myBlock;}public void run(){while(myBlock.startSign == 1){try{sleep((10-myBlock.speedMark + 1)*100);myBlock.down();}catch(InterruptedException e){}}}}。

俄罗斯方块java代码6

俄罗斯方块java代码6

=================1======================package russia;/** 控制面板类*/import java.awt.*;import java.awt.event.*;import javax.swing.*;import javax.swing.border.*;public class ControlPanel extends JPanel{private TipBlockPanel tipBlockPanel;private JPanel tipPanel,InfoPanel,buttonPanel;private final JTextField levelField,scoreField;private JButton playButton,pauseButton,stopButton,turnHarderButton,turnEasilyButton;private EtchedBorder border=new EtchedBorder(EtchedBorder.RAISED,Color.WHITE, new Color(148, 145, 140)) ;private RussiaBlocksGame game;private Timer timer;public ControlPanel(final RussiaBlocksGame game){this.game = game;/**图形界面部分*/setLayout(new GridLayout(3,1,0,4));tipBlockPanel = new TipBlockPanel();tipPanel = new JPanel( new BorderLayout() );tipPanel.add( new JLabel("Next Block:") , BorderLayout.NORTH );tipPanel.add( tipBlockPanel , BorderLayout.CENTER );tipPanel.setBorder(border);InfoPanel = new JPanel( new GridLayout(4,1,0,0) );levelField = new JTextField(""+RussiaBlocksGame.DEFAULT_LEVEL);levelField.setEditable(false);scoreField = new JTextField("0");scoreField.setEditable(false);InfoPanel.add(new JLabel("Level:"));InfoPanel.add(levelField);InfoPanel.add(new JLabel("Score:"));InfoPanel.add(scoreField);InfoPanel.setBorder(border);buttonPanel = new JPanel(new GridLayout(5,1,0,0));playButton = new JButton("Play");pauseButton = new JButton("Pause");stopButton = new JButton("Stop");turnHarderButton = new JButton("Turn harder"); turnEasilyButton = new JButton("Turn easily");buttonPanel.add(playButton);buttonPanel.add(pauseButton);buttonPanel.add(stopButton);buttonPanel.add(turnHarderButton);buttonPanel.add(turnEasilyButton);buttonPanel.setBorder(border);addKeyListener(new ControlKeyListener());//添加add(tipPanel);add(InfoPanel);add(buttonPanel);/**添加事件监听器*/playButton.addActionListener(new ActionListener(){public void actionPerformed(ActionEvent event){game.playGame();requestFocus();//让ControlPanel重新获得焦点以响应键盘事件}});pauseButton.addActionListener(new ActionListener(){public void actionPerformed(ActionEvent event){if(pauseButton.getText().equals("Pause"))game.pauseGame();elsegame.resumeGame();requestFocus();//让ControlPanel重新获得焦点以响应键盘事件}});stopButton.addActionListener(new ActionListener(){public void actionPerformed(ActionEvent event){game.stopGame();requestFocus();//让ControlPanel重新获得焦点以响应键盘事件}});turnHarderButton.addActionListener(new ActionListener(){public void actionPerformed(ActionEvent event){int level = 0;try{level = Integer.parseInt(levelField.getText());setLevel(level + 1);}catch(NumberFormatException e){e.printStackTrace();}requestFocus();//让ControlPanel重新获得焦点以响应键盘事件}});turnEasilyButton.addActionListener(new ActionListener(){public void actionPerformed(ActionEvent event){int level = 0;try{level = Integer.parseInt(levelField.getText());setLevel(level - 1);}catch(NumberFormatException e){e.printStackTrace();}requestFocus();//让ControlPanel重新获得焦点以响应键盘事件}});/** 时间驱动程序,每格500毫秒对level,score值进行更新*/timer = new Timer(500,new ActionListener(){public void actionPerformed(ActionEvent event){scoreField.setText(""+game.getScore());game.levelUpdate();}});timer.start();}/** 设置预显方块的样式*/public void setBlockStyle(int style){tipBlockPanel.setStyle(style);tipBlockPanel.repaint();}/** 重置,将所有数据恢复到最初值*/public void reset(){levelField.setText(""+RussiaBlocksGame.DEFAULT_LEVEL); scoreField.setText("0");setPlayButtonEnabled(true);setPauseButtonLabel(true);tipBlockPanel.setStyle(0);}/**设置playButton是否可用*/public void setPlayButtonEnabled(boolean enable){playButton.setEnabled(enable);/**设置pauseButton的文本*/public void setPauseButtonLabel(boolean pause){pauseButton.setText( pause ? "Pause" : "Rusume" );}/**设置方块的大小,改变窗体大小时调用可自动调整方块到合适的尺寸*/public void fanning(){tipBlockPanel.fanning();}/**根据level文本域的值返回当前的级别*/public int getLevel(){int level = 0;try{level=Integer.parseInt(levelField.getText());}catch(NumberFormatException e){e.printStackTrace();}return level;}/** 设置level文本域的值*/public void setLevel(int level){if(level > 0 && level <= RussiaBlocksGame.MAX_LEVEL) levelField.setText("" + level);}/** 内部类为预显方块的显示区域*/private class TipBlockPanel extends JPanel{private Color bgColor = Color.darkGray,blockColor = Color.lightGray;private RussiaBox [][]boxes = new RussiaBox[RussiaBlock.ROWS][RussiaBlock.COLS]; private int boxWidth, boxHeight,style;private boolean isTiled = false;/** 构造函数*/public TipBlockPanel(){for(int i = 0; i < boxes.length; i ++)for(int j = 0; j < boxes[i].length; j ++){boxes[i][j]=new RussiaBox(false);}style = 0x0000;}/** 构造函数*/public TipBlockPanel(Color bgColor, Color blockColor){this();this.bgColor = bgColor;this.blockColor = blockColor;}/** 设置方块的风格*/public void setStyle(int style){this.style = style;repaint();}/** 绘制预显方块*/public void paintComponent(Graphics g){super.paintComponent(g);int key = 0x8000;if(!isTiled)fanning();for(int i = 0; i < boxes.length; i ++)for(int j = 0; j<boxes[i].length ;j ++){Color color = (style & key) != 0 ? blockColor : bgColor;g.setColor(color);g.fill3DRect(j * boxWidth, i * boxHeight, boxWidth, boxHeight, true);key >>=1;}}/**设置方块的大小,改变窗体大小时调用可自动调整方块到合适的尺寸*/public void fanning(){boxWidth = getSize().width / RussiaBlock.COLS;boxHeight = getSize().height /RussiaBlock.ROWS;isTiled=true;}}/**内部类键盘键听器,响应键盘事件*/class ControlKeyListener extends KeyAdapter {public void keyPressed(KeyEvent ke){if (!game.isPlaying()) return;RussiaBlock block = game.getCurBlock();switch (ke.getKeyCode()) {case KeyEvent.VK_DOWN:block.moveDown();break;case KeyEvent.VK_LEFT:block.moveLeft();break;case KeyEvent.VK_RIGHT:block.moveRight();break;case KeyEvent.VK_UP:block.turnNext();break;case KeyEvent.VK_SPACE://一键到底while(block.moveDown()){}break;default:break;}}}}=================2=================================== package russia;/** 游戏中方块显示的画布类*/import java.awt.*;import java.awt.event.*;import javax.swing.*;import javax.swing.border.*;public class GameCanvas extends JPanel{private RussiaBox [][]boxes;private int rows = 20 , cols = 12;private static GameCanvas canvas=null;private int boxWidth, boxHeight;//默认为零需要调用fanning函数设置private Color blockColor = Color.RED, bgColor = new Color(0,204,204);private EtchedBorder border=new EtchedBorder(EtchedBorder.RAISED,Color.WHITE, new Color(148, 145, 140)) ;/**采用单件模式,构造函数私有*/private GameCanvas(){boxes = new RussiaBox[rows][cols];for(int i = 0; i < boxes.length; i ++)for(int j = 0; j<boxes[i].length; j ++)boxes[i][j] = new RussiaBox(false);setBorder(border);}/**获得GameCanvas实例*/public static GameCanvas getCanvasInstance(){if(canvas == null)canvas = new GameCanvas();return canvas;}/**设置画布的背景色*/public void setBgColor(Color bgColor){this.bgColor = bgColor;}/** 获得画布的背景色*/public Color getBgColor(){return bgColor;}/**设置方块的颜色*/public void setBlockColor(Color blockColor) {this.blockColor = blockColor;}/**方块的颜色*/public Color getBlockColor(){return blockColor;}/**设置画布中方块的行数*/public void setRows(int rows){this.rows = rows;}/**得到画布中方块的行数*/public int getRows(){return rows;}/**设置画布中方块的列数*/public void setCols(int cols){this.cols = cols;}/**得到画布中方块的列数*/public int getCols(){return cols;}/**得到row行,col列的方格*/public RussiaBox getBox(int row, int col){if(row >= 0 && row < rows && col >= 0 && col < cols)return boxes[row][col];elsereturn null;}/**在画布中绘制方块*/public void paintComponent(Graphics g){super.paintComponent(g);fanning();for(int i = 0; i < boxes.length; i ++)for(int j = 0; j < boxes[i].length; j ++){Color color = boxes[i][j].isColorBox() ? blockColor : bgColor;g.setColor(color);g.fill3DRect(j * boxWidth, i * boxHeight , boxWidth , boxHeight , true);}}/**清除第row行*/public void removeLine(int row){for(int i = row; i > 0; i --)for(int j = 0; j < cols; j ++){boxes[i][j] = (RussiaBox)boxes[i-1][j].clone();}}/**重置为初始时的状态*/public void reset(){for(int i = 0; i < boxes.length; i++)for(int j = 0 ;j < boxes[i].length; j++){boxes[i][j].setColor(false);}repaint();}/** 根据窗体的大小自动调整方格的大小*/public void fanning(){boxWidth = getSize().width / cols;boxHeight = getSize().height / rows;}}====================3======================= package russia;/** 方块类*/public class RussiaBlock extends Thread{private int style,y,x,level;private boolean moving,pausing;private RussiaBox boxes[][];private GameCanvas canvas;public final static int ROWS = 4;public final static int COLS = 4;public final static int BLOCK_KIND_NUMBER = 7; public final static int BLOCK_STATUS_NUMBER = 4; public final static int BETWEEN_LEVELS_TIME = 50; public final static int LEVEL_FLATNESS_GENE = 3;/**方块的所有风格及其不同的状态*/public final static int[][] STYLES = {// 共28种状态{0x0f00, 0x4444, 0x0f00, 0x4444}, // 长条型的四种状态{0x04e0, 0x0464, 0x00e4, 0x04c4}, // 'T'型的四种状态{0x4620, 0x6c00, 0x4620, 0x6c00}, // 反'Z'型的四种状态{0x2640, 0xc600, 0x2640, 0xc600}, // 'Z'型的四种状态{0x6220, 0x1700, 0x2230, 0x0740}, // '7'型的四种状态{0x6440, 0x0e20, 0x44c0, 0x8e00}, // 反'7'型的四种状态{0x0660, 0x0660, 0x0660, 0x0660}, // 方块的四种状态};/**构造函数*/public RussiaBlock(int y,int x,int level,int style){this.y = y;this.x = x;this.level = level;moving = true;pausing = false;this.style = style;canvas = GameCanvas.getCanvasInstance();boxes = new RussiaBox[ROWS][COLS];int key = 0x8000;for(int i = 0; i < boxes.length; i++)for(int j = 0; j < boxes[i].length; j++){boolean isColor = ( (style & key) != 0 );boxes[i][j] = new RussiaBox(isColor);key >>= 1;}display();}/**线程的run方法控制放块的下落及下落速度*/public void run(){while(moving){try{sleep( BETWEEN_LEVELS_TIME * (RussiaBlocksGame.MAX_LEVEL - level + LEVEL_FLATNESS_GENE) );if(!pausing)moving = ( moveTo(y + 1,x) && moving );}catch(InterruptedException e){e.printStackTrace();}}}/**暂停移动*/public void pauseMove(){pausing = true;}/**从暂停状态恢复*/public void resumeMove(){pausing = false;}/**停止移动*/public void stopMove(){moving = false;}/**向左移一格*/public void moveLeft(){moveTo(y , x - 1);}/**向右移一格*/public void moveRight(){moveTo(y , x + 1);}/**向下移一格,返回与其他几个不同,为了一键到底*/public boolean moveDown(){if(moveTo(y + 1, x))return true;elsereturn false;}/**移到newRow,newCol位置*/public synchronized boolean moveTo(int newRow, int newCol){//erase();//必须在判断前进行擦除,否则isMoveable将产生错误行为if(!moving || !isMoveable(newRow,newCol)){display();return false;}y = newRow;x = newCol;display();canvas.repaint();return true;}/**判断能否移到newRow,newCol位置*/private boolean isMoveable(int newRow, int newCol){erase();for(int i = 0; i < boxes.length; i ++)for(int j = 0; j< boxes[i].length; j ++ ){if( boxes[i][j].isColorBox() ){RussiaBox box = canvas.getBox(newRow + i, newCol + j);if(box == null || box.isColorBox())return false;}}return true;/**通过旋转变为下一种状态*/public void turnNext(){int newStyle = 0;for(int i = 0; i < STYLES.length; i ++)for(int j = 0 ;j < STYLES[i].length; j++){if(style == STYLES[i][j]){newStyle = STYLES[i][(j + 1)%BLOCK_STATUS_NUMBER];break;}}turnTo(newStyle);}/**通过旋转变能否变为newStyle状态*/private synchronized boolean turnTo(int newStyle){//erase();//擦除之后在判断isTurnNextAbleif(!moving || !isTurnable(newStyle)){display();return false;}style=newStyle;int key = 0x8000;for(int i = 0; i < boxes.length; i ++)for(int j = 0 ;j < boxes[i].length; j++){boolean isColor = ((key & style) != 0 );boxes[i][j].setColor(isColor);key >>=1;}display();canvas.repaint();return true;}*判断通过旋转能否变为下一种状态*/private boolean isTurnable(int newStyle){erase();int key = 0x8000;for(int i = 0; i< boxes.length; i++)for(int j=0; j<boxes[i].length; j++){if((key & newStyle) != 0){RussiaBox box = canvas.getBox(y + i, x + j);if(box == null || box.isColorBox())return false;}key >>= 1;}return true;}/**擦除当前方块(只是设置isColor属性,颜色并没有清除,为了判断能否移动之用) */private void erase(){for(int i = 0; i < boxes.length; i ++)for(int j = 0; j< boxes[i].length; j ++ ){if( boxes[i][j].isColorBox() ){RussiaBox box = canvas.getBox( y + i, x + j);if(box != null)box.setColor(false);}}}/**显示当前方块(其实只是设置Color属性,在调用repaint方法时才真正显示)*/private void display(){for(int i = 0; i < boxes.length; i ++)for(int j = 0;j< boxes[i].length ; j ++){if(boxes[i][j].isColorBox()){RussiaBox box = canvas.getBox( y + i, x + j);if(box != null)box.setColor( true );}}}}===========================4=================package russia;/** 主游戏类*/import java.awt.*;import java.awt.event.*;import javax.swing.*;public class RussiaBlocksGame extends JFrame{public final static int PER_LINE_SCORE = 100;//消去一行得分public final static int PER_LEVEL_SCORE = PER_LINE_SCORE*20;//升一级需要的分数public final static int DEFAULT_LEVEL = 5;//默认级别public final static int MAX_LEVEL = 10;//最高级别private int score=0,curLevelScore = 0;//总分和本级得分private GameCanvas canvas;private ControlPanel controlPanel;private RussiaBlock block;private int style = 0;boolean playing = false;private JMenuBar bar;private JMenu gameMenu,controlMenu,windowStyleMenu,informationMenu;private JMenuItem newGameItem,setBlockColorItem,setBgColorItem,turnHardItem,turnEasyItem,exitItem;private JMenuItem playItem,pauseItem,resumeItem,stopItem;private JRadioButtonMenuItem windowsRadioItem,motifRadioItem,metalRadioItem;private JMenuItem authorItem,helpItem;private ButtonGroup buttonGroup;/** 构造函数public RussiaBlocksGame(String title){super(title);setSize(300,400);Dimension scrSize=Toolkit.getDefaultToolkit().getScreenSize();setLocation((scrSize.width-getSize().width)/2,(scrSize.height-getSize().height)/2);createMenu();Container container=getContentPane();container.setLayout(new BorderLayout());canvas = GameCanvas.getCanvasInstance();controlPanel = new ControlPanel(this);container.add(canvas,BorderLayout.CENTER);container.add(controlPanel,BorderLayout.EAST);addWindowListener(new WindowAdapter(){public void windowClosing(WindowEvent event){stopGame();System.exit(0);}});addComponentListener(new ComponentAdapter(){public void componentResized(ComponentEvent event){canvas.fanning();}});canvas.fanning();setVisible(true);}/** 判断游戏是否正在进行public boolean isPlaying(){return playing;}/** 开始游戏并设置按钮和菜单项的可用性*/public void playGame(){play();controlPanel.setPlayButtonEnabled(false); playItem.setEnabled(false);}/** 暂停游戏*/public void pauseGame(){if(block != null) block.pauseMove(); controlPanel.setPauseButtonLabel(false); pauseItem.setEnabled(false); resumeItem.setEnabled(true);}/** 从暂停中恢复游戏*/public void resumeGame(){if(block != null) block.resumeMove(); controlPanel.setPauseButtonLabel(true); pauseItem.setEnabled(true); resumeItem.setEnabled(false);}/** 停止游戏*/public void stopGame(){if(block != null) block.stopMove(); playing = false;controlPanel.setPlayButtonEnabled(true); controlPanel.setPauseButtonLabel(true);playItem.setEnabled(true);}/** 得到当前级别*/public int getLevel(){return controlPanel.getLevel();}/** 设置当前级别,并更新控制面板的显示*/public void setLevel(int level){if(level>0&&level<11)controlPanel.setLevel(level);}/** 得到当前总分数*/public int getScore(){if(canvas != null)return score;return 0;}/** 得到本级得分*/public int getCurLevelScore(){if(canvas != null)return curLevelScore;return 0;}/** 更新等级*/public void levelUpdate(){int curLevel = getLevel();if(curLevel < MAX_LEVEL && curLevelScore >= PER_LEVEL_SCORE) {setLevel(curLevel + 1);curLevelScore -= PER_LEVEL_SCORE;}}/** 获得当前得方块*/public RussiaBlock getCurBlock() {return block;}/** 开始游戏*/private void play(){playing=true;Thread thread = new Thread(new Game());thread.start();reset();}/** 重置*/private void reset(){controlPanel.reset();canvas.reset();score = 0;curLevelScore = 0;}/** 宣告游戏结束*/private void reportGameOver(){JOptionPane.showMessageDialog(this,"Game over!");}/** 创建菜单*/private void createMenu(){gameMenu = new JMenu("Game");newGameItem = new JMenuItem("New Game"); setBlockColorItem = new JMenuItem("Set Block Color..."); setBgColorItem = new JMenuItem("Set BackGround Color...");turnHardItem = new JMenuItem("Turn Harder"); turnEasyItem = new JMenuItem("Turn Easily");exitItem = new JMenuItem("Exit");gameMenu.add(newGameItem);gameMenu.add(setBlockColorItem);gameMenu.add(setBgColorItem);gameMenu.add(turnHardItem);gameMenu.add(turnEasyItem);gameMenu.add(exitItem);controlMenu = new JMenu("Control");playItem = new JMenuItem("Play");pauseItem = new JMenuItem("Pause");resumeItem = new JMenuItem("Resume");stopItem = new JMenuItem("Stop");controlMenu.add(playItem);controlMenu.add(pauseItem);controlMenu.add(resumeItem);controlMenu.add(stopItem);windowStyleMenu = new JMenu("WindowStyle"); buttonGroup = new ButtonGroup();windowsRadioItem = new JRadioButtonMenuItem("Windows"); motifRadioItem = new JRadioButtonMenuItem("Motif"); metalRadioItem = new JRadioButtonMenuItem("Mentel",true); windowStyleMenu.add(windowsRadioItem);buttonGroup.add(windowsRadioItem); windowStyleMenu.add(motifRadioItem);buttonGroup.add(motifRadioItem);windowStyleMenu.add(metalRadioItem);buttonGroup.add(metalRadioItem);informationMenu = new JMenu("Information");authorItem = new JMenuItem("Author:Fuliang");helpItem = new JMenuItem("Help");informationMenu.add(authorItem);informationMenu.add(helpItem);bar = new JMenuBar();bar.add(gameMenu);bar.add(controlMenu);bar.add(windowStyleMenu);bar.add(informationMenu);addActionListenerToMenu();setJMenuBar(bar);}/** 添加菜单响应*/private void addActionListenerToMenu(){newGameItem.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent ae) {stopGame();reset();setLevel(DEFAULT_LEVEL);}});setBlockColorItem.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent ae) {Color newBlockColor =JColorChooser.showDialog(RussiaBlocksGame.this,"Set color for block", canvas.getBlockColor());if (newBlockColor != null)canvas.setBlockColor(newBlockColor);}});setBgColorItem.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent ae) {Color newBgColor =JColorChooser.showDialog(RussiaBlocksGame.this,"Set color for block",canvas.getBgColor());if (newBgColor != null)canvas.setBgColor(newBgColor);}});turnHardItem.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent ae) {int curLevel = getLevel();if (curLevel < MAX_LEVEL) setLevel(curLevel + 1);}});turnEasyItem.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent ae) {int curLevel = getLevel();if (curLevel > 1) setLevel(curLevel - 1);}});exitItem.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent ae) {System.exit(0);}});playItem.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent ae) {playGame();}});pauseItem.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent ae) {pauseGame();}});resumeItem.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent ae) {resumeGame();}});stopItem.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent ae) {stopGame();}});windowsRadioItem.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent ae) {String plaf = "com.sun.java.swing.plaf.windows.WindowsLookAndFeel"; setWindowStyle(plaf);canvas.fanning();controlPanel.fanning();}});motifRadioItem.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent ae) {String plaf = "com.sun.java.swing.plaf.motif.MotifLookAndFeel";setWindowStyle(plaf);canvas.fanning();controlPanel.fanning();;}});metalRadioItem.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent ae) {String plaf = "javax.swing.plaf.metal.MetalLookAndFeel";setWindowStyle(plaf);canvas.fanning();controlPanel.fanning();}});}/** 设定窗口风格*/private void setWindowStyle(String plaf){try {UIManager.setLookAndFeel(plaf);SwingUtilities.updateComponentTreeUI(this);} catch (Exception e) {e.printStackTrace();}}private class Game implements Runnable{/** (non-Javadoc)* @see ng.Runnable#run()* 游戏线程的run函数*/public void run(){int col=(int)(Math.random()*(canvas.getCols()-3));style=RussiaBlock.STYLES[(int)(Math.random()*RussiaBlock.BLOCK_KIND_NUMBER)][(int)(Math.random()*RussiaBlock.BLOCK_STATUS_NUMBER)];while (playing) {if (block != null) { //第一次循环时,block为空if (block.isAlive()) {try {Thread.sleep(100);} catch (InterruptedException ie) {ie.printStackTrace();}continue;}}checkFullLine();if (isGameOver()) { //检查游戏是否应该结束了playItem.setEnabled(true);pauseItem.setEnabled(true);resumeItem.setEnabled(false);controlPanel.setPlayButtonEnabled(true);controlPanel.setPauseButtonLabel(true);reportGameOver();return;}block = new RussiaBlock(-1, col, getLevel(),style);block.start();col=(int)(Math.random()*(canvas.getCols()-3));style=RussiaBlock.STYLES[(int)(Math.random()*RussiaBlock.BLOCK_KIND_NUMBER)][(int )(Math.random()*RussiaBlock.BLOCK_STATUS_NUMBER)];controlPanel.setBlockStyle(style);}}/** 判断是否能消去整行*/public void checkFullLine(){for (int i = 0; i < canvas.getRows(); i++) {int row = -1;boolean fullLineColorBox = true;for (int j = 0; j < canvas.getCols(); j++) {if (!canvas.getBox(i, j).isColorBox()) {fullLineColorBox = false;break;}}if (fullLineColorBox) {curLevelScore += PER_LINE_SCORE;score += PER_LINE_SCORE;row = i--;canvas.removeLine(row);}}}/** 判断游戏是否结束*/private boolean isGameOver() {for (int i = 0; i < canvas.getCols(); i++) {RussiaBox box = canvas.getBox(0, i);if (box.isColorBox()) return true;}return false;}}public static void main(String[] args){new RussiaBlocksGame("Russia Blocks Game");}}========================5=================== package russia;/**虚拟的单个方格类,控制方格的颜色*/public class RussiaBox implements Cloneable{private boolean isColor;public RussiaBox(boolean isColor){this.isColor = isColor;}/**设置颜色*/public void setColor(boolean isColor) {this.isColor=isColor;}/**返回颜色*/public boolean isColorBox(){return isColor;}/** @see ng.Object#clone()*/public Object clone(){Object o = null;try{o=super.clone();}catch(CloneNotSupportedException e) {e.printStackTrace();}return o;}}。

Java项目--俄罗斯方块

Java项目--俄罗斯方块

Java项⽬--俄罗斯⽅块Java项⽬--俄罗斯⽅块百度盘链接⼀、⼼得⼆、游戏实例游戏截图⽬录结构三、代码1、主界⾯ Tetris.java1package com.hsj.tetris;23import java.awt.Color;4import java.awt.Font;5import java.awt.Graphics;6import java.awt.Image;7import java.awt.event.KeyAdapter;8import java.awt.event.KeyEvent;9import java.util.Arrays;10import java.util.Timer;11import java.util.TimerTask;1213import javax.imageio.ImageIO;14import javax.swing.JFrame;15import javax.swing.JPanel;16/**17 * 俄罗斯⽅块游戏⾯板18 *19*/20public class Tetris extends JPanel {21/** 正在下落⽅块 */22private Tetromino tetromino;23/** 下⼀个下落⽅块 */24private Tetromino nextOne;25/** ⾏数 */26public static final int ROWS = 20;27/** 列数 */28public static final int COLS = 10;29/** 墙 */30private Cell[][] wall = new Cell[ROWS][COLS];31/** 消掉的⾏数 */32private int lines;33/** 分数 */34private int score;3536public static final int CELL_SIZE = 26;3738private static Image background;//背景图⽚39public static Image I;40public static Image J;41public static Image L;42public static Image S;43public static Image Z;44public static Image O;45public static Image T;46static{//加载静态资源的,加载图⽚47//建议将图⽚放到 Tetris.java 同包中!48//从包中加载图⽚对象,使⽤Swing API实现51// Tetris.class.getResource("tetris.png"));52// T = toolkit.getImage(Tetris.class.getResource("T.png"));53// S = toolkit.getImage(Tetris.class.getResource("S.png")); 54// Z = toolkit.getImage(Tetris.class.getResource("Z.png"));55// L = toolkit.getImage(Tetris.class.getResource("L.png"));56// J = toolkit.getImage(Tetris.class.getResource("J.png"));57// I = toolkit.getImage(Tetris.class.getResource("I.png"));58// O = toolkit.getImage(Tetris.class.getResource("O.png")); 59//import javax.imageio.ImageIO;60try{61 background = ImageIO.read(62 Tetris.class.getResource("tetris.png"));63 T=ImageIO.read(Tetris.class.getResource("T.png"));64 I=ImageIO.read(Tetris.class.getResource("I.png"));65 S=ImageIO.read(Tetris.class.getResource("S.png"));66 Z=ImageIO.read(Tetris.class.getResource("Z.png"));67 L=ImageIO.read(Tetris.class.getResource("L.png"));68 J=ImageIO.read(Tetris.class.getResource("J.png"));69 O=ImageIO.read(Tetris.class.getResource("O.png"));70 }catch(Exception e){71 e.printStackTrace();72 }73 }7475public void action(){76//tetromino = Tetromino.randomTetromino();77//nextOne = Tetromino.randomTetromino();78//wall[19][2] = new Cell(19,2,Tetris.T);79 startAction();80 repaint();81 KeyAdapter l = new KeyAdapter() {82public void keyPressed(KeyEvent e) {83int key = e.getKeyCode();84if(key == KeyEvent.VK_Q){85 System.exit(0);//退出当前的Java进程86 }87if(gameOver){88if(key==KeyEvent.VK_S){89 startAction();90 }91return;92 }93//如果暂停并且按键是[C]就继续动作94if(pause){//pause = false95if(key==KeyEvent.VK_C){ continueAction(); }96return;97 }98//否则处理其它按键99switch(key){100case KeyEvent.VK_RIGHT: moveRightAction(); break; 101case KeyEvent.VK_LEFT: moveLeftAction(); break; 102case KeyEvent.VK_DOWN: softDropAction() ; break; 103case KeyEvent.VK_UP: rotateRightAction() ; break; 104case KeyEvent.VK_Z: rotateLeftAction() ; break;105case KeyEvent.VK_SPACE: hardDropAction() ; break; 106case KeyEvent.VK_P: pauseAction() ; break;107 }108 repaint();109 }110 };111this.requestFocus();112this.addKeyListener(l);113 }114115public void paint(Graphics g){116 g.drawImage(background, 0, 0, null);//使⽤this 作为观察者117 g.translate(15, 15);//平移绘图坐标系118 paintTetromino(g);//绘制正在下落的⽅块119 paintWall(g);//画墙120 paintNextOne(g);121 paintScore(g);122 }123public static final int FONT_COLOR = 0x667799;124public static final int FONT_SIZE = 0x20;125private void paintScore(Graphics g) {126 Font f = getFont();//获取当前的⾯板默认字体127 Font font = new Font(128 f.getName(), Font.BOLD, FONT_SIZE);129int x = 290;130int y = 162;131 g.setColor(new Color(FONT_COLOR));132 g.setFont(font);135 y+=56;136 str = "LINES:"+this.lines;137 g.drawString(str, x, y);138 y+=56;139 str = "[P]Pause";140if(pause){str = "[C]Continue";}141if(gameOver){ str = "[S]Start!";}142 g.drawString(str, x, y);143 }144145private void paintNextOne(Graphics g) {146 Cell[] cells = nextOne.getCells();147for(int i=0; i<cells.length; i++){148 Cell c = cells[i];149int x = (c.getCol()+10) * CELL_SIZE-1;150int y = (c.getRow()+1) * CELL_SIZE-1;151 g.drawImage(c.getImage(), x, y, null);152 }153 }154155private void paintTetromino(Graphics g) {156 Cell[] cells = tetromino.getCells();157for(int i=0; i<cells.length; i++){158 Cell c = cells[i];159int x = c.getCol() * CELL_SIZE-1;160int y = c.getRow() * CELL_SIZE-1;161//g.setColor(new Color(c.getColor()));162//g.fillRect(x, y, CELL_SIZE, CELL_SIZE);163 g.drawImage(c.getImage(), x, y, null);164 }165 }166167//在 Tetris 类中添加⽅法 paintWall168private void paintWall(Graphics g){169for(int row=0; row<wall.length; row++){170//迭代每⼀⾏, i = 0 1 2 (19)171 Cell[] line = wall[row];172//line.length = 10173for(int col=0; col<line.length; col++){174 Cell cell = line[col];175int x = col*CELL_SIZE;176int y = row*CELL_SIZE;177if(cell==null){178//g.setColor(new Color(0));179//画⽅形180//g.drawRect(x, y, CELL_SIZE, CELL_SIZE); 181 }else{182 g.drawImage(cell.getImage(), x-1, y-1, null); 183 }184 }185 }186 }187/**188 * 在 Tetris(俄罗斯⽅块) 类中增加⽅法189 * 这个⽅法的功能是:软下落的动作控制流程190 * 完成功能:如果能够下落就下落,否则就着陆到墙上,191 * ⽽新的⽅块出现并开始落下。

俄罗斯方块(Java实现)

俄罗斯方块(Java实现)

俄罗斯⽅块(Java实现)程序效果:代码://Box.java1package tetris;2public class Box {3private final int M = 30, N = 12;4private int[][] ls = new int[M][N];5private int score=0;6int getM() {7return M;8 }9int getN() {10return N;11 }12int getScore() {13return score;14 }15boolean isOut(int x,int y){16return x<0|y<0|x>M-1|y>N-1?true:false;17 }18int getFlag(int x, int y) {19return isOut(x,y)?2:ls[x][y];20 }21int clearFlag(int x, int y) {22if(isOut(x,y))return -1;23 ls[x][y]=0;24return 0;25 }26int setFlag_1(int x, int y) {27if(isOut(x,y))return -1;28 ls[x][y]=1;29return 0;30 }31int setFlag_2(int x, int y) {32if(isOut(x,y))return -1;33 ls[x][y]=2;34return 0;35 }36/*boolean isFlag_2(int x, int y) {37 return isOut(x,y)?true:ls[x][y]== 2 ? true:false ;38 }*/39void clear(int x, int maxX) {40if(isOut(x,0)||isOut(maxX,0))return ;41for (int i = x; i <= maxX; i++) {42boolean isAllNotBlank = true;43for (int j = 0; j <= N - 1; j++) {44if (ls[i][j]== 0) {45 isAllNotBlank = false;46break;47 }48 }49if (isAllNotBlank) {50for (int k = i - 1; k >= 0; k--) {51for (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.java1package tetris;2import java.awt.Point;3import java.util.Random;4public class Shape {5private final Box box;6private Point[] ps = new Point[4];7private Point[] tps = new Point[5];8private 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 };17private int change = 0,shape,x,y;18int left,down;19private Random random;20boolean isPaused = false;21 Shape(Box b) {22 box = b;23for (int i = 0; i <= 3; i++) {24 ps[i] = new Point();25 }26for (int i = 0; i <= 4; i++) {27 tps[i] = new Point();28 }29 random = new Random();30 getNewShape();31 }32private void clearTpsFlag(){33for (int i = 0; i <= 3; i++) {34 box.clearFlag(tps[i].x, tps[i].y);35 }36 }37private int setPsFlag_1() {38for (int i = 0; i <= 3; i++) {39 box.setFlag_1(ps[i].x, ps[i].y);40 }41return 0;42 }43private int setPsFlag_2() {44for (int i = 0; i <= 3; i++) {45 box.setFlag_2(ps[i].x, ps[i].y);46 }47return 0;48 }49private synchronized int tps() {50for (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;56return 0;57 }58private synchronized int backupChange() {59for (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;65return 0;66 }67private synchronized int check() {68 System.out.println(ps[0]+","+ps[1]+","+ps[2]+","+ps[3]);69for (int i = 0; i <= 3;i++) {70if (!(box.getFlag(ps[i].x, ps[i].y)==0||box.getFlag(ps[i].x, ps[i].y)==1)){71 backupChange();72return 5;}73 }74return 0;75 }76private void getNewShape(){77 System.out.println("lll");78int i = Math.abs(random.nextInt()) % 7;79 shape=i;80 x=1;81 y=box.getN()/2;82for(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 }89void changeShape(){90 tps();91 change++;92 change%=shapes[shape].length;93for(int j=0;j<=3;j++){94 ps[j].setLocation(x+shapes[shape][change][j*2], y+shapes[shape][change][j*2+1]);95 }96int g=check();97if(g==0){98 clearTpsFlag();99 setPsFlag_1();100 }101 }102synchronized int move(int dir) {103 tps();104switch(dir){105case 0:for (int i = 0; i <= 3; i++) {ps[i].y--;}y--;break;106case 1:for (int i = 0; i <= 3; i++) {ps[i].y++;}y++;break;107case 2:for (int i = 0; i <= 3; i++) {ps[i].x++;}x++;break;108default:109 }110int g = check();111if(g!=0&&dir==2){112int x = ps[0].x;113int maxX = ps[3].x;// x+4>M-1?M-1:x+4;114 setPsFlag_2();115 box.clear(x, maxX);116if(x==1){return -1;}117 getNewShape();118 }119if(g==0){120 clearTpsFlag();121 setPsFlag_1();122 }123return 0;124 }125 }//Tetris.java1package tetris;23import java.awt.BorderLayout;4import java.awt.Color;5import java.awt.Container;6import java.awt.Graphics;7import java.awt.GridLayout;8import java.awt.event.KeyAdapter;9import java.awt.event.KeyEvent;10import java.io.BufferedReader;11import java.io.BufferedWriter;12import java.io.FileNotFoundException;13import java.io.FileReader;14import java.io.FileWriter;15import java.io.IOException;16import javax.swing.JButton;17import javax.swing.JFrame;18import javax.swing.JOptionPane;19import javax.swing.JPanel;20import javax.swing.JTextField;2122public class Tetris extends JFrame implements Runnable{23private static final long serialVersionUID = 279494108361487144L; 24final Color BC = Color.GRAY;25final Color FC = Color.LIGHT_GRAY;26 Box box;27 Shape shape;28int a = 0, b = 0, c = 0;29 JPanel panel, scorePanel;30 JTextField scoreField, bestScoreField;31 JButton[][] bs;32 Tetris(Box b) {33super("Tetris");34 box = b;35 shape =new Shape(b);36 bs = new JButton[box.getM()][box.getN()];37for (int i = 0; i <= box.getM() - 1; i++) {38for (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()));58for (int i = 0; i <= box.getM() - 1; i++) {59for (int j = 0; j <= box.getN() - 1; j++) {60 panel.add(bs[i][j]);61 }62 }63 container.add(panel, BorderLayout.CENTER);64this.addKeyListener(new KeyAdapter() {65public void keyPressed(KeyEvent e) {66int c = e.getKeyCode();67// System.out.print(c);68switch (c) {69case KeyEvent.VK_LEFT :70//shape.left++;71 shape.move(0);72break;73case KeyEvent.VK_RIGHT :74//shape.left--;75 shape.move(1);76break;77case KeyEvent.VK_UP :78 shape.changeShape();79break;80case KeyEvent.VK_DOWN :81 shape.down++;82break;83case KeyEvent.VK_SPACE :84if (shape.isPaused == true) {85 shape.isPaused = false;86 } else {87 shape.isPaused = true;88 }89break;90default : }91 }92 });93this.setFocusable(true);94 setLocation(200, 10);95 setSize(20 * box.getN(), 20 * box.getM() + 20);96 setVisible(true);97 }98private int down() throws InterruptedException {99 System.out.println("ddd");100int dd=shape.move(2);101 scoreField.setText("Score: " + new Integer(box.getScore()).toString()); 102if(dd==-1){gameOver();}105public void run() {106while (true) {107try {108if (shape.isPaused == true) {109// System.out.println("PAUSED");110 Thread.sleep(500);111 } else {112//System.out.println("start1");113 down();114for (int i = 0; i <= box.getM() - 1; i++) {115for (int j = 0; j <= box.getN() - 1; j++) {116if(box.getFlag(i, j)==0)117 bs[i][j].setBackground(BC);118else bs[i][j].setBackground(FC);119 }120 }121if (shape.down >=1) {122 shape.down--;123 Thread.sleep(50);124continue;125 }126 Thread.sleep(250);127 }128 } catch (InterruptedException e) {129 e.printStackTrace();130 }131 }132 }133 String getBestScores() {134 BufferedReader reader = null;135try {136 reader = new BufferedReader(new FileReader("score.txt"));137 } catch (FileNotFoundException e) {138 e.printStackTrace();139 }140try {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());152return bestS;153 }154int gameOver() {155 JOptionPane.showMessageDialog(null, "你死了~~~.", "GAME OVER", 156 JOptionPane.PLAIN_MESSAGE);157if (box.getScore() > a) {158 c = b;159 b = a;160 a = box.getScore();161 }162else if (box.getScore() > b) {163 c = b;164 b = box.getScore();165 }166else if (box.getScore()> c) {167 c = box.getScore();168 }169 save();170 System.exit(0);173int save() {174 BufferedWriter writer = null;175try {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();182try {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 }195return 0;196 }197public 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 }204205 }程序写于⼤三上学期。

JAVA俄罗斯方块程序代码

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.*;import javax.swing.Timer;public class Tetris extends JFrame{public Tetris(){Tetrisblok a=new Tetrisblok();addKeyListener(a);add(a);}public static void main(String[]args){Tetris frame=new Tetris();JMenuBar menu=new JMenuBar();frame.setJMenuBar(menu);JMenu game=new JMenu("游戏");JMenuItem newgame=game.add("新游戏");JMenuItem pause=game.add("暂停");JMenuItem goon=game.add("继续");JMenuItem exit=game.add("退出");JMenu help=new JMenu("帮助");JMenuItem about=help.add("关于");menu.add(game);menu.add(help);frame.setLocationRelativeTo(null);frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);frame.setSize(220,275);frame.setTitle("Tetris内测版");//frame.setUndecorated(true);frame.setVisible(true);frame.setResizable(false);}}//创建一个俄罗斯方块类class Tetrisblok extends JPanel implements KeyListener{//blockType代表方块类型//turnState代表方块状态private int blockType;private int score=0;private int turnState;private int x;private int y;private int i=0;int j=0;int flag=0;//定义已经放下的方块x=0-11,y=0-21;int[][]map=new int[13][23];//方块的形状第一组代表方块类型有S、Z、L、J、I、O、T7种第二组代表旋转几次第三四组为方块矩阵private final int shapes[][][]=new int[][][]{//i{{0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0},{0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0},{0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0},{0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0}},//s{{0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0},{1,0,0,0,1,1,0,0,0,1,0,0,0,0,0,0},{0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0},{1,0,0,0,1,1,0,0,0,1,0,0,0,0,0,0}},//z{{1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0},{0,1,0,0,1,1,0,0,1,0,0,0,0,0,0,0},{1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0},{0,1,0,0,1,1,0,0,1,0,0,0,0,0,0,0}},//j{{0,1,0,0,0,1,0,0,1,1,0,0,0,0,0,0},{1,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0},{1,1,0,0,1,0,0,0,1,0,0,0,0,0,0,0},{1,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0}},//o{{1,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0},{1,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0},{1,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0},{1,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0}},//l{{1,0,0,0,1,0,0,0,1,1,0,0,0,0,0,0},{1,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0},{1,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0},{0,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0}}, //t{{0,1,0,0,1,1,1,0,0,0,0,0,0,0,0,0},{0,1,0,0,1,1,0,0,0,1,0,0,0,0,0,0},{1,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0},{0,1,0,0,0,1,1,0,0,1,0,0,0,0,0,0}}}; //生成新方块的方法public void newblock(){blockType=(int)(Math.random()*1000)%7;turnState=(int)(Math.random()*1000)%4;x=4;y=0;if(gameover(x,y)==1){newmap();drawwall();score=0;JOptionPane.showMessageDialog(null,"GAME OVER");}}//画围墙public void drawwall(){for(i=0;i<12;i++){map[i][21]=2;}for(j=0;j<22;j++){map[11][j]=2;map[0][j]=2;}}//初始化地图public void newmap(){for(i=0;i<12;i++){for(j=0;j<22;j++){map[i][j]=0;}}}//初始化构造方法Tetrisblok(){newblock();newmap();drawwall();Timer timer=new Timer(1000,new TimerListener());timer.start();}//旋转的方法public void turn(){int tempturnState=turnState;turnState=(turnState+1)%4;if(blow(x,y,blockType,turnState)==1){}if(blow(x,y,blockType,turnState)==0){turnState=tempturnState;}repaint();}//左移的方法public void left(){if(blow(x-1,y,blockType,turnState)==1){x=x-1;};repaint();}//右移的方法public void right(){if(blow(x+1,y,blockType,turnState)==1){x=x+1;};repaint();}//下落的方法public void down(){if(blow(x,y+1,blockType,turnState)==1){y=y+1;delline();};if(blow(x,y+1,blockType,turnState)==0){add(x,y,blockType,turnState);newblock();delline();};repaint();}//是否合法的方法public int blow(int x,int y,int blockType,int turnState){for(int a=0;a<4;a++){for(int b=0;b<4;b++){if(((shapes[blockType][turnState][a*4+b]==1)&&(map[x+b+1][y+a]==1))||((shapes[blockType][turnState][a*4+b]==1)&&(map[x+b+1][y+a]==2))){return0;}}}return1;}//消行的方法public void delline(){int c=0;for(int b=0;b<22;b++){for(int a=0;a<12;a++){if(map[a][b]==1){c=c+1;if(c==10){score+=10;for(int d=b;d>0;d--){for(int e=0;e<11;e++){map[e][d]=map[e][d-1];}}}}}c=0;}}//判断你挂的方法public int gameover(int x,int y){if(blow(x,y,blockType,turnState)==0){return1;}return0;}//把当前添加mappublic void add(int x,int y,int blockType,int turnState){int j=0;for(int a=0;a<4;a++){for(int b=0;b<4;b++){if(map[x+b+1][y+a]==0){map[x+b+1][y+a]=shapes[blockType][turnState][j];};j++;}}}//画方块的的方法public void paintComponent(Graphics g){super.paintComponent(g);//画当前方块for(j=0;j<16;j++){if(shapes[blockType][turnState][j]==1){g.fillRect((j%4+x+1)*10,(j/4+y)*10,10,10);}}//画已经固定的方块for(j=0;j<22;j++){for(i=0;i<12;i++){if(map[i][j]==1){g.fillRect(i*10,j*10,10,10);}if(map[i][j]==2){g.drawRect(i*10,j*10,10,10);}}}g.drawString("score="+score,125,10);g.drawString("抵制不良游戏,",125,50);g.drawString("拒绝盗版游戏。

Java编写的俄罗斯方块(小游戏)

short i,j;
for (i=0; i<xblocks; i++)
{
for (j=0; j<yblocks; j++)
{
screendata[i][j]=0;
}
ห้องสมุดไป่ตู้ }
score=0;
emptyline=-1;
int objectdx;
short objecttype;
short objectcolor;
int objectrotation;
int objectrotationd=0;
short objectptr;
short checkptr;
final short itemcount=7;
fmsmall = g.getFontMetrics();
g.setFont(largefont);
fmlarge = g.getFontMetrics();
gameInit();
}
//初始化游戏
public void gameInit()
{
0,0, 1,0, 0,1, -1,1, // 被旋转180度
0,0, 0,-1, 1,0, 1,1, // 被旋转270度
0,0, 1,0, -1,0, 0,-1, // L形1,正常状态
0,0, 0,1, 0,-1, -1,0, // 被旋转90度
short screencount=40;
boolean showtitle=true;
int items[]={
0,0, -1,0, 0,-1, -1,-1, // 四方形, 正常状态

俄罗斯方块java代码

俄罗斯方块java代码俄罗斯方块是最经典的休闲益智游戏之一,现在很多人都不玩了,这里就来写一篇俄罗斯方块的Java代码。

首先,需要说明的是,Java代码中有两个类,一个是主类(Tetris.java),一个是方块类(Block.java)。

主类包含的功能是:显示游戏画面、游戏的主逻辑、处理键盘事件、以及控制游戏暂停、游戏结束等;方块类包含的功能是:初始化方块颜色、坐标、方向等,旋转方块。

那么我们来分析一下主类(Tetris.java)的代码。

首先是一些变量的定义:游戏区域的宽度和高度static final int Width = 10;static final int Height = 22;方块的颜色static Color blocksColor[] = {new Color(255, 255, 255), new Color(204, 102, 102),new Color(102, 204, 102), new Color(102, 102, 204),new Color(204, 204, 102), new Color(204, 102, 204),new Color(102, 204, 204), new Color(218, 170, 0) };游戏区域static int[][] wall = new int[Width][Height];当前方块static Block curBlock;下一个方块static Block nextBlock;游戏是否结束static boolean isOver;线程static MyThread t;接下来是一些初始化操作:初始化主窗体public Tetris() {initFrame();initUI();initGame();}初始化游戏界面private void initUI() {设置游戏面板和游戏区域pnlGame = new JPanel();pnlGame.setPreferredSize(new Dimension(blockSize * Width, blockSize * Height));pnlGame.setBorder(BorderFactory.createLineBorder(Color.gray));gameArea = new GameArea();pnlGame.add(gameArea);设置下一个方块显示面板和下一个方块区域pnlNextBlock = new JPanel();pnlNextBlock.setPreferredSize(new Dimension(blockSize * 4, blockSize * 4));pnlNextBlock.setBorder(BorderFactory.createTitledBorder("Next Block"));nextBlockArea = new BlockArea();pnlNextBlock.add(nextBlockArea);将游戏界面和下一个方块界面加入主窗体frmMain.getContentPane().add(pnlGame, BorderLayout.WEST);frmMain.getContentPane().add(pnlNextBlock, BorderLayout.EAST);显示窗体frmMain.pack();frmMain.setVisible(true);}初始化游戏private void initGame() {初始化积分、速度score = 0;speed = 1;初始化游戏区域for (int i = 0; i < Width; i++) {for (int j = 0; j < Height; j++) {wall[i][j] = 0;}}旋转T型方块,初始朝向为横向curBlock = new Block(1, 0);生成下一块方块nextBlock = new Block(0, 0);}我们可以看到,主类(Tetris.java)包含以下方法:1. initFrame()方法,用来初始化主窗体。

java实现俄罗斯方块小游戏

java实现俄罗斯⽅块⼩游戏本⽂实例为⼤家分享了java实现俄罗斯⽅块的具体代码,供⼤家参考,具体内容如下使⽤⼀个⼆维数组保存游戏的地图:// 游戏地图格⼦,每个格⼦保存⼀个⽅块,数组纪录⽅块的状态private State map[][] = new State[rows][columns];游戏前先将所有地图中的格⼦初始化为空:/* 初始化所有的⽅块为空 */for (int i = 0; i < map.length; i++) {for (int j = 0; j < map[i].length; j++) {map[i][j] = State.EMPTY;}}玩游戏过程中,我们能够看到界⾯上的⽅块,那么就得将地图中所有的⽅块绘制出来,当然,除了需要绘制⽅块外,游戏积分和游戏结束的字符串在必要的时候也需要绘制:/*** 绘制窗体内容,包括游戏⽅块,游戏积分或结束字符串*/@Overridepublic void paint(Graphics g) {super.paint(g);for (int i = 0; i < rows; i++) {for (int j = 0; j < columns; j++) {if (map[i][j] == State.ACTIVE) { // 绘制活动块g.setColor(activeColor);g.fillRoundRect(j * BLOCK_SIZE, i * BLOCK_SIZE + 25,BLOCK_SIZE - 1, BLOCK_SIZE - 1, BLOCK_SIZE / 5,BLOCK_SIZE / 5);} else if (map[i][j] == State.STOPED) { // 绘制静⽌块g.setColor(stopedColor);g.fillRoundRect(j * BLOCK_SIZE, i * BLOCK_SIZE + 25,BLOCK_SIZE - 1, BLOCK_SIZE - 1, BLOCK_SIZE / 5,BLOCK_SIZE / 5);}}}/* 打印得分 */g.setColor(scoreColor);g.setFont(new Font("Times New Roman", Font.BOLD, 30));g.drawString("SCORE : " + totalScore, 5, 70);// 游戏结束,打印结束字符串if (!isGoingOn) {g.setColor(Color.RED);g.setFont(new Font("Times New Roman", Font.BOLD, 40));g.drawString("GAME OVER !", this.getWidth() / 2 - 140,this.getHeight() / 2);}}通过随机数的⽅式产⽣⽅块所组成的⼏种图形,⼀般七种图形:条形、⽥形、正7形、反7形、T形、Z形和反Z形,如⽣成条形:map[0][randPos] = map[0][randPos - 1] = map[0][randPos + 1]= map[0][randPos + 2] = State.ACTIVE;⽣成图形后,实现下落的操作。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相关文档
最新文档