概述
需求(题目):
随机生成5个不重复的英文字符,全大写,例如:KHXUA
用户输入字符循环开始猜字符,每次猜完以后提示,字母对的个数和位置对的个数
例如用户输入:NBKHA,提示字符对3个位置对1个
满分500分,猜错一次扣5分,位置全对即为正确
分析:
1.随机生成5个不重复的英文字符
2.用户输入(输入的是字符串,转化为字符数组)
3.用户输入和随机生成进行比较(字符对的个数,位置对的个数)
4.计算分数
在随机生成五个不重复的大写字母这个步骤中,我写了两个实现方式,其中一个是老师讲的,利用了开关原理
package cn.tedu.day1016;
import java.util.Arrays;
import java.util.Scanner;
public class TestGussLetters {
public static void main(String[] args) {
char[] arr = getGenerateLetters();
System.out.println(arr);//看着答案测试
System.out.println("游戏开始!请尽情猜测!");
//定义猜错的次数
int count = 0;
//定义一个死循环,让用户不停循环的猜,while(){}循环
while(true){
System.out.println("请输入你所猜的5个字母序列:(输入EXIT——退出游戏)");
char[] chars = getScannerLetters();//定义一个字符数组chars调用获取用户输入的字符串,转为字符数组,与系统的正确答案进行比较
String stt = String.valueOf(chars);//将字符数组再转换为字符串与EXIT比较,exit为字符串,字符数组与字符串无法比较
if(stt.equals("EXIT")){
System.out.println("真笨,游戏结束");
break;
}
System.out.println("您输入的是:"+stt);//直接写chars,因为是引用类型,存的是地址,显示的是地址
int[] result = check(arr,chars);//调用比较两个数组的方法,返回字符对的个数,位置对的个数
if(result[0] == arr.length){
int score = 100 * arr.length - count * 5;
System.out.println("恭喜您猜对了,分数为:"+score);
break;
}else {
count++;
System.out.println("位置对的个数为:"+result[0]+",字符对的个数为:"+result[1]);
}
}
}
//定义获取五个不重复的字母并存到数组的方法getGenerateLetters
public static char[] getGenerateLetters(){
/*
方式一:老师教的
*/
/*
1.生成要比较的数组,空数组
*/
char[] chs = new char[5];
/*
2.随机字符数组的范围,从这个数组抽取不同的元素放入到要生成比较的数组中,固定数组
*/
char[] letters = {'A','B','C','D','E','F','G','H','I'
,'J','K','L','M','N','O','P','Q','R','S','T',
'U','V','W','X','Y','Z'};
/*
3.创建中间数组,长度与固定数组一致,使用其下标与固定数组一样,用于随机生成的下标不重复
重复了,重新生成下标,获取新的元素
*/
/*
4.定义布尔类型的数组,存的是true和false,默认值为false,取到的下标改为true
*/
boolean[] flag = new boolean[letters.length];
/*
5.for循环控制 循环生成5个不重复的字符-->字母
*/
for (int i = 0; i < chs.length; i++) {//chs.length,要比较的数组的长度chs,为5
int index;//定义一个int类型,用来存下标的值
/*
6. do - while 循环,不定义循环的次数,一直循环,直到条件满足,结束循环
*/
do{
/*
7.随机生成下标,范围[0,26),用作与布尔类型数组flag[]比较,为false,则没重复,
把固定数组letters[]相对应下标元素取出,放到要比较的数组chs[]中
*/
index = (int)(Math.random()*letters.length);//Math.random(),范围为[0,1),为double,乘26,还为double,要强转为int类型
}while (flag[index] == true);
/*
8. flag[index] == true
循环条件: 随机生成的下标,所对应的布尔类型中的元素是否为false,
为true,则之前生成过,为避免重复,要再循环随机生成一个下标
为false,则之前没有生成过,为新的下标,把这个下标对应的固定数组letters的元素取出,赋给要比较的数组chs()
程序向下执行
*/
/*
9.为false,则之前没有生成过,为新的下标,把这个下标对应的固定数组letters的元素取出,赋给要比较的数组chs()
*/
chs[i] = letters[index];
/*
10.将中间数组flag[]的值改为true,如果下次生成了一样的下标,再循环生成一个新的下标
*/
flag[index] = true;
}
/*
方式二:自己写的
*/
/*for (int i = 0; i < chs.length; i++) {//循环生成5个字母
chs[i] = (char)(Math.random()*26+65);
for (int j = 0;j < i;j++){ //循环判断与之前生成的字母是否相同
if (chs[i] == chs[j]){
i--; //相同的话,就i减1,再生成一个新的数
break;
}
}
}*/
return chs;
}
//获取用户从控制台输入的字符串存到字符数组中
public static char[] getScannerLetters(){
/*
1.创建一个Scanner对象
*/
Scanner sca = new Scanner(System.in);
/*
2.定义一个数接收用户输入的字符串
*/
String str = sca.nextLine().toUpperCase();//获取输入的字符串并转换为大写
/*
3.将字符串转换为字符数组
*/
char[] input = str.toCharArray();//定义一个字符数组接收字符串
return input;
}
//对两个数组进行比较
/*
比较两个数组,结果要求 位置对的个数,字符对的个数, 个数,是整数,且两个
返回两个整数,有int[]数组来存储,
result[0]存储 位置对的个数
result[1]存储 字符对的个数
*/
public static int[] check(char[] chs,char[] input){
/*
1.结果 result[0]存储 位置对的个数
result[1]存储 字符对的个数
*/
int[] result = new int[2];//两个长度的int数组
/*
2.用for循环,利用下标对两个数组进行比较,就是嵌套for()循环
外循环,遍历随机生成的要比较的数组chs
内循环,遍历用户输入的字符数组
*/
for (int i = 0; i < chs.length; i++) {
for (int j = 0;j < input.length;j++){
if(chs[i] == input[j]){//匹配相对应下标的元素,即字母是否相同
result[1]++;//字符相同,个数+1
if(i == j){//再判断位置是否相同
result[0]++;//位置匹配在字符匹配基础上
}
}
}
}
return result;
}
}
测试结果:
猜错三次,3*5=15;扣15分,所以分数为485
最后
以上就是幸福仙人掌为你收集整理的java实现猜字母游戏,猜五个大写的字母的全部内容,希望文章能够帮你解决java实现猜字母游戏,猜五个大写的字母所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复