发表于: 2017-08-17 05:49:51

2 908


在敲了二十遍代码后感觉不一样了,在敲六七遍的时候还需要看源代码,在敲十一;十二遍的时候已经不需要看源代码了,之后就是越敲越快了。

在本小节结束的时候有个问题:有没有办法让小球在遇到墙的时候反弹回来呢?

这个算法花了很长时间,最后代码如下:

public void run() {

int downSign = 0 ;

while(true) {

int downSign = 1 ;

while(y < 400 && downSign == 1) {

y ++ ;

try {

Thread.sleep(100) ;

}catch(Exception e) {}

repaint() ;

}

downSign = 0 ;

while(y > 30 && downSign == 0) {

y -- ;

try {

Thread.sleep(100) ;

}catch(Exception e) {}

repaint() ;

}

}

}

可能这个算法唯一的问题是若Thread.sleep()方法中参数越小,小球闪烁地越厉害,速度越快。反之越稳定。

线程有创建、就绪、运行、阻塞、死亡五种状态,离不开线程对象的start、run等方法;另外,线程还有优先级,没用运用就不细究。

写代码的时候,在这本书上使用的{}是这样用的:

public static void main(String[] args){

}

之前的疯狂书中是这样婶的:

public static void main(String[] args)

{

}

我比较倾向于使用第二种,两个花括号对齐。使用第一种感觉有点节省篇幅的意思。但是在本书中用的是第一种,而且我注意到《Java编程思想》也是用的第一种。那就使用第一种吧。尽管会有些不习惯。但是就像关谷说的,“吐着吐着就习惯了。”我写着写着就习惯了。

dowhile语句在while条件后需要一个分号表示结束,我一直以为是我的条件错误,直到我把条件改为了true,还是有问题。

上面的是小头,大头在下面:在一个闭合的矩形框内小球的撞击的程序:

程序运行后小球永远在框内循环撞击。

代码:

import java.awt.* ;

import java.awt.event.*;

public class italicFly {

public static void main(String[] args) {

Frame f = new Frame() ;

f.setSize(300 , 400) ;

MyPanel3 mp = new MyPanel3() ;

f.add(mp) ;

Thread t = new Thread(mp) ;

t.start() ;

f.show() ;

f.addWindowListener(new WindowAdapter() { //关闭窗口

public void windowClosing(WindowEvent e) {

System.exit(0);

}

}) ;

}

}

