规则: 1.生成一个由3个数字组成的字符串而且3个数字不重复。
       2.玩家写出3个数字来猜,然后程序提示正确的数字数量及正确数字所在位置的正确数量
       3.猜出3个数字并且位置全对时为胜利,猜8次均未能猜对则为失败。以下是我写的猜数字的代码,代码本身无问题,可正常运行
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.Scanner;
public class GuessNumber {
public static void main(String[] args){

String[] result_array = randomNum();

Scanner scanner = new Scanner(System.in);

boolean loop = false;
do{
for(int j=0;j<8;j++){

System.out.println("请输入要猜的3位数字");
String str = scanner.nextLine();
int correct_number =0;//猜对的数字数量
int correct_position = 0;//猜对的位置数量

for(int k=0;k<3;k++){
if(str.contains(result_array[k])){
correct_number++;
if(str.indexOf(result_array[k])==k){
correct_position++;
}
}
}

System.out.println("有"+correct_number+"个数字正确");
System.out.println("有"+correct_position+"个位置正确");
if(correct_position==3){
System.out.println("很好,猜中了");
break;
}
}

System.out.println("再来一次? Y/N");
String str = scanner.nextLine();
if(str.equalsIgnoreCase("Y")){
loop = true;
result_array = randomNum();
}else{
loop = false;
}
}while(loop==true);
}

/**
 * 随机生成目标数字
 * @return
 */
public static String[] randomNum(){
List<String> list = new ArrayList<String>();
Random random = new Random();
for(int i=0;i<10;i++){
list.add(i+"");
}

String[] array = new String[3];
for(int i=0;i<array.length;i++){
array[i] = list.remove(random.nextInt(list.size()));
}
return array;
}
}
现在想问一下高手能不能写一个懂得自己去猜数字的程序,也就是用一个程序扮演玩家的角色去猜数字,
而且如果可以的话,希望该程序能懂得分析之前猜的结果,并能在8次之内猜出正确的数字和位置

