欢迎访问悦橙教程(wld5.com),关注java教程。悦橙教程  java问答|  每日更新
页面导航 : > > 文章正文

java,

来源: javaer 分享于  点击 1584 次 点评:169

java,


import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
//小方块类
class XFK {
    int m;   //横向的小格子的位置
    int n;   //纵向的小格子的位置
}
abstract class AbsFK{
    XFK [] xfk = new XFK[4];      //小方块数组
    int state;                    //状态
    int [] [] map;
    AbsFK (){                      //构造函数,用来给小方块数组中的每一个对象开辟空间
        for (int i = 0; i<4 ; i++){
            xfk[i] = new XFK();
        }
    }
    public void setMap(int [][] map){
        this.map = map;
    }
    abstract public void reset();   //重置
    abstract public void turn();    //旋转
    abstract public boolean canTurn(); //是否能旋转
    //是否能左移
    public boolean canMoveLeft(){
        for (int i =0; i<4; i++){
            int m = xfk[i].m - 1;
            int n = xfk[i].n;
            if ( m<0 || m>11 || n<0 || n>17 || map [m][n] == 1 ){
                return false;
            }
        }
        return true;
    }
    //是否能右移
    public boolean canMoveRight(){
        for (int i =0; i<4; i++){
            int m = xfk[i].m + 1;
            int n = xfk[i].n;
            if (m < 0 || m > 11 || n < 0 || n > 17 || map[m][n] == 1) {
                return false;
            }
        }
        return true;
    }
    //是否能下移
    public boolean canMoveDown(){
        for (int i = 0; i < 4; i++) {
            int m = xfk[i].m ;
            int n = xfk[i].n + 1;
            if (m < 0 || m > 11 || n < 0 || n > 17 || map[m][n] == 1) {
                return false;
            }
        }
        return true;
    }
    public void moveLeft(){           //左移
        for (int i = 0; i<4; i++){
            xfk[i].m--;
        }
    }
    public void moveRight(){           //右移
        for (int i = 0; i<4; i++){
            xfk[i].m++;
        }
    }
    public void moveDown(){            //下移
        for (int i = 0; i<4; i++){
            xfk[i].n++;
        }
    }
}
class FK1 extends AbsFK{              //子类
    public void reset(){              //实现从基类中继承下来的抽象方法
        //给state赋一个随机数
        state = (int)(Math.random()*2);
        //根据state给小方块数组赋值
        if (state == 0){                //横着摆放
            for (int i = 0; i<4; i++){
                xfk[i].m = 4+i;
                xfk[i].n = 0;
            }
        }
        else {                          //竖着摆放
            for (int i = 0; i<4; i++){
                xfk[i].m = 5;
                xfk[i].n = i;
            }
        }
    }
    public void turn(){               //实现从基类继承下来的抽象方法
        if (state == 0)  {   //横->竖
            int m = xfk[0].m + 1;
            int n = xfk[0].n - 1;
            for (int i = 0; i<4; i++){
                xfk[i].m = m;
                xfk[i].n = n+i;
            }
            state = 1;
        }else {              //竖->横
            int m = xfk[0].m - 1;
            int n = xfk[0].n + 1;
            for (int i = 0; i<4; i++){
                xfk[i].m = m + i;
                xfk[i].n = n;
            }
            state = 0;
        }
    }
    public boolean canTurn() {
        return true;
    }
}
class RussiaPanel extends JPanel implements KeyListener{
   FK1 dqfk = new FK1();         //基类引用引用子类对象,当前方块
    static int time = 500;                 //线程调用重绘方法的时间间隔
    static int [][] map = new int[12][18];   //12列,18行
    RussiaPanel(){
        dqfk.reset();                //重置当前方块
        dqfk.setMap(map);
    }
    public FK1 getBlock()
    {return dqfk;}
    public void paint(Graphics g){  //绘制方法
        super.paint(g);
        //绘制网格
        g.setColor(Color.blue);
        //13条竖线
        for (int i = 0; i<=12; i++){
            g.drawLine(i*25,0,i*25,18*25);
        }
        //19条横线
        for (int i = 0; i<=18; i++){
            g.drawLine(0,i*25,12*25,i*25);
        }
        //绘制map中为的位置,障碍物
        g.setColor(Color.cyan);
        for (int i = 0; i<12 ; i++){
            for (int j = 0; j < 18; j++) {
                if (map[i][j] == 1) {
                    g.fill3DRect(i * 25, j * 25, 25, 25, true);
                }
            }
        }
        //绘制当前方块
        g.setColor(Color.orange);
        for (int i = 0; i<4; i++){  //绘制当前方块中的小方块数组中的每一个小方块
            int m = dqfk.xfk[i].m;
            int n = dqfk.xfk[i].n;
            g.fill3DRect(m*25,n*25,25,25,true);
        }
    }
    public void keyPressed(KeyEvent e) {
        int key = e.getKeyCode();
        switch(key){
             case KeyEvent.VK_UP:
                 //旋转
                 if(dqfk.canTurn())
                     dqfk.turn();
                 this.repaint();         //立刻刷新
                 break;
             case KeyEvent.VK_DOWN:
                 //加速
                 time=100;
                 break;
             case KeyEvent.VK_LEFT:
                 if (dqfk.canMoveLeft())
                     dqfk.moveLeft();
                 this.repaint();        //立刻刷新
                 break;
             case KeyEvent.VK_RIGHT:
                 if (dqfk.canMoveRight())
                     dqfk.moveRight();
                 this.repaint();        //立刻刷新
                 break;
             default:
                 break;
        }
    }
    public void keyReleased(KeyEvent e) {
        //还原速度
        int key = e.getKeyCode();
        if (key == KeyEvent.VK_DOWN)
            time = 500;
    }
    public void keyTyped(KeyEvent e) {
    }
  public  void  deletefullline()  //删除满行的方法
{    int fulllinenum=0;
   for (int i = 0; i<18 ; i++){
     boolean isfull = true;
            for (int j = 0; j < 12; j++)
            {if( map[j][i]!=1)
             isfull=false;
             }
             if(isfull==true)
             {fulllinenum++;
                for(int j=0;j<12;j++)
                 map[j][i]=0;
                 for(int k=i+1;k<18;k++)
                 {if(map[k][i]==1)
                  map[k][i]=0;
                  map[k][i-1]=1;
               }
             }
             
  }
  RussiaFrame.score+=fulllinenum*10;
  RussiaFrame.scoreField.setText(""+ RussiaFrame.score);
}
// boolean isgameover()      //判断游戏是否结束
// {  boolean []exit;
// for(int k=0;k<18;k++)
// {exit[k]=false;}
//  for (int i = 0; i<18 ; i++)
//         for (int j = 0; j < 12; j++)
//         {
//          if(map[j][i]==1)
//           exit[i]=true;
//         }
//         for(int k=0;k<18;k++)
//         {if(exit[k]==false)
//         {     break;
//              return false;
//           
//         }
//              else
//               return  true;
//          }
//  }
}
public class RussiaFrame extends JFrame
{
     RussiaPanel p;
    static int score;//记分
    static int level; //级数
public static TextField scoreField,levelField;
public static MyTimer timer;
  Button play_b,level_up_b,level_down_b,pause_b,exit_b;
  //JPanel pa1,pa2;
     RussiaFrame (){
   setLayout(new  GridLayout(1,2,10,10));
      p = new RussiaPanel();
     p.addKeyListener(p);
      timer = new MyTimer(p);
       timer.setDaemon(true);
       timer.start();
       timer.suspend();
        add(p);
     score=0;
     level=1;
    JPanel pa1=new JPanel();
     //pa2=new Jpanel();
      //pa2.add(p);
  GridLayout gl=new GridLayout(9,1,1,5); //功能菜单的布局
  pa1.setLayout(gl);
   Label scorep = new Label("分数:",Label.LEFT); //分数的输出
     Label levelp = new Label("级数:",Label.LEFT); //级数的输出
     scoreField = new TextField(8);
     levelField = new TextField(8);
     scoreField.setEditable(false);
     levelField.setEditable(false);
       play_b = new Button("开始游戏"); //定义play按钮
      play_b.setSize(new Dimension(50,200));
      play_b.addActionListener(new Command(Command.button_play,p));
        level_up_b = new Button("提升级数");//定义提升级数按钮;
      level_up_b.setSize(new Dimension(50,200));
     level_up_b.addActionListener(new Command(Command.button_levelup,p));
    
       level_down_b = new Button("降低级数"); //定义降低级数按钮
      level_down_b.setSize(new Dimension(50,200));
      level_down_b.addActionListener(new Command(Command.button_leveldown,p));
     
       pause_b = new Button("游戏暂停"); //定义游戏暂停按钮
         pause_b.setSize(new Dimension(50,200));
       pause_b.addActionListener(new Command(Command.button_pause,p));
      
        exit_b = new Button("退出"); //定义游戏退出按钮
    exit_b.setSize(new Dimension(50,200));
      exit_b.addActionListener(new Command(Command.button_quit,p));
      pa1.add(scorep);
      pa1.add(scoreField);
      pa1.add(levelp);
      pa1.add(levelField);
      pa1.add(play_b);
      pa1.add( level_up_b);
      pa1.add(level_down_b);
      pa1.add(pause_b);
      pa1.add( exit_b);
      add(pa1);
      setVisible(true);
      p.requestFocus();
     }
        //Container con = this.getContentPane();
        //con.setLayout(new  GridLayout(1,2,10,10));
        //con.add(p);

