俄罗斯方块游戏

原创 2006年06月06日 13:45:00

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.awt.image.*;


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

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

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

 


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

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

   switch((int)(Math.random()*7)){
      case 0:
      curPiece[0]=new Bzw(middle-1,top-1,1);
      curPiece[1]=new Bzw(middle-2,top-1,1);
      curPiece[2]=new Bzw(middle,top-1,1);
      curPiece[3]=new Bzw(middle+1,top-1,1);
      break;
      case 1:
      curPiece[0]=new Bzw(middle,top-2,5);
      curPiece[1]=new Bzw(middle,top-1,5);
      curPiece[2]=new Bzw(middle-1,top-2,5);
      curPiece[3]=new Bzw(middle+1,top-2,5);
      break;
      case 2:
      curPiece[0]=new Bzw(middle,top-2,2);
      curPiece[1]=new Bzw(middle-1,top-1,2);
      curPiece[2]=new Bzw(middle,top-1,2);
      curPiece[3]=new Bzw(middle+1,top-2,2);
      break;
      case 3:
      curPiece[0]=new Bzw(middle,top-2,7);
      curPiece[1]=new Bzw(middle+1,top-1,7);
      curPiece[2]=new Bzw(middle,top-1,7);
      curPiece[3]=new Bzw(middle-1,top-2,7);
      break;
      case 4:
      curPiece[0]=new Bzw(middle-1,top-1,3);
      curPiece[1]=new Bzw(middle,top-1,3);
      curPiece[2]=new Bzw(middle-1,top-2,3);
      curPiece[3]=new Bzw(middle,top-2,3);
      break;
      case 5:
      curPiece[0]=new Bzw(middle,top-1,6);
      curPiece[1]=new Bzw(middle-1,top-1,6);
      curPiece[2]=new Bzw(middle+1,top-1,6);
      curPiece[3]=new Bzw(middle+1,top-2,6);
      break;
      case 6:
      curPiece[0]=new Bzw(middle,top-1,4);
      curPiece[1]=new Bzw(middle+1,top-1,4);
      curPiece[2]=new Bzw(middle-1,top-1,4);
      curPiece[3]=new Bzw(middle-1,top-2,4);
      break;
      }
      gameInPlay=moveBzws(old, curPiece);
 }
  private synchronized boolean movecurPiece(int byx,int byy,boolean rotate)
  {
     Bzw newpos[]=new Bzw[4];
     for(int i=0;i<4;i++){
        if(rotate){
           int dx=curPiece[i].column-curPiece[0].column;
           int dy=curPiece[i].row-curPiece[0].row;
           newpos[i]=new Bzw(curPiece[0].column-dy,
                     curPiece[0].row+dx,curPiece[i].color);
        }else{
         newpos[i]=new Bzw(curPiece[i].column+byx,
                     curPiece[i].row+byy, curPiece[i].color);
              }
    }
    if(moveBzws(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[i][j]==0)
         continue outerlabel;
    for(int k=j;k<rows-1;k++)
      for(int i=0;i<cols;i++)
         field[i][k]=field[i][k+1];
         theScore+=100;
         totalPieces+=1;
         playLevel=0+totalPieces/10;
         j-=1;
    }
  }
                    
     public  D(){
        setBackground(Color.GRAY);
        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[i][j]=0;
        oldField[i][j]=-1;
       }
    }
    playLevel=0;
    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_ENTER :
      stop();
      start();
      break;
      case KeyEvent.VK_Q:
        stop();
        System.exit(0);
        break;
      case KeyEvent.VK_A :
      case KeyEvent.VK_LEFT:
      movecurPiece(-1,0,false);
      needNewPiece=false;
      repaint();
      break;
      case KeyEvent.VK_D :
      case KeyEvent.VK_RIGHT:
      movecurPiece(1,0,false);
      needNewPiece=false;
      repaint();
      break;
      case KeyEvent.VK_W :
      case KeyEvent.VK_SPACE :
      movecurPiece(0,0,true);
      repaint();
      break;
      
      case KeyEvent.VK_S :
      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.GRAY);
   g.fillRect(0,0,120,400);
   g.setColor(Color.white);
   g.drawString("目前的分数:"+theScore,gx-20,gy);
   gy+=40;
   g.drawString("目前的等级:"+playLevel,gx-20,gy);

   
   g.drawString("开始键按 Enter",gx-10,430);
   g.drawString("退出键按 Q",gx+160,430);
   g.drawString(" 变换键按 空格 " ,gx+300,430   );
   for(int i=0;i<cols;i++)
      for(int j=0;j<rows;j++){
         if(
            oldField[i][rows-1-j]==-1||
            oldField[i][rows-1-j]!=field[i][rows-1-j]){
           g.setColor(colors[field[i][rows-1-j]]);
              g.fill3DRect(
              xoffset+sqlength*i,
              sqlength+sqlength*j,
              sqlength,sqlength,true);
         }    
         oldField[i][rows-1-j]=field[i][rows-1-j];
         }
     g1.drawImage(bu,0,0,this);
    }
    public static void main(String args[]){
      D  aa=new D();
      aa.addWindowListener(new WindowAdapter(){
             public void windowClosing(WindowEvent e){
                 System.exit(0);
             }
      });
      aa.setTitle("白贞伟_俄罗斯方块游戏");
      aa.setSize(500,830);
      aa.setResizable(false);
      aa.setVisible(true);
      aa.start();
    }

     
  }
 

