⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tetrics.java~184~

📁 JAVA的俄罗斯方块
💻 JAVA~184~
字号:
package tao;

import java.awt.*;
import javax.swing.*;
import javax.swing.event.*;
import java.awt.event.*;
import java.awt.geom.*;
import javax.swing.border.*;

//创建椭圆按扭
class Sbutton extends JButton{
private Shape shape;
public Sbutton()
{super();
 setSize(46,40);
 setContentAreaFilled(false);
}
protected void paintComponent(Graphics g){
 if(getModel().isArmed()){
  g.setColor(Color.blue);
  }
 else{
  g.setColor(Color.yellow);}
 g.fillOval(0,0,46,40);
 super.paintComponent(g);
 }
protected void paintBorder(Graphics g){
 g.setColor(Color.red);
 g.drawOval(0,0,46,40);
 }

}

//////////////////////////////////////////////////////////////////////////////

//创建block类以封装各种方块
class block
{
int m_ncolumn;
int m_nrow;
int m_ncolor;
block(int column,int row,int color)
{
this.m_ncolumn=column;
this.m_nrow=row;
this.m_ncolor=color;
}
//判断两方块是否相同
boolean isequal(block s)
{
return (m_ncolumn==s.m_ncolumn && m_nrow==s.m_nrow&&
m_ncolor==s.m_ncolor);
}
//判断方块是否在游戏所玩的区域
boolean inbounds()
{
return (m_ncolumn>=0&&m_ncolumn<tetrics.cols
&&m_nrow>=0&&m_nrow<tetrics.rows);
}
}

//////////////////////////////////////////////////////////////////////////////