解决方案 »

  1.   

    我觉得楼主应该可以借鉴c/s模式的聊天室你上面的程序可以做server,然后接受client发过来的数据client端其实应该就是一个查找算法
      

  2.   


    你所说的a和b两个提示都是有的。
    原代码中
    System.out.println("有"+correct_number+"个数字正确");
    System.out.println("有"+correct_position+"个位置正确");
    这段就是用来提示你说的a和b的。
      

  3.   


    import java.util.ArrayList;
    import java.util.List;
    import java.util.Random;
    import java.util.Scanner;public class GuessNumber {
    static String[] guess = randomNum();
    //结果中没有包含的数字
    static List<String> time0 = new ArrayList<String>();
    //结果有包含的数字
    static List<String> time1 = new ArrayList<String>();
    //所包含数字的全排列
    static List<String> all = new ArrayList<String>();
    //如果是第一次的话,就生成全排列,否则的话从all中选择
    static boolean first = true;

        public static void main(String[] args){
            String[] result_array = randomNum();
            Scanner scanner = new Scanner(System.in);
            boolean loop = false;
            do{
                for(int j=0;j<8;j++){
                 String str = arrayToString(guess);
                 System.out.println(str);
                    int correct_number =0;//猜对的数字数量
                    int correct_position = 0;//猜对的位置数量
                    for(int k=0;k<3;k++){
                        if(str.contains(result_array[k])){
                            correct_number++;
                            if(str.indexOf(result_array[k])==k){
                                correct_position++;
                            }
                            if(str.indexOf(result_array[k])>=0) {
                             time1.add(result_array[k]);
                            }
                        }
                    }
                    
                    System.out.println("有"+correct_number+"个数字正确");
                    System.out.println("有"+correct_position+"个位置正确");
                    if(correct_position==3){
                        System.out.println("很好,猜中了");
                        break;
                    }
                    guess = guess(correct_number);
                }
                
                //System.out.println("再来一次? Y/N");
                //String str = scanner.nextLine();
                String str = "N";//现在这里只做一次
                if(str.equalsIgnoreCase("Y")){
                    loop = true;
                    result_array = randomNum();
                }else{
                    loop = false;
                }
            }while(loop==true);
        }
        
        private static String[] guess(int correctNumber) {
         List<String> list = new ArrayList<String>();
         String[] array = new String[3];
            Random random = new Random();
            for(int i=0;i<10;i++){
                list.add(i+"");
            }
            
            if(correctNumber == 0) {//如果没有猜对的数字,就把这次猜的这几个数加入time0,然后在后面移除。
             for(String s : guess) {
             time0.add(s);
             }
            } else if(correctNumber == 3) {//如果数字都猜对了,是第一次的话就全排列猜对的数字,否则的话就从全排列中随机选取一个结果返回,并从全排列中移除这个结果。
             if(first) {
             List<String> data = new ArrayList<String>();
             for(String s : guess) {
             data.add(s);
             }
             sort(data, new ArrayList<String>());
             first = false;
             } else {
             all.remove(arrayToString(guess));
             String str = all.remove(random.nextInt(all.size()));
             for(int i=0; i<str.length(); i++) {
             array[i] = String.valueOf(str.charAt(i));
             }
             return array;
             }
            } else {//如果猜对了一个或两个数字,就把这次猜错的数字加入time0,然后在后面移除。
             for(String s : guess) {
             if(!time1.contains(s)) {
             time0.add(s);
             }
             }
            }
            
            for(String s : time0) {
             list.remove(s);
            }
            
           
            for(int i=0;i<array.length;i++){
                array[i] = list.remove(random.nextInt(list.size()));
            }
            return array;
    }    /**
         * 生成包含的数字的全排列
         * @param datas
         * @param target
         */
    private static void sort(List<String> datas, List<String> target) {   
            if (target.size() == guess.length) {   
             StringBuffer sb = new StringBuffer();
                for (String str : target)   
                   sb.append(str);
                all.add(sb.toString());
                return;   
            }   
            for (int i = 0; i < datas.size(); i++) {   
                List<String> newDatas = new ArrayList<String>(datas);   
                List<String> newTarget = new ArrayList<String>(target);   
                newTarget.add(newDatas.get(i));   
                newDatas.remove(i);   
                sort(newDatas, newTarget);   
            }   
        }  

    /**
         * 字符数组转换为字符串
         * @param guess
         * @return
         */
        private static String arrayToString(String[] guess) {
    StringBuffer sb = new StringBuffer();
    for(String s : guess) {
    sb.append(s);
    }
    return sb.toString();
    } /**
         * 随机生成目标数字
         * @return
         */
        public static String[] randomNum(){
            List<String> list = new ArrayList<String>();
            Random random = new Random();
            for(int i=0;i<10;i++){
                list.add(i+"");
            }
            
            String[] array = new String[3];
            for(int i=0;i<array.length;i++){
                array[i] = list.remove(random.nextInt(list.size()));
            }
            return array;
        }
    }
      

  4.   

    你说的是下面的吗?if(str.indexOf(result_array[k])>=0) {
                                time1.add(result_array[k]);
                            }
    不好意思啊,当初也没想这么多,现在想想,真的好像有点犯规啊!
      

  5.   


    import java.util.ArrayList;
    import java.util.Iterator;
    import java.util.List;
    import java.util.Random;
    import java.util.Scanner;public class NumberGuess {
    static String guess;
    static List<String> list = new ArrayList<String>(); public static void main(String[] args) {
    String[] result_array = randomNum();
    init();
    guess = list.get(0);
    boolean loop = false;
    do {
    for (int j = 0; j < 8; j++) {
    String str = guess;
    System.out.println(str);
    int correct_number = 0;// 猜对的数字数量
    int correct_position = 0;// 猜对的位置数量
    for (int k = 0; k < 3; k++) {
    if (str.contains(result_array[k])) {
    correct_number++;
    if (str.indexOf(result_array[k]) == k) {
    correct_position++;
    }
    }
    } System.out.println("有" + correct_number + "个数字正确");
    System.out.println("有" + correct_position + "个位置正确");
    if (correct_position == 3) {
    System.out.println("很好,猜中了");
    break;
    }
    guess = guess(correct_number, correct_position);
    } // System.out.println("再来一次? Y/N");
    // String str = scanner.nextLine();
    String str = "N";// 现在这里只做一次
    if (str.equalsIgnoreCase("Y")) {
    loop = true;
    result_array = randomNum();
    } else {
    loop = false;
    }
    } while (loop == true);
    } /**
     * 初始化list,里面的值是从012-987之间的没有重复数字的值。
     */
    private static void init() {
    for (int i = 0; i < 10; i++) {
    for (int j = 0; j < 10; j++) {
    if (i != j) {
    for (int k = 0; k < 10; k++) {
    if (k != i && k != j) {
    list.add(String.valueOf(i) + String.valueOf(j)
    + String.valueOf(k));
    }
    }
    }
    }
    }
    } /**
     * 猜数字
     * @param correctNumber
     * @param correctPosition
     * @return
     */
    private static String guess(int correctNumber, int correctPosition) {
    if(correctNumber == 0) {
    Iterator<String> iterator = list.iterator();
    List<String> temp = new ArrayList<String>();
    while(iterator.hasNext()) {
    String str = iterator.next();
    if(containsCount(str, guess) == 0) {
    temp.add(str);
    }
    }
    list = temp;
    } else if(correctNumber == 1) {
    Iterator<String> iterator = list.iterator();
    List<String> temp = new ArrayList<String>();
    while(iterator.hasNext()) {
    String str = iterator.next();
    if(containsCount(str, guess) == 1) {
    temp.add(str);
    }
    }
    list = temp;
    } else if(correctNumber == 2) {
    Iterator<String> iterator = list.iterator();
    List<String> temp = new ArrayList<String>();
    while(iterator.hasNext()) {
    String str = iterator.next();
    if(containsCount(str, guess) == 2) {
    temp.add(str);
    }
    }
    list = temp;
    } else {
    Iterator<String> iterator = list.iterator();
    List<String> temp = new ArrayList<String>();
    while(iterator.hasNext()) {
    String str = iterator.next();
    if(containsCount(str, guess) == 3 && samePostionCount(str, guess) <= correctPosition) {
    temp.add(str);
    }
    }
    list = temp;
    }
    guess = list.get(0);
    return guess;
    }

    /**
     * 计算字符串str1和str2共同包含的字符的个数。
     * @param str1
     * @param str2
     * @return
     */
    private static int containsCount(String str1, String str2) {
    int count = 0;
    for(int i=0; i<str2.length(); i++) {
    if(str1.contains(String.valueOf(str2.charAt(i)))) {
    count ++;
    }
    }
    return count;
    }

    /**
     * 计算字符串str1和str2对应位置字符相同的个数。
     * @param str1
     * @param str2
     * @return
     */
    private static int samePostionCount(String str1, String str2) {
    int count = 0;
    for(int i=0; i<str2.length(); i++) {
    if(str1.charAt(i) == str2.charAt(i)) {
    count ++;
    }
    }
    return count;
    } /**
     * 随机生成目标数字
     * 
     * @return
     */
    public static String[] randomNum() {
    List<String> list = new ArrayList<String>();
    Random random = new Random();
    for (int i = 0; i < 10; i++) {
    list.add(i + "");
    } String[] array = new String[3];
    for (int i = 0; i < array.length; i++) {
    array[i] = list.remove(random.nextInt(list.size()));
    }
    return array;
    }
    }这个现在能满足楼主的需求,大多数情况下在8次或7次的时候都能猜对,楼主可以再研究研究,看看能否100%猜正确。
      

  6.   


    import java.util.ArrayList;
    import java.util.Iterator;
    import java.util.List;
    import java.util.Random;
    import java.util.Scanner;public class NumberGuess {
    static String guess;
    static List<String> list = new ArrayList<String>(); public static void main(String[] args) {
    String[] result_array = randomNum();
    init();
    guess = list.get(0);
    boolean loop = false;
    do {
    for (int j = 0; j < 8; j++) {
    String str = guess;
    System.out.println(str);
    int correct_number = 0;// 猜对的数字数量
    int correct_position = 0;// 猜对的位置数量
    for (int k = 0; k < 3; k++) {
    if (str.contains(result_array[k])) {
    correct_number++;
    if (str.indexOf(result_array[k]) == k) {
    correct_position++;
    }
    }
    } System.out.println("有" + correct_number + "个数字正确");
    System.out.println("有" + correct_position + "个位置正确");
    if (correct_position == 3) {
    System.out.println("很好,猜中了");
    break;
    }
    guess = guess(correct_number, correct_position);
    } // System.out.println("再来一次? Y/N");
    // String str = scanner.nextLine();
    String str = "N";// 现在这里只做一次
    if (str.equalsIgnoreCase("Y")) {
    loop = true;
    result_array = randomNum();
    } else {
    loop = false;
    }
    } while (loop == true);
    } /**
     * 初始化list,里面的值是从012-987之间的没有重复数字的值。
     */
    private static void init() {
    for (int i = 0; i < 10; i++) {
    for (int j = 0; j < 10; j++) {
    if (i != j) {
    for (int k = 0; k < 10; k++) {
    if (k != i && k != j) {
    list.add(String.valueOf(i) + String.valueOf(j)
    + String.valueOf(k));
    }
    }
    }
    }
    }
    } /**
     * 猜数字
     * @param correctNumber
     * @param correctPosition
     * @return
     */
    private static String guess(int correctNumber, int correctPosition) {
    if(correctNumber == 0) {
    Iterator<String> iterator = list.iterator();
    List<String> temp = new ArrayList<String>();
    while(iterator.hasNext()) {
    String str = iterator.next();
    if(containsCount(str, guess) == 0 && samePostionCount(str, guess) <= correctPosition){// && samePostionCount(str, guess) <= correctPosition) {
    temp.add(str);
    }
    }
    list = temp;
    } else if(correctNumber == 1) {
    Iterator<String> iterator = list.iterator();
    List<String> temp = new ArrayList<String>();
    while(iterator.hasNext()) {
    String str = iterator.next();
    if(containsCount(str, guess) == 1 && samePostionCount(str, guess) <= correctPosition){// && samePostionCount(str, guess) <= correctPosition) {
    temp.add(str);
    }
    }
    list = temp;
    } else if(correctNumber == 2) {
    Iterator<String> iterator = list.iterator();
    List<String> temp = new ArrayList<String>();
    while(iterator.hasNext()) {
    String str = iterator.next();
    if(containsCount(str, guess) == 2 && samePostionCount(str, guess) <= correctPosition){// && samePostionCount(str, guess) <= correctPosition) {
    temp.add(str);
    }
    }
    list = temp;
    } else {
    Iterator<String> iterator = list.iterator();
    List<String> temp = new ArrayList<String>();
    while(iterator.hasNext()) {
    String str = iterator.next();
    if(containsCount(str, guess) == 3 && samePostionCount(str, guess) <= correctPosition){// && samePostionCount(str, guess) <= correctPosition) {
    temp.add(str);
    }
    }
    list = temp;
    }
    guess = list.get(0);
    return guess;
    }

    /**
     * 计算字符串str1和str2共同包含的字符的个数。
     * @param str1
     * @param str2
     * @return
     */
    private static int containsCount(String str1, String str2) {
    int count = 0;
    for(int i=0; i<str2.length(); i++) {
    if(str1.contains(String.valueOf(str2.charAt(i)))) {
    count ++;
    }
    }
    return count;
    }

    /**
     * 计算字符串str1和str2对应位置字符相同的个数。
     * @param str1
     * @param str2
     * @return
     */
    private static int samePostionCount(String str1, String str2) {
    int count = 0;
    for(int i=0; i<str2.length(); i++) {
    if(str1.charAt(i) == str2.charAt(i)) {
    count ++;
    }
    }
    return count;
    } /**
     * 随机生成目标数字
     * 
     * @return
     */
    public static String[] randomNum() {
    List<String> list = new ArrayList<String>();
    Random random = new Random();
    for (int i = 0; i < 10; i++) {
    list.add(i + "");
    } String[] array = new String[3];
    for (int i = 0; i < array.length; i++) {
    array[i] = list.remove(random.nextInt(list.size()));
    }
    return array;
    }
    }在前面的基础上,做了一些改进,现在我测试的结果是每次都会在7次内(包括7次)猜出正确的结果。