50分帮忙查一个程序错误。有源代码
orant 2003-07-27 10:42:33 import java.awt.*;
import java.applet.Applet;
public class Breakout extends Applet implements Runnable{
//定义Applet的初始化变量
Dimension d;
Font largefont=new Font("Helvetica",Font.BOLD,25);
Font smallfont=new Font("Helvetica",Font.BOLD,13);
FontMetrics fmsmall,fmlarge;
Graphics goff;
Image ii;
Thread thethread;
boolean ingame=false;
int player1score,ballx,bally,batpos,batdpos=0,balldx=0,balldy=0,batheight;
int dxval,ballsleft,count;
boolean showtitle=true;
boolean[] showbrick;
int bricksperline;
final int borderwidth=5,batwidth=50,ballsize=5,
scoreheight=20,screendelay=300,brickwidth=15,brickheight=8,
brickspace=2,backcol=0x102040,numlines=4,startline=32;
public void init(){
Graphics g;
d=getSize();
setBackground(new Color(backcol));
bricksperline=(d.width-2*borderwidth)/(brickwidth+brickspace);
d.width=bricksperline*(brickwidth+brickspace)+(2*borderwidth);
g=getGraphics();
g.setFont(smallfont);
fmsmall=g.getFontMetrics();
g.setFont(largefont);
fmlarge=g.getFontMetrics();
showbrick=new boolean[bricksperline*numlines];
}
public void GameInit(){
batpos=(d.width-batwidth)/2;
ballx=(d.width-ballsize)/2;
bally=(d.height-ballsize-scoreheight-2*borderwidth);
player1score=0;
ballsleft=3;
dxval=2;
if(Math.random()<0.5)
balldx=dxval;
else
balldx=-dxval;
balldy=-dxval;
count=screendelay;
batdpos=0;
InitBricks();
}
public void InitBricks(){
for(int i=0;i<numlines*bricksperline;i++)
showbrick[i]=true;
}
public boolean keyDown(Event e,int key){
if(ingame){
if(key==Event.LEFT) batdpos=-3;
if(key==Event.RIGHT) batdpos=3;
if(key==Event.ESCAPE) ingame=false;
}
else{
if(key=='s'||key=='S'){
ingame=true;
GameInit();
}
}
return true;
}
public boolean keyUp(Event e,int key){
System.out.println("Key:"+key);
if(key==Event.LEFT||key==Event.RIGHT)
batdpos=0;
return true;
}
public void paint(Graphics g){
String s;
Graphics gg;
if(goff==null&&d.width>0&&d.height>0){
ii=createImage(d.width,d.height);
goff=ii.getGraphics();
}
if(goff==null||ii==null) return;
goff.setColor(new Color(backcol));
goff.fillRect(0,0,d.width,d.height);
if(ingame) PlayGame();
else ShowIntroScreen();
g.drawImage(ii,0,0,this);
}
public void PlayGame(){
MoveBall();
CheckBat();
CheckBricks();
DrawPlayField();
DrawBricks();
ShowScore();
}
public void ShowIntroScreen(){
String s;
MoveBall();
CheckBat();
CheckBricks();
BatDummyMove();
DrawPlayField();
CheckBricks();
ShowScore();
goff.setFont(largefont);
goff.setColor(new Color(96,128,255));
if(showtitle){
s="Bound Pane Game";
goff.drawString(s,(d.width-fmlarge.stringWidth(s))/2,
(d.height-scoreheight-borderwidth)/2-20);
s="Java Example Charter 10";
goff.setFont(smallfont);
goff.setColor(new Color(255,160,64));
goff.drawString(s,(d.width-fmlarge.stringWidth(s))/2,
(d.width-scoreheight-borderwidth)/2+10);
s="";
goff.drawString(s,(d.width-fmsmall.stringWidth(s))/2,
(d.height-scoreheight-borderwidth)/2+30);
}
else{
goff.setFont(smallfont);
goff.setColor(new Color(96,128,255));
s="press s to start game";
goff.drawString(s,(d.width-fmsmall.stringWidth(s))/2,
(d.height-scoreheight-borderwidth)/2-10);
goff.setColor(new Color(255,160,64));
s="Use left or right move the pane";
goff.drawString(s,(d.width-fmsmall.stringWidth(s))/2,(d.height-scoreheight-borderwidth)/2+20);
}
count--;
if(count<=0){
count=screendelay;
showtitle=!showtitle;
}
}
public void DrawBricks(){
int i,j;
boolean nobricks=true;
int colordelta=255/(numlines-1);
for(j=0;j<numlines;j++){
for(i=0;i<bricksperline;i++){
if(showbrick[j*bricksperline+i]){
nobricks=false;
goff.setColor(new Color(255,j*colordelta,255-j*colordelta));
goff.fillRect(borderwidth+i*(brickwidth+brickspace),
startline+j*(brickheight+brickspace),
brickwidth,brickheight);
}
}
}
if(nobricks){
InitBricks();
if(ingame)
player1score+=100;
}
}
public void DrawPlayField(){
goff.setColor(Color.white);
goff.fillRect(0,0,d.width,borderwidth);
goff.fillRect(0,0,borderwidth,d.height);
goff.fillRect(d.width-borderwidth,0,borderwidth,d.height);
goff.fillRect(batpos,d.height-2*borderwidth-scoreheight,batwidth,batheight);
goff.fillRect(ballx,bally,ballsize,ballsize);
}