java实现猜字母游戏,猜五个大写的字母

需求(题目):
随机生成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 

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值