小白求答,写了个猜字母的代码,可是它识别不了我的答案,求大神解惑

import java.util.Scanner;

public class Guess {

public static void main(String[] args) {
    // TODO Auto-generated method stub
    //第一步:定义数据结构:
    /*Input:*/
    char[] chs = new char[5];//保存随机生成的5个字母
    char[] input = new char[5];//保存用户输入的5个字母
    /*Output:*/
    //第几次尝试,猜对几个字母,几个字母的位置正确
    int times=0,right=0,position=0;
    int score=0;//分数
    char[] realtime=new char[5];//保存实时显示猜对位置字母的数组
    /*隐含变量*/
    String inStr=" ";//临时保存从控制台录入的字符串
    /*process*/
    generate(chs);
    /*打桩测试*/
    for(int i=0;i<chs.length;i++){
        System.out.print(chs[i]+",");
    }
    /*主程序循环*/
    Scanner sc=new Scanner(System.in);//只有从控制台获得用户输入就用Scanner
    System.out.println("游戏开始...");
    //循环
    /*字符串不是基本类型,做等值比较,不能用==
     * 应该使用Java专门的API比较字符串是否相等
     * 语法:字符串1.equals(字符串2);
     */
    while(!inStr.equals("EXIT")&&position!=chs.length){
        System.out.println("请输入5个字母,按回车继续...(exit-退出)");
        //Step2:获得用户输入:
        /*获得用户输入的字符串:sc.next()——返回输入整个字符串
         * 防止、去掉空格:字符串.trim()——去掉字符前后空格
         * 将输入的字符串中所有的小写字母,统一转换为大写字母:
         *      字符串.toUpperCase()
         */
        inStr=sc.next().trim().toUpperCase();
        //Stpe3:判断:如果用户输入的不是exit,才继续
        if(!inStr.equals("EXIT")){
            //Stpe4:将字符串,转化为字符数组,保存到input数组中
            //将字符串转换为字符数组的API:字符数组=字符串.toCharArray()
            input=inStr.toCharArray();
            //Step5:比较chs和input两个数组的相似程度
            //得到right:猜对几个字母
            //得到position:猜对位置的有几个
            //得到realtime:猜对位置的实时数组
            int[] result=compare(chs,input,realtime);
            right=result[0];
            position=result[1];
            //Step6:如果没有都猜对
            if(position!=chs.length){
                //将尝试次数+1
                times++;
        System.out.println("第"+times+"次尝试:"+"猜对了"
                        +right+"个字母,"+"其中"+position+
                        "个位置正确"); 
        for(int i=0;i<realtime.length;i++){
            System.out.print(realtime[i]+",");
        }
        System.out.println();
            }       
        }
    }
    /*如果推出循环,只有两种情况:
     * 1用户输入exit,主动退出,输入欢迎下次再来
     * 2用户猜对了(position==chs.length)
     * 计算得分:100*chs.length-10*times
     * 输出,恭喜你猜对了
     * */
    if(inStr.equals("EXIT")){
        System.out.println("欢迎下次再来!");
    }else{
        score=100*chs.length-10*times;
        System.out.println("恭喜您,猜对了,本次得分:"+score);
    }
}
/**
 * 比较两个数组
 * 1.求出猜对几个字母,有几个字母的位置正确
 * 2.将比较结果分别保存在返回值数组的第一个元素和第二个元素中
 * 3.将位置正确的字母在realtime中实时显示
 * @param chs 随机生成的目标数组
 * @param input 用户输入的数组
 * @param realtime 实时显示猜对位置的元素数组
 * @return 1个数:[0]保存猜对字母的个数
 *               [1]保存猜对位置的个数
 */
public static int[] compare(char[]chs,char[]input,char[]realtime){
    //数组的第一个元素[0],表示有几个相同的字母
    //数组第二个元素[1],表示位置有几个相同的字母
    int[] result=new int[2];//新建两个整数元素的数组
    /*
     * 反复取出input数组中每个元素和chs数组中每个元素比较
     * 只有input中的元素和chs中的元素相等
     * 对result[0]+1,表示猜对了一个字母
     * 立刻判断此时的位置是否相同(i==j)
     * 如果i==j
     * 对result[1]+1,表示猜对了一个位置
     * 将才对的字母,填入realtime数组相同的位置
     */
    for(int i=0;i<input.length;i++){
        for(int j=0;i<chs.length;i++){
            if(input[1]==chs[j]){
                result[0]++;
                if(i==j){
                    result[1]++;
                    realtime[i]=input[i];
                }
                break;
            }
    }
    }
    return result;
}
    /**
     * 自动生成5个不重复的字母,直接保存在数组chs中
     * @param chs:传入一个空数组。
     *      方法内,对数组的更改,直接作用于原数组
     */

