2016-03-18 回答
import java.awt.borderlayout;
import java.awt.color;
import java.awt.dimension;
import java.awt.graphics;
import java.awt.graphics2d;
import java.awt.event.mouseevent;
import java.awt.event.mouselistener;
import javax.swing.jframe;
import javax.swing.jpanel;
publicclass test extends jframe
{
/** serial */
privatestaticfinallongserialversionuid = 1l;
booleanmousetag = false;
booleancrosstag = false;
intepointx = 0;
intepointy = 0;
inttype = 0;
intxdir = 10;
intxdir1 = 21;
intydir1 = 113;
intxdir2 = 10;
intydir2 = 110;
jpanel panel = null;
jpanel carpanel = null;
thread drawthread = null;
thread carthread = null;
public test()
{
panel = new jpanel()
{
/** serial */
privatestaticfinallongserialversionuid = 1l;
@override
publicvoid paint(graphics g)
{
super.paint(g);
graphics2d g2 = (graphics2d) g;
g2.drawstring("你是我的小龟!", 200, 20);
// 十字路口
g2.drawline(138, 0, 138, 90);
g2.drawline(0, 90, 138, 90);
g2.drawline(0, 150, 138, 150);
g2.drawline(138, 150, 138, 270);
g2.drawline(330, 0, 330, 90);
g2.drawline(330, 90, 490, 90);
g2.drawline(330, 150, 330, 270);
g2.drawline(330, 150, 490, 150);
switch (type)
{
case 0:
g2.setcolor(color.red);
g2.fillroundrect(10, 10, 22, 22, 90, 90);
g2.setcolor(color.green);
g2.fillroundrect(10, 35, 22, 22, 90, 90);
g2.setcolor(color.yellow);
g2.fillroundrect(10, 60, 22, 22, 90, 90);
break;
case 1:
g2.setcolor(color.green);
g2.fillroundrect(10, 10, 22, 22, 90, 90);
g2.setcolor(color.red);
g2.fillroundrect(10, 35, 22, 22, 90, 90);
g2.setcolor(color.yellow);
g2.fillroundrect(10, 60, 22, 22, 90, 90);
break;
case 2:
g2.setcolor(color.green);
g2.fillroundrect(10, 10, 22, 22, 90, 90);
g2.setcolor(color.yellow);
g2.fillroundrect(10, 35, 22, 22, 90, 90);
g2.setcolor(color.red);
g2.fillroundrect(10, 60, 22, 22, 90, 90);
break;
default:
break;
}
// car
g2.setcolor(color.green);
g2.filloval(xdir1, ydir1, 8, 8);
g2.setcolor(color.black);
g2.filloval(xdir2, ydir2, 12, 12);
// mouse round
if (mousetag)
{
g2.setcolor(color.red);
g2.drawoval(epointx - 12, epointy - 35, 20, 20);
g2.drawline((xdir1 + xdir2) / 2 + 6, (ydir2 + 6),
epointx - 6, epointy - 25);
xdir1 = (xdir1 + xdir2) / 2 + 6;
ydir1 = (ydir1 + 6);
}
if (crosstag)
{
g2.setcolor(color.red);
g2.drawstring("哎哟!", xdir1, ydir1);
}
}
};
drawthread = new thread()
{
@override
publicvoid run()
{
while (true)
{
try
{
thread.sleep(1000);
if (type == 0)
{
type = 1;
}
elseif (type == 1)
{
type = 2;
}
elseif (type == 2)
{
type = 0;
}
panel.repaint(0, 0, 50, 100);
}
catch (interruptedexception e)
{
e.printstacktrace();
}
}
}
};
add(panel, borderlayout.center);
if (drawthread.getstate() == thread.state.runnable)
{
return;
}
else
{
drawthread.start();
}
// ///
carthread = new thread()
{
@override
publicvoid run()
{
while (true)
{
try
{
// 自由开,遇到障碍物拐弯
freeruncar();
thread.sleep(50);
repaint();
}
catch (interruptedexception e)
{
}
}
}
privatevoid freeruncar()
{
// 前进方向
if (epointx > xdir2)
{
xdir1 = xdir2 + 8;
if (xdir2 > 480)
xdir2 = 0;
xdir2 += 1;
}
elseif (epointx 480)
xdir2 = 0;
xdir2 -= 1;
}
elseif (epointx == xdir2)
{
xdir1 = xdir2;
if (xdir2 > 480)
xdir2 = 0;
xdir2 -= 1;
}
if (epointy - 25 > ydir2)
{
ydir1 = ydir2 + 8;
if (ydir2 > 330)
ydir2 = 0;
ydir2 += 1;
}
elseif (epointy - 25 330)
ydir2 = 0;
ydir2 -= 1;
}
elseif (epointy - 25 == ydir2)
{
ydir1 = ydir2;
if (ydir2 > 330)
ydir2 = 0;
ydir2 -= 1;
}
// 碰撞检测 138, 90/ 138, 150/330, 90/330, 150
if (xdir1 <= 138 && ydir1 <= 90)
{
crosstag = true;
}
elseif (xdir1 <= 138 && ydir1 >= 150)
{
crosstag = true;
}
elseif (xdir1 >= 330 && ydir1 <= 90)
{
crosstag = true;
}
elseif (xdir1 >= 330 && ydir1 >= 150)
{
crosstag = true;
}
else
{
crosstag = false;
}
if (crosstag)
{
epointx = 250;
}
}
};
if (carthread.getstate() == thread.state.runnable)
{
return;
}
else
{
carthread.start();
}
// 鼠标thread
final thread mousethread = new thread()
{
@override
publicvoid run()
{
while (true)
{
if (mousetag)
{
}
}
}
@override
publicvoid interrupt()
{
mousetag = false;
}
};
if (mousethread.getstate() == thread.state.runnable)
{
return;
}
else
{
mousethread.start();
}
this.addmouselistener(new mouselistener()
{
@override
publicvoid mouseclicked(mouseevent e)
{
//system.out.println(e.getx() + ", " + e.gety());
}
@override
publicvoid mousereleased(mouseevent e)
{
epointx = e.getpoint().x;
epointy = e.getpoint().y;
mousetag = false;
}
@override
publicvoid mousepressed(mouseevent e)
{
epointx = e.getpoint().x;
epointy = e.getpoint().y;
mousetag = true;
}
@override
publicvoid mouseexited(mouseevent e)
{
}
@override
publicvoid mouseentered(mouseevent e)
{
}
});
}
publicstaticvoid main(string[] args)
{
test test = new test();
test.setsize(new dimension(500, 300));
test.setlocationrelativeto(null);
test.setdefaultcloseoperation(jframe.exit_on_close);
test.setresizable(false);
test.setvisible(true);
}
}