JavaGame-The Tortoise and the Hare(龟兔赛跑)

大家好我是新人猫咪!!!!!!!

Java龟兔赛跑是一个经典的寓言故事,常常用作教学示例来展示Java程序的基本结构和控制流程。在这个模拟中,通常会有一个乌龟和兔子作为两个角色,代表了不同的速度。程序通常包含如下步骤:

  1. 定义一个"兔子"类和一个"乌龟"类,它们都实现了一个共同的"动物"接口,有移动的距离和比赛的方法。

  2. 初始化兔子和乌龟,并设置初始位置和速度差异。

  3. 使用while循环,每一步让两者按照各自的速度移动一段距离。例如,兔子每次比乌龟快很多,但比赛中兔子可能会选择小憩。

  4. 判断比赛条件,比如当乌龟到达终点或兔子休息结束,就停止比赛并计算结果。

通过这个简单的例子,学生可以学习到如何创建类、封装属性、继承、多态以及基本的控制结构,如if-else和循环。

条件:

--普通格,共100格

龟:每次随机移动1至3格
兔子:每次随机移动1至6格

每20格会随机出现以下功能格各一次(不会在同一格内出现两种或两种以上功能)

功能格:(**和^^可以连续执行,@@和==不能连续执行)
**幸运星格:选手可再行动一次
@@地雷格:兔子回到上数两个地雷格,龟回到上一地雷格(若后方无地雷格则回到起点)
==传送格:兔子到达下一传送格,龟到达下数两个传送格(若前方无传送格则到达终点)
||树格:兔子停止三次行动
^^下坡格:龟前进10格

下面是猫咪写的代码大家可以参考一下:

我们要在项目中准备一个guitu包包和五个类,地图类,以动物为抽象类,还有兔兔类,和龟龟类分别继承动物类,最后还有一个Game类内含main方法来启动游戏

地图类是最基本的

它应该先被写好但是同时也是逻辑最难的,考验大家的算法能力

我们首先将数组中的数据填充为基本格,然后定义一个功能格数组里面有五种功能格

最难的是一个嵌套循环,用于生成一个长度为5的整数数组,并为每个数组元素赋予一个随机数。外部的for循环控制生成5个数组,内部的for循环用于为每个数组元素生成随机数。

内部的随机数生成部分使用了Math类的random()方法,该方法会生成一个位于0到1之间的随机小数。代码中通过将该随机小数乘以20再加上20乘以外部循环变量i的值,得到了一个介于20i到20(i+1)之间的随机整数。此处的目的是使得每个数组元素的值都在固定的范围内。

之后通过一个while循环,使用check方法来检查生成的随机数是否已经存在于数组中。如果存在,则重新生成随机数,直到随机数不重复为止。check方法的作用是遍历数组,检查数组中是否存在与随机数相等的元素。

一旦得到一个不重复的随机数,将其赋值给数组元素,并使用该随机数作为索引,从map数组中取出对应的function元素,并将其存储在map[rand]中。

最终,在外部的for循环执行完毕后,会生成5个不重复的随机数数组,并通过map数组记录每个随机数对应的function元素。

静态块的作用是因为它在程序加载的时候就初始化地图数据,如果不这样做每一次摁下回车地图都会重新加载导致地图不唯一(哭哭)

package guitu;
import java.util.Arrays;
public class Map {
    static String[] map=new String[100];
    public static boolean check(int[] arr,int rand){
        for (int a:arr){
            if (a==rand){
                return true;
            }
        }
        return false;
    }
    //使用静态块,在程序加载的时候就初始化地图数据
    static  {
        Arrays.fill(map,"--");
        String[] function={"**","==","@@","||","^^"};
        for (int i=0;i<5;i++){
            int[] arr=new int[5];
            for (int j=0;j<5;j++){
                int rand=(int) (Math.random()*20+20*i);
                while (check(arr,rand)){
                    rand=(int) (Math.random()*20+20*i);
                }
                arr[j]=rand;
                map[rand]=function[j];
            }
        }

    }
}

定义了一个抽象类Animal。Animal类有以下属性:position表示当前位置,name表示动物的名字,maxStep表示最大步数。

Animal类有以下方法:

  1. play()方法:表示玩游戏的过程。在play()方法中依次调用了run()、check()、lucky()、check()、dilei()、chuansong()、check()、down()、check()、tree()和printMap()方法。

  2. check()方法:检查是否达到终点位置(99)。如果达到终点位置,则输出游戏结束,并退出程序。

  3. run()方法:每调用一次走一步。随机生成一个介于1和maxStep之间的数,将position增加这个数,并输出当前位置。

  4. lucky()方法:检查当前位置是否是幸运格,如果是,则输出遇到了幸运格,并再次调用run()方法。

  5. dilei()方法:抽象方法,需要由子类实现。

  6. chuansong()方法:抽象方法,需要由子类实现。

  7. tree()方法:空方法,可以由子类覆盖实现。

  8. down()方法:空方法,可以由子类覆盖实现。

  9. printMap()方法:打印地图。根据当前位置将动物的名字放在对应位置上,然后打印地图。

总体来说,这段代码是一个抽象的动物类,定义了动物的一些共同行为和属性,具体的行为需要由子类来实现。

package guitu;

public  abstract class Animal {
    protected int position;
    protected String name;
    protected int maxStep;

    public void play(){
        run();
        check();
        lucky();
        check();
        dilei();
        chuansong();
        check();
        down();
        check();
        tree();
        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 += 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();
    }
}

定义了一个名为"Rabbit"的公共类,继承了"Animal"类。

这个类有私有成员变量"stopCount"和"sleep",分别用来记录兔子停止的次数和是否在睡觉。

构造函数"Rabbit"将兔子的名字设为"兔子",最大步数设为6。

"public void dilei()"方法是重写了父类的方法,用来处理兔子遇到障碍物时的行为。如果兔子遇到了"@",并且当前位置小于40,兔子将返回起点位置为0;否则,兔子会往前找,直到找到两个连续的"@",兔子会停在第二个"@"的位置。

"public void chuansong()"方法是重写了父类的方法,用来处理兔子遇到传送门时的行为。如果兔子遇到了"==",并且当前位置大于等于80,兔子将前往终点位置为99;否则,兔子会往后找,直到找到下一个"==",兔子会传送到那个位置。

"public void tree()"方法用来处理兔子遇到树的行为。如果兔子遇到了"||",且当前不在睡觉状态,兔子将休息3步。

因为兔兔会睡觉所以要重写兔兔run的方法

"public void run()"方法用来控制兔子的行为。如果兔子正在休息,停止次数会减少;否则,兔子将继续前进。

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(name+"遇到了树格,停止移动三次");
                sleep=true;
            }
        }
    }

    public void run(){
        if (stopCount>0){
            stopCount--;
            System.out.println(name+"正在睡觉,这是第"+(3-stopCount)+"轮");
        }else {
            sleep=false;
            super.run();
        }
    }
}

定义了一个名为Tortoise(乌龟)的类,该类继承自Animal(动物)类。

构造方法Tortoise():设置乌龟的名称为"乌龟",最大步数为3。

重写的方法dilei():当乌龟所在地图位置为"@@"时,如果当前位置在20之前,则将位置设置为0;否则,从当前位置-1开始向前搜索,直到找到下一个"@@"位置,并将位置设置为该位置。

重写的方法chuansong():当乌龟所在地图位置为"=="时,如果当前位置在60之后,则将位置设置为99;否则,从当前位置+1开始向后搜索,统计出现的"=="的个数,当个数等于2时,将位置设置为该位置。

方法down():当乌龟所在地图位置为"^^"时,将位置向下移动10个位置。

package guitu;

public class Tortoise extends Animal {

    public Tortoise() {
        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;
                }
            }
            System.out.println(name + "遇到了地雷被炸回了" + position + "位置");
        }
    }

    @Override
    public void chuansong() {
        if (Map.map[position].equals("==")) {
            if (position >= 60) {
                position = 99;
                System.out.println(name + "遇到了传送格,被传送到终点");
                return;
            }
            int count = 0;
            for (int i = position + 1; i < 100; i++) {
                if (Map.map[i].equals("==")) {
                    count++;
                }
                if (count == 2) {
                    position = i;
                    break;
                }
            }
            System.out.println(name + "遇到了传送格被传送到了" + position + "位置");
        }
    }

    public void down() {
            if (Map.map[position].equals("^^")){
                position=position+10;
                System.out.println(name+"遇到下坡路,前进10格");
            }
    }
}

最后输入回车就可以玩游戏了哟!!!!

记得创建对象才可以调用方法!!

package guitu;

import java.util.Scanner;

public class Game {
    public static void main(String[] args) {

        Animal r=new Rabbit();
        Animal t=new Tortoise();

        Scanner sc=new Scanner(System.in);
        while (true){
            r.play();
            t.play();
            sc.nextLine();
        }
    }
}

这是最后的游戏效果哦~

很不可思议最后兔子居然赢了

其实这个游戏所有的功能格都是对乌龟有利的

乌龟赢得游戏的概率还是很大的

好了代码到这里就结束了

专一的猫咪在这里

祝大家生活如诗如画,每一天都充满阳光和希望;工作顺心如意,步步高升;家人朋友健康快乐,幸福满溢。愿你的明天比今天更美好,未来的路上笑容常伴。

  • 24
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
好的,我可以为您介绍一下 Java 编写的龟兔赛跑模拟。 首先,我们需要定义两个角色——乌龟和兔子,他们的基本属性包括速度、位置等信息。可以用一个类来表示他们: ```java public class Animal { private String name; // 名称 private int speed; // 速度 private int position; // 位置 // 构造函数 public Animal(String name, int speed) { this.name = name; this.speed = speed; this.position = 0; } // 睡觉 public void sleep() { System.out.println(name + "在睡觉..."); } // 行动 public void move() { int distance = speed; // 行进距离等于速度 position += distance; // 更新位置 System.out.println(name + "跑了" + distance + "米,当前位置:" + position + "米"); } // 获取位置 public int getPosition() { return position; } } ``` 接下来,我们需要模拟比赛的场景。可以使用一个类来表示比赛,包括两个角色和比赛的逻辑: ```java public class Race { private Animal tortoise; // 乌龟 private Animal hare; // 兔子 // 构造函数 public Race() { tortoise = new Animal("乌龟", 5); hare = new Animal("兔子", 10); } // 开始比赛 public void start() { int totalDistance = 100; // 总距离 while (tortoise.getPosition() < totalDistance && hare.getPosition() < totalDistance) { tortoise.move(); hare.move(); if (hare.getPosition() - tortoise.getPosition() > 10) { tortoise.sleep(); // 兔子领先10米以上,乌龟睡觉 } } System.out.println("比赛结束,"); if (hare.getPosition() >= totalDistance && tortoise.getPosition() >= totalDistance) { System.out.println("双方同时到达终点,平局!"); } else if (hare.getPosition() >= totalDistance) { System.out.println("兔子获胜!"); } else { System.out.println("乌龟获胜!"); } } } ``` 最后,我们可以在 `main()` 函数中创建比赛对象并开始比赛: ```java public static void main(String[] args) { Race race = new Race(); race.start(); } ``` 这样,我们就成功地用 Java 编写了一个龟兔赛跑模拟程序。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值