Java——公牛母牛小游戏(完整代码详细解析)

本文介绍了一个经典的猜数字游戏,该游戏由两人参与,一方设定四位不重复数字,另一方尝试猜测。文章详细阐述了游戏规则,并提供了游戏实现的编程思路及代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

前言

一、游戏规则

二、详细解析

三、完整代码


前言

猜数字(又称 Bulls and Cows )是一种古老的的密码破译类益智类小游戏,起源于20世纪中期,一般由两个人或多人玩,也可以由一个人和电脑玩。

一、游戏规则

通常由两个人玩,一方出数字,一方猜。出数字的人要想好一个没有重复数字的4个数,不能让猜的人知道。猜的人就可以开始猜。每猜一个数字,出数者就要根据这个数字给出几A几B,其中A前面的数字表示位置正确的数的个数,而B前的数字表示数字正确而位置不对的数的个数。

如正确答案为 5234,而猜的人猜 5346,则是 1A2B,其中有一个5的位置对了,记为1A,而3和4这两个数字对了,而位置没对,因此记为 2B,合起来就是 1A2B。

接着猜的人再根据出题者的几A几B继续猜,直到猜中(即 4A0B)为止。


二、详细解析

1.出数字(由电脑产生4个0-9随机数,且不重复)

  • 声明一个数组去接受随机数(注意生成整数随机数要强转数据类型)
  • 遍历数组
  • 利用内循环去重;当有数字重复时,利用循环回退,回到当前下标位置重新生成一个数
   int[] numbers = new int[4];
        //i 代表数组元素的下标 小于它的数组长度 ; 计数变量
        for (int i = 0; i < numbers.length; i++) {
            //生成随机数
            int suiJiShu = (int) (Math.random() * 10);
            numbers[i] = suiJiShu;
            //去重  j表示比i小的所有下标   当前i的数和比i小的所有数比较
            for (int j = 0; j < i; j++) {
                if (numbers[j] == numbers[i]) {
                    //循环回退
                    i--;
                    //重复时;内循环结束
                    break;

                }
            }
        }

2.猜数字(用户输入)

  • 利用死循环 实现 用户重复输入;达到条件时用break;终止
  • 声明输入器,字符串类型接受数据,把字符串 转换为 字符数组
  • 用分支语句  去限制输入数字位数

  • 内循环 遍历 查重

 在死循环外 使用声明
        char[] chars;
        //死循环 重复输入
        for (; ; ) {
            System.out.println("请输入猜的的数字:");
            Scanner input = new Scanner(System.in);
            //用户输入
            String userNum = input.next();
            //用户输入的数字 转化为数组
            chars= userNum.toCharArray();

            // 只能给4个字符(如果字符个数不等于4个,需要请用户重新输入)
            if (chars.length != 4) {
                System.out.println("输入有误,请输入4个数字");
                continue;
            }

            boolean judge= false;
            for (int i = 0; i < chars.length; i++) {
                // 只能输入一个数字字符串
                if (chars[i] < 48 || chars[i] > 57) {
                    System.out.println("您输入的不是数字,请重新输入");
                    judge=true;
                    break;
                }
                //3.查重 数字不能重复
                for(int j=0;j<i;j++){
                    if(chars[i]==chars[j]){
                        System.out.println("数字重复,请重新输入");
                        judge=true;
                        break;//关掉了第二个循环; 整体还是会循环
                    }
                }
                if (judge){
                    //数字重复时,关掉上面的循环;进入到这里,关掉外面整体判断的循环
                    break;
                }
            }
            if(judge==false){
                System.out.println("输入合法");
            }else {
                continue;
            }

3.用户猜的数字 和 电脑 出的数字对比,给出结果几A几B

  • 声明两个变量表示位置和数字
  • 用循环遍历 系统产生的随机数和用户输入的数
  • 内循环里比较两者是否相同
  • 如果下标也相同 则变量numA自增一次
  • 如果下标不同 则变量numB自增一次
  • 比较字符串如果A+B=4A0B 则输出成功  跳出循环

            int numA=0;
            int numB=0;
            for (int i=0;i<numbers.length;i++){ //系统产生的数字下标
                for(int j =0;j<chars.length;j++){
                    if(numbers[i]==chars[j]-48) {
   //数据类型不一样 系统是数字  用户输入的是字符编码
   //1.要么比较时,字符编码-48     2.要么源头,系统输人数字改成48-57
                      
                      if(i==j){
                          numA++;
                          break;
                      }
                      else {
                          numB++;
                          break;
                      }
                    }

                }
            }
            String str =numA+"A"+ numB+"B";
            System.out.println(str);
            if(str.equals("4A0B")){
       //  PS:字符串无法使用 == 比较
        /*
            String str1 = "aaa";
            数据是放在常量池中,常量池中常量有且只有一个,不会出现重复
            new String("aaa");
            数据是放在堆空间中

            == 比较的是值(变量空间的值--可以是数据、地址值)
                基本数据类型:比较的是他们的值是否相同
                引用数据类型: 比较的是 内存地址是否为同一地址
            equals 比较内容是否相同
         */
                System.out.println("NB!恭喜你通关成功!");
                break;

            }else {
                System.out.println("加油,还差一点哦");
            }
        }

三、完整代码

public class Game {
    public static void main(String[] args) {
        int[] numbers = new int[4];
        for (int i = 0; i < numbers.length; i++) {
            int suiJiShu = (int) (Math.random() * 10);
            numbers[i] = suiJiShu;
            for (int j = 0; j < i; j++) {
                    i--;
                    break;

                }
            }
        }
        for (int i = 0; i < numbers.length; i++) {
            System.out.print(numbers[i] + " ");
        }

        System.out.println();
        System.out.println("欢迎进入 - Bulls and cows - 游戏");
  

        char[] chars;
        for (; ; ) {
            System.out.println("请输入猜的的数字:");
            Scanner input = new Scanner(System.in);
            String userNum = input.next();
            chars= userNum.toCharArray();

            if (chars.length != 4) {
                System.out.println("输入有误,请输入4个数字");
                continue;
            }

            boolean judge= false;
            for (int i = 0; i < chars.length; i++) {
                if (chars[i] < 48 || chars[i] > 57) {
                    System.out.println("您输入的不是数字,请重新输入");
                    judge=true;
                    break;
                }

                for(int j=0;j<i;j++){
                    if(chars[i]==chars[j]){
                        System.out.println("数字重复,请重新输入");
                        judge=true;
                        break;
                    }
                }
                if (judge){
                    break;
                }
            }
            if(judge==false){
                System.out.println("输入合法");
            }else {
                continue;
            }
            int numA=0;
            int numB=0;
            for (int i=0;i<numbers.length;i++){ 
                for(int j =0;j<chars.length;j++){
                    if(numbers[i]==chars[j]-48) {
                      if(i==j){
                          numA++;
                          break;
                      }
                      else {
                          numB++;
                          break;
                      }
                    }

                }
            }
            String str =numA+"A"+ numB+"B";
            System.out.println(str);
            if(str.equals("4A0B")){
                System.out.println("NB!恭喜你通关成功!");
                break;

            }else {
                System.out.println("加油,还差一点哦");
            }
        }


    }
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BroRiver

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值