?? fish.java
字號(hào):
//Fish定義了一條魚(yú)游動(dòng)的一些參量以及如何在Panel上顯示魚(yú)
package fish;
import java.util.Random;
public class Fish extends Thread{
private Random rand = new Random();
int fishID; //魚(yú)的ID號(hào)
int x; //該魚(yú)的x坐標(biāo)
int y; //該魚(yú)的y坐標(biāo)
int width; //該魚(yú)使用的圖片的寬度
int height; //該魚(yú)使用的圖片的高度
//隨機(jī)產(chǎn)生魚(yú)初始游的方向
int down = rand.nextInt(10)%2;//down=1 : 向下游;down=0 : 向上游
int right = rand.nextInt(10)%2;//right=1: 向右游
//用來(lái)控制刷新周期,sleepTime越小,兩次刷新之間的時(shí)間間隔就越小,從而速度就越快
private int sleepTime = rand.nextInt(50);
//隨機(jī)產(chǎn)生斜游角度比x:y=angle,即在x方向上游動(dòng)angle次之后才在y方向上移動(dòng)一次
private int angle = rand.nextInt(5)+2;
//隨機(jī)產(chǎn)生魚(yú)上下左右游動(dòng)的最大上限,即振幅
private int xSwing = rand.nextInt(1500);
private int ySwing = rand.nextInt(800);
private int countXSwing = 0;//x方向上振幅計(jì)數(shù)
private int countYSwing = 0;//y方向上振幅計(jì)數(shù)
//一個(gè)數(shù)組,包含了上述除了魚(yú)ID的所有參量
private int[] fishStates = new int[12];
boolean isRunning;
private FishPanel panel;
public Fish(int fishID,int x,int y,int width,int height,FishPanel panel,boolean isRunning){
this.fishID = fishID;
this.x = x;
this.y = y;
this.width = width;
this.height = height;
this.panel = panel;
this.isRunning = isRunning;
this.start();
}
public Fish(int fishID,int[] state,FishPanel panel,boolean isRunning){
this.fishID = fishID;
this.x = state[0];
this.y = state[1];
this.width = state[2];
this.height = state[3];
this.down = state[4];
this.right = state[5];
this.sleepTime = state[6];
this.angle = state[7];
this.xSwing = state[8];
this.ySwing = state[9];
this.countXSwing = state[10];
this.countYSwing = state[11];
this.panel = panel;
this.isRunning = isRunning;
this.start();
}
public void run()
{
while(isRunning)
{
computeX();
computeY();
try
{
sleep(sleepTime);//sleepTime
}
catch(Exception ex){
ex.printStackTrace();
}
panel.repaint();
}
}
public void reStart(){
this.isRunning = true;
}
public void halt()
{
this.isRunning = false;
}
public void computeX(){
if(right == 1){
if(countXSwing == xSwing)
{//判斷是否到右端邊框或達(dá)到最大振幅
right=0;
reset('x');
}
if(x >= panel.getWidth()){
this.x = -width;
StringBuffer buffer = new StringBuffer();
int[] states = this.getFishStates();
for(int i = 0 ;i < states.length;i ++){
if(i!=0)buffer.append(FishConstants.ARRAY_SEPARATOR);
buffer.append(states[i]);
}
buffer.append('\n');
panel.messageManager.sendMessage(Integer.toString(this.fishID),buffer.toString());
//reset('x');
this.halt();
}
x++;
}
else
{
if(countXSwing == xSwing)
{//判斷是否到左端邊框或達(dá)到最大振幅
right=1;
reset('x');
}
if(x+width <= 0){
this.x = panel.getWidth();
StringBuffer buffer = new StringBuffer();
int[] states = this.getFishStates();
for(int i = 0 ;i < states.length;i ++){
if(i!=0)buffer.append(FishConstants.ARRAY_SEPARATOR);
buffer.append(states[i]);
}
buffer.append('\n');
panel.messageManager.sendMessage(Integer.toString(this.fishID),buffer.toString());
this.halt();
}
x--;
}
countXSwing++;
}
//計(jì)算魚(yú)的上下游動(dòng)
public void computeY(){
//判斷隨機(jī)數(shù)l是否為0,是則水平游動(dòng),否則計(jì)算角度
if(countXSwing%angle == 0){
if(down == 1)//x former
{//down=1表示向下游且當(dāng)x++或x--了l次后,y++
if( countYSwing == ySwing)
{//判斷是否到底或上下振幅游滿否
down=0;
reset('y');
}
if(y >= panel.getHeight()){
this.y = -height;
StringBuffer buffer = new StringBuffer();
int[] states = this.getFishStates();
for(int i = 0 ;i < states.length;i ++){
if(i!=0)buffer.append(FishConstants.ARRAY_SEPARATOR);
buffer.append(states[i]);
}
buffer.append('\n');
panel.messageManager.sendMessage(Integer.toString(this.fishID),buffer.toString());
this.halt();
//reset('y');
}
y++;
}
else if(countXSwing%angle == 0)//x former
{//當(dāng)向上游且當(dāng)x++或x--了l次之后,y--
if(countYSwing == ySwing)
{
down=1;
reset('y');
}
if(y+height <= 0)
{
this.y = panel.getHeight();
StringBuffer buffer = new StringBuffer();
int[] states = this.getFishStates();
for(int i = 0 ;i < states.length;i ++){
if(i!=0)buffer.append(FishConstants.ARRAY_SEPARATOR);
buffer.append(states[i]);
}
buffer.append('\n');
panel.messageManager.sendMessage(Integer.toString(this.fishID),buffer.toString());
this.halt();
//reset('y');
}
y--;
}
countYSwing++;
}
}
public void reset(char direction){
//魚(yú)游動(dòng)狀態(tài)改變后重新生成各項(xiàng)數(shù)值
if(direction=='x')
{
xSwing = rand.nextInt(1500);//重新生成新的左右振幅(判斷依據(jù):x)
countXSwing = 0; //左右振幅計(jì)數(shù)清0
}
else
{
ySwing = rand.nextInt(800);//重新生成新的上下振幅(判斷依據(jù):y)
countYSwing = 0;//上下振幅計(jì)數(shù)清0
}
sleepTime = rand.nextInt(50);//重新生成新的速度
angle = rand.nextInt(5)+2;//重新生成新的角度比
}
public int[] getFishStates(){
fishStates[0] = this.x;
fishStates[1] = this.y;
fishStates[2] = this.width;
fishStates[3] = this.height;
fishStates[4] = this.down;
fishStates[5] = this.right;
fishStates[6] = this.sleepTime;
fishStates[7] = this.angle;
fishStates[8] = this.xSwing;
fishStates[9] = this.ySwing;
fishStates[10] = this.countXSwing;
fishStates[11] = this.countYSwing;
return fishStates;
}
}
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -