发表于: 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 ;
}
}
}
}
}
程序算法全部自己写没有参考书上的,书上的写的比较简短,还没有来及看。我的虽然长但是算法比较清晰,一开始比较顺利。在运行后有点小错误马上就能解决。但是在程序运行了一阵子后,我没看运行窗口,小球没了。。然后又运行几次确定是在死角那跑出去的。解决死角问题的算法不太好想,花了相当长的时间。最后确定的算法是当小球的坐标是死角坐标时,让小球沿相反的方向走。
下午及晚上考虑小球碰到一个墙就变色,两个小球飞行反弹。
不会动的王八也可以动起来了。
评论