JAVA多线实现龟兔赛跑

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 实现龟兔赛跑,我们更加深入地理解了面向对象编程的概念,同时也体会到了坚持和努力的重要性,就像乌龟在比赛中始终不放弃,最终获得成功。希望这个小小的编程实践能激发您对编程的兴趣和创造力。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值