1.题目分析:
1.1 进入程序后,勇士自定义自己的生命值(提示生命值需要在1-10之中),如果超过最大10、小于最小值1 ,抛出自定义LimiteException异常,输出“错误生命值1314,终止勇敢者游戏!”,程序终止。
1.2 正确输入自己的生命值之后,开始进行闯关(系统已设立20个单词,此时随机选取6个出来)。
1.3 从选取的6个单词中,随机取出一个单词,显示出其的单词首和尾,中间补充间隔字符(例如:window——>你的第X个单词为w****w)。
1.4 输入单个字母进行猜测。
1.5 输入错误的话(例如window中,我输了k)。则生命值减1,输出“输入错误,你现在的生命值为X”。
1.6 并随机选择已准备好的鼓励语句组“我和你只差一个脚步的距离了,赶快解救我吧;我和你相隔千山万水,再好好努力;等你一万年,勇士加油吧;”中一条鼓励游戏者。在随机选择中,出现数组溢出异常,输出“勇士,天降空难,再减掉一个生命值,还剩生命值 xx次 ”。 (例如:我语句组总共有6句,生成随机值的范围为1-10,就是说有40%的几率会给再次扣血。)
1.7 输入正确,继续输入。
1.8. 如果符合给出的答案,则显示成功信息,程序结束输出“游戏成功,恭喜晋级第X轮,勇士”。
1.9 生命值为0时结束游戏,输出“游戏OVER,等待勇士再次冲锋”,程序结束。大于0则继续,直到通过完X轮。若完成X轮,输出“通过成功,恭喜勇士”,程序结束。
2.代码部分
import java.util.Random;
import java.util.Scanner;
public class braverGame {
public static Random r; //随机选择单词组中的一个单词序号或随机选取的鼓励语句的位置
public static String[] ss; //存放一组的单词
public static String s; //随机选择的单词
public static String[] word; //当前猜测的单词
public static String[] status; //存放选取的猜测单词
public static int healthPoint; //生命值
public static int flag; //生命值是否正确输入的标记
public static int flag1; //生命值为0的标志
public static int flag2; //记录输入单词的位置
public static int round=5; //多少关
public static String[] encouragements = {"我和你只差一个脚步的距离了,赶快解救我吧",
"我和你相隔千山万水,再好好努力",
"等你一万年,勇士加油吧"};//存放鼓励的语句
public static String[] words = {"write", "that", "operation", "loving", "program",
"exit", "watermelon", "insert", "cafeteria", "company",
"python", "refactor", "java", "window", "computer",
"history", "problem", "attribute", "invent", "codify"}; //存放猜测的单词
public static void main(String[] args) throws LimiteException {
//1.判断输入的生命值是否要求
flag = inithealthPoint();
if (flag != 0) {
flag1 = 1; //此时生命值不为0,勇士是否gameover的标志
//2.随机选取round个单词,进行至多round轮的挑战
initWordGroud(round);
//作弊查看单词
for (String q:ss){
System.out.println(q);
}
//3.进行单词猜测
if (guess(round)==0){
System.out.println("你的生命值到底了,游戏OVER,等待勇士再次冲锋");
}
else {
System.out.println("通过成功,恭喜勇士");
}
}
}
//用户进行单词猜测
public static int guess(int round){
for (int i = 0;i<round;i++){
System.out.println("勇士开启第"+(i+1)+"轮冒险");
flag2 = 1; //每次初试位置都在第二个上,例如python中p****n,起始在第二个*的位置
int lenth1 = ss[i].length(); //获取此单词的长度
word = ss[i].split(""); //将字符串转为换数组
status=new String[lenth1]; //根据单词的长度,分配数组的大小
init(lenth1);
System.out.println("");
while (true){
print(lenth1);
Scanner sc=new Scanner(System.in); //用户输入字符进行猜测
String c=sc.nextLine();
iscontain(c); //判断是否符合
if (flag2==lenth1-1){ //当标志移到数组的最后,可得知已经完成了此轮的猜测
if (i!=round-1){
System.out.println("晋级下轮");
}
break;
}
else if (flag1==0){
return 0;
}
}
}
return 1;
}
//判断用户是否猜对
public static void iscontain(String c) {
if (word[flag2].equals(c)){
status[flag2]=c;
flag2++; //猜对,标志移一位
System.out.println("输入成功");
}
else {
healthPoint --;
System.out.println("输入错误,你现在的生命值为:"+healthPoint);
if (healthPoint==0){
flag1=0;
return;
}
try {
int q = r.nextInt(5); //随机生成个0-4的值
System.out.println(encouragements[q]); //抽取一句鼓励的话,没越界的话,正常鼓励,越界的话(大于2),减生命值
}
catch (Exception e){
healthPoint --;
System.out.println("勇士,天降空难,再减掉一个生命值,还剩生命值:"+healthPoint);
if (healthPoint==0) {
flag1 = 0;
}
}
}
}
//打印出此单词的猜测过程
public static void print(int lenth) {
System.out.print("(Guess) Enter a letter in word ");
for(int i=0;i<lenth;i++) {
System.out.print(status[i]);
}
System.out.print(" > ");
}
//对用户输入的生命值进入判断,是否有字符错误或者越界
public static int inithealthPoint() {
Scanner sc = new Scanner(System.in);
System.out.print("勇士,请输入您的生命值(1-10):");
try {
healthPoint = Integer.parseInt(sc.nextLine());
} catch (Exception e) {
System.out.println(e);
System.out.println("您没有正确输入数字");
return 0;
}
if (healthPoint > 10 || healthPoint < 1) {
try {
throw new LimiteException("错误生命值1314,终止勇敢者游戏!");
} catch (LimiteException e) {
e.printStackTrace();
return 0; //结束方法
}
}
return 1;
}
//从单词组中取出一定量的单词,用以后面的猜测
public static void initWordGroud(int num) { //num代表要取出单词组的个数
ss = new String[num];
r = new Random();
int num1 = 0; //标记下移
while (true) {
s = words[r.nextInt(words.length)];
if(num1==0){
ss[num1] = s;
num1 += 1;
}
else {
if(isCound(s,ss,num1)==1){
ss[num1]=s;
num1 += 1;
}
}
if (num == num1) { //取够了,就退出循环
break;
}
}
}
//判断从单词组取出的单词,是否有重复
public static int isCound(String s1,String []s2, int num){
for (int i=0;i<num;++i){
if (s2[i].equals(s1)){
return 0;
}
}
return 1;
}
//初试化猜测单词的形式,例如window ————> w****w
public static void init(int length) {
status[0]=word[0];
status[length-1]=word[length-1];
for(int i=1;i<length-1;i++) {
status[i]="*";
}
}
// 异常类
static class LimiteException extends Exception {
//添加一个空参数的构造方法
public LimiteException(){
super();
}
/*
添加一个带异常信息的构造方法
查看源码发现,所有的异常类都会有一个带异常信息的构造方法,方法内部会调用父类带异常信息的构造方法,让父类来处理这个异常信息
*/
public LimiteException(String message){
super(message);
}
}
}
3 运行结果:
3.1 正常运行
3.2 输入的生命值越界
3.3 挑战失败