BUG的缔造者 2017-04-16 14:30 采纳率: 60%
浏览 1149
已采纳

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

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条回答 默认 最新

  • coolsunxu 2017-04-16 15:27
    关注
    **_for(int j=0;j<chs.length;j++){//第一部分
                    if(input[i]==chs[j]){//第二部分**_
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(8条)

报告相同问题?

悬赏问题

  • ¥15 鼠标右键,撤销删除 复制 移动,要怎样删除
  • ¥15 使用MATLAB进行余弦相似度计算加速
  • ¥15 服务器安装php5.6版本
  • ¥15 我想用51单片机和数码管做一个从0开始的计数表 我写了一串代码 但是放到单片机里面数码管只闪烁一下然后熄灭
  • ¥20 系统工程中,状态空间模型中状态方程的应用。请猛男来完整讲一下下面所有问题
  • ¥15 我想在WPF的Model Code中获取ViewModel Code中的一个参数
  • ¥15 arcgis处理土地利用道路 建筑 林地分类
  • ¥20 使用visual studio 工具用C++语音,调用openslsx库读取excel文件的sheet问题
  • ¥100 寻会做云闪付tn转h5支付链接的技术
  • ¥15 DockerSwarm跨节点无法访问问题