Разработка модуля "Игра в слова" для Избушки

Ответить
hrigan
Администратор
Сообщения: 334
Зарегистрирован: 01 мар 2023, 15:57
Разработка модуля "Игра в слова" для Избушки

Сообщение hrigan »

1. Импортируем библиотеки

Код: Выделить всё

import random
from PyQt5 import QtWidgets, QtCore
from PyQt5.QtCore import QTimer, Qt
from Speaker import *
  • random — для выбора случайного слова.
  • PyQt5 — для создания GUI.
  • QTimer — для обновления экрана.
  • Speaker — модуль для синтеза и распознавания речи.
2. Создаем класс WordsGame
Этот класс наследуется от QtWidgets.QFrame, что делает его отдельным графическим контейнером в PyQt.

Код: Выделить всё

class WordsGame(QtWidgets.QFrame):
    def __init__(self, parent=None):
        super(WordsGame, self).__init__(parent)
  • super(WordsGame, self).__init__(parent) — инициализирует родительский класс QFrame.
Загружаем словарь и алфавит

Код: Выделить всё

        self.rus_dict = open('words/word_rus.txt', 'r', encoding='utf-8')  # открытие словаря
        self.rus_dict = self.rus_dict.read().splitlines()

        self.rus_alphabet = ['а', 'б', 'в', 'г', 'д', 'е', 'ё', 'ж', 'з', 'и', 'й', 'к', 'л', 'м', 'н', 'о', 'п', 'р',
                             'с', 'т', 'у', 'ф', 'х', 'ц', 'ч', 'ш', 'щ', 'э', 'ю', 'я']
  • Загружаем слова из файла word_rus.txt и превращаем в список.
  • Создаем список букв русского алфавита.
Инициализируем переменные

Код: Выделить всё

        self.used_words = []  # список использованных слов
        self.speach_rec = Speaker()  # объект для работы с речью
        self.dialog_trig = True  # флаг для управления диалогом
        self.first_dialog_trig = True  # первый запуск диалога
        self.exit_trig = False  # флаг выхода из игры
        self.answer_word = ""  # текущее слово бота
        self.word_game_active_trigger = False  # флаг активности игры
3. Создаем графический интерфейс
Настройка окна

Код: Выделить всё

        self.setGeometry(QtCore.QRect(50, 350, 700, 70))
  • setGeometry(x, y, width, height) — устанавливает положение и размер окна.
Добавляем QLabel для отображения слов

Код: Выделить всё

        self.word_label = QtWidgets.QLabel(self)
        self.word_label.setGeometry(QtCore.QRect(0, 0, 700, 70))
        self.word_label.setObjectName("word_label")
        self.word_label.setStyleSheet("background: rgba(8, 91, 169, 1); font-size:65px;")
        self.word_label.setAlignment(Qt.AlignCenter)
        self.word_label.setText("Скажите слово!!!")
  • QLabel — виджет для вывода слов.
  • setGeometry() — задает размер.
  • setStyleSheet() — устанавливает цвет фона и размер шрифта.
  • setAlignment(Qt.AlignCenter) — выравнивает текст по центру.
  • setText("Скажите слово!!!") — начальное сообщение.
4. Настраиваем таймер

Код: Выделить всё

        self.timer_update = QTimer(self)
        self.timer_update.timeout.connect(self.update_event)
        self.timer_update.start()
  • QTimer вызывает функцию update_event() регулярно, проверяя активность игры.

Код: Выделить всё

5. Основная логика игры
Запуск игры

Код: Выделить всё

    def start_game_words(self, rec):
        self.word_game_active_trigger = True  # Устанавливаем флаг активности
Бот предлагает начать игру

Код: Выделить всё

        if self.dialog_trig:
            if self.first_dialog_trig:
                self.speach_rec.speak("Давайте сыграем в слова, вы начинаете")
                self.first_dialog_trig = False
            else:
                self.speach_rec.speak(f"{self.answer_word}")
  • Если игра только начинается, бот говорит: "Давайте сыграем в слова, вы начинаете".
  • Если уже идет раунд, бот повторяет предыдущее слово.
