Разработка модуля "Игра в слова" для Избушки
Разработка модуля "Игра в слова" для Избушки
1. Импортируем библиотеки
Этот класс наследуется от QtWidgets.QFrame, что делает его отдельным графическим контейнером в PyQt.
3. Создаем графический интерфейс
Настройка окна
Запуск игры
Бот предлагает начать игру
Здесь мы используем модуль распознавания речи полученный из основного потока, через аргумент
Обучение новому ключевому слову
Добавьте в файл key_phrase.txt следующие строки
Так как это класс с игрой в сервисе существует отдельный модуль, который вызывается по фразе "Давай поиграем"
Необходимо добавить ветвь для выбора игры следующим образом
Так как модуль содержит виджет, то ему необходимо указать родительский виджет, для этого в функции
Добавьте
10. Завершение
Для того чтобы модуль работал, в папку Server_final/words нужно добавить файл word_rus.txt, скачать его можно тут.
Код: Выделить всё
import random
from PyQt5 import QtWidgets, QtCore
from PyQt5.QtCore import QTimer, Qt
from Speaker import *
- random — для выбора случайного слова.
- PyQt5 — для создания GUI.
- QTimer — для обновления экрана.
- Speaker — модуль для синтеза и распознавания речи.
Этот класс наследуется от 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 # флаг активности игры
Настройка окна
Код: Выделить всё
self.setGeometry(QtCore.QRect(50, 350, 700, 70))
- setGeometry(x, y, width, height) — устанавливает положение и размер окна.
Код: Выделить всё
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("Скажите слово!!!") — начальное сообщение.
Код: Выделить всё
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().
- Выводим слово на экран.
- Сообщаем игроку, на какую букву он должен ответить.
Код: Выделить всё
def word_check(self, user_word):
- Проверяем, начинается ли слово с правильной буквы.
- Проверяем, было ли оно уже использовано.
- Проверяем, есть ли слово в словаре.
Код: Выделить всё
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.
Код: Выделить всё
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 скрывается.
Обучение новому ключевому слову
Добавьте в файл key_phrase.txt следующие строки
Код: Выделить всё
игра в слова,слова
в слова,слова
слова,слова
- Это необходимо чтобы модуль распознавания, обучился новому ключевому слову
Так как это класс с игрой в сервисе существует отдельный модуль, который вызывается по фразе "Давай поиграем"
Код: Выделить всё
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)
Для того чтобы модуль работал, в папку Server_final/words нужно добавить файл word_rus.txt, скачать его можно тут.