史上最短小精悍的javascript编写的俄罗斯方块游戏,仅仅60行代码

史上最短小精悍的javascript编写的俄罗斯方块游戏,仅仅60行代码,代码下载地址:http://www.zuidaima.com/share/1759652641295360.htm...
  • yaerfeng
  • yaerfeng
  • 2014年04月28日 09:52
  • 52086

使用Java实现小游戏:俄罗斯方块

使用Java实现小游戏:俄罗斯方块使用一个二维数组保存游戏的地图:// 游戏地图格子,每个格子保存一个方块,数组纪录方块的状态 private State map[][] = new State[ro...
  • zhliro
  • zhliro
  • 2015年05月15日 16:43
  • 3103

使用Qt开发俄罗斯方块游戏

使用Qt开发俄罗斯方块游戏,可能大家都比较感兴趣吧。那么就快看下面的详细讲解吧! 其实在Qt Creator中已经有了俄罗斯方块的例子,大家可以在帮助中搜索Tetrix进行查看。其内容如下: ...
  • imxiangzi
  • imxiangzi
  • 2016年02月15日 11:37
  • 2138

unity3D游戏开发实战原创视频讲座系列1之3D俄罗斯方块开发

讲解目录: 第一讲  游戏演示和游戏资源介绍 第二讲  Cube预制体和7种方块的制作 第三讲  方块的产生与下落 第四讲  方块的左右移动和旋转 第五讲  方块的停止下落 第六讲  方块的消除 第七...
  • u010019717
  • u010019717
  • 2014年03月18日 21:05
  • 2891

Java 俄罗斯方块游戏

工程源代码: package com.ljheee.tetris; import java.applet.*; import java.awt.*; public class RRT exten...
  • ljheee
  • ljheee
  • 2016年11月08日 15:12
  • 704

编程之美1.17——俄罗斯方块游戏

问题: 让电脑自动下俄罗斯方块游戏。 解法: 对当前的积木块,枚举它旋转后的每一个形状从每一列落下的棋盘,将该棋盘和前一个棋盘进行对比,并打分,最后取得分最高的那个形状和那一列作为电脑的...
  • linyunzju
  • linyunzju
  • 2012年06月23日 23:55
  • 2046

使用Java实现小游戏:俄罗斯方块

使用Java实现小游戏:俄罗斯方块使用一个二维数组保存游戏的地图:// 游戏地图格子,每个格子保存一个方块,数组纪录方块的状态 private State map[][] = new State[ro...
  • zhliro
  • zhliro
  • 2015年05月15日 16:43
  • 3103

俄罗斯方块单人游戏设计概述

看见身边好多同学都有写博客的好习惯,受他们潜移默化的影响,决定从今天开始起自己也要开始写博客。一方面方便自己偶尔查询已经忘记的知识点,另一方面也有利于巩固自己的知识体系,加深对已做过项目的认识与理解。...
  • baidu_25820069
  • baidu_25820069
  • 2016年04月06日 19:32
  • 298

用c实现俄罗斯方块游戏过程

#include #include #include #include #include #define ROW_AR 28 #define COL_AR 14 #define BLOCK_X 4 ...
  • qq_30359183
  • qq_30359183
  • 2017年07月12日 16:02
  • 198

Swift游戏开发之俄罗斯方块:No.9 添加点击和移动事件

本节内容过后,我们的程序运行起来将是这样的: 我们一步一步来,首先添加点击事件: 接触过iOS开发的应该对这些步骤不陌生,我们要添加UITapGestureDetector到view里面。 打开Ma...
  • u011156012
  • u011156012
  • 2015年02月06日 10:49
  • 1547
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:俄罗斯方块游戏
举报原因:
原因补充:

(最多只允许输入30个字)