7-3 植物大战僵尸(简单版) java

植物大战僵尸作为一款曾经风靡全球的小游戏,是当代无数大学生的童年回忆,现在就让我们对它的回忆更深刻一点吧!

假设有一只僵尸与戴夫的家门呈一条直线(视为X轴),忽略僵尸可能会摔倒,豌豆可能会卡壳等一切影响因素,将僵尸、植物

戴夫看作是 "一个大小可忽略的点"即可。

home  plant                                                       <- zombi
|-----|-----------------------------------------------------------------|
0    100                                                               L  (cm)

如上所示,一开始僵尸在戴夫家门口正前方坐标L(cm)处,戴夫在坐标100处种了一颗豌豆射手,无论僵尸站的有多远,豌豆射手每隔两秒都会发射一枚豌豆攻击僵尸,如果僵尸走到豌豆射手面前还没被击倒的话,豌豆射手则会被僵尸一脚踹飞(踹的过程耗时忽略不计)。这时你以为这样戴夫的脑袋瓜子就完蛋了?嘿嘿,那可不一定!戴夫会拿起头上的平底锅,等到僵尸抵达坐标0的那一刻,用尽全身力气必定给僵尸爆头一击,然后瘫倒在地。如果此时僵尸还没被击倒......oh~NO!

求僵尸被击倒(血条被清空)的一瞬间,所在的x轴坐标值,或者是......oh~NO! + 僵尸剩余血量

输入格式:

第一行给出五个正整数,依次为 N ,M ,L,K ,V

  1. N 表示豌豆射手每发豌豆的威力 (豌豆飞行过程耗时忽略不计) ,[1,20]
  2. M 表示戴夫手拿平底锅,一击爆头的威力,[1,100]
  3. L 表示僵尸一开始的里戴夫家门口的距离 ,[10^3,10^7]
  4. K 为僵尸的初始血量 ,[100,10^7]
  5. V 为僵尸每秒钟前进的距离,[1,500]
N M L K V

输出格式:

如果僵尸被击倒,则输出僵尸被击倒时的x坐标

反之输出......oh~NO!+僵尸剩余血量

输入样例1:

2 10 1000 800 1

输出样例1:

200

输入样例2:

1 10 1000 800 1

输出样例2:

......oh~NO!340

我的代码

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        Integer N,M,L,K,V,time;
        N=sc.nextInt();
        M=sc.nextInt();
        L=sc.nextInt();
        K=sc.nextInt();
        V=sc.nextInt();
        time=0;
        //缩小数据量
        num n=new num(N,M,L,K,V,time);
        n.start();
        N=n.N;
        M=n.M;
        L=n.L;
        K=n.K;
        V=n.V;
        //借助初始化之后的数据来创建各个对象
        time=n.time;
        zombi js=new zombi(K,L,V);
        dave me=new dave(M);
        plant zw=new plant(N);
        while (true){
            time++;
            //僵尸一秒一步
            js.run();
            if(js.length< zw.length){
                js.kick(zw);
            }
            //两秒一颗豌豆
            if(time%2==0&&zw.tag){
                zw.attack(js);
            }
            if(js.length<=0){
                me.pot(js);
                if(js.blood<=0){
                    System.out.printf("%d",0);
                }else {
                    System.out.printf("......oh~NO!%d\n",js.blood);
                }
                break;
            }
            if(js.blood<=0){
                System.out.printf("%d",js.length);
                break;
            }
        }
    }

}
//僵尸类,有踹飞植物的功能,往前行走的功能, 属性血条,距离戴夫的距离,每一步的步数
class zombi{
    public int blood;
    public int length;
    int step;
    void run(){
        length-=step;
    }
    void kick(plant it){
        it.tag=false;
    }

    public zombi(int blood, int length, int step) {
        this.blood = blood;
        this.length = length;
        this.step = step;
    }
}
//植物类,功能吐出豌豆,属性是否被僵尸干掉,伤害量,初始种植距离,题目中恒为100
class plant{
    public final int length=100;
    public int hurt;
    public boolean tag=true;
    void attack(zombi it){
        it.blood-=hurt;
    }

    public plant(int hurt) {
        this.hurt = hurt;
    }
}
//戴夫类,属性平底锅伤害,挥出平底锅的功能
class dave{
    int hurt;
    void pot(zombi it){
        it.blood-=hurt;
    }

    public dave(int hurt) {
        this.hurt = hurt;
    }
}

//存储输入的数据和初始化数据的类
class num{
    public Integer N,M,L,K,V,time;
    public num(Integer n, Integer m, Integer l, Integer k, Integer v, Integer time) {
        N = n;
        M = m;
        L = l;
        K = k;
        V = v;
        this.time = time;
    }
    //写完之后第一次提交发现步数小,距离很大的时候会超时,于是补了一个初始化函数,减少一些重复且无效的步骤
    void start(){
        if(L>1000){
            if(K/((L-100)/V+1)/N>0){
                time=(L-100)/V;
                L-=time*V;
                K-=time/2*N;
            }else {
                time=K/N-1;
                L-=time*V;
                K-=time/2*N;
            }
        }
    }
}

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值