Распознавание слов
Здесь мы используем модуль распознавания речи полученный из основного потока, через аргумент

Код: Выделить всё

            while True:
                rec.listening()
                query = rec.get_full_phrase().lower()
  • rec.listening() — запускает режим распознавания.
  • rec.get_full_phrase() — получает сказанное слово и приводит его к нижнему регистру.
Обработка выхода

Код: Выделить всё

                if 'выйти из игры' in query:
                    self.dialog_trig = False
                    self.exit_trig = True
                    break
  • Если пользователь говорит "выйти из игры", игра останавливается.
Проверяем слово

Код: Выделить всё

                elif len(query) > 0:
                    if self.word_check(query):
                        self.used_words.append(query)
  • Проверяем слово на корректность с помощью word_check().
Генерация ответа

Код: Выделить всё

                        answer_letter = query[-1]
                        if answer_letter in ['ъ', 'ы', 'ь']:
                            answer_letter = query[-2]

                        answer = self.get_answer(answer_letter)
                        self.speach_rec.speak(answer)
                        self.word_label.setText(answer)
                        self.speach_rec.speak(f"вам на {answer[-1]}")
                        self.used_words.append(answer)
  • Берем последнюю букву слова.
  • Если это ъ, ы, ь, берем предыдущую букву.
  • Выбираем слово get_answer().
  • Выводим слово на экран.
  • Сообщаем игроку, на какую букву он должен ответить.
6. Проверка слова

Код: Выделить всё

    def word_check(self, user_word):
  • Проверяем, начинается ли слово с правильной буквы.
  • Проверяем, было ли оно уже использовано.
  • Проверяем, есть ли слово в словаре.
7. Генерация ответа

Код: Выделить всё

    def get_answer(self, user_word):
        possible_words = [w for w in self.rus_dict if w.startswith(user_word) and w not in self.used_words]
        return random.choice(possible_words) if possible_words else None
  • Находим все слова, которые начинаются на нужную букву.
  • Выбираем случайное слово.
  • Если слов нет, возвращаем None.
8. Обновление интерфейса

Код: Выделить всё

    def update_event(self):
        if self.word_game_active_trigger:
            self.setVisible(True)
            self.word_label.setVisible(True)
        else:
            self.setVisible(False)
            self.word_label.setVisible(False)
  • Если игра активна, QLabel виден.
  • Если игра завершена, QLabel скрывается.
9. Добавление модуля в основной код
Обучение новому ключевому слову
Добавьте в файл key_phrase.txt следующие строки

Код: Выделить всё

игра в слова,слова
в слова,слова
слова,слова
  • Это необходимо чтобы модуль распознавания, обучился новому ключевому слову
Добавление в Service
Так как это класс с игрой в сервисе существует отдельный модуль, который вызывается по фразе "Давай поиграем"

Код: Выделить всё

def game_mode(self, command):
Необходимо добавить ветвь для выбора игры следующим образом

Код: Выделить всё

                if full_phrase:
                    key_phrase = self.key_phrase_analizer.analyzer(
                        full_phrase)  # Анализируем фразу на наличие ключевых слов
                    if 'кнб' in key_phrase:  # Если ключевое слово "кнб" найдено
                        self.test_rps.play_game_trig = True  # Устанавливаем флаг начала игры в камень-ножницы-бумага
                        self.test_rps.start_game_RPS(self.recognizer)  # Запускаем игру
                        break  # Выходим из цикла
                   elif 'слова' in key_phrase:
                        self.words_game.start_game_words(self.recognizer)
                        break
Так как модуль содержит виджет, то ему необходимо указать родительский виджет, для этого в функции

Код: Выделить всё

def connect_widget(self, central_widget):
Добавьте

Код: Выделить всё

self.words_game.setParent(central_widget)
10. Завершение
Для того чтобы модуль работал, в папку Server_final/words нужно добавить файл word_rus.txt, скачать его можно тут.

Ответить