class MyPanel3 extends Panel implements Runnable {

int x = 50 ;

int y = 50 ;

public void paint(Graphics g)  {

g.fillOval(x , y , 20 , 20) ; //画一个实心圆作为控制主体

g.drawRect(20, 30, 180, 270) ; //画一个矩形作为房间,实心圆只能在房间里运动

}

public void run() {

boolean upSign = false ; //用四个变量来存储当前姿态有些多余,这样写目的是提高代码的阅读性

boolean downSign = true ;//初始状态,让小球沿右下方向跑

boolean leftSign = false ;

boolean rightSign = true ;

while(true) {

if(upSign == false && downSign == true 

&& leftSign == false && rightSign == true) { //如果小球沿右下方向

if(x == 180 && y == 30) { //若小球移动到了右上死角,也就是同时碰到了天花板和右壁

upSign = false ;

downSign = true ;

leftSign = true ;

rightSign = false ;

continue ;

}

if(x == 180 && y == 280) { //若小球移动到了右下死角,也就是同时碰到了地板和右壁

upSign = true ;

downSign = false ;

leftSign = true ;

rightSign = false ;

continue ;

}

do {

x ++ ;

y ++ ;

try {

Thread.sleep(30) ;

}catch(Exception e) {}

repaint() ;

}while(x != 180 && y != 280) ;

if(x == 180) { //在右下方向碰到右壁,改为左下方向

upSign = false ;

downSign = true ;

leftSign = true ;

rightSign = false ;

}

if(y == 280) { //在右下方向碰到地板;改为右上方向

upSign = true ;

downSign = false ;

leftSign = false ;

rightSign = true ;

}

}

if(upSign == false && downSign == true 

&& leftSign == true && rightSign == false) { //如果小球沿左下方向

if(x == 20 && y == 280) { //若小球移动到了左下死角,也就是同时碰到了地板和左壁

upSign = true ;

downSign = false ;

leftSign = false ;

rightSign = true ;

continue ;

}

if(x == 20 && y == 30) { //若小球移动到了左上死角,也就是同时碰到了地板和左壁

upSign = false ;

downSign = true ;

leftSign = false ;

rightSign = true ;

continue ;

}

do {

x -- ;

y ++ ;

try {

Thread.sleep(30) ;

}catch(Exception e) {}

repaint() ;

}while(x != 20 && y != 280) ;

if(x == 20) { //在左下方向碰到了左壁,改为右下方向

upSign = false ;

downSign = true ;

leftSign = false ;

rightSign = true ;

}

if(y == 280) { //在左下方向碰到了地板,改为左上

upSign = true ;

downSign = false ;

leftSign = true ;

rightSign = false ;

}

}

if(upSign == true && downSign == false 

&& leftSign == true && rightSign == false) { //如果小球沿左上方向

if(x == 20 && y == 280) { //若小球移动到了左下死角,也就是同时碰到了地板和左壁

upSign = true ;

downSign = false ;

leftSign = false ;

rightSign = true ;

continue ;

}

if(x == 20 && y == 30) { //若小球移动到了左上死角,也就是同时碰到了地板和左壁

upSign = false ;

downSign = true ;

leftSign = false ;

rightSign = true ;

continue ;

}

do {

x -- ;

y -- ;

try {

Thread.sleep(30) ;

}catch(Exception e) {}

repaint() ;

}while(x != 20 && y != 30) ;

if(x == 20) { //在左上方向碰到了左壁,改为右上方向

upSign = true ;

downSign = false ;

leftSign = false ;

rightSign = true ;

}

if(y == 30) { //在左上方向碰到了天花板,改为左下方向

upSign = false ;

downSign = true ;

leftSign = true ;

rightSign = false ;

}

}

if(upSign == true && downSign == false 

&& leftSign == false && rightSign == true) { //如果小球沿右上方向

if(x == 180 && y == 30) { //若小球移动到了右上死角,也就是同时碰到了天花板和右壁

upSign = false ;

downSign = true ;

leftSign = true ;

rightSign = false ;

continue ;

}

if(x == 180 && y == 280) { //若小球移动到了右下死角,也就是同时碰到了地板和右壁

upSign = true ;

downSign = false ;

leftSign = true ;

rightSign = false ;

continue ;

}

do {

x ++ ;

y -- ;

try {

Thread.sleep(30) ;

}catch(Exception e) {}

repaint() ;

}while(x != 180 && y != 30) ;

if(x == 180 && y != 30) { //在右上方向碰到了右壁,改为左上方向

upSign = true ;

downSign = false ;

leftSign = true ;

rightSign = false ;

}

if(y == 30 && x != 180) { //在右上方向碰到了天花板,改为右下方向

upSign = false ;

downSign = true ;

leftSign = false ;

rightSign = true ;

}

}

}

}

}

程序算法全部自己写没有参考书上的,书上的写的比较简短,还没有来及看。我的虽然长但是算法比较清晰,一开始比较顺利。在运行后有点小错误马上就能解决。但是在程序运行了一阵子后,我没看运行窗口,小球没了。。然后又运行几次确定是在死角那跑出去的。解决死角问题的算法不太好想,花了相当长的时间。最后确定的算法是当小球的坐标是死角坐标时,让小球沿相反的方向走。

下午及晚上考虑小球碰到一个墙就变色,两个小球飞行反弹。

不会动的王八也可以动起来了。


返回列表 返回列表
评论

    分享到