Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 478|回复: 0

[Java游戏学习]俄罗斯方块

[复制链接]
  • TA的每日心情
    开心
    2021-3-12 23:18
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2014-10-14 20:00:12 | 显示全部楼层 |阅读模式
    程序运行图:

       

    //俄罗斯方块。
    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    import java.awt.image.*;


    class Square{
       int column;
       int row;
       int color;
       Square(int column,int row,int color){
          this.column=column;
          this.row=row;
          this.color=color;
        }

        boolean InBounds(){
          return(column>=0&&column<ChenWin17.cols&&
              row>=0&&row<ChenWin17.rows+4);
        }

        boolean IsEqual(Square s){
           return (column==s.column)&&(row==s.row)&&(color==s.color);
        }
      }




      public class ChenWin17 extends JFrame implements Runnable{
          static int sqlength;
          static final int xoffset=150;
          static int cols;
          static int rows;
          int field[][];
          int oldField[][];
          Square curPiece[]=new Square[4];
          boolean gameInPlay;
          boolean needNewPiece;
          Thread theThread=null;
          Color colors[];
          int theScore=0;
          int playLevel;
          int totalPieces;

       boolean moveSquares(Square from[],Square to[]){
         outerlabel:
         for(int i=0;i<to.length;i++){
           if(to.InBounds()==false) return false;
           if(field[to.column][to.row]!=0){
              for(int j=0;j<from.length;j++)
                 if(to.IsEqual(from[j]))
                   continue outerlabel;
              return false;
           }
         }
        for(int i=0;i<from.length;i++)
          if(from.InBounds())
            field[from.column][from.row]=0;
        for(int i=0;i<to.length;i++)
           field[to.column][to.row]=to.color;
           return true;
      }
      void newPiece(){
        Square old[]=new Square[4];
        old[0]=old[1]=old[2]=old[3]=new Square(-1,-1,0);
        int middle=cols/2;
        int top=rows;

        switch((int)(Math.random()*7)){
           case 0:
           curPiece[0]=new Square(middle-1,top-1,1);
           curPiece[1]=new Square(middle-2,top-1,1);
           curPiece[2]=new Square(middle,top-1,1);
           curPiece[3]=new Square(middle+1,top-1,1);
           break;
           case 1:
           curPiece[0]=new Square(middle,top-2,5);
           curPiece[1]=new Square(middle,top-1,5);
           curPiece[2]=new Square(middle-1,top-2,5);
           curPiece[3]=new Square(middle+1,top-2,5);
           break;
           case 2:
           curPiece[0]=new Square(middle,top-2,2);
           curPiece[1]=new Square(middle-1,top-1,2);
           curPiece[2]=new Square(middle,top-1,2);
           curPiece[3]=new Square(middle+1,top-2,2);
           break;
           case 3:
           curPiece[0]=new Square(middle,top-2,7);
           curPiece[1]=new Square(middle+1,top-1,7);
           curPiece[2]=new Square(middle,top-1,7);
           curPiece[3]=new Square(middle-1,top-2,7);
           break;
           case 4:
           curPiece[0]=new Square(middle-1,top-1,3);
           curPiece[1]=new Square(middle,top-1,3);
           curPiece[2]=new Square(middle-1,top-2,3);
           curPiece[3]=new Square(middle,top-2,3);
           break;
           case 5:
           curPiece[0]=new Square(middle,top-1,6);
           curPiece[1]=new Square(middle-1,top-1,6);
           curPiece[2]=new Square(middle+1,top-1,6);
           curPiece[3]=new Square(middle+1,top-2,6);
           break;
           case 6:
           curPiece[0]=new Square(middle,top-1,4);
           curPiece[1]=new Square(middle+1,top-1,4);
           curPiece[2]=new Square(middle-1,top-1,4);
           curPiece[3]=new Square(middle-1,top-2,4);
           break;
           }
           gameInPlay=moveSquares(old, curPiece);
      }
       private synchronized boolean movecurPiece(int byx,int byy,boolean rotate)
       {
          Square newpos[]=new Square[4];
          for(int i=0;i<4;i++){
             if(rotate){
                int dx=curPiece.column-curPiece[0].column;
                int dy=curPiece.row-curPiece[0].row;
                newpos=new Square(curPiece[0].column-dy,
                          curPiece[0].row+dx,curPiece.color);
             }else{
              newpos=new Square(curPiece.column+byx,
                          curPiece.row+byy, curPiece.color);
                   }
         }
         if(moveSquares(curPiece,newpos)==false) return false;
            curPiece=newpos;
            return true;
         }

         void removelines(){
         outerlabel:
         for(int j=0;j<rows;j++){
           for(int i=0;i<cols;i++)
            if(field[j]==0)
              continue outerlabel;
         for(int k=j;k<rows-1;k++)
           for(int i=0;i<cols;i++)
              field[k]=field[k+1];
              theScore+=10;
              totalPieces+=1;
              playLevel=5+totalPieces/10;
              j-=1;
         }
       }
                         
          public  ChenWin17(){
             setBackground(Color.blue);
             sqlength=20;
             cols=10;
             rows=19;
             addKeyListener(new MykeyListener());
             requestFocus();
             field=new int[cols][rows+4];
             oldField=new int[cols][rows+4];
             colors=new Color[8];
             colors[0]=new Color(40,40,40);
             colors[1]=new Color(255,0,0);
             colors[2]=new Color(0,200,0);
             colors[3]=new Color(0,200,255);
             colors[4]=new Color(255,255,0);
             colors[5]=new Color(255,150,0);
             colors[6]=new Color(210,0,240);
             colors[7]=new Color(40,0,240);
         }

       public void start(){
         for(int i=0;i<cols;i++){
           for(int j=0;j<rows+4;j++){
             field[j]=0;
             oldField[j]=-1;
            }
         }
         playLevel=5;
         theScore=0;
         totalPieces=0;
         needNewPiece=true;
         gameInPlay=true;
         theThread=new Thread(this);
          theThread.start();
         requestFocus();
       }

       public synchronized void stop(){
         if(theThread!=null)
          theThread=null;
       }

       static int delay_map[]={
        600,600,600,600,500,400,300,250,200,150,100};

        public void run(){
          while(gameInPlay){
              try{
                 int t;
                 if(playLevel>10) t=75;
                 else t=delay_map[playLevel];
                 Thread.sleep(t);
              }catch(InterruptedException e) {}
              if(needNewPiece){
                 removelines();
                 newPiece();
                 needNewPiece=false;
              }else{
                    needNewPiece=!movecurPiece(0,-1,false);
               }
            repaint();
          }
          theThread=null;
      }

      class MykeyListener implements KeyListener{

         public void keyPressed(KeyEvent evt){
         int key=evt.getKeyCode();  
          switch(key){
           case KeyEvent.VK_S:
           stop();
           start();
           break;
           case KeyEvent.VK_Q:
             stop();
             System.exit(0);
             break;
           case KeyEvent.VK_H:
           case KeyEvent.VK_LEFT:
           movecurPiece(-1,0,false);
           needNewPiece=false;
           repaint();
           break;
           case KeyEvent.VK_K:
           case KeyEvent.VK_RIGHT:
           movecurPiece(1,0,false);
           needNewPiece=false;
           repaint();
           break;
           case KeyEvent.VK_J:
           case KeyEvent.VK_UP:
           movecurPiece(0,0,true);
           repaint();
           break;
           case KeyEvent.VK_M:
           case KeyEvent.VK_DOWN:
           while(movecurPiece(0,-1,false))
             repaint();
             break;
         }
      }
        public void keyReleased(KeyEvent e){
        }

        public void keyTyped(KeyEvent e){}


    }

      public synchronized void paint(Graphics g1){


        BufferedImage bu=new BufferedImage(getSize().width,getSize().height,
            BufferedImage.TYPE_INT_ARGB);
        Graphics2D g=bu.createGraphics();
        g.setFont(new Font("helvetica",0,18));
         
        int gx=sqlength;
        int gy=sqlength*rows/4;
        g.setColor(Color.blue);
        g.fillRect(0,0,120,400);
        g.setColor(Color.white);
        g.drawString("Score:"+theScore,gx,gy);
        gy+=30;
        g.drawString("Level:"+playLevel,gx,gy);
        g.drawString("Pressed S to Play",gx-10,430);
        g.drawString("Pressed Q to exit",gx+160,430);
        for(int i=0;i<cols;i++)
           for(int j=0;j<rows;j++){
              if(
                 oldField[rows-1-j]==-1||
                 oldField[rows-1-j]!=field[rows-1-j]){
                g.setColor(colors[field[rows-1-j]]);
                   g.fill3DRect(
                   xoffset+sqlength*i,
                   sqlength+sqlength*j,
                   sqlength,sqlength,true);
              }     
              oldField[rows-1-j]=field[rows-1-j];
              }
          g1.drawImage(bu,0,0,this);
         }
         public static void main(String args[]){
           ChenWin17  aa=new ChenWin17();
           aa.addWindowListener(new WindowAdapter(){
                  public void windowClosing(WindowEvent e){
                      System.exit(0);
                  }
           });
           aa.setTitle("This is ChenWin17");
           aa.setSize(350,440);
           aa.setResizable(false);
           aa.setVisible(true);
           aa.start();
         }

          
       }

             
                


    源码下载:http://file.javaxxz.com/2014/10/14/200011917.zip
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-6-19 14:43 , Processed in 0.434502 second(s), 46 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表