📄 matrics.java~43~
字号:
import java.awt.*;import java.awt.event.*;/** * Title: * Description: * Copyright: Copyright (c) 2001 * Company: * @author * @version 1.0 */public class Matrics extends Panel implements Runnable{ //每个小方块的大小:宽,高 int m_nSqLength; //信息区大小 final int XOFFSET=200; static int m_nCols; static int m_nRows; //当前的界面情况 int m_nField[][]; int m_nOldField[][]; //当前移动的方块 Square m_curPiece[]=new Square[4]; boolean m_bGameInPlay; boolean m_bNeedNewPiece; Thread m_theThread=null; Color m_colors[]; int m_nPieceValue,m_nTheScore=0; int m_nPlayLevel; int m_nTotalPieces; boolean m_bJustupdating=false; int m_nDelayMap[]={600,600,600,600,500,400,300,250,200,150,100}; final Color BAKCOLOR=Color.cyan; final Color FORCOLOR=Color.black; public static int NOSQUARE=0; public Matrics() { super(); setBackground(BAKCOLOR); init(); } public void init() { //设置初始参数 m_nSqLength=20; m_nCols=10; m_nRows=20; m_nField=new int [m_nCols][m_nRows+4]; m_nOldField=new int[m_nCols][m_nRows+4]; //定义八种颜色 m_colors=new Color[8]; m_colors[0]=new Color(40,40,40); m_colors[1]=new Color(255,0,0); m_colors[2]=new Color(0,200,0); m_colors[3]=new Color(0,200,255); m_colors[4]=new Color(255,255,0); m_colors[5]=new Color(255,150,0); m_colors[6]=new Color(210,0,240); m_colors[7]=new Color(40,0,240); } public synchronized void start() { if(m_theThread!=null) { m_theThread.resume(); return; } for(int i=0;i<m_nCols;i++) { for(int j=0;j<m_nRows+4;j++) { m_nField[i][j]=0; m_nOldField[i][j]=-1; } } m_nPlayLevel=5; m_nTheScore=0; m_nTotalPieces=0; m_bNeedNewPiece=true; m_bGameInPlay=true; m_theThread=new Thread(this); m_theThread.start(); requestFocus(); } public void update(Graphics g) { m_bJustupdating=true; paint(g); } public synchronized void paint(Graphics g) { g.setFont(new Font("宋体",0,18)); int gx=m_nSqLength; int gy=m_nSqLength*m_nRows/4; //打印Score和level的位置 g.clearRect(gx,gy-25,XOFFSET-gx,25); g.drawString("Score:"+m_nTheScore,gx,gy); gy+=30; g.clearRect(gx,gy-25,XOFFSET-gx,25); g.drawString("Level:"+m_nPlayLevel,gx,gy); for(int i=0;i<m_nCols;i++) for(int j=0;j<m_nRows;j++) { //-1代表没有刚刚开始 if(!m_bJustupdating ||m_nOldField[i][m_nRows-1-j]==-1 || m_nOldField[i][m_nRows-1-j]!=m_nField[i][m_nRows-1-j]) { g.setColor(m_colors[m_nField[i][m_nRows-1-j]]); g.fill3DRect(XOFFSET+m_nSqLength*i,m_nSqLength+m_nSqLength*j,m_nSqLength,m_nSqLength,true); } m_nOldField[i][m_nRows-1-j]=m_nField[i][m_nRows-1-j]; } m_bJustupdating=false; } public void run() { while(m_bGameInPlay){ System.out.println("playing"); try { int t; if(m_nPlayLevel>10) t=75; else t=m_nDelayMap[m_nPlayLevel]; Thread.sleep(t); }catch(InterruptedException e){e.printStackTrace();} if(m_bNeedNewPiece) { if(m_nPieceValue>0) { m_nTheScore+=m_nPieceValue; m_nTotalPieces+=1; m_nPlayLevel=5+m_nTotalPieces/30; } removelines(); newPiece(); m_bNeedNewPiece=false; System.out.println("playing2"); } else { m_bNeedNewPiece=!moveCurPiece(0,-1,false); if(!m_bNeedNewPiece) m_nPieceValue-=5; } repaint(); } m_theThread=null; } /** *移动方块 *@param nDx 左右移动,向左为-1 *@param nDy 上下移动,向下为-1 */ private synchronized boolean moveCurPiece(int nDx,int nDy,boolean bRotate) { Square newpos[]=new Square[4]; for(int i=0;i<4;i++){ if(bRotate) { int dx=m_curPiece[i].m_nColumn-m_curPiece[0].m_nColumn; int dy=m_curPiece[i].m_nRow-m_curPiece[0].m_nRow; newpos[i]=new Square(m_curPiece[0].m_nColumn-dy,m_curPiece[0].m_nRow+dx,m_curPiece[i].m_nColor); } else { newpos[i]=new Square(m_curPiece[i].m_nColumn+nDx,m_curPiece[i].m_nRow+nDy,m_curPiece[i].m_nColor); } } if(moveSquares(m_curPiece,newpos)==false) return false; m_curPiece=newpos; return true; } /** * 移动方块,如果不能移动,则返回假 */ boolean moveSquares(Square from[],Square to[]) { //判断是否能移动 outerlable: for (int i=0;i<to.length;i++) { if(to[i].InBounds()==false) return false; //如果不在可玩区域,则返回假 if(m_nField[to[i].m_nColumn][to[i].m_nRow]!=0) { for(int j=0;j<from.length;j++) if(to[i].IsEqual(from[j])) continue outerlable; return false; } } //移动 for(int i=0;i<from.length;i++) if(from[i].InBounds()) m_nField[from[i].m_nColumn][from[i].m_nRow]=0; for(int i=0;i<to.length;i++) m_nField[to[i].m_nColumn][to[i].m_nRow]=to[i].m_nColor; return true; } private void newPiece() { Square old[]=new Square[4]; old[0]=old[1]=old[2]=old[3]=new Square(-1,-1,0); int middle=m_nCols/2; int top=m_nRows; switch((int)(Math.random()*7)) { case 0: //XXXX red; m_nPieceValue=100; m_curPiece[0]=new Square(middle-1,top-1,1); m_curPiece[1]=new Square(middle-2,top-1,1); m_curPiece[2]=new Square(middle,top-1,1); m_curPiece[3]=new Square(middle+1,top-1,1); break; case 1: // X orange; //XXX m_nPieceValue=200; m_curPiece[0]=new Square(middle,top-2,5); m_curPiece[1]=new Square(middle,top-1,5); m_curPiece[2]=new Square(middle-1,top-2,5); m_curPiece[3]=new Square(middle+1,top-2,5); break; case 2: //XX green; m_nPieceValue=180; m_curPiece[0]=new Square(middle,top-2,2); m_curPiece[1]=new Square(middle-1,top-1,2); m_curPiece[2]=new Square(middle,top-1,2); m_curPiece[3]=new Square(middle+1,top-2,2); break; case 3: //XX blue; m_nPieceValue=180; m_curPiece[0]=new Square(middle,top-2,7); m_curPiece[1]=new Square(middle+1,top-1,7); m_curPiece[2]=new Square(middle,top-1,7); m_curPiece[3]=new Square(middle-1,top-2,7); break; case 4: //XX light blue; m_nPieceValue=100; m_curPiece[0]=new Square(middle-1,top-1,3); m_curPiece[1]=new Square(middle,top-1,3); m_curPiece[2]=new Square(middle-1,top-2,3); m_curPiece[3]=new Square(middle,top-2,3); break; case 5: //XXX purle; m_nPieceValue=120; m_curPiece[0]=new Square(middle,top-1,6); m_curPiece[1]=new Square(middle-1,top-1,6); m_curPiece[2]=new Square(middle+1,top-1,6); m_curPiece[3]=new Square(middle+1,top-2,6); break; case 6: //XXX yellow; m_nPieceValue=120; m_curPiece[0]=new Square(middle,top-1,4); m_curPiece[1]=new Square(middle+1,top-1,4); m_curPiece[2]=new Square(middle-1,top-1,4); m_curPiece[3]=new Square(middle-1,top-2,4); break; } m_bGameInPlay=moveSquares(old,m_curPiece); } //去掉可以消去的行 private void removelines() { outerlabel: for(int j=0;j<m_nRows;j++) { for(int i=0;i<m_nCols;i++) if(m_nField[i][j]==0) continue outerlabel; for(int k=j;k<m_nRows-1;k++) for(int i=0;i<m_nCols;i++) m_nField[i][k]=m_nField[i][k+1]; j-=1; } } public boolean keyDown(Event evt,int nKey) { if(!m_bGameInPlay)return true; 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 synchronized void stop() { if(m_theThread!=null) m_theThread.stop(); m_theThread=null; } public synchronized void pause() { if(m_theThread!=null) { bPause=true; try{m_theThread.suspend();} catch(Exception e){e.printStackTrace();} } }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -