fianl修饰的方法,不可以被重写。
fianl修饰的属性,值不可以修改。
<?extends Object>是泛型中的特别写法, 这个的意思是 object的子类。 ?继承与object,只要是object的子类都可以。
你说的+号,java中没有符号的重载,这个和c/c++不一样。 +号用于字符串,是连接字符串用的。基本类型+“” 结果就是字符串。 system。out。println()或print()输出的是字符串
不一定。JAVA编译器对与+号的字符串会进行编译优化,优化后也是用StringBuilder的append方法。
但是编译优化是有局限的比如
String str = ""
for(int i =0i <1000i++){
str = str + i
}
这种它优化后的结果是
String str = ""
for(int i =0i <1000i++){
StringBuilder sb = new StringBuilder ()
sb.append(str).append(i)
}
而我们期望的是
String str = ""
StringBuilder sb = new StringBuilder ()
for(int i =0i <1000i++){
sb.append(i)
}
import java.applet.Appletimport 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 = 0i <line * brickNumOfLinei++)
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 = 0j <linej++) {
for (i = 0i <brickNumOfLinei++) {
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 = 0j <linej++) {
for (i = 0i <brickNumOfLinei++) {
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这个变量去控制移动。。但你根本没用这个变量去画图。。所以不能移动。。你自己去改把。。