В мире компьютерных игр существует множество разнообразных головоломок и логических задач, но одной из наиболее увлекательных и захватывающих является игра «Быки и коровы». Эта простая, но умопомрачительно интересная игра требует от игрока сочетания умения логически мыслить и гармоничной комбинации удачи. В этой статье мы рассмотрим как можно реализовать программу «Быки и коровы».
Теория
Алгоритм программы для игры «Быки и коровы» можно разделить на следующие шаги:
- Генерация загаданного числа. Программа генерирует случайное четырехзначное число без повторяющихся цифр. Это число становится загаданным числом.
- Ввод попытки игроком. Игрок вводит свою попытку угадать число (тоже четырехзначное и без повторяющихся цифр).
- Проверка попытки. Программа анализирует попытку игрока и сравнивает каждую цифру с соответствующей цифрой загаданного числа. Если цифра совпадает и находится на правильной позиции, это считается «быком«. Если цифра совпадает, но находится на неправильной позиции, это считается «коровой«. Программа подсчитывает количество быков и коров и сообщает игроку результат.
- Проверка условия завершения. Если количество быков равно 4 (то есть все цифры угаданы на правильных позициях), игра завершается, и программа сообщает игроку о победе. В противном случае игра продолжается, и игроку предлагается ввести новую попытку.
- Повторение шагов 2-4. Игра продолжает выполняться в цикле, пока игрок не угадает загаданное число.
C++
Запрограммируем игру «быки и коровы» — компьютер генерирует число из 4 неповторяющихся чисел, игрок должен угадать его.
#include <iostream> #include <vector> #include <cstdlib> #include <ctime> using namespace std; // Функция для генерации случайного четырехзначного числа vector<int> generateRandomNumber() { vector<int> number; srand(time(nullptr)); // Генерируем первую цифру (не ноль) number.push_back(rand() % 9 + 1); // Генерируем остальные три цифры for (int i = 1; i < 4; ++i) { int digit = rand() % 10; number.push_back(digit); } return number; } // Функция для проверки быков и коров pair<int, int> checkBullsAndCows(const vector<int>& secretNumber, const vector<int>& guess) { int bulls = 0; int cows = 0; for (int i = 0; i < 4; ++i) { if (guess[i] == secretNumber[i]) { bulls++; } else { for (int j = 0; j < 4; ++j) { if (guess[i] == secretNumber[j]) { cows++; break; } } } } return make_pair(bulls, cows); } int main() { vector<int> secretNumber = generateRandomNumber(); vector<int> guess(4); int attempts = 0; cout << "Добро пожаловать в игру 'Быки и коровы'!" << endl; cout << "Попробуйте угадать четырехзначное число." << endl; while (true) { cout << "Введите вашу попытку (четыре цифры без пробелов): "; cin >> guess[0] >> guess[1] >> guess[2] >> guess[3]; if (cin.fail()) { cout << "Ошибка! Введите четыре цифры без пробелов." << endl; cin.clear(); cin.ignore(numeric_limits<streamsize>::max(), '\n'); continue; } pair<int, int> result = checkBullsAndCows(secretNumber, guess); cout << "Результат: " << result.first << " бык(ов) и " << result.second << " коров(а)." << endl; if (result.first == 4) { cout << "Поздравляем! Вы угадали число: "; for (int digit : secretNumber) { cout << digit; } cout << endl; break; } attempts++; } cout << "Вы сделали " << attempts << " попыток." << endl; return 0; }
Этот код создает случайное четырехзначное число и предлагает пользователю угадать его. Пользователь может вводить свои попытки, и программа будет сообщать количество быков и коров в каждой попытке. Игра продолжается, пока пользователь не угадает все четыре правильные цифры на правильных позициях (четыре быка).
C#
using System; using System.Collections.Generic; using System.Linq; class Program { static void Main() { List<int> secretNumber = GenerateSecretNumber(); List<int> guess = new List<int>(); int attempts = 0; Console.WriteLine("Добро пожаловать в игру 'Быки и коровы'!"); Console.WriteLine("Попробуйте угадать четырехзначное число."); while (true) { Console.Write("Введите вашу попытку (четыре цифры без пробелов): "); string input = Console.ReadLine(); if (input.Length != 4 || !input.All(char.IsDigit)) { Console.WriteLine("Ошибка! Введите четыре цифры без пробелов."); continue; } guess = input.Select(c => int.Parse(c.ToString())).ToList(); Tuple<int, int> result = CheckBullsAndCows(secretNumber, guess); Console.WriteLine($"Результат: {result.Item1} бык(ов) и {result.Item2} коров(а)."); if (result.Item1 == 4) { Console.WriteLine("Поздравляем! Вы угадали число: " + string.Join("", secretNumber)); break; } attempts++; } Console.WriteLine("Вы сделали " + attempts + " попыток."); } static List<int> GenerateSecretNumber() { List<int> numbers = Enumerable.Range(0, 10).ToList(); List<int> secretNumber = new List<int>(); Random random = new Random(); for (int i = 0; i < 4; i++) { int index = random.Next(numbers.Count); secretNumber.Add(numbers[index]); numbers.RemoveAt(index); } return secretNumber; } static Tuple<int, int> CheckBullsAndCows(List<int> secret, List<int> guess) { int bulls = 0; int cows = 0; for (int i = 0; i < secret.Count; i++) { if (secret[i] == guess[i]) { bulls++; } else if (secret.Contains(guess[i])) { cows++; } } return new Tuple<int, int>(bulls, cows); } }
Python
import random def generate_secret_number(): """Генерирует случайное четырехзначное число без повторяющихся цифр.""" digits = list(range(10)) random.shuffle(digits) return digits[:4] def check_bulls_and_cows(secret, guess): """Проверяет количество быков и коров в попытке пользователя.""" bulls = 0 cows = 0 for i in range(4): if guess[i] == secret[i]: bulls += 1 elif guess[i] in secret: cows += 1 return bulls, cows def main(): secret_number = generate_secret_number() attempts = 0 print("Добро пожаловать в игру 'Быки и коровы'!") print("Попробуйте угадать четырехзначное число.") while True: user_input = input("Введите вашу попытку (четыре цифры без пробелов): ") if len(user_input) != 4 or not user_input.isdigit(): print("Ошибка! Введите четыре цифры без пробелов.") continue guess = [int(digit) for digit in user_input] bulls, cows = check_bulls_and_cows(secret_number, guess) print(f"Результат: {bulls} бык(ов) и {cows} коров(а).") if bulls == 4: print(f"Поздравляем! Вы угадали число: {''.join(map(str, secret_number))}") break attempts += 1 print(f"Вы сделали {attempts} попыток.") if __name__ == "__main__": main()
Java
import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Random; import java.util.Scanner; public class BullsAndCowsGame { public static void main(String[] args) { List<Integer> secretNumber = generateSecretNumber(); List<Integer> guess = new ArrayList<>(); int attempts = 0; System.out.println("Добро пожаловать в игру 'Быки и коровы'!"); System.out.println("Попробуйте угадать четырехзначное число."); while (true) { System.out.print("Введите вашу попытку (четыре цифры без пробелов): "); Scanner scanner = new Scanner(System.in); String input = scanner.next(); if (input.length() != 4 || !input.matches("\\d+")) { System.out.println("Ошибка! Введите четыре цифры без пробелов."); continue; } for (int i = 0; i < 4; i++) { guess.add(Integer.parseInt(String.valueOf(input.charAt(i)))); } int[] result = checkBullsAndCows(secretNumber, guess); System.out.println("Результат: " + result[0] + " бык(ов) и " + result[1] + " коров(а)."); if (result[0] == 4) { System.out.println("Поздравляем! Вы угадали число: " + secretNumber); break; } attempts++; guess.clear(); } System.out.println("Вы сделали " + attempts + " попыток."); } private static List<Integer> generateSecretNumber() { List<Integer> numbers = new ArrayList<>(Arrays.asList(0, 1, 2, 3, 4, 5, 6, 7, 8, 9)); List<Integer> secretNumber = new ArrayList<>(); Random random = new Random(); for (int i = 0; i < 4; i++) { int index = random.nextInt(numbers.size()); secretNumber.add(numbers.get(index)); numbers.remove(index); } return secretNumber; } private static int[] checkBullsAndCows(List<Integer> secret, List<Integer> guess) { int bulls = 0; int cows = 0; for (int i = 0; i < 4; i++) { if (guess.get(i).equals(secret.get(i))) { bulls++; } else if (secret.contains(guess.get(i))) { cows++; } } return new int[]{bulls, cows}; } }
Pascal
program BullsAndCowsGame; uses SysUtils, Math; function GenerateSecretNumber: string; var SecretNumber: string; Numbers: string; i, Index: Integer; begin SecretNumber := ''; Numbers := '0123456789'; for i := 1 to 4 do begin Index := Random(Length(Numbers)) + 1; SecretNumber := SecretNumber + Numbers[Index]; Delete(Numbers, Index, 1); end; Result := SecretNumber; end; function CheckBullsAndCows(SecretNumber, Guess: string): string; var Bulls, Cows, i, j: Integer; begin Bulls := 0; Cows := 0; for i := 1 to Length(SecretNumber) do begin if SecretNumber[i] = Guess[i] then Inc(Bulls) else for j := 1 to Length(Guess) do if (SecretNumber[i] = Guess[j]) and (i <> j) then Inc(Cows); end; Result := Format('%d бык(ов) и %d коров(а).', [Bulls, Cows]); end; var SecretNumber, UserGuess: string; Attempts: Integer; begin Randomize; SecretNumber := GenerateSecretNumber; Attempts := 0; WriteLn('Добро пожаловать в игру "Быки и коровы"!'); WriteLn('Попробуйте угадать четырехзначное число.'); repeat Write('Введите вашу попытку (четыре цифры без пробелов): '); ReadLn(UserGuess); if Length(UserGuess) <> 4 then WriteLn('Ошибка! Введите четыре цифры без пробелов.') else begin WriteLn(CheckBullsAndCows(SecretNumber, UserGuess)); Inc(Attempts); end; until CheckBullsAndCows(SecretNumber, UserGuess) = '4 бык(ов) и 0 коров(а).'; WriteLn('Поздравляем! Вы угадали число: ', SecretNumber); WriteLn('Вы сделали ', Attempts, ' попыток.'); end.
JavaScript
function generateSecretNumber() { // Генерируем случайное четырехзначное число без повторяющихся цифр let numbers = Array.from({ length: 10 }, (_, i) => i); numbers = numbers.slice(1); // Удаляем 0 из чисел for (let i = numbers.length - 1; i > 0; i--) { const j = Math.floor(Math.random() * (i + 1)); [numbers[i], numbers[j]] = [numbers[j], numbers[i]]; } return numbers.slice(0, 4).join(''); } function checkBullsAndCows(secret, guess) { let bulls = 0; let cows = 0; for (let i = 0; i < 4; i++) { if (guess[i] === secret[i]) { bulls++; } else if (secret.includes(guess[i])) { cows++; } } return [bulls, cows]; } function playGame() { const secretNumber = generateSecretNumber(); let attempts = 0; alert('Добро пожаловать в игру "Быки и коровы"!\nПопробуйте угадать четырехзначное число.'); while (true) { let userGuess = prompt('Введите вашу попытку (четыре цифры без пробелов):'); if (userGuess === null || userGuess.length !== 4 || !/^\d+$/.test(userGuess)) { alert('Ошибка! Введите четыре цифры без пробелов.'); continue; } const result = checkBullsAndCows(secretNumber, userGuess); alert(`Результат: ${result[0]} бык(ов) и ${result[1]} коров(а).`); if (result[0] === 4) { alert(`Поздравляем! Вы угадали число: ${secretNumber}`); break; } attempts++; } alert(`Вы сделали ${attempts} попыток.`); } playGame();
PHP
<?php function generateSecretNumber() { // Генерируем случайное четырехзначное число без повторяющихся цифр $numbers = range(0, 9); shuffle($numbers); return implode('', array_slice($numbers, 0, 4)); } function checkBullsAndCows($secret, $guess) { $bulls = 0; $cows = 0; for ($i = 0; $i < 4; $i++) { if ($guess[$i] === $secret[$i]) { $bulls++; } elseif (in_array($guess[$i], str_split($secret))) { $cows++; } } return [$bulls, $cows]; } function playGame() { $secretNumber = generateSecretNumber(); $attempts = 0; echo "Добро пожаловать в игру 'Быки и коровы'!\n"; echo "Попробуйте угадать четырехзначное число.\n"; while (true) { $userGuess = readline("Введите вашу попытку (четыре цифры без пробелов): "); if (!preg_match('/^\d{4}$/', $userGuess)) { echo "Ошибка! Введите четыре цифры без пробелов.\n"; continue; } $result = checkBullsAndCows($secretNumber, $userGuess); echo "Результат: {$result[0]} бык(ов) и {$result[1]} коров(а).\n"; if ($result[0] === 4) { echo "Поздравляем! Вы угадали число: {$secretNumber}\n"; break; } $attempts++; } echo "Вы сделали {$attempts} попыток.\n"; } playGame(); ?>