在学习JAVA过程遇到的一些基础性疑惑,求解惑!

Python014

在学习JAVA过程遇到的一些基础性疑惑,求解惑!,第1张

final修饰的类,不可以被继承,没有子类

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.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 = 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这个变量去控制移动。。但你根本没用这个变量去画图。。所以不能移动。。你自己去改把。。