        //给当前的窗体对象注册键盘监听器
       //p.addKeyListener(p);
        //开始线程 
    public static void main(String[] args) {
        RussiaFrame f = new RussiaFrame();
        f.setSize(700,500);
        f.show();
    }
}
class Command implements ActionListener          //编辑菜单栏的功能
{
    static final int button_play = 1;          //给按钮分配编号
       static final int button_levelup = 2;
       static final int button_leveldown = 3;
       static final int button_quit = 4;
       static final int button_pause = 5;
        static  boolean pause_resume=true;
  RussiaPanel rp;
  int  curbutton;
  Command( int button,RussiaPanel rp)
  {curbutton=button;
    this.rp=rp;
  }
      public void actionPerformed (ActionEvent e)
     {
      switch(curbutton)
      {
     
       case button_play:
                       RussiaFrame.score=0;
                     RussiaFrame.scoreField.setText("0");
                     RussiaFrame.levelField.setText("1");
                      RussiaFrame.timer.resume();
                    break;
      case button_levelup:
           RussiaFrame.level++;
         RussiaFrame.levelField.setText(""+RussiaFrame.level);
                     break;
       case button_leveldown:
          RussiaFrame.level--;
          RussiaFrame.levelField.setText(""+RussiaFrame.level);
          break;
             case button_pause:
               if(pause_resume)
               {  RussiaFrame.timer.suspend();
               pause_resume=false;
                }
                else
                {RussiaFrame.timer.resume();
                 pause_resume=true;
                 }
                 break;
              case button_quit:
                System.exit(0);
      }                      
      }
      }
class MyTimer extends Thread{   //定义线程
   RussiaPanel scr;
   public MyTimer( RussiaPanel scr){
       this.scr = scr;
   }
  public void run() {
        while (true){
            if (scr.getBlock().canMoveDown())
            {
           
                scr.getBlock().moveDown();
                scr.repaint();
            }
                            //自动下落
            else {
                //记载当前方块的四个小方块的最终位置信息到二维数组上
            
                for (int i = 0; i<4; i++){
                    int m =scr.getBlock().xfk[i].m;
                    int n =scr.getBlock().xfk[i].n;
                    scr.map[m][n] = 1; 
                   scr.deletefullline();
                }
                //重新定位一个下落的方块
                scr.getBlock().reset();
                  scr.repaint();
            }
//            if(isgameover()){
//               suspend();
//              
//             }
            try {
                Thread.sleep((10- RussiaFrame.level + 1)*100);
            } catch (InterruptedException ex) {
            }
        }
  
}
}

 

本文摘自: 编程十万个为什么(http://www.bcwhy.com) 详细出处请参考:http://www.bcwhy.com/thread-2562-1-1.html

相关文章

    暂无相关文章
相关栏目:

用户点评