📄 tetrics.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 + -