仙剑之十里坡

标题: 七夕小雨教程系列java_swing俄罗斯方块教程[3]_完 [打印本页]

作者: 七夕小雨    时间: 2011-5-19 21:19
标题: 七夕小雨教程系列java_swing俄罗斯方块教程[3]_完
http://player.youku.com/player.php/sid/XMjY4MjkxNTM2/v.swf

最终完成的三个CLASS

gameAct.class

package eLuoSiFangKuai;
public class gameAct {
int x;
int y;
}

gameMain.class

package eLuoSiFangKuai;
import javax.swing.*;
public class gameMain extends JFrame{
public gameMain() {
  super("俄罗斯方块1.0V---七夕小雨作品");
  gameWin g = new gameWin();
  add(g);
  setSize(380,420);
  setLocation(200, 200);
  setVisible(true);
}
public static void main(String[] args) {
  new gameMain();
}
}

gameWin.class

package eLuoSiFangKuai;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import javax.swing.Timer;
public class gameWin extends JPanel implements ActionListener,KeyListener{
JButton newGame = new JButton("开始");
JButton endGame = new JButton("退出");
int fenShu=0,speed=0,tFenShu=0;
gameAct[] act = new gameAct[4];
gameAct[] actTemp = new gameAct[4];
Random r = new Random();
boolean start=false;
int[][] map = new int[10][18];
Timer t;int temp;
JDialog dialog = new JDialog();
JLabel label = new JLabel();
JButton button = new JButton("ok");
public gameWin() {
  for (int i = 0; i < act.length; i++) {
   act = new gameAct();
  }
  for (int i = 0; i < act.length; i++) {
   actTemp = new gameAct();
  }
  for (int i = 0; i < 10; i++) {
   for (int j = 0; j < 18; j++) {
    map[j] = 0;
   }
  }
  setLayout(new FlowLayout(FlowLayout.RIGHT));
  add(newGame);
  add(endGame);
  newGame.addActionListener(this);
  endGame.addActionListener(this);
  addKeyListener(this);
  dialog.setLayout(new GridLayout(2,1));
  dialog.add(label);
  dialog.add(button);
  button.addActionListener(this);
  dialog.setSize(200,100);
  dialog.setLocation(200, 200);
  dialog.setVisible(false);
  
}
public void paintComponent(Graphics g){
  super.paintComponent(g);
  g.drawRect(9, 10, 200, 360);
  g.drawString("分数"+fenShu, 220, 60);
  g.drawLine(220, 65, 360, 65);
  g.drawString("速度"+speed, 220, 90);
  g.drawLine(220, 95, 360, 95);
  g.drawString("下一个方块", 250, 120);
  g.drawString("俄罗斯方块1.0v", 220, 340);
  g.drawString("七夕小雨", 220, 360);
  ////////////////////////
  if (start) {
   g.setColor(new Color(255,0,0));
   for (int i = 0; i < 4; i++) {
    g.fillRect(10+act.x*20, 10+act.y*20, 20, 20);
   }
   for (int i = 0; i < 10; i++) {
    for (int j = 0; j <18; j++) {
     if (map[j]==1) {
      g.fillRect(10+i*20, 10+j*20, 20, 20);
     }
    }
   }
   g.setColor(new Color(0,0,255));
   for (int i = 0; i < 4; i++) {
    g.fillRect(220+actTemp.x*20, 160+actTemp.y*20, 20, 20);
   }
  }
}
private boolean newAct() {
  switch (temp) {
  case 0:
   act[0].x =3;act[0].y=0;
   act[1].x =4;act[1].y=0;
   act[2].x =2;act[2].y=1;
   act[3].x =3;act[3].y=1;
   break;
  case 1:
   act[0].x =1;act[0].y=0;
   act[1].x =2;act[1].y=0;
   act[2].x =3;act[2].y=0;
   act[3].x =4;act[3].y=0;
   break;
  case 2:
   act[0].x =2;act[0].y=0;
   act[1].x =3;act[1].y=0;
   act[2].x =2;act[2].y=1;
   act[3].x =3;act[3].y=1;
   break;
  case 3:
   act[0].x =2;act[0].y=0;
   act[1].x =2;act[1].y=1;
   act[2].x =2;act[2].y=2;
   act[3].x =3;act[3].y=2;
   break;
  case 4:
   act[0].x =3;act[0].y=0;
   act[1].x =3;act[1].y=1;
   act[2].x =3;act[2].y=2;
   act[3].x =2;act[3].y=2;
   break;
  case 5:
   act[0].x =3;act[0].y=0;
   act[1].x =2;act[1].y=1;
   act[2].x =3;act[2].y=1;
   act[3].x =4;act[3].y=1;
   break;
  case 6:
   act[0].x =2;act[0].y=0;
   act[1].x =3;act[1].y=0;
   act[2].x =3;act[2].y=1;
   act[3].x =4;act[3].y=1;
   break;
  }
  for (int i = 0; i < 4; i++) {
   if (maxYes(act.x, act.y)) {
    return false;
   }
  }
  return true;
}
public void nextAct(){
  switch (temp) {
  case 0:
   actTemp[0].x =3;actTemp[0].y=0;
   actTemp[1].x =4;actTemp[1].y=0;
   actTemp[2].x =2;actTemp[2].y=1;
   actTemp[3].x =3;actTemp[3].y=1;
   break;
  case 1:
   actTemp[0].x =1;actTemp[0].y=0;
   actTemp[1].x =2;actTemp[1].y=0;
   actTemp[2].x =3;actTemp[2].y=0;
   actTemp[3].x =4;actTemp[3].y=0;
   break;
  case 2:
   actTemp[0].x =2;actTemp[0].y=0;
   actTemp[1].x =3;actTemp[1].y=0;
   actTemp[2].x =2;actTemp[2].y=1;
   actTemp[3].x =3;actTemp[3].y=1;
   break;
  case 3:
   actTemp[0].x =2;actTemp[0].y=0;
   actTemp[1].x =2;actTemp[1].y=1;
   actTemp[2].x =2;actTemp[2].y=2;
   actTemp[3].x =3;actTemp[3].y=2;
   break;
  case 4:
   actTemp[0].x =3;actTemp[0].y=0;
   actTemp[1].x =3;actTemp[1].y=1;
   actTemp[2].x =3;actTemp[2].y=2;
   actTemp[3].x =2;actTemp[3].y=2;
   break;
  case 5:
   actTemp[0].x =3;actTemp[0].y=0;
   actTemp[1].x =2;actTemp[1].y=1;
   actTemp[2].x =3;actTemp[2].y=1;
   actTemp[3].x =4;actTemp[3].y=1;
   break;
  case 6:
   actTemp[0].x =2;actTemp[0].y=0;
   actTemp[1].x =3;actTemp[1].y=0;
   actTemp[2].x =3;actTemp[2].y=1;
   actTemp[3].x =4;actTemp[3].y=1;
   break;
  }
}
public void actionPerformed(ActionEvent e) {
  if (e.getSource()==newGame) {
   if (e.getActionCommand().equals("开始")) {
    newGame.setText("重置");
    requestFocus(true);
    start = true;
    temp = r.nextInt(7);
    if (!newAct()) {
     t = new Timer(1000-(100*speed),new myTimer());
     t.start();
     temp = r.nextInt(7);
     nextAct();
     repaint();
    }else {
     //这里是游戏失败的情况;
     return;
    }
   }else {
    start = false;
    fenShu = 0;
    tFenShu=0;
    speed=0;
    for (int i = 0; i < 10; i++) {
     for (int j = 0; j < 18; j++) {
      map[j]=0;
     }
    }
    newGame.setText("开始");
   }
  }
  if (e.getSource()==endGame) {
   System.exit(0);
  }
  if (e.getSource()==button) {
   fenShu = 0;
   tFenShu=0;
   speed=0;
   start =false;
   for (int i = 0; i < 10; i++) {
    for (int j = 0; j < 18; j++) {
     map[j]=0;
    }
   }
   newGame.setText("开始");
   dialog.setVisible(false);
   repaint();
  }
}
public void Move(int x, int y) {
  if (minYes(x, y)) {
   for (int i = 0; i < 4; i++) {
    act.x+=x;
    act.y+=y;
   }
  }
  repaint();
}
private int delact() {
  int line = 0;
  for (int i = 0; i < 18; i++) {
   int j;
   for (j = 0; j < 10; j++) {
    if (map[j]==0) {
     break;
    }
   }
   if (j>=10) {
    line +=1;
    if (i!=0) {
     for (int j2 =i-1; j2 >0; j2--) {
      for (int k = 0; k < 10; k++) {
       map[k][j2+1] = map[k][j2];
      }
     }
     for (int j2 = 0; j2 < 10; j2++) {
      map[0][j2] = 0;
     }
    }
   }
  }
  repaint();
  return line;
}
private void down() {
  if (minYes(0, 1)) {
   for (int i = 0; i < 4; i++) {
    act.y+=1;
   }
   repaint();
  }else {
   t.stop();
   for (int i = 0; i < 4; i++) {
    map[act.x][act.y]=1;
   }
   int line = delact();
   if (line!=0) {
    fenShu = fenShu+10*line*line;
    if (fenShu-tFenShu>=300) {
     tFenShu = fenShu;
     if (speed <=9) {
      speed+=1;
     }
    }
   }
   if (!newAct()) {
    temp = r.nextInt(7);
    nextAct();
    t.start();
   }else {
    t.stop();
    label.setText("游戏结束,您的分数是"+fenShu);
    dialog.setVisible(true);
   }
   repaint();
  }
}
public void up(){
  gameAct[] tt = new gameAct[4];
  for (int i = 0; i < tt.length; i++) {
   tt = new gameAct();
   tt.x = act.x;
   tt.y = act.y;
  }
  int cx = (tt[0].x+tt[1].x+tt[2].x+tt[3].x)/4;
  int cy = (tt[0].y+tt[1].y+tt[2].y+tt[3].y)/4;
  for (int i = 0; i < tt.length; i++) {
   tt.x = cx+cy-act.y;
   tt.y = cy-cx+act.x;
  }
  for (int i = 0; i < tt.length; i++) {
   if (!maxYes(tt.x, tt.y)) {
    return;
   }
  }
  for (int i = 0; i < tt.length; i++) {
   act.x = tt.x;
   act.y = tt.y;
  }
  repaint();
}
public boolean minYes(int x, int y){
  for (int i = 0; i < 4; i++) {
   if (!maxYes(act.x+x, act.y+y)) {
    return false;
   }
  }
  return true;
}
public boolean maxYes(int x, int y){
  if (x<0||x>=10||y<-1||y>=18) {
   return false;
  }
  if (map[x][y]==1) {
   return false;
  }
  return true;
}
public void keyPressed(KeyEvent e) {
  if (start) {
   switch (e.getKeyCode()) {
   case KeyEvent.VK_DOWN:
    down();
    break;
   case KeyEvent.VK_UP:
    up();
    break;
   case KeyEvent.VK_LEFT:
    Move(-1, 0);
    break;
   case KeyEvent.VK_RIGHT:
    Move(1, 0);
    break;
   default:
    break;
   }
  }
}
public void keyReleased(KeyEvent arg0) { }
public void keyTyped(KeyEvent arg0) { }
public class myTimer implements ActionListener{
  public void actionPerformed(ActionEvent e) {
   if (start) {
    down();
   }
  }
}
}
作者: 雾都弦歌    时间: 2011-5-19 21:56
一大堆看不懂的字符...
作者: 御剑天河    时间: 2011-5-20 17:21
终于没了(哈哈哈)




欢迎光临 仙剑之十里坡 (http://palslp.com/BBS/) Powered by Discuz! X2.5