TA的每日心情 | 开心 2021-3-12 23:18 |
---|
签到天数: 2 天 [LV.1]初来乍到
|
程序运行图:
//俄罗斯方块。
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 |
|