Мы — «Имитационная игра», команда, состоящая из членов 4-й когорты BNTA: Алекса, Кристиана, Суад, Розалинды и Рэйчел.
Этот совместный проект был реализован в рамках программы Bright Network Technology Academy. Проект состоит из вспомогательного приложения Wordle, основанного на концепциях теории информации, использованных в видео YouTube 3Blue1Brown — Решение Wordle с использованием теории информации .
API был создан с использованием Java, SpringBoot и PostgresQL и протестирован с помощью Postman. Список всех возможных слов был взят отсюда, а ответы на Wordle каждого дня можно было найти, просматривая веб-сайт Wordle.
Есть два режима:
Требования к нашему проекту и график разработки можно найти здесь.
git clone [email protected]:https://github.com/Roscaaa/Wordle-Helper.git
и откройте его в своей любимой Java IDE (мы рекомендуем IntelliJ).wordle
. (При использовании терминала введите psql
, чтобы запустить PostgresQL, а затем запустите CREATE DATABASE wordle;
)worlde.sql
для заполнения таблиц базы данных wordle
. Для этого вы можете:Примечание . Команды DROP TABLES в начале sql-скрипта не нужны при первой настройке базы данных (см. ниже):
DROP TABLE IF EXISTS original_word_list CASCADE;
DROP TABLE IF EXISTS users CASCADE;
DROP TABLE IF EXISTS actual_answers CASCADE;
DROP TABLE IF EXISTS all_games CASCADE;
Также обратите внимание : в приведенных ниже командах обязательно замените правильные пути к файлам:
-- Insert data into original word list table
COPY original_word_list (word, probability, score) FROM
' /[insert file path here]/initialcalculations.txt ' DELIMITER ' , ' CSV;
-- Insert actual answers and respective dates data into actual answers table
COPY actual_answers (date_of_given_answer, actual_word) FROM
' /[insert file path here]/date-word-answer.txt ' DELIMITER ' , ' CSV;
localhost:8080/competitive/computemachinescores
. Обратите внимание, что этот этап может занять некоторое время, поскольку на нем вычисляются баллы машины для всех примерно 3000 реальных ответов! Ниже приведен список методов, используемых в каждом классе, и их описания:
WordService
) Этот класс обслуживания вызывает уровень доступа к данным для извлечения объектов Word
из базы данных. Кроме того, он также содержит методы, относящиеся к логике самого решателя Wordle.
.GetAllWords()
Возвращает список всех записей в таблице original_word_list в виде объектов Word
.
.GetAllWordsRankedByScore()
То же, что и .GetAllWords
, за исключением того, что список объектов Word
ранжируется по свойству Score.
.GetAllWordsRankedByScore(Integer numOfWords)
То же, что и .GetAllWordsRankedByScore
за исключением того, что список объектов Word
имеет размер, заданный numOfWords
.
.GetWordById(Integer id)
Извлекает Word
с заданным id
из таблицы original_word_list.
.GetWordByName(String nameOfWord)
Извлекает первое Word
, свойство word
которого равно nameOfWord
из таблицы original_word_list.
.WordValidator(String word)
Возвращает true
, если данная строка включена в столбец слов в таблице original_word_list, в противном случае выдается исключение.
.setUniformProbabilities(List<Word> wordList)
Возвращает входной список объектов Word
после установки свойства вероятности каждого Word
, чтобы все были равны, а сумма равна единице. В качестве примера будет возвращен список, состоящий из двух объектов Word
, с вероятностями, равными 0.5
.
.GenerateWordPattern(Word word, Word targetWord)
Возвращает LinkedHashMap<String, String>
представляющий шаблон, полученный путем угадывания word
предполагая, что ответом является targetWord
. Например, изображенный здесь шаблон Wordle будет представлен картой:
{
"f0" : " yellow " ,
"o1" : " yellow " ,
"o2" : " green " ,
"d3" : " grey " ,
"s4" : " green "
}
Обычно клавиши обозначаются буквой, за которой следует индекс, обозначающий ее положение в слове. Значения принимают три значения: "yellow"
, "green"
и "grey"
каждое из которых представляет цвет буквы в шаблоне Wordle.
.CheckPatternMatch(Word word, Word targetWord, LinkedHashMap<String, String> pattern)
Возвращает true
, если word
и targetWord
могут воспроизводить pattern
при передаче в качестве аргументов метода .GenerateWordPattern
. В противном случае возвращается false
.
findMatchingWords(Word guess, List<Word> wordList, LinkedHashMap<String, String> pattern)
Возвращает список объектов Word
, состоящий из слов в wordList
, которые возвращают true
при передаче в качестве аргумента targetWord
.checkPatternMatch
. Другими аргументами здесь служат guess
и pattern
.
.computePatternProbability(Word guess, List<Word> wordList, LinkedHashMap<String, String> pattern)
Для заданного guess
вычислите Double
, значение которого представляет вероятность получения данного pattern
. Это определяется суммой вероятностей всех объектов Word
в wordList
, которые возвращают true
при вводе в качестве аргумента targetWord
для .checkPatternMatch
.
.logTwo(Double value)
Возвращает значение Double
, значение которого является логарифмом второго аргумента.
.computeWordScore(Word word, List<Word> wordList)
Вычисляет среднее количество раз, когда ожидается уменьшение размера wordList
вдвое при угадывании word
.
.computeScoreDistribution(List<Word> wordList)
Применяет метод .computeWordScore
к каждому Word
в wordList
и устанавливает для свойства score
значение, возвращаемое методом. Затем возвращается результирующий список объектов Word
.
getGuessesForAnswer(Answer answer)
Вычисляет количество предположений, сделанных решателем Wordle для угадывания answer
. Затем answer
возвращается со свойством machineResult
которому присвоено вычисленное значение.
AnswerService
) Этот класс обслуживания вызывает уровень доступа к данным для извлечения и обновления объектов Answer
из базы данных.
.getAllAnswers()
Возвращает список всех записей в таблице fact_respons как объекты Answer
.
.doesAnswerWithIdExists(Integer id)
Возвращает true
, если объект ответа с этим идентификатором существует в таблице fact_response.
.getAnswerById(Integer id)
Возвращает объект ответа с соответствующим идентификатором из таблицы fact_answers.
.addAnswerToTable(Answer answer)
Берет объект Answer
и добавляет его в таблицу act_response.
.deleteAnswerById(Integer id)
Удаляет объект Answer
с соответствующим идентификатором из таблицы fact_response из аргумента.
.updateAnswerById(Integer id, Answer answer)
Обновляет объект Answer
с соответствующим идентификатором из таблицы fact_response с объектом Answer
, переданным в качестве аргумента.
В этом разделе перечислены POJO, используемые в проекте, а также их свойства и связанная структура JSON при использовании запросов POST и PUT:
HTTP-запрос | Тип | Функция |
---|---|---|
Слово | • Целочисленный идентификатор • Строковое слово • Двойная вероятность • Двойной балл | Н/Д |
Пользователь | • Целочисленный идентификатор • Имя строки • Строка электронной почты. • Строковое имя пользователя. | { "имя": "Суад", "электронная почта": "[email protected]", "userName": "SusuTheFlowerPot" } |
Отвечать | • Целочисленный идентификатор • LocalDate DateOfAnswer. • Строка AnswerOfDay • Целочисленные машинные результаты | { "dateOfAnswer": "04.01.2025", "answerOfDay": "талия", «машинныйрезультат»: 3 } |
Игра | • Целочисленный идентификатор • Целочисленный идентификатор пользователя. • Целочисленный идентификатор ответа • Целочисленные предположения пользователя | { «Идентификатор пользователя»: 1, «ИД ответа»: 1, «Угадано пользователем»: 3 } |
HTTP-запрос | Тип | Функция |
---|---|---|
локальный хост: 8080/помощник | ПОЛУЧАТЬ | Получите все слова. |
локальный хост: 8080/помощник/рейтинг | ПОЛУЧАТЬ | Получить все слова, ранжированные по баллам. |
localhost:8080/helper/ranked/{numOfWords} | ПОЛУЧАТЬ | Получите все слова, ранжированные по баллам, и укажите, сколько слов вернулось. |
локальный хост: 8080/помощник/старт | ПОЛУЧАТЬ | Запустите игру. Вернет лучшие предположения, упорядоченные по баллам. |
localhost:8080/helper/start/{слово} | УДАЛИТЬ | Введите свое предположение для {word} и включите шаблон, полученный от Wordle, в тело запроса в формате JSON (т. е. какие буквы были зелеными, желтыми, серыми). Пример: { "f0": "желтый", "o1": "желтый", "o2": "зеленый", "d3": "серый", "s4": "зеленый" } |
локальный хост: 8080/помощник/эндшпиль | УДАЛИТЬ | Игра заканчивается, когда вы угадали правильное слово. |
HTTP-запрос | Тип | Функция |
---|---|---|
localhost:8080/helper/wordbyid/{id} | ПОЛУЧАТЬ | Получить пословный идентификатор. |
localhost:8080/helper/wordbyname/{nameofword} | ПОЛУЧАТЬ | Получить слово за словом имя. |
HTTP-запрос | Тип | Функция |
---|---|---|
localhost: 8080/competitive/computemachinescores | ПОМЕЩАТЬ | Требуется для запуска в рамках настройки соревновательного режима. Это заполнит машинные догадки в таблице fact_response. |
локальный хост: 8080/конкурентный/все | ПОЛУЧАТЬ | Получить все игры в базе данных. |
локальный хост: 8080/competitive/addgame | ПОЧТА | Добавьте новую игру (JSON) в базу данных, используя тело запроса. Пример: { «Идентификатор пользователя»: 1, «ИД ответа»: 1, «Угадано пользователем»: 3 } |
localhost:8080/competitive/dailyresults/{date} | ПОЛУЧАТЬ | Получить все результаты на указанную дату. |
localhost:8080/competitive/userresults/{имя пользователя}/{дата} | ПОЛУЧАТЬ | Получить все результаты для имени пользователя на данную дату. |
localhost:8080/competitive/userresults/{имя пользователя} | ПОЛУЧАТЬ | Получить все результаты для имени пользователя. |
localhost:8080/competitive/averageresults/{имя пользователя} | ПОЛУЧАТЬ | Получите среднее значение догадок пользователя. |
localhost: 8080/competitive/start/{userId} | ПОЛУЧАТЬ | Запустите игру для пользователя с соответствующим идентификатором. |
localhost: 8080/competitive/start/{userid}/{guess} | УДАЛИТЬ | Введите предположение пользователя в поле {guess}. Повторяйте для каждой догадки, пока игра не будет завершена. |
localhost: 8080/competitive/start/{userid}/end | ПОЧТА | Завершите игру для пользователя и сохраните результат в базе данных. |
локальный хост: 8080/пользователь | ПОЛУЧАТЬ | Получить всех пользователей из базы данных. |
локальный хост: 8080/пользователь/{userId} | ПОЛУЧАТЬ | Получить пользователя из базы данных по идентификатору. |
локальный хост: 8080/пользователь | ПОЧТА | Добавьте пользователя (JSON) в базу данных, используя тело запроса. Пример: { "имя": "Суад", "электронная почта": "[email protected]", "userName": "SusuTheFlowerPot" } |
HTTP-запрос | Тип | Функция |
---|---|---|
локальный хост: 8080/конкурентный/{id} | ПОМЕЩАТЬ | Обновить игру (JSON) по идентификатору через тело запроса. Пример: { «Идентификатор пользователя»: 1, «ИД ответа»: 1, «Угадано пользователем»: 3 } |
локальный хост: 8080/конкурентный/{id} | УДАЛИТЬ | Удалить игру по id. |
локальный хост: 8080/конкурентный/{id} | ПОЛУЧАТЬ | Получить игру по идентификатору. |
локальный хост: 8080/ответы | ПОЛУЧАТЬ | Получите все ответы. |
локальный хост: 8080/ответы/{id} | ПОЛУЧАТЬ | Получите ответ по идентификатору ответа. |
локальный хост: 8080/ответы/добавить ответ | ПОЧТА | Добавьте ответ (JSON), используя тело запроса. Пример: { "dateOfAnswer": "04.01.2025", "answerOfDay": "талия", «машинныйрезультат»: 3 } |
локальный хост: 8080/ответы/{id} | УДАЛИТЬ | Удалить ответ по идентификатору. |
локальный хост: 8080/ответы/обновление/{id} | ПОМЕЩАТЬ | Обновите ответ (JSON) по идентификатору, используя тело запроса. Пример: { "dateOfAnswer": "04.01.2025", "answerOfDay": "талия", «машинныйрезультат»: 3 } |
локальный хост: 8080/пользователь/{userId} | УДАЛИТЬ | Удалить пользователя по идентификатору. |
локальный хост: 8080/пользователь/{userId} | ПОМЕЩАТЬ | Обновите пользователя (JSON) по идентификатору, используя тело запроса. Пример: { "имя": "Суад", "электронная почта": "[email protected]", "userName": "SusuTheFlowerPot" } |
Огромное спасибо команде БНТА и особенно нашим тренерам Колину, Нельсону и Иэну!