← Назад к вопросам
Создать простую quiz-игру
1.2 Junior🔥 121 комментариев
#C# и ООП#UI#Unity Core#Коллекции и структуры данных
Условие
Создайте текстовую quiz-игру на Unity.
Требования
- Игра читает текст из файла и выделяет уникальные слова
- Игроку предлагается угадать слово по буквам
- Для угадывания есть набор букв на кнопках
- Слово закрыто квадратами как в Поле Чудес
- Ограниченное количество попыток
- Подсчет очков
- Несколько уровней сложности
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.csUI/UIManager.csModels/QuizData.csManagers/DifficultyManager.cs
- Assets/Resources/TextFiles: Текстовые файлы с вопросами
- Assets/Prefabs/UI: Префабы кнопок и UI элементов
- Assets/Sprites: Графика для игры
8. Ключевые особенности реализации
- Event-driven архитектура: Использование событий UnityEvent для связи между компонентами
- ScriptableObjects: Хранение конфигураций уровней в ScriptableObject для легкой настройки
- Object Pooling: Для переиспользования кнопок букв
- Localization System: Поддержка нескольких языков через ключи
- Save System: Сохранение прогресса через PlayerPrefs или JSON файлы
- Анимация 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 или простой текстовый файл с категориями, что позволит легко расширять базу вопросов без изменения кода.