Java程序解惑,希望大家帮帮忙,打砖块游戏不能用键盘控制。开始和移动都不能。运行是用application吗?

程序在一楼,望大家帮忙啊。字数太多写不下……分我一定会给大家的,谢谢~... 程序在一楼,望大家帮忙啊。字数太多写不下……分我一定会给大家的,谢谢~ 展开
 我来答
flymomo123
2011-07-06 · TA获得超过819个赞
知道小有建树答主
回答量:301
采纳率:0%
帮助的人:369万
展开全部
import java.applet.Applet;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Event;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

public class ballApplet extends Applet implements Runnable {
Dimension d;
Font bFont = new Font("Helvetica", Font.BOLD, 24);
Font sFont = new Font("Helvetica", Font.BOLD, 14);
FontMetrics fmSmall, fmBig;
Graphics goff;
Image img;
Thread mThread;
boolean ingame = false;
int ballx, bally, batpos;
int batdpos = 0;
int balldx = 0, balldy = 0, dxval;
int iScroe, ballNum;
boolean[] showbrick;
int brickNumOfLine;
final int bWidth = 5;
final int batW = 20;
final int ballsize = 5;
final int batH = 5;
final int scoreH = 25;
final int brickW = 15;
final int brickH = 8;
final int space = 1;
final int backcol = 0x102040;
final int line = 4;
final int startline = 32;

public void init() {
Graphics g;
d=size();
setBackground(new Color(backcol));
brickNumOfLine = (d.width-2*bWidth)/(brickW +space);
d.width = brickNumOfLine*(brickW+space)+(2*bWidth);
g = getGraphics();
g.setFont(sFont);
fmSmall= g.getFontMetrics();
g.setFont(bFont);
fmBig = g.getFontMetrics();
showbrick = new boolean[brickNumOfLine*line];
this.addKeyListener(new BallGameKeyListener());
GameInit();

}

public void GameInit() {
batpos = (d.width - batW) / 2;
ballx = (d.width - ballsize) / 2;
bally = (d.height - ballsize - scoreH - 2 * bWidth);
iScroe = 0;
ballNum = 3;
dxval = 2;
if (Math.random() < 0.5)
balldx = dxval;
else
balldx = -dxval;
balldy = -dxval;
batdpos = 0;
InitBricks();
}

public void InitBricks() {
int i;
for (i = 0; i < line * brickNumOfLine; i++)
showbrick[i] = true;
}

// public boolean keyDown(Event e, int key) {
// if (ingame) {
// if (key == Event.LEFT)
// batdpos = -4;
// if (key == Event.RIGHT)
// batdpos = 4;
// if (key == Event.ESCAPE)
// ingame = false;
// } else {
// if (key == 's' || key == 'S') {
// ingame = true;
// GameInit();
// }
// }
// return true;
// }
//
// public boolean keyUp(Event e, int key) {
// if (key == Event.LEFT || key == Event.RIGHT)
// batdpos = 0;
// return true;
// }

public void paint(Graphics g) {
if (goff == null && d.width > 0 && d.height > 0) {
img = createImage(d.width, d.height);
goff = img.getGraphics();
}
if (goff == null || img == null)
return;
goff.setColor(new Color(backcol));
goff.fillRect(0, 0, d.width, d.height);
if (ingame)
PlayGame();
else
ShowIntroScreen();
g.drawImage(img, 0, 0, this);
}

public void PlayGame() {
MoveBall();
CheckBat();
CheckBricks();
DrawPlayField();
DrawBricks();
ShowScore();
}

public void ShowIntroScreen() {
MoveBall();
CheckBat();
CheckBricks();
BatDummyMove();
DrawPlayField();
DrawBricks();
ShowScore();
goff.setFont(bFont);
goff.setColor(new Color(96, 128, 255));
String s = "弹球游戏";
goff.drawString(s, (d.width - fmBig.stringWidth(s)) / 2, (d.height
- scoreH - bWidth) / 2 - 20);
goff.setFont(sFont);
goff.setColor(new Color(128, 255, 32));
s = "请按下'S'键开始游戏";
goff.drawString(s, (d.width - fmSmall.stringWidth(s)) / 2, (d.height
- scoreH - bWidth) / 2 + 30);
goff.setColor(new Color(255, 160, 64));
s = "使用方向键控制球拍移动";
goff.drawString(s, (d.width - fmSmall.stringWidth(s)) / 2, (d.height
- scoreH - bWidth) / 2 + 50);
}

public void DrawBricks() {
int i, j;
boolean nobricks = true;
int colorDelta = 255 / (line - 1);
for (j = 0; j < line; j++) {
for (i = 0; i < brickNumOfLine; i++) {
if (showbrick[j * brickNumOfLine + i]) {
nobricks = false;
goff.setColor(new Color(255, j * colorDelta, 255 - j
* colorDelta));
goff.fillRect(bWidth + i * (brickW + space), startline + j
* (brickH + space), brickW, brickH);
}
}
}
if (nobricks) {
InitBricks();
if (ingame)
iScroe += 100;
}
}

public void DrawPlayField() {
goff.setColor(Color.white);
goff.fillRect(0, 0, d.width, bWidth);
goff.fillRect(0, 0, bWidth, d.height);
goff.fillRect(d.width - bWidth, 0, bWidth, d.height);
goff.fillRect(0, d.height - bWidth, d.width, bWidth);
goff.fillRect(batpos, d.height - 2 * bWidth - scoreH, batW, batH);
goff.fillRect(ballx, bally, ballsize, ballsize);
}

public void ShowScore() {
goff.setFont(sFont);
goff.setColor(Color.white);
goff.drawString("得分:" + iScroe, 40, d.height - 10);
String s = "生命:" + ballNum;
goff
.drawString(s, d.width - 40 - fmSmall.stringWidth(s),
d.height - 10);
}

public void MoveBall() {
ballx += balldx;
bally += balldy;
if (bally <= bWidth) {
balldy = -balldy;
bally = bWidth;
}
if (bally >= (d.height - ballsize - scoreH)) {
if (ingame) {
ballNum--;
if (ballNum <= 0)
ingame = false;
}
ballx = batpos + (batW - ballsize) / 2;
bally = startline + line * (brickH + space);
balldy = dxval;
balldx = 0;
}
if (ballx >= (d.width - bWidth - ballsize)) {
balldx = -balldx;
ballx = d.width - bWidth - ballsize;
}
if (ballx <= bWidth) {
balldx = -balldx;
ballx = bWidth;
}
}

public void BatDummyMove() {
if (ballx < (batpos + 2))
batpos -= 3;
else if (ballx > (batpos + batW - 3))
batpos += 3;
}

public void CheckBat() {
batpos += batpos;
if (batpos < bWidth)
batpos = bWidth;
else if (batpos > (d.width - bWidth - batW))
batpos = (d.width - bWidth - batW);
if (bally >= (d.height - scoreH - 2 * bWidth - ballsize)
&& bally < (d.height - scoreH - 2 * bWidth)
&& (ballx + ballsize) >= batpos && ballx <= (batpos + batW)) {
bally = d.height - scoreH - ballsize - bWidth * 2;
balldy = -dxval;
balldx = CheckBatBounce(balldx, ballx - batpos);
}
}

public int CheckBatBounce(int dy, int delta) {
int sign;
int stepsize, i = -ballsize, j = 0;
stepsize = (ballsize + batW) / 8;
if (dy > 0)
sign = 1;
else
sign = -1;
while (i < batW && delta > i) {
i += stepsize;
j++;
}
switch (j) {
case 0:
case 1:
return -4;
case 2:
return -3;
case 7:
return 3;
case 3:
case 6:
return sign * 2;
case 4:
case 5:
return sign * 1;
default:
return 4;
}
}

public void CheckBricks() {
int i, j, x, y;
int xspeed = balldx;
if (xspeed < 0)
xspeed = -xspeed;
int ydir = balldy;
if (bally < (startline - ballsize)
|| bally > (startline + line * (space + brickH)))
return;
for (j = 0; j < line; j++) {
for (i = 0; i < brickNumOfLine; i++) {
if (showbrick[j * brickNumOfLine + i]) {
y = startline + j * (space + brickH);
x = bWidth + i * (space + brickW);
if (bally >= (y - ballsize) && bally < (y + brickH)
&& ballx >= (x - ballsize) && ballx < (x + brickW)) {
showbrick[j * brickNumOfLine + i] = false;
if (ingame)
iScroe += (line - j);
if (ballx >= (x - ballsize)
&& ballx <= (x - ballsize + 3)) {
balldx = -xspeed;
} else if (ballx <= (x + brickW - 1)
&& ballx >= (x + brickW - 4)) {
balldx = xspeed;
}
balldy = -ydir;
}
}
}
}
}

public void run() {
long starttime;
Graphics g = getGraphics();
Thread.currentThread().setPriority(Thread.MAX_PRIORITY);
while (true) {
starttime = System.currentTimeMillis();
try {
paint(g);
starttime += 20;
Thread.sleep(Math
.max(0, starttime - System.currentTimeMillis()));
} catch (InterruptedException e) {
break;
}
}
}

public void start() {
if (mThread == null) {
mThread = new Thread(this);
mThread.start();
}
}

public void stop() {
if (mThread != null) {
mThread.stop();
mThread = null;
}
}

public static void main(String[] args) {
Frame frame = new Frame("弹球游戏");
ballApplet app = new ballApplet();
frame.add("Center", app);
frame.setSize(270, 350);
frame.validate();
frame.setVisible(true);
frame.addWindowListener(new WindowControl(app));
app.init();
app.start();
}

class BallGameKeyListener implements KeyListener{

@Override
public void keyPressed(KeyEvent e) {
int key = e.getKeyCode();
// TODO Auto-generated method stub
if (ingame) {

switch(key){
case KeyEvent.VK_ESCAPE:
ingame = false;
break;
case KeyEvent.VK_RIGHT:
batdpos = 4;
break;
case KeyEvent.VK_LEFT:
batdpos = -4;
break;
}

} else {
if (key == KeyEvent.VK_S) {
ingame = true;
GameInit();
}
}
}

@Override
public void keyReleased(KeyEvent e) {
// TODO Auto-generated method stub
int key = e.getKeyCode();
if (key == KeyEvent.VK_LEFT || key == KeyEvent.VK_RIGHT)
batdpos = 0;
}

@Override
public void keyTyped(KeyEvent e) {
// TODO Auto-generated method stub

}

}
}

