龟兔赛跑——JAVA双线程

思路:先创建一个动物类,创建龟兔线程,共用一个run,用currentThread()判断当前线程为何人
,Thing()为事件库,把所有事件写在里面,以后想加的话也可以加的。
所有结果都是随机产生的,每次运行都是不同的结果。
图片只弄了两个,开头和结尾

package test;

import java.util.Scanner;

//线程
class animals implements Runnable{
	Thread Turtle,Rabbit;//龟兔
	
	int WinT=1;//判断龟赢
	int WinR=1;//判断兔赢
	
	int random;//随机数字
	int distance[]= {1,1};//distance[0]是乌龟的路程,distance[1]是兔子的路程
	long sleep[]= {1000,1000};//sleep[0]是乌龟的睡眠时间,sleep[1]是兔子的睡眠时间
	
	/*int i;
	int WhoWin() {
		if(WinT>WinR) 
			return 1;
			//System.out.println("乌龟赢了");
		else return 2;
			//System.out.println("乌龟输了");
	}*/
	
	
	public animals() {
		Turtle=new Thread(this);
		Rabbit=new Thread(this);
		Turtle.setName("乌龟");
		Rabbit.setName("兔子");
	}
	
	public void run() {
		
		//当线程是龟时
		if(Thread.currentThread()==Turtle) {
		for(;distance[0]<100;) {
			if(WinR>WinT) {//判断兔子是否已经赢了
				Turtle.interrupt();
				break;
				}//if
			
			if(distance[0]%10==0&&distance[0]!=50) {
				Thing(Turtle, "乌龟", distance, sleep);
			}//IF
			else if(distance[0]==50){
				sleep[0]=1000;
				System.out.println(Thread.currentThread().getName()+"过河了,速度变成1m/s");
				}
			try {
				Thread.sleep(sleep[0]);
			} catch (InterruptedException e) {
				//e.printStackTrace();
			}//try-catch
			System.out.println(Thread.currentThread().getName()+" "+distance[0]);
			distance[0]++;
		}//for
		
		WinT++;//龟赢时+1
		
		if(WinT>WinR) {
			System.out.println("乌龟赢了");
			
			}
		else System.out.println("乌龟输了");
		
		}//Turtle
			
		//当线程是兔子的时候
		else if(Thread.currentThread()==Rabbit) {
			for(;distance[1]<100;) {
				if(WinT>WinR) {//判断龟是否已近赢了
					Rabbit.interrupt();
				break;
				}//if
			
			if(distance[1]%10==0&&distance[1]!=50) {		
				Thing(Rabbit, "兔子", distance, sleep);
			}
			else if(distance[1]==50){
				sleep[1]=1000;
				System.out.println(Thread.currentThread().getName()+"过河了,速度变成1m/s");
				}
			
			try {
				Thread.sleep(sleep[1]);
			} catch (InterruptedException e) {
				//e.printStackTrace();
			}//try-catch
			System.out.println(Thread.currentThread().getName()+" "+distance[1]);
			distance[1]++;
		}//for
		
		WinR++;//当兔子赢时+1
		if(WinR>WinT) {
			System.out.println("兔子赢了");
			
			}
		else System.out.println("兔子输了");
		}//Turtle
		System.out.println("end");
		
	}//run()
	
	//求速度
	double speech(long sleep) {
		return 1.0/(sleep/1000.0);
	}
	
	//判断下标返回自己的值的函数,t是下标,0为乌龟,1为兔子
	int TorR(Runnable target) {
		int me = 0;//t是下标,0为乌龟,1为兔子
		if(Thread.currentThread()==Turtle) me=0;
		else if(Thread.currentThread()==Rabbit) me=1;
		return me;
	}
	
	//判断下标,返回他人的值,,1为乌龟,0为兔子
	int harmful(Runnable target) {
		int h=0;
		if(Thread.currentThread()==Turtle) h=1;
		else if(Thread.currentThread()==Rabbit) h=0;
		return h;
	}
	
	//事件
	public void Thing(Runnable target,String name,int distance[],long sleep[]) {		
		int rannum=(int) (Math.random()*10);//随机产生数字
		switch(rannum) {
		case 0:stomach(target,name,distance,sleep);break;
		case 1:car(target,name,distance,sleep);break;
		case 2:food(target,name,distance,sleep);break;
		case 3:rod(target,name,distance,sleep);break;
		case 4:portal(target,name,distance,sleep);break;
		case 5:System.out.println("无事发生");
		case 6:mushroom(target,name,distance,sleep);break;
		case 7:banana(target,name,distance,sleep);break;
		case 8:DengChao(target,name,distance,sleep);break;
		case 9:HK(target,name,distance,sleep);break;
		default:System.out.println("开发中");
		
		}
	}
	
	//肚子痛
	void stomach (Runnable target,String name,int distance[],long sleep[]) {
		
		int me=TorR(target);//返回自己的值
		
		System.out.println(Thread.currentThread().getName()+"肚子痛了(当前速度为:"+speech(sleep[me])+"m/s)");
		random=(int) (Math.random()*2);
		if(random==1){
			sleep[me]=sleep[me]+500;
			System.out.println(Thread.currentThread().getName()+"强忍屎意(速度减少,当前速度为:"+speech(sleep[me])+"m/s)");
		}//b==1
		else if(random==0) {
			System.out.println(Thread.currentThread().getName()+"吃整肠丸(无事发生)");
		}//b==0		
		
	}//stomach函数
	
	//有车出现
	void car(Runnable target,String name,int distance[],long sleep[]) {
		
		int me=TorR(target);
		
		random=(int) (Math.random()*2);
		System.out.println(Thread.currentThread().getName()+"遇到了一辆车(当前速度为:"+speech(sleep[me])+"m/s)");
		if(random==1){
			distance[me]=distance[me]+3;
			System.out.println(Thread.currentThread().getName()+"坐上汽车,路径移动了3米");
		}//b==1
		else if(random==0) {
			sleep[me]=sleep[me]/2;
			System.out.println(Thread.currentThread().getName()+"无视汽车(坚强意志力导致速度增加,当前速度为:"+speech(sleep[me])+"m/s)");
		}//b==0		
	}
	
	//出现食物.
	void food(Runnable target,String name,int distance[],long sleep[]) {
		int me=TorR(target);//自己的值
		int h=harmful(target);//别人的值
		random=(int) (Math.random()*2);
		System.out.println(Thread.currentThread().getName()+"看见了麻辣烫(当前速度为:"+speech(sleep[me])+"m/s)");
		if(random==0) {
			try {
				Thread.sleep(2000);
			} catch (InterruptedException e) {
				// TODO 自动生成的 catch 块
				e.printStackTrace();
			}
			sleep[me]=sleep[me]/2;
			System.out.println(Thread.currentThread().getName()+"停了两秒来吃麻辣烫(速度增加,当前速度为:"+speech(sleep[me])+"m/s)");
		}//ramdom==0
		else if(random==1) {
			sleep[h]=sleep[h]+1000;
			System.out.println(Thread.currentThread().getName()+"向另一位选手进行“麻辣烫投毒”(另一位选手速度减少到"+speech(sleep[h])+"m/s)");
		}//random==1
	}//foor()
	
	//换位法杖
	void rod(Runnable target,String name,int distance[],long sleep[]) {
		int me=TorR(target);
		int h=harmful(target);
		random=(int) (Math.random()*2);
		System.out.println(Thread.currentThread().getName()+"捡到一个换位法杖(当前距离为:"+distance[me]+"m)");
		switch(random) {
		case 0:
			int i=distance[me];
			distance[me]=distance[h];
			distance[h]=i;
			System.out.println(Thread.currentThread().getName()+"换位成功,与另一位选手互换位置(自己距离:"+distance[me]+"m,另一人距离:"+distance[h]+"m)");break;
		case 1:System.out.println(Thread.currentThread().getName()+"使用失败,无事发生");break;
		}//switch
	}//rob
	
	//传送门
	void portal(Runnable target,String name,int distance[],long sleep[]) {
		int me=TorR(target);
		random=(int) (Math.random()*2);
		int chuansong=(int) (Math.random()*21);
		System.out.println(Thread.currentThread().getName()+"遇到了传送门(当前距离为:"+distance[me]+"m)");
		switch(random) {
		case 0:
			distance[me]=distance[me]+chuansong;
			System.out.println(Thread.currentThread().getName()+"传送前进了"+chuansong+"m(当前位置:"+distance[me]+"m)");break;
		case 1:
			distance[me]=distance[me]-chuansong;
			if(distance[me]<=0) {
				distance[me]=1;
				System.out.println("倒退到尽头啦,从起点开始");
				}
			System.out.println(Thread.currentThread().getName()+"传送后退了"+chuansong+"m(当前位置:"+distance[me]+"m)");break;
		}//switch
	}//portal
	
	//蘑菇
	void mushroom(Runnable target,String name,int distance[],long sleep[]) {
		int me=TorR(target);
		random=(int) (Math.random()*3);
		System.out.println(Thread.currentThread().getName()+"看到地上有个蘑菇(当前速度为:"+speech(sleep[me])+"m/s)");
		switch(random) {
		case 0:
			sleep[me]=sleep[me]/2;
			System.out.println(Thread.currentThread().getName()+"吃了“加速蘑菇”(速度增加,当前速度为:"+speech(sleep[me])+"m/s)");break;
		case 1:
			try {
				Thread.sleep(2000);
			} catch (InterruptedException e) {
				// TODO 自动生成的 catch 块
				e.printStackTrace();
			}
			System.out.println(Thread.currentThread().getName()+"吃了“眩晕蘑菇”(眩晕两秒)");break;
		case 2:
			sleep[me]=sleep[me]*2;
			System.out.println(Thread.currentThread().getName()+"吃了“减速蘑菇”(速度减少,当前速度为:"+speech(sleep[me])+"m/s)");break;
		}//switch
	}//mushroom
	
	//banana!!!!!
	void banana(Runnable target,String name,int distance[],long sleep[]) {
		int h=harmful(target);//别人的值
		random=(int) (Math.random()*2);
		System.out.println(Thread.currentThread().getName()+"丢香蕉皮");
		switch(random) {
		case 0:
			distance[h]=distance[h]+5;
			System.out.println("另一位选手踩香蕉皮向前划了5m(另一个选手距离为:"+distance[h]+"m/s)");break;
		case 1:
			sleep[h]=(long) (sleep[h]*1.5);
			System.out.println("另一位选手踩香蕉皮(另一个选手减速了,它的速度为:"+speech(sleep[h])+"m/s)");break;
		}//switch
	}//banana
	
	//遇到邓超
	void DengChao(Runnable target,String name,int distance[],long sleep[]) {
		
		System.out.println(Thread.currentThread().getName()+"遇到了邓超,停下来3s与其拍照");
		try {
			Thread.sleep(3000);
		} catch (InterruptedException e) {
			// TODO 自动生成的 catch 块
			e.printStackTrace();
		}
	}//邓超
	
	//变态假面
	void HK(Runnable target,String name,int distance[],long sleep[]) {
		int me=TorR(target);
		int h=harmful(target);
		random=(int) (Math.random()*2);
		System.out.println(Thread.currentThread().getName()+"遇到变态假面(当前速度为:"+speech(sleep[me])+"m/s)");
		switch(random) {
		case 0:
			sleep[me]=sleep[me]/2;
			System.out.println(Thread.currentThread().getName()+"被吓跑了(速度增加,当前速度为:"+speech(sleep[me])+"m/s)");break;
		case 1:
			sleep[h]=sleep[h]/2;
			System.out.println(Thread.currentThread().getName()+"打到了变态假面并获得了假面能力,吓到另一位选手了(另一选手速度增加,速度为:"+speech(sleep[h])+"m/s)");
			break;
		}//switch
	}//变态假面
	
	
	
}//animal

//main
public class TurtleAndRabbit {

	public static void main(String[] args) {
		System.out.println("开始");
		/*Scanner sc=new Scanner(System.in);
		System.out.println("请输入数字");
		double a=sc.nextDouble();*/
		
		
		animals d=new animals();
		d.Turtle.start();
		d.Rabbit.start();
		
		
	}
	
	
}

在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值