返回

Go & Java 携手猜数字:揭秘数字游戏背后的算法之美

后端

Go语言实现

1. 代码示例

package main

import (
	"fmt"
	"math/rand"
	"time"
)

func main() {
	// 设置随机种子
	rand.Seed(time.Now().UnixNano())

	// 生成秘密数字
	secretNumber := rand.Intn(100) + 1

	// 获取玩家猜测
	var guess int
	fmt.Println("猜一个数字(1-100):")
	fmt.Scanln(&guess)

	// 比较猜测与秘密数字
	var bulls, cows int
	for guess != secretNumber {
		// 计算公牛数和奶牛数
		bulls, cows = calculateBullsAndCows(guess, secretNumber)

		// 输出结果
		fmt.Printf("%d个公牛,%d个奶牛\n", bulls, cows)

		// 获取玩家下一次猜测
		fmt.Println("再猜一次:")
		fmt.Scanln(&guess)
	}

	// 玩家猜中了秘密数字
	fmt.Println("恭喜你,你猜中了!")
}

// 计算公牛数和奶牛数
func calculateBullsAndCows(guess, secretNumber int) (int, int) {
	bulls, cows := 0, 0
	guessStr := strconv.Itoa(guess)
	secretStr := strconv.Itoa(secretNumber)

	for i := 0; i < len(guessStr); i++ {
		if guessStr[i] == secretStr[i] {
			bulls++
		} else if strings.Contains(secretStr, string(guessStr[i])) {
			cows++
		}
	}

	return bulls, cows
}

2. 算法解析

该算法使用循环来比较玩家猜测与秘密数字。每次循环中,算法计算公牛数(正确位置上的数字)和奶牛数(正确数字但位置不正确)。

公牛数是通过比较猜测数字和秘密数字的每一位来计算的。如果一位上的数字相同,则该位上的数字计为公牛数。

奶牛数是通过检查秘密数字中是否包含猜测数字中的每一位数字来计算的。如果猜测数字中的某一位数字出现在秘密数字中,但位置不正确,则该位上的数字计为奶牛数。

算法重复上述步骤,直到玩家猜测正确或达到最大猜测次数。

Java语言实现

1. 代码示例

import java.util.Scanner;
import java.util.Random;

public class GuessNumberGame {

    public static void main(String[] args) {
        // 设置随机种子
        Random rand = new Random();
        rand.setSeed(System.currentTimeMillis());

        // 生成秘密数字
        int secretNumber = rand.nextInt(100) + 1;

        // 获取玩家猜测
        Scanner scanner = new Scanner(System.in);
        System.out.println("猜一个数字(1-100):");
        int guess = scanner.nextInt();

        // 比较猜测与秘密数字
        int bulls, cows;
        while (guess != secretNumber) {
            // 计算公牛数和奶牛数
            bulls = calculateBulls(guess, secretNumber);
            cows = calculateCows(guess, secretNumber);

            // 输出结果
            System.out.printf("%d个公牛,%d个奶牛\n", bulls, cows);

            // 获取玩家下一次猜测
            System.out.println("再猜一次:");
            guess = scanner.nextInt();
        }

        // 玩家猜中了秘密数字
        System.out.println("恭喜你,你猜中了!");
    }

    // 计算公牛数
    private static int calculateBulls(int guess, int secretNumber) {
        int bulls = 0;
        String guessStr = String.valueOf(guess);
        String secretStr = String.valueOf(secretNumber);

        for (int i = 0; i < guessStr.length(); i++) {
            if (guessStr.charAt(i) == secretStr.charAt(i)) {
                bulls++;
            }
        }

        return bulls;
    }

    // 计算奶牛数
    private static int calculateCows(int guess, int secretNumber) {
        int cows = 0;
        String guessStr = String.valueOf(guess);
        String secretStr = String.valueOf(secretNumber);

        for (int i = 0; i < guessStr.length(); i++) {
            if (secretStr.contains(String.valueOf(guessStr.charAt(i)))) {
                cows++;
            }
        }

        return cows;
    }
}

2. 算法解析

该算法与Go语言实现的算法类似,同样使用循环来比较玩家猜测与秘密数字。每次循环中,算法计算公牛数和奶牛数。

公牛数是通过比较猜测数字和秘密数字的每一位来计算的。如果一位上的数字相同,则该位上的数字计为公牛数。

奶牛数是通过检查秘密数字中是否包含猜测数字中的每一位数字来计算的。如果猜测数字中的某一位数字出现在秘密数字中,但位置不正确,则该位上的数字计为奶牛数。

算法重复上述步骤,直到玩家猜测正确或达到最大猜测次数。