class WindowControl extends WindowAdapter {
Applet app;

public WindowControl(Applet app) {
this.app = app;
}

public void WindowClosing(WindowEvent e) {
app.stop();
app.destroy();
System.exit(0);
}

}

给你+了个keyListener 然后按你的理念给你加入了按键判定。按S按键可以开始游戏但方向键不能移动应该是你的方法错误了你自己修改去把懒得看了。。太长了 一般画可以移动的物体是直接按坐标来画然后移动的时候+= 好哦这-= 控制坐标 我发现你的错误是你用batdpos这个变量去控制移动。。但你根本没用这个变量去画图。。所以不能移动。。你自己去改把。。
yanyanwenbo
2011-07-06
知道答主
回答量:6
采纳率:0%
帮助的人:6.7万
展开全部
import java.applet.Applet;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Event;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
public class ballApplet extends Applet implements Runnable {
Dimension d;
Font bFont = new Font("Helvetica", Font.BOLD, 24);
Font sFont = new Font("Helvetica",Font.BOLD,14);
FontMetrics fmSmall, fmBig;
Graphics goff;
Image img;
Thread mThread;
boolean ingame = false;
int ballx, bally, batpos;
int batdpos = 0;
int balldx=0,balldy=0,dxval;
int iScroe,ballNum;
boolean[] showbrick;
int brickNumOfLine;
final int bWidth = 5;
final int batW = 20;
final int ballsize = 5;
final int batH = 5;
final int scoreH = 25;
final int brickW = 15;
final int brickH = 8;
final int space = 1;
final int backcol = 0x102040;
final int line = 4;
final int startline = 32;
public void init() {
Graphics g;
d=size();
setBackground(new Color(backcol));
brickNumOfLine = (d.width-2*bWidth)/(brickW +space);
d.width = brickNumOfLine*(brickW+space)+(2*bWidth);
g = getGraphics();
g.setFont(sFont);
fmSmall= g.getFontMetrics();
g.setFont(bFont);
fmBig = g.getFontMetrics();
showbrick = new boolean[brickNumOfLine*line];
GameInit();
}
public void GameInit() {
batpos = (d.width-batW)/2;
ballx = (d.width-ballsize)/2;
bally=(d.height-ballsize-scoreH-2*bWidth);
iScroe = 0;
ballNum =3;
dxval =2;
if(Math.random() <0.5)
balldx=dxval;
else
balldx=-dxval;
balldy = -dxval;
batdpos =0;
InitBricks();
}
public void InitBricks(){
int i;
for (i=0;i<line*brickNumOfLine;i++)
showbrick[i]=true;
}
public boolean keyDown(Event e,int key){
if(ingame){
if(key == Event.LEFT)
batdpos =-4;
if (key==Event.RIGHT)
batdpos=4;
if(key==Event.ESCAPE)
ingame=false;
}
else {
if (key =='s' || key =='S') {
ingame=true;
GameInit();
}
}
return true;
}
public boolean keyUp(Event e,int key){
if(key==Event.LEFT || key==Event.RIGHT)
batdpos=0;
return true;
}
public void paint(Graphics g) {
if (goff ==null&&d.width>0&&d.height>0) {
img = createImage(d.width,d.height);
goff = img.getGraphics();
}
if (goff ==null|| img==null)
return;
goff.setColor(new Color(backcol));
goff.fillRect(0,0,d.width,d.height);
if(ingame)
PlayGame();
else
ShowIntroScreen();
g.drawImage(img,0,0,this);
}
public void PlayGame() {
MoveBall();
CheckBat();
CheckBricks();
DrawPlayField();
DrawBricks();
ShowScore();
}
public void ShowIntroScreen() {
MoveBall();
CheckBat();
CheckBricks();
BatDummyMove();
DrawPlayField();
DrawBricks();
ShowScore();
goff.setFont(bFont);
goff.setColor(new Color(96,128,255));
String s="弹球游戏";
goff.drawString(s, (d.width-fmBig.stringWidth(s))/2,
(d.height-scoreH-bWidth)/2-20);
goff.setFont(sFont);
goff.setColor(new Color(128,255,32));
s="请按下'S'键开始游戏";
goff.drawString(s,(d.width-fmSmall.stringWidth(s))/2,
(d.height-scoreH-bWidth)/2+30);
goff.setColor(new Color(255, 160,64));
s="使用方向键控制球拍移动";
goff.drawString(s,(d.width-fmSmall.stringWidth(s))/2,
(d.height-scoreH-bWidth)/2+50);
}
public void DrawBricks() {
int i,j;
boolean nobricks =true;
int colorDelta=255/(line-1);
for(j=0;j<line;j++) {
for(i=0;i< brickNumOfLine;i++){
if (showbrick[j*brickNumOfLine+i]) {
nobricks=false;
goff.setColor(new Color(255,j*colorDelta,255-j*colorDelta));
goff.fillRect(bWidth +i*(brickW+space),
startline +j*(brickH+space),brickW,brickH);
}
}
}
if(nobricks) {
InitBricks();
if(ingame)
iScroe +=100;
}
}
public void DrawPlayField() {
goff.setColor(Color.white);
goff.fillRect(0,0,d.width,bWidth);
goff.fillRect(0,0,bWidth,d.height);
goff.fillRect(d.width-bWidth,0,bWidth,d.height);
goff.fillRect(0,d.height-bWidth,d.width,bWidth);
goff.fillRect(batpos,d.height-2*bWidth-scoreH,batW,batH);
goff.fillRect(ballx,bally,ballsize,ballsize);
}
public void ShowScore() {
goff.setFont(sFont);
goff.setColor(Color.white);
goff.drawString("得分:" + iScroe,40,d.height-10);
String s="生命:" +ballNum;
goff.drawString(s,d.width-40-fmSmall.stringWidth(s),d.height-10);
}
public void MoveBall() {
ballx +=balldx;
bally +=balldy;
if (bally<=bWidth) {
balldy =-balldy;
bally=bWidth;
}
if(bally >=(d.height -ballsize-scoreH)) {
if(ingame) {
ballNum--;
if(ballNum <=0)
ingame = false;
}
ballx =batpos+(batW-ballsize)/2;
bally = startline +line *(brickH +space);
balldy=dxval;
balldx=0;
}
if (ballx>=(d.width-bWidth-ballsize)) {
balldx = -balldx;
ballx = d.width-bWidth-ballsize;
}
if(ballx<=bWidth){
balldx=-balldx;
ballx=bWidth;
}
}
public void BatDummyMove(){
if (ballx <(batpos+2))
batpos -=3;
else if(ballx>(batpos +batW-3))
batpos +=3;
}
public void CheckBat() {
batpos +=batpos;
if(batpos<bWidth)
batpos =bWidth;
else if (batpos >(d.width-bWidth-batW))
batpos=(d.width-bWidth-batW);
if (bally >=(d.height-scoreH-2*bWidth-ballsize)&&
bally<(d.height-scoreH-2*bWidth)&&
(ballx+ballsize)>=batpos&&ballx<=(batpos +batW)) {
bally=d.height-scoreH-ballsize-bWidth*2;
balldy=-dxval;
balldx=CheckBatBounce(balldx,ballx-batpos);
}
}
public int CheckBatBounce(int dy,int delta){
int sign;
int stepsize,i=-ballsize,j=0;
stepsize=(ballsize+batW)/8;
if(dy>0)
sign=1;
else
sign=-1;
while(i<batW&& delta>i){
i+=stepsize;
j++;
}
switch(j) {
case 0:
case 1:
return -4;
case 2:
return -3;
case 7:
return 3;
case 3:
case 6:
return sign *2;
case 4:
case 5:
return sign *1;
default:
return 4;
}
}
public void CheckBricks(){
int i,j,x,y;
int xspeed=balldx;
if(xspeed<0)
xspeed=-xspeed;
int ydir = balldy;
if(bally<(startline-ballsize)||
bally>(startline+line*(space +brickH)))
return;
for(j=0;j<line;j++){
for(i=0;i<brickNumOfLine;i++){
if(showbrick[j*brickNumOfLine+i]) {
y=startline+j*(space+brickH);
x=bWidth+i*(space+brickW);
if(bally>=(y-ballsize)&&bally<(y+brickH)&&
ballx>=(x-ballsize)&&ballx<(x+brickW)){
showbrick[j*brickNumOfLine +i]=false;
if(ingame)
iScroe +=(line-j);
if(ballx>=(x-ballsize)&&ballx<=(x-ballsize+3)){
balldx=-xspeed;
}
else if(ballx<=(x+brickW-1)&&ballx>=(x+brickW-4)){
balldx=xspeed;
}
balldy=-ydir;
}
}
}
}
}
public void run() {
long starttime;
Graphics g=getGraphics();
Thread.currentThread().setPriority(Thread.MAX_PRIORITY);
while(true){
starttime=System.currentTimeMillis();
try{
paint(g);
starttime +=20;
Thread.sleep(Math.max(0,starttime-System.currentTimeMillis()));
}
catch(InterruptedException e){
break;
}
}
}
public void start() {
if(mThread==null){
mThread=new Thread(this);
mThread.start();
}
}
public void stop() {
if(mThread !=null){
mThread.stop();
mThread=null;
}
}
public static void main(String[] args) {
Frame frame =new Frame("弹球游戏");
ballApplet app =new ballApplet();
frame.add("Center",app);
frame.setSize(270,350);
frame.validate();
frame.setVisible(true);
frame.addWindowListener(new WindowControl(app));
app.init();
app.start();
}
}
class WindowControl extends WindowAdapter{
Applet app;
public WindowControl(Applet app){
this.app=app;
}
public void WindowClosing(WindowEvent e){
app.stop();
app.destroy();
System.exit(0);
}

}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
双耳猫
2011-07-06 · 超过23用户采纳过TA的回答
知道答主
回答量:36
采纳率:0%
帮助的人:41.4万
展开全部
太长了,没时间看,你这个程序是Applet,运行的时候要以Java Applet运行,不能用application。也就是在Eclipse中要选择“Java Applet”运行,如果是从命令行启动,要用“appletviewer ……”来运行。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式