    public static void generate(char[] chs){
        /*
         * 反复生成多个字母,就要用循环:
         * 循环变量:int i=0;
         * 循环条件:i<chs.length;
         * 迭代循环变量:无规律
         *      只有生成字母不重复时,才+1!
         * 循环体:随机生成65~90之间的1个整数。
         * 判断刚生成的整数,在数组中是否重复
         * 如果没有重复,就加入数组chs中,并且i++
         * (否则什么都不做,再生成一个新字母,再比较)
         */
        //因为循环次数和迭代规律不确定,所以使用while循环
        int i = 0;//定义循环变量
        while(i<chs.length){
            //随机生成65-90之间的整数
            int r=(int)(Math.random()*(90-65+1)+65);
            //判断r是否在数组中包含
            //定义1个布尔类型变量,表示r是否可用。默认是ture.
            boolean enable=true;
            //循环遍历数组的每个元素,和r比。
            //只要任意1个元素等于r,则改变变量enable=false,表示r不可用。
            for(int j=0;j<i;j++){
                if(chs[j]==r){
                    enable=false;
            }
        }
            if(enable){//如果r可用
                chs[i]=(char)r;
                i++;
        }
        }   
    }
}

9个回答

**_for(int j=0;j<chs.length;j++){//第一部分
                if(input[i]==chs[j]){//第二部分**_
coolsunxu
coolsunxu 回复weixin_38249353: 我也是上学期刚学,也会犯些低级错误,哈哈,多注意就行啦
接近 3 年之前 回复
weixin_38249353
BUG的缔造者 回复coolsunxu: 羞愧Ing
接近 3 年之前 回复
coolsunxu
coolsunxu 你的第二個循環裡寫的是i,但是應該是j
接近 3 年之前 回复
weixin_38249353
BUG的缔造者 大神还在么,恕我眼拙,除了i这个错误,还有哪里,我仅修改了这个的情况下,只能识别第一个字母和位置,然后复制粘贴你的代码没毛病!!!可是我找不到其他的不同了,求送佛送到西!
接近 3 年之前 回复
weixin_38249353
BUG的缔造者 啊!原来是i和1没分清!谢谢大神!呜~蠢爆了
接近 3 年之前 回复

把代码粘贴到这个“插入代码片”这里,这样清晰,不然无法看啊

weixin_38249353
BUG的缔造者 刚刚才知道有这功能0 0!已发了!
接近 3 年之前 回复
 public static int[] compare(char[]chs,char[]input,char[]realtime){
        //数组的第一个元素[0],表示有几个相同的字母
        //数组第二个元素[1],表示位置有几个相同的字母
        int[] result=new int[2];//新建两个整数元素的数组
        /*
         * 反复取出input数组中每个元素和chs数组中每个元素比较
         * 只有input中的元素和chs中的元素相等
         * 对result[0]+1,表示猜对了一个字母
         * 立刻判断此时的位置是否相同(i==j)
         * 如果i==j
         * 对result[1]+1,表示猜对了一个位置
         * 将才对的字母,填入realtime数组相同的位置
         */
        for(int i=0;i<input.length;i++){
            for(int j=0;j<chs.length;j++){//第一部分
                if(input[i]==chs[j]){//第二部分
                    result[0]++;
                    if(i==j){
                        result[1]++;
                        realtime[i]=input[i];
                    }
                    break;
                }
        }
        }
        return result;
    }

已修改,这里
图片说明

你的代码有点乱呀,注释都和代码交错了,建议发完整的

weixin_38249353
BUG的缔造者 您看一下我发的图
接近 3 年之前 回复

这是用eclipse写的。。。。图片图片图片图片图片图片图片

你不是可以粘贴复制的吗,就在这里呀,图片没法复制粘贴呀

import java.util.Scanner;

public class Guess {

public static void main(String[] args) {
    // TODO Auto-generated method stub
    //第一步:定义数据结构:
    /*Input:*/
    char[] chs = new char[5];//保存随机生成的5个字母
    char[] input = new char[5];//保存用户输入的5个字母
    /*Output:*/
    //第几次尝试,猜对几个字母,几个字母的位置正确
    int times=0,right=0,position=0;
    int score=0;//分数
    char[] realtime=new char[5];//保存实时显示猜对位置字母的数组
    /*隐含变量*/
    String inStr=" ";//临时保存从控制台录入的字符串
    /*process*/
    generate(chs);
    /*打桩测试*/
    for(int i=0;i<chs.length;i++){
        System.out.print(chs[i]+",");
    }
    /*主程序循环*/
    Scanner sc=new Scanner(System.in);//只有从控制台获得用户输入就用Scanner
    System.out.println("游戏开始...");
    //循环
    /*字符串不是基本类型,做等值比较,不能用==
     * 应该使用Java专门的API比较字符串是否相等
     * 语法:字符串1.equals(字符串2);
     */
    while(!inStr.equals("EXIT")&&position!=chs.length){
        System.out.println("请输入5个字母,按回车继续...(exit-退出)");
        //Step2:获得用户输入:
        /*获得用户输入的字符串:sc.next()——返回输入整个字符串
         * 防止、去掉空格:字符串.trim()——去掉字符前后空格
         * 将输入的字符串中所有的小写字母,统一转换为大写字母:
         *      字符串.toUpperCase()
         */
        inStr=sc.next().trim().toUpperCase();
        //Stpe3:判断:如果用户输入的不是exit,才继续
        if(!inStr.equals("EXIT")){
            //Stpe4:将字符串,转化为字符数组,保存到input数组中
            //将字符串转换为字符数组的API:字符数组=字符串.toCharArray()
            input=inStr.toCharArray();
            //Step5:比较chs和input两个数组的相似程度
            //得到right:猜对几个字母
            //得到position:猜对位置的有几个
            //得到realtime:猜对位置的实时数组
            int[] result=compare(chs,input,realtime);
            right=result[0];
            position=result[1];
            //Step6:如果没有都猜对
            if(position!=chs.length){
                //将尝试次数+1
                times++;
        System.out.println("第"+times+"次尝试:"+"猜对了"
                        +right+"个字母,"+"其中"+position+
                        "个位置正确"); 
        for(int i=0;i<realtime.length;i++){
            System.out.print(realtime[i]+",");
        }
        System.out.println();
            }       
        }
    }
    /*如果推出循环,只有两种情况:
     * 1用户输入exit,主动退出,输入欢迎下次再来
     * 2用户猜对了(position==chs.length)
     * 计算得分:100*chs.length-10*times
     * 输出,恭喜你猜对了
     * */
    if(inStr.equals("EXIT")){
        System.out.println("欢迎下次再来!");
    }else{
        score=100*chs.length-10*times;
        System.out.println("恭喜您,猜对了,本次得分:"+score);
    }
}
/**
 * 比较两个数组
 * 1.求出猜对几个字母,有几个字母的位置正确
 * 2.将比较结果分别保存在返回值数组的第一个元素和第二个元素中
 * 3.将位置正确的字母在realtime中实时显示
 * @param chs 随机生成的目标数组
 * @param input 用户输入的数组
 * @param realtime 实时显示猜对位置的元素数组
 * @return 1个数:[0]保存猜对字母的个数
 *               [1]保存猜对位置的个数
 */
public static int[] compare(char[]chs,char[]input,char[]realtime){
    //数组的第一个元素[0],表示有几个相同的字母
    //数组第二个元素[1],表示位置有几个相同的字母
    int[] result=new int[2];//新建两个整数元素的数组
    /*
     * 反复取出input数组中每个元素和chs数组中每个元素比较
     * 只有input中的元素和chs中的元素相等
     * 对result[0]+1,表示猜对了一个字母
     * 立刻判断此时的位置是否相同(i==j)
     * 如果i==j
     * 对result[1]+1,表示猜对了一个位置
     * 将才对的字母,填入realtime数组相同的位置
     */
    for(int i=0;i<input.length;i++){
        for(int j=0;i<chs.length;i++){
            if(input[1]==chs[j]){
                result[0]++;
                if(i==j){
                    result[1]++;
                    realtime[i]=input[i];
                }
                break;
            }
    }
    }
    return result;
}
    /**
     * 自动生成5个不重复的字母,直接保存在数组chs中
     * @param chs:传入一个空数组。
     *      方法内,对数组的更改,直接作用于原数组
     */

    public static void generate(char[] chs){
        /*
         * 反复生成多个字母,就要用循环:
         * 循环变量:int i=0;
         * 循环条件:i<chs.length;
         * 迭代循环变量:无规律
         *      只有生成字母不重复时,才+1!
         * 循环体:随机生成65~90之间的1个整数。
         * 判断刚生成的整数,在数组中是否重复
         * 如果没有重复,就加入数组chs中,并且i++
         * (否则什么都不做,再生成一个新字母,再比较)
         */
        //因为循环次数和迭代规律不确定,所以使用while循环
        int i = 0;//定义循环变量
        while(i<chs.length){
            //随机生成65-90之间的整数
            int r=(int)(Math.random()*(90-65+1)+65);
            //判断r是否在数组中包含
            //定义1个布尔类型变量,表示r是否可用。默认是ture.
            boolean enable=true;
            //循环遍历数组的每个元素,和r比。
            //只要任意1个元素等于r,则改变变量enable=false,表示r不可用。
            for(int j=0;j<i;j++){
                if(chs[j]==r){
                    enable=false;
            }
        }
            if(enable){//如果r可用
                chs[i]=(char)r;
                i++;
        }
        }   
    }
}


你的copare函数里写的是

 for(int i=0;i<input.length;i++){
        for(int j=0;i<chs.length;i++){
            if(input[1]==chs[j]){

我帮你改的是这样的

 for(int i=0;i<input.length;i++){
        for(int j=0;j<chs.length;j++){
            if(input[i]==chs[j]){

就是第二层循环你把j写成了i

这代码似曾相识啊!!!!!!

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问

相似问题

2
编程小白,关于spring的问题
1
新人小白完全看不懂pycharm目录结构
1
asp.net Mvc 怎么连接 sql server并在网页上显示 小白求附上代码
3
Android小白,如何单独查看某一个功能模块的相对应的那段代码
4
源代码中的System.in这样写有何意义?
4
新人小白,求C++完整代码
11
本人前端小白,求推荐前端的开发工具,扩展性高一点,可以自己写插件或者附加功能,主要是代码提示功能
2
堆栈cookie检测 代码检测到基于堆栈的缓冲区溢出,小白不懂程序哪里出错了,求解答~
2
急求!!C++小白一枚,用ODBC读取EXCLE文件,自己建立的EXCLE文件打不开
1
我想在下列代码中获取动态的存储权限该怎么写,求大神,新手小白看不明白
1
小白提问几个关于C51单片机程序的问题
2
怎么处理可以使浏览器识别自己写的标签啊?写个插件之类的可以么?本人小白,求前辈指教
4
(小白)JS/JQ怎么实现点击一个小图标隐藏一个div并且图标更换为另一个
3
小白求问VS2017如何写C++程序
1
小白求问:安装了PhpStorm之后还需要什么准备工作?
4
网页登录界面 验证账号密码如何跳过数据库,我小白一个,求完整的字符串
2
c语言问题修改错误代码我小白
1
嵌入式小白求学习,如何将ART移植到openwrt里面?求详细过程
3
新手小白求教:简单图像的外观检测识别方法
2
windows C++调用阿里云实时语音识别的问题