public class tetrics extends Panel implements Runnable,KeyListener
{//selectlevel2 level=new selectlevel2();
 boolean suspended;//判断游戏是否继续
 boolean stopped;//判断游戏是否结束
Thread  thread=null;//创建一个线程
boolean gameinplay;//判断游戏是否正在玩
boolean neednewpiece;//判断是否需要新的方块
int playednums;//已玩方块数
int playlevel;//等级
int score=0;//分数
Color colors[];//定义一组颜色
int delaymap[]={600,550,500,450,400,350,300,250,200,150,100};//游戏的速度
block curpiece[]=new block[4];//正在玩的方块
block prepiece[]=new block[4];//预览方块
int field[][];//游戏当前状态
int oldfield[][];//游戏刚刚改变前的状态
int totalpieces;//总工玩的方块
boolean paused=false;//游戏暂停

final Color BakColor=new Color(223,210,190);
final Color ForColor=new Color(230,118,217);
final int XOFFSET=159;
int length;
static int cols;
static int rows;

public tetrics()
{
super();
addKeyListener(this);
setBackground(BakColor);

  suspended=false;
  stopped=false;
 length=20;
 cols=10;
 rows=18;
 field=new int[cols][rows];
 oldfield=new int[cols][rows];
 playlevel=0;

//定义一组颜色,即为方块的颜色
colors=new Color[8];
colors[0]=new Color(236,236,236);
 colors[1]=new Color(255,0,0);
 colors[2]=new Color(0,200,40);
 colors[3]=new Color(0,200,255);colors[4]=new Color(255,210,0);
colors[5]=new Color(255,165,0);
colors[6]=new Color(200,0,240);
colors[7]=new Color(0,255,0);
}

//生成方块
private void newprepiece()
{
int middle=cols/2;
int top=rows;

switch((int)(Math.random()*7))
{
case 0://横杆
prepiece[0]=new block(middle-1,top-1,1);
prepiece[1]=new block(middle-2,top-1,1);
prepiece[2]=new block(middle,top-1,1);
prepiece[3]=new block(middle+1,top-1,1);
break;

case 1://反丁字
prepiece[0]=new block(middle,top-2,5);
prepiece[1]=new block(middle,top-1,5);
prepiece[2]=new block(middle-1,top-2,5);
prepiece[3]=new block(middle+1,top-2,5);
break;

case 2://"2"形
prepiece[0]=new block(middle,top-2,2);
prepiece[1]=new block(middle-1,top-1,2);
prepiece[2]=new block(middle,top-1,2);
prepiece[3]=new block(middle+1,top-2,2);
break;

case 3://反"2"形
prepiece[0]=new block(middle,top-2,6);
prepiece[1]=new block(middle+1,top-1,6);
prepiece[2]=new block(middle,top-1,6);
prepiece[3]=new block(middle-1,top-2,6);
break;

case 4://方块
prepiece[0]=new block(middle-1,top-1,3);
prepiece[1]=new block(middle,top-1,3);
prepiece[2]=new block(middle-1,top-2,3);
prepiece[3]=new block(middle,top-2,3);
break;

case 5://"7"形
prepiece[0]=new block(middle,top-1,7);
prepiece[1]=new block(middle-1,top-1,7);
prepiece[2]=new block(middle+1,top-1,7);
prepiece[3]=new block(middle+1,top-2,7);
break;

case 6://反"7"形
prepiece[0]=new block(middle,top-1,4);
prepiece[1]=new block(middle+1,top-1,4);
prepiece[2]=new block(middle-1,top-1,4);
prepiece[3]=new block(middle-1,top-2,4);
break;
}
}

//将预览方块转换成正在玩的方块
private void transferpretocur()
{
block old[]=new block[4];
old[0]=old[1]=old[2]=old[3]=new block(-1,-1,0);
for(int i=0;i<4;i++)
{
curpiece[i]=prepiece[i];
}
gameinplay=moveblocks(old,curpiece);
}

//移动方块,若不能移动则返回假
boolean moveblocks(block from[],block to[])
{
loop:
for (int i=0;i<to.length;i++)
{
if(to[i].inbounds()==false) return false;//若不在所玩区域则返回假
if(field[to[i].m_ncolumn][to[i].m_nrow]!=0)
{
for(int j=0;j<from.length;j++)
if(to[i].isequal(from[j]))
continue loop;
return false;//若移向的区域有方块则返回假
}
}
 //移动
for(int i=0;i<from.length;i++)
  if(from[i].inbounds())
     field[from[i].m_ncolumn][from[i].m_nrow]=0;

for(int i=0;i<to.length;i++)
field[to[i].m_ncolumn][to[i].m_nrow]=to[i].m_ncolor;
   return true;
}

//移动当前玩的方块组,x表示左右移动,-1表示向左,1表示向有,0表示不动;y表示上下移动,-1表示向下。。。
private synchronized boolean movecurpiece(int x,int y,boolean rotate)
{
block newpos[]=new block[4];
for(int i=0;i<4;i++){
if(rotate)//转动
{
int dx=curpiece[i].m_ncolumn-curpiece[0].m_ncolumn;
int dy=curpiece[i].m_nrow-curpiece[0].m_nrow;
newpos[i]=new block(curpiece[0].m_ncolumn-dy,curpiece[0].m_nrow+dx,curpiece[i].m_ncolor);
}
else
{
newpos[i]=new block(curpiece[i].m_ncolumn+x,curpiece[i].m_nrow+y,curpiece[i].m_ncolor);
}
}
//调用前面的moveblocks方法
if(moveblocks(curpiece,newpos)==false) return false;
curpiece=newpos;
return true;
}
//消行
private void removelines()
{
loop1:
for(int j=0;j<rows;j++)
{
for(int i=0;i<cols;i++)
if(field[i][j]==0)
continue loop1;
for(int k=j;k<rows-1;k++)
  for(int i=0;i<cols;i++)
   field[i][k]=field[i][k+1];score+=10;
j-=1;
}
}

//画出游戏面板
public synchronized void paint(Graphics g)
{
 playlevel=selectlevel.setlevel;
    //level.setValue(m_nplaylevel);

 g.setColor(ForColor);
 for(int i=0;i<3;i++)
 {g.fill3DRect(0,160+i*5,130,5,true);}
 for(int i=0;i<3;i++)
 {g.fill3DRect(130+i*5,0,5,420,true);}
 g.setColor(Color.red);
 g.setFont(new Font("隶书",0,18));
 int gx=20;
 int gy=220;

g.clearRect(gx,gy-25,XOFFSET-50,25);
g.drawString("现在得分:"+score,gx,gy);
gy+=30;
g.clearRect(gx,gy-25,XOFFSET-50,25);
g.drawString("现在级别:"+playlevel,gx,gy);
gy+=30;
g.clearRect(gx,gy-25,XOFFSET-50,25);
g.drawString("已玩方块:"+playednums,gx,gy);

int middle=cols/2;
int top=rows;
gy-=235;
 g.setColor(colors[0]);
 //g.setColor(Color.pink);
g.fill3DRect(30,gy,length*4,length*4,true);//画方块预览区域

if(gameinplay)
{
 //画预览方块
for(int i=0;i<4;i++)
{
g.setColor(colors[prepiece[i].m_ncolor]);
g.fill3DRect((prepiece[i].m_ncolumn-middle+2)*length+30,
gy-(prepiece[i].m_nrow-top)*length,length,length,true);
}
}
//画玩方块的区域以及玩的方块
for(int i=0;i<cols;i++)
   for(int j=0;j<rows;j++)
{
       g.setColor(colors[field[i][rows - 1 - j]]);
       g.fill3DRect(XOFFSET + length * i, length + length * j,
                   length, length, true);

//}
 // m_noldfield[i][m_nrows-1-j]=m_nfield[i][m_nrows-1-j];
}

}

public void run()
{
while(gameinplay)
{
try
{
int t;//控制游戏速度
if(playlevel>10) t=75;
else t=delaymap[playlevel];
Thread.sleep(t);
synchronized (this){
  while(suspended){
    wait();
  }
  if(stopped) {break;}
}
}catch(InterruptedException e){e.printStackTrace();}
if(neednewpiece)
{
totalpieces+=1;
if(totalpieces%50==0){playlevel++;selectlevel.setlevel++;}//若玩过50个方块,级别加1
//}
removelines();
playednums+=1;
transferpretocur();
newprepiece();
neednewpiece=false;
}
else
{
neednewpiece=!movecurpiece(0,-1,false);
}
repaint();
}
if(!gameinplay){JOptionPane.showMessageDialog(null,"Game Over!");
     tframe.button1.setEnabled(true);}
thread=null;
}

synchronized void stops(){ stopped=true;
    suspended=false;paused=false;thread=null;notify();}
synchronized void pauses(){suspended=true;stopped=false;paused=true;}
synchronized void resumes(){suspended=false;stopped=false;notify();}

public synchronized void start()
{suspended=false;
 stopped=false;
requestFocus();

if(thread!=null)//若是暂停而不是结束则让游戏继续下去
{
this.resumes();
paused=false;
return;
}
repaint();
for(int i=0;i<cols;i++)//否则,清空当前方块
{
for(int j=0;j<rows;j++)
{
field[i][j]=0;
oldfield[i][j]=-1;
}
}
 //重新初始化各变量
playednums=0;
score=0;
totalpieces=0;
neednewpiece=true;
gameinplay=true;
thread=new Thread(this);
newprepiece();
thread.start();
}

/*public synchronized void pauses()
{
if(m_thethread!=null)
{
try
{
m_thethread.suspend();
m_bpaused=true;
}
catch(Exception e){e.printStackTrace();}
}
}

public synchronized void stops()
{
if(m_thethread!=null)
m_thethread.stop();
m_thethread=null;

}*/

/*public boolean keyDown(Event evt,int nKey)
{
if(!m_bgameinplay)return true;
if(m_bpaused)return true;
 //int key = evt.getKeyCode();
switch(nKey){
case 'a':
case Event.LEFT:
movecurpiece(-1,0,false);
m_bneednewpiece=false;
repaint();
break;

case 'd':
case Event.RIGHT:
movecurpiece(1,0,false);
m_bneednewpiece=false;
repaint();
break;

case 'w':
case Event.UP:
movecurpiece(0,0,true);
repaint();
break;

case 's':
case Event.DOWN:
while(movecurpiece(0,-1,false))
repaint();
break;
}
return true;
}*/

   public void keyPressed(KeyEvent e) {
     int key = e.getKeyCode();//获得按键键码
     if (key == tframe.ROTATE) //如果按下旋转按键,则旋转
     {
      movecurpiece(0,0,true);
     repaint();
    }
    else if (key == tframe.LEFT) {
      movecurpiece(-1,0,false);
   neednewpiece=false;
   requestFocus();
   repaint();requestFocus();

    }
    else if (key == tframe.RIGHT) {
      movecurpiece(1,0,false);
    neednewpiece=false;

    repaint();requestFocus();

    }
    else if (key == tframe.DOWN) {

        while(movecurpiece(0,-1,false))
   repaint();


      }
      else if(key==tframe.pause)
      {pauses();}

    }
 public void keyTyped(KeyEvent e) {}

 public void keyReleased(KeyEvent e){}


public void update(Graphics g)//重载update,以减少闪烁
{
paint(g);
}

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -