Java基础--用程序模拟打怪游戏

简介: Java基础--用程序模拟打怪游戏

模拟回合制打怪游戏

注:这是随机数的提升练习,不会生成随机数的点这里

一、问题具体描述

打怪游戏:玩家、怪物

玩家:血量值315

怪物:血量值500

玩家和怪物互砍。

玩家每次攻击怪物产生5\~8点伤害,怪物每次攻击玩家产生3\~5点伤害。

采用回合制(玩家和怪物互砍一刀为一个回合)。

一方挂掉,游戏结束。

要求:用程序模拟战斗过程。

二、分析

(1)可以定义两个变量,分别代表玩家(315)和怪物(500)。

(2)打斗过程是反复执行的,就要用到循环。

循环成立的条件:玩家和怪物都活着。

循环里面执行:玩家和怪物互砍。

(3)玩家攻击怪物

①生成玩家攻击力(5~8)。

②怪物血量值对应减少。

③输出:玩家攻击怪物,怪物掉了多少血量,还剩多少血量。

(4)怪物攻击玩家

①生成怪物攻击力(3~5)。

②玩家血量值对应减少。

③输出:怪物攻击玩家,玩家掉了多少血量,还剩多少血量。

(5)循环之后,判断玩家和怪物是否都活着,若都活着,就再循环,否则结束循环。

(6)游戏结束。

三、代码编写

(1)根据上面的分析,我们不难写出代码:

package Test1;

public class demo2 {
    public static void main(String[] args) {
        /* 打怪游戏 */
        //1、定义两个变量,分别赋值相应的血量值
        int w=315; //玩家
        int g=500; //怪物
        int i=1;//回合计数变量
        //2、用循环模拟打斗回合
        while(w>0 && g>0){ //循环条件是两者都活着
            //循环里面执行两者互砍
            System.out.println("----------第"+i+"回合----------");
            i++;//每一次回合之后,让回合计数变量加一
        //3、玩家攻击怪物
            //生成玩家攻击力(5~8)
            int wg=(int)(Math.random()*4)+5;
            //减少怪物血量值
            g-=wg;
            //输出结果
            System.out.println("玩家攻击怪物,怪物掉了"+wg+"点血量值,"+"还剩"+g+"点血量值");
        //4、怪物攻击玩家
            //生成怪物攻击力(3~5)
            int gw=(int)(Math.random()*3+3);
            //减少玩家血量值
            w-=gw;
            //输出结果
            System.out.println("怪物攻击玩家,玩家掉了"+gw+"点血量值,"+"还剩"+w+"点血量值");
        }
    }
}

看一下执行结果,会出一点小意外:

image-20220309173048383

我们会发现,最后一个回合中,怪物血量已经减少为负值了,即已经挂掉了。

但是最后还是攻击了玩家,“诈尸”了?

按照道理,本不应该再攻击玩家了。

(2)那刚才编写的代码究竟哪里出错了呢?

:cloud_with_lightning: 当我们减少怪物血量值之后,如果怪物已经挂了,此时,若并没有让循环停止,下面“怪物攻击玩家”的代码将继续执行。

image-20220309173732772

我们可以在“玩家攻击怪物”之后的代码添加一个判断“怪物是否已经挂掉”

        //判断怪物是否已经挂掉
        if(g<=0){
            //让循环停止,并输出结果
            System.out.println("怪物挂掉,玩家胜利!");
            break; //可以在循环中使用哦。在此处作用:停止循环继续执行
        }

同理,在“怪物攻击玩家”之后的代码添加一个判断“玩家是否已经挂掉”

        //判断玩家是否已经挂掉
        if(w<=0){
            //让循环停止,并输出结果
            System.out.println("玩家挂掉,怪物胜利!");
            break; 
        }

整体代码:

package Test1;

public class demo2 {
    public static void main(String[] args) {
        /* 打怪游戏 */
        //1、定义两个变量,分别赋值相应的血量值
        int w=315; //玩家
        int g=500; //怪物
        int i=1;//回合计数变量
        //2、用循环模拟打斗回合
        while(w>0 && g>0){ //循环条件是两者都活着
            //循环里面执行两者互砍
            System.out.println("----------第"+i+"回合----------");
            i++;//每一次回合之后,让回合计数变量加一
        //3、玩家攻击怪物
            //生成玩家攻击力(5~8)
            int wg=(int)(Math.random()*4)+5;
            //减少怪物血量值
            g-=wg;
            //输出结果
            System.out.println("玩家攻击怪物,怪物掉了"+wg+"点血量值,"+"还剩"+g+"点血量值");

            //判断怪物是否已经挂掉
            if(g<=0){
                //让循环停止,并输出结果
                System.out.println("怪物挂掉,玩家胜利!");
                break; //可以在循环中使用哦。在此处作用:停止循环继续执行
            }

        //4、怪物攻击玩家
            //生成怪物攻击力(3~5)
            int gw=(int)(Math.random()*3+3);
            //减少玩家血量值
            w-=gw;
            //输出结果
            System.out.println("怪物攻击玩家,玩家掉了"+gw+"点血量值,"+"还剩"+w+"点血量值");
            
            //判断玩家是否已经挂掉
            if(w<=0){
                //让循环停止,并输出结果
                System.out.println("玩家挂掉,怪物胜利!");
                break;
            }
        }
    }
}

运行结果:

image-20220309174715273

可以看到,怪物没有“诈尸”了!

显示结果正常。

(3)代码调整。

此时“break”有调整循环的作用。

当怪物或玩家的血量值<=0的时候,循环就会停止。

那么此时while中的条件判断就没有意义了。

可以写一个恒成立的条件:true

image-20220309175639897

最终代码:

package Test1;

public class demo2 {
    public static void main(String[] args) {
        /* 打怪游戏 */
        //1、定义两个变量,分别赋值相应的血量值
        int w=315; //玩家
        int g=500; //怪物
        int i=1;//回合计数变量
        //2、用循环模拟打斗回合
        while(true){ //循环条件是两者都活着
            //循环里面执行两者互砍
            System.out.println("----------第"+i+"回合----------");
            i++;//每一次回合之后,让回合计数变量加一
        //3、玩家攻击怪物
            //生成玩家攻击力(5~8)
            int wg=(int)(Math.random()*4)+5;
            //减少怪物血量值
            g-=wg;
            //输出结果
            System.out.println("玩家攻击怪物,怪物掉了"+wg+"点血量值,"+"还剩"+g+"点血量值");

            //判断怪物是否已经挂掉
            if(g<=0){
                //让循环停止,并输出结果
                System.out.println("怪物挂掉,玩家胜利!");
                break; //可以在循环中使用哦。在此处作用:停止循环继续执行
            }

        //4、怪物攻击玩家
            //生成怪物攻击力(3~5)
            int gw=(int)(Math.random()*3+3);
            //减少玩家血量值
            w-=gw;
            //输出结果
            System.out.println("怪物攻击玩家,玩家掉了"+gw+"点血量值,"+"还剩"+w+"点血量值");

            //判断玩家是否已经挂掉
            if(w<=0){
                //让循环停止,并输出结果
                System.out.println("玩家挂掉,怪物胜利!");
                break;
            }
        }
    }
}

运行结果展示(每个人每次运行结果不同很正常,因为是随机生成):

image-20220309175827906

相关文章
|
24天前
|
Java
Java猜数字游戏
Java猜数字游戏
17 2
|
1月前
|
Java Android开发
基于Java的坦克大战游戏的设计与实现
基于Java的坦克大战游戏的设计与实现
14 0
|
1月前
|
Java
java程序导出堆文件
java程序导出堆文件
|
1月前
|
SQL Oracle Java
sql文件批处理程序-java桌面应用
sql文件批处理程序-java桌面应用
25 0
|
1月前
|
存储 Java
Java:编写程序,计算两个数的和、差、积、商和余数。docx
Java:编写程序,计算两个数的和、差、积、商和余数。docx
|
14天前
|
Java Maven
【Java报错】显示错误“Error:java: 程序包org.springframework.boot不存在“
【Java报错】显示错误“Error:java: 程序包org.springframework.boot不存在“
35 3
|
2天前
|
Java
网页运行java程序cheerpj
网页运行java程序cheerpj
26 0
|
29天前
|
Java
elasticsearch使用java程序添加删除修改
elasticsearch使用java程序添加删除修改
9 0
|
1月前
|
Java
java程序
re是java运行时的环境,包含jvm和运行时所需要的类库 jdk是java开的程序包,包含jre和开发人员使用的工具 jvm就是我们常说的java虚拟机,他是整个java实现跨平台的最核心 的部分,所有的java程序会首先被编译为.class的类文件,这种类文 件可以在虚拟机上执行。也就是说class并不直接与机器的操作系统 相对应,而是经过虚拟机间接与操作系统交互,由虚拟机将程序解释 给本地系统执行。 只有jvm还不能成class的执行,因为再解释class的时候jvm需要调用 解释所需要的类库lib,而jre包含lib类库。jvm屏蔽了与具体操作系 统平台相关的信息,使得java程
17 0
|
1月前
|
算法 Java
游戏匹配系统的奥秘,Java代码揭秘
游戏匹配系统的奥秘,Java代码揭秘
29 1