模拟回合制打怪游戏
注:这是随机数的提升练习,不会生成随机数的点这里。
一、问题具体描述
打怪游戏:玩家、怪物
玩家:血量值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+"点血量值");
}
}
}
看一下执行结果,会出一点小意外:
我们会发现,最后一个回合中,怪物血量已经减少为负值了,即已经挂掉了。
但是最后还是攻击了玩家,“诈尸”了?
按照道理,本不应该再攻击玩家了。
(2)那刚才编写的代码究竟哪里出错了呢?
:cloud_with_lightning: 当我们减少怪物血量值之后,如果怪物已经挂了,此时,若并没有让循环停止,下面“怪物攻击玩家”的代码将继续执行。
我们可以在“玩家攻击怪物”之后的代码添加一个判断“怪物是否已经挂掉”。
//判断怪物是否已经挂掉
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;
}
}
}
}
运行结果:
可以看到,怪物没有“诈尸”了!
显示结果正常。
(3)代码调整。
此时“break”有调整循环的作用。
当怪物或玩家的血量值<=0的时候,循环就会停止。
那么此时while中的条件判断就没有意义了。
可以写一个恒成立的条件:true。
最终代码:
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;
}
}
}
}
运行结果展示(每个人每次运行结果不同很正常,因为是随机生成):