java多线实现龟兔赛跑
一,故事背景
龟兔赛跑是一则家喻户晓的寓言故事,兔子自以为速度快而骄傲自满,在比赛中偷懒睡觉;乌龟则一步一个脚印,坚持不懈地前进,最终赢得了比赛。
二,项目题目要求
--普通格,共100格
龟:每次随机移动1至3格
兔子:每次随机移动1至6格
每20格会随机出现以下功能格各一次(不会在同一格内出现两种或两种以上功能)
功能格:(**和^^可以连续执行,@@和==不能连续执行)
**幸运星格:选手可再行动一次
@@地雷格:兔子回到上数两个地雷格,龟回到上一地雷格(若后方无地雷格则回到起点)
==传送格:兔子到达下一传送格,龟到达下数两个传送格(若前方无传送格则到达终点)
||树格:兔子停止三次行动
^^下坡格:龟前进10格
三,java代码实现思路
1.定义比赛与参与者
- Turtle 类(乌龟):具有前进速度和当前位置的属性,以及前进的方法。
- Rabbit]类(兔子):同样具有速度、位置属性和前进方法,但还包含可能偷懒的逻辑。
2. 比赛过程模拟
- 创建一个Map循环来模拟比赛的时间流逝。
- 创建一个Game来完成在每次循环中,乌龟和兔子根据各自的速度和状态前进一定距离。
3. 判定比赛结果
- 比较乌龟和兔子的最终位置,确定谁先到达终点。
四、核心代码片段展示
//Animal
package Guitu;
public abstract class Animal {
protected int position;
protected String name;
protected int maxStep;
public void play(){
run();
check();
lucky();
check();
down();
check();
tree();
check();
chuansong();
check();
printMap();
}
public void check(){
if (position >= 99){
System.out.println("游戏结束" + name + "赢了");
//主动退出程序
System.exit(0);
}
}
//每调用一次走一次
public void run(){
int rand = (int)(Math.random()*maxStep)+1;
position = position+rand;
System.out.println(name + "本次走" + rand + "格,当前位置在:" + position);
}
public void lucky(){
if (Map.map[position].equals("**")){
System.out.println(name + "遇到了幸运格,再走一次");
run();
}
}
public abstract void dilei();
public abstract void chuansong();
public void tree() {
}
public void down(){
}
public void printMap() {
for (int i = 0; i < Map.map.length; i++) {
if (i==position){
System.out.print(name);
}else{
System.out.print(Map.map[i] );
}
}
System.out.println();
}
}
//Game
package Guitu;
import java.util.Scanner;
public class
Game {
public static void main(String[] args) {
Animal t = new Turtle();
Animal r = new Rabbit();
Scanner sc = new Scanner(System.in);
while (true) {
t.play();
r.play();
sc.nextLine();
}
}
}
//Map
package Guitu;
import java.util.Arrays;
public class Map {
public static String[] map= new String[100];
public static boolean check(int[] arr, int a) {
for (int i = 0; i < arr.length; i++) {
if (arr[i] == a) {
return false;
}
}
return true;
}
static {
Arrays.fill(map, "--");
int[] history = new int[5];
Arrays.fill(history, -1);
String[] b = {"**","@@","==","||","^^"};
for (int j = 0;j<5;j++){
for (int i = 0; i < 5; i++) {
int a = (int) (Math.random() * 20);
while (!check(history,a)){
a = (int) (Math.random() * 20);
}
history[i] = a;
map[a+20*j] = b[i];
}
}
for(Object o : map){
System.out.print(o);
}
}
}
//Rabbit
package Guitu;
public class Rabbit extends Animal {
private int stopCount;
private boolean sleep = false;
public Rabbit() {
name = "兔子";
maxStep = 6;
}
@Override
public void dilei() {
if(Map.map[position].equals("@@")){
if (position<40){
position=0;
System.out.println(name + "遇到了地雷,被炸回起点");
return;
}
int count = 0;
for(int i = position-1;i>0;i--){
if(Map.map[i].equals("@@")){
count++;
}
if (count == 2){
position=i;
break;
}
}
System.out.println(name + "遇到了地雷,被炸到了" + position + "位置");
}
}
@Override
public void chuansong() {
if (Map.map[position].equals("==")){
if(position>80){
position=99;
System.out.println(name+"遇到了传送格,直接送到了终点");
return;
}
for (int i = position+1; i < 100; i++) {
if (Map.map[i].equals("==")){
position=i;
break;
}
}
System.out.println(name+"遇到了传送格,传送到了"+position+"位置");
}
}
public void tree(){
if (Map.map[position].equals("||")){
if (!sleep){
stopCount = 3;
System.out.println("兔子遇到了树,停止三次移动");
sleep = true;
}
}
}
public void run(){
if(stopCount>0){
stopCount--;
System.out.println(name + "正在睡觉"+(3-stopCount) + "轮");
}else{
sleep = false;
super.run();
}
}
}
//Trutle
package Guitu;
public class Turtle extends Animal{
public Turtle(){
name = "乌龟";
maxStep = 3;
}
@Override
public void dilei() {
if(Map.map[position].equals("@@")){
if (position <20){
position = 0;
System.out.println(name + "遇到了地雷,被炸回起点");
return;
}
for (int i = position-1; i > 0; i--){
if (Map.map[i].equals("@@")){
position = i;
break;
}
}
五、代码运行结果与分析
运行上述代码,可能会得到不同的结果。有时兔子因为偷懒而让乌龟赢得比赛,有时兔子保持清醒从而率先到达终点,这很好地模拟了故事中的不确定性。
六、总结
通过用 Java 实现龟兔赛跑,我们更加深入地理解了面向对象编程的概念,同时也体会到了坚持和努力的重要性,就像乌龟在比赛中始终不放弃,最终获得成功。希望这个小小的编程实践能激发您对编程的兴趣和创造力。