← Назад к вопросам

Создать простую quiz-игру

1.2 Junior🔥 121 комментариев
#C# и ООП#UI#Unity Core#Коллекции и структуры данных

Условие

Создайте текстовую quiz-игру на Unity.

Требования

  1. Игра читает текст из файла и выделяет уникальные слова
  2. Игроку предлагается угадать слово по буквам
  3. Для угадывания есть набор букв на кнопках
  4. Слово закрыто квадратами как в Поле Чудес
  5. Ограниченное количество попыток
  6. Подсчет очков
  7. Несколько уровней сложности

UI

  • Экран с закрытым словом
  • Кнопки с буквами
  • Счетчик очков и попыток
  • Меню старт и результаты

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI7 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Архитектура решения для Quiz-игры на Unity

Я разработал бы эту игру с использованием MVC-подхода (Model-View-Controller), что обеспечит чистую архитектуру и легкую поддержку. Проект будет состоять из нескольких ключевых компонентов.

1. Модель данных (GameData)

using System.Collections.Generic;

[System.Serializable]
public class QuizData
{
    public List<QuizLevel> levels = new List<QuizLevel>();
    public int totalScore = 0;
    public int currentLevelIndex = 0;
}

[System.Serializable]
public class QuizLevel
{
    public string word;
    public string category;
    public Difficulty difficulty;
    public int baseScore;
    public List<char> availableLetters;
}

public enum Difficulty
{
    Easy,    // Короткие слова, больше попыток
    Medium,  // Средней длины
    Hard     // Длинные слова, меньше попыток
}

2. Управление игровой логикой (GameController)

Основной контроллер будет обрабатывать:

  • Загрузку и парсинг текстового файла
  • Выбор уникальных слов
  • Управление состоянием игры
  • Подсчет очков
using UnityEngine;
using System.IO;
using System.Linq;
using System.Collections.Generic;

public class GameController : MonoBehaviour
{
    private QuizData gameData;
    private string currentWord;
    private List<char> guessedLetters = new List<char>();
    private int attemptsRemaining;
    private int currentScore;
    
    // Параметры сложности
    [System.Serializable]
    public class DifficultySettings
    {
        public Difficulty difficulty;
        public int attempts;
        public int scoreMultiplier;
    }
    
    public List<DifficultySettings> difficultySettings;
    
    public void InitializeGame()
    {
        LoadWordsFromFile("QuizWords.txt");
        CalculateWordComplexity();
        SetupCurrentLevel();
    }
    
    private void LoadWordsFromFile(string fileName)
    {
        string filePath = Path.Combine(Application.streamingAssetsPath, fileName);
        
        if (File.Exists(filePath))
        {
            string text = File.ReadAllText(filePath);
            // Извлекаем уникальные слова, игнорируя короткие
            string[] words = text.Split(' ', '.', ',', '!', '?')
                .Where(w => w.Length >= 4)
                .Select(w => w.ToUpper())
                .Distinct()
                .ToArray();
            
            // Сохраняем в модель данных
            // ... код инициализации уровней
        }
    }
    
    public bool ProcessLetterGuess(char letter)
    {
        if (attemptsRemaining <= 0) return false;
        
        if (currentWord.Contains(letter))
        {
            guessedLetters.Add(letter);
            UpdateScore(true);
            return true;
        }
        else
        {
            attemptsRemaining--;
            UpdateScore(false);
            return false;
        }
    }
}

3. Пользовательский интерфейс (UIManager)

Основные UI компоненты:

using UnityEngine;
using UnityEngine.UI;
using System.Collections.Generic;

public class UIManager : MonoBehaviour
{
    // Ссылки на UI элементы
    public GameObject letterButtonPrefab;
    public Transform lettersGrid;
    public Text hiddenWordText;
    public Text scoreText;
    public Text attemptsText;
    public GameObject startMenu;
    public GameObject gameScreen;
    public GameObject resultsScreen;
    
    private List<GameObject> letterButtons = new List<GameObject>();
    
    public void SetupWordDisplay(string word, List<char> guessedLetters)
    {
        string displayWord = "";
        foreach (char c in word)
        {
            if (guessedLetters.Contains(c))
                displayWord += c + " ";
            else
                displayWord += "_ ";
        }
        hiddenWordText.text = displayWord;
    }
    
    public void CreateLetterButtons(List<char> availableLetters)
    {
        ClearLetterButtons();
        
        foreach (char letter in availableLetters)
        {
            GameObject buttonObj = Instantiate(letterButtonPrefab, lettersGrid);
            Button btn = buttonObj.GetComponent<Button>();
            Text btnText = buttonObj.GetComponentInChildren<Text>();
            
            btnText.text = letter.ToString();
            
            // Добавляем обработчик нажатия
            btn.onClick.AddListener(() => OnLetterButtonClick(letter));
            
            letterButtons.Add(buttonObj);
        }
    }
    
    private void OnLetterButtonClick(char letter)
    {
        // Отправляем событие в GameController
        GameController.Instance.ProcessLetterGuess(letter);
    }
}

4. Настройка уровней сложности

// Конфигурация в инспекторе Unity
[System.Serializable]
public class LevelConfig
{
    public int minWordLength;
    public int maxWordLength;
    public int attempts;
    public int baseScore;
    public float timeMultiplier;
}

public class DifficultyManager : MonoBehaviour
{
    public LevelConfig easyConfig = new LevelConfig()
    {
        minWordLength = 4,
        maxWordLength = 6,
        attempts = 10,
        baseScore = 100
    };
    
    public LevelConfig mediumConfig = new LevelConfig()
    {
        minWordLength = 7,
        maxWordLength = 9,
        attempts = 7,
        baseScore = 200
    };
    
    public LevelConfig hardConfig = new LevelConfig()
    {
        minWordLength = 10,
        maxWordLength = 15,
        attempts = 5,
        baseScore = 300
    };
}

5. Система подсчета очков

public class ScoreSystem
{
    public int CalculateWordScore(string word, Difficulty difficulty, 
                                  bool isCorrect, int remainingAttempts)
    {
        int baseScore = 0;
        
        switch (difficulty)
        {
            case Difficulty.Easy:
                baseScore = word.Length * 10;
                break;
            case Difficulty.Medium:
                baseScore = word.Length * 15;
                break;
            case Difficulty.Hard:
                baseScore = word.Length * 25;
                break;
        }
        
        // Бонус за оставшиеся попытки
        int bonus = remainingAttempts * 5;
        
        // Множитель за сложность
        float multiplier = isCorrect ? 1.0f : 0.5f;
        
        return Mathf.RoundToInt((baseScore + bonus) * multiplier);
    }
}

6. Парсинг текстового файла и выбор слов

using System.Text.RegularExpressions;

public class TextParser
{
    public static List<string> ExtractUniqueWords(string text)
    {
        // Удаляем специальные символы и цифры
        string cleanText = Regex.Replace(text, @"[^а-яА-ЯёЁa-zA-Z\s]", "");
        
        // Разбиваем на слова и фильтруем
        List<string> words = cleanText.Split(' ')
            .Where(word => word.Length >= 4)
            .Select(word => word.ToUpper())
            .Distinct()
            .OrderBy(word => word)
            .ToList();
        
        return words;
    }
}

7. Структура проекта Unity

  • Assets/Scenes: Сцены меню и игры
  • Assets/Scripts:
    • Controllers/GameController.cs
    • UI/UIManager.cs
    • Models/QuizData.cs
    • Managers/DifficultyManager.cs
  • Assets/Resources/TextFiles: Текстовые файлы с вопросами
  • Assets/Prefabs/UI: Префабы кнопок и UI элементов
  • Assets/Sprites: Графика для игры

8. Ключевые особенности реализации

  1. Event-driven архитектура: Использование событий UnityEvent для связи между компонентами
  2. ScriptableObjects: Хранение конфигураций уровней в ScriptableObject для легкой настройки
  3. Object Pooling: Для переиспользования кнопок букв
  4. Localization System: Поддержка нескольких языков через ключи
  5. Save System: Сохранение прогресса через PlayerPrefs или JSON файлы
  6. Анимация UI: Плавные переходы между состояниями игры

9. Оптимизации

// Использование Object Pooling для кнопок
public class LetterButtonPool : MonoBehaviour
{
    private Queue<GameObject> availableButtons = new Queue<GameObject>();
    
    public GameObject GetButton()
    {
        if (availableButtons.Count > 0)
            return availableButtons.Dequeue();
        else
            return Instantiate(buttonPrefab);
    }
    
    public void ReturnButton(GameObject button)
    {
        button.SetActive(false);
        availableButtons.Enqueue(button);
    }
}

Эта архитектура обеспечивает:

  • Масштабируемость: Легко добавлять новые уровни и режимы
  • Поддерживаемость: Четкое разделение ответственности
  • Производительность: Оптимизация критических компонентов
  • Гибкость: Легкая настройка баланса игры через инспектор Unity

Для текстового файла рекомендую формат JSON или простой текстовый файл с категориями, что позволит легко расширять базу вопросов без изменения кода.