نحن لعبة التقليد، فريق يتكون من أعضاء BNTA Cohort 4، أليكس، كريستيان، سعاد، روزاليندا، وراشيل.
تم الانتهاء من هذا المشروع التعاوني كجزء من برنامج Bright Network Technology Academy. يتكون المشروع من تطبيق مساعد Wordle، استنادًا إلى مفاهيم نظرية المعلومات المستخدمة في فيديو YouTube بواسطة 3Blue1Brown - حل Wordle باستخدام نظرية المعلومات .
تم إنشاء واجهة برمجة التطبيقات باستخدام 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
يتم ترتيبها حسب خاصية النتيجة.
.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()
قم بإرجاع قائمة بجميع الإدخالات في جدول الإجابات الفعلية ككائنات Answer
.
.doesAnswerWithIdExists(Integer id)
يُرجع true
إذا كان كائن الإجابة بالمعرف موجودًا في جدول الإجابات الفعلية
.getAnswerById(Integer id)
إرجاع كائن الإجابة بالمعرف المقابل من جدول الإجابات الفعلية
.addAnswerToTable(Answer answer)
يأخذ كائن Answer
ويضيفه إلى جدول الإجابات الفعلية
.deleteAnswerById(Integer id)
يحذف كائن Answer
بالمعرف المطابق من جدول الإجابات الفعلية من الوسيطة
.updateAnswerById(Integer id, Answer answer)
يقوم بتحديث كائن Answer
بالمعرف المطابق من جدول الإجابات الفعلية مع تمرير كائن Answer
في الوسيطة
في هذا القسم، يتم سرد POJOs المستخدمة في المشروع مع خصائصها وبنية JSON ذات الصلة عند استخدام طلب POST وPUT:
طلب HTTP | يكتب | وظيفة |
---|---|---|
كلمة | • معرف عدد صحيح • سلسلة كلمة • احتمال مزدوج • نقاط مزدوجة | لا يوجد |
مستخدم | • معرف عدد صحيح • اسم السلسلة • سلسلة البريد الإلكتروني • اسم المستخدم سلسلة | { "الاسم": "سعاد"، "البريد الإلكتروني": "[email protected]"، "اسم المستخدم": "SusuTheFlowerPot" } |
إجابة | • معرف عدد صحيح • LocalDate DateOfAnswer • سلسلة AnswerOfDay • نتائج آلة عدد صحيح | { "تاريخ الإجابة": "04/01/2025", "answerOfDay": "الخصر", "نتيجة الآلة": 3 } |
لعبة | • معرف عدد صحيح • معرف المستخدم عدد صحيح • معرف الإجابة الصحيح • عدد صحيح UserGuesses | { "معرف المستخدم": 1، "معرف الإجابة": 1، "تخمين المستخدم": 3 } |
طلب HTTP | يكتب | وظيفة |
---|---|---|
المضيف المحلي: 8080/مساعد | يحصل | احصل على كل الكلمات. |
المضيف المحلي: 8080/مساعد/مرتبة | يحصل | الحصول على كل الكلمات مرتبة حسب النتيجة. |
المضيف المحلي:8080/مساعد/مرتبة/{numOfWords} | يحصل | احصل على جميع الكلمات مرتبة حسب النتيجة وحدد عدد الكلمات التي تم إرجاعها. |
المضيف المحلي: 8080/مساعد/بدء | يحصل | ابدأ اللعبة. سوف يعود أفضل التخمينات مرتبة حسب النتيجة. |
المضيف المحلي:8080/مساعد/بدء/{كلمة} | يمسح | أدخل تخمينك لـ {word} وقم بتضمين النمط الذي حصلت عليه من Wordle في نص الطلب كـ JSON (أي الحروف التي كانت باللون الأخضر والأصفر والرمادي). مثال: { "f0": "أصفر", "o1": "أصفر", "o2": "أخضر", "d3": "رمادي", "s4": "أخضر" } |
المضيف المحلي: 8080/مساعد/نهاية اللعبة | يمسح | تنتهي اللعبة عندما تحصل على الكلمة الصحيحة. |
طلب HTTP | يكتب | وظيفة |
---|---|---|
المضيف المحلي:8080/مساعد/wordbyid/{id} | يحصل | الحصول على كلمة بكلمة معرف. |
المضيف المحلي:8080/مساعد/wordbyname/{nameofword} | يحصل | الحصول على كلمة حسب اسم الكلمة. |
طلب HTTP | يكتب | وظيفة |
---|---|---|
المضيف المحلي: 8080/تنافسية/نتائج الآلات الحاسوبية | يضع | مطلوب للتشغيل كجزء من إعداد الوضع التنافسي. سيؤدي هذا إلى ملء تخمينات الآلة في جدول الإجابات الفعلية. |
المضيف المحلي: 8080/تنافسي/الكل | يحصل | الحصول على جميع الألعاب في قاعدة البيانات. |
المضيف المحلي:8080/تنافسية/addgame | بريد | أضف لعبة جديدة (JSON) إلى قاعدة البيانات باستخدام Request Body. مثال: { "معرف المستخدم": 1، "معرف الإجابة": 1، "تخمين المستخدم": 3 } |
المضيف المحلي:8080/تنافسية/النتائج اليومية/{التاريخ} | يحصل | الحصول على جميع النتائج في تاريخ معين. |
المضيف المحلي:8080/تنافسية/userresults/{اسم المستخدم}/{التاريخ} | يحصل | احصل على جميع النتائج لاسم المستخدم المحدد في التاريخ. |
المضيف المحلي:8080/تنافسية/userresults/{اسم المستخدم} | يحصل | احصل على جميع النتائج لاسم المستخدم. |
المضيف المحلي: 8080/تنافسية/متوسطةالنتائج/{اسم المستخدم} | يحصل | احصل على متوسط تخمينات المستخدم. |
المضيف المحلي:8080/تنافسية/بدء/{userId} | يحصل | ابدأ لعبة لمستخدم ذي معرف مطابق. |
المضيف المحلي:8080/تنافسية/بدء/{userid}/{تخمين} | يمسح | أدخل تخمين المستخدم في {تخمين}. كرر كل تخمين حتى تنتهي اللعبة. |
المضيف المحلي:8080/competitive/start/{userid}/end | بريد | نهاية اللعبة للمستخدم وحفظ النتيجة في قاعدة البيانات. |
المضيف المحلي: 8080/مستخدم | يحصل | الحصول على كافة المستخدمين من قاعدة البيانات. |
المضيف المحلي:8080/مستخدم/{userId} | يحصل | الحصول على المستخدم من قاعدة البيانات عن طريق المعرف. |
المضيف المحلي: 8080/مستخدم | بريد | أضف مستخدم (JSON) إلى قاعدة البيانات باستخدام نص الطلب. مثال: { "الاسم": "سعاد"، "البريد الإلكتروني": "[email protected]"، "اسم المستخدم": "SusuTheFlowerPot" } |
طلب HTTP | يكتب | وظيفة |
---|---|---|
المضيف المحلي:8080/تنافسية/{id} | يضع | تحديث اللعبة (JSON) عن طريق المعرف من خلال نص الطلب. مثال: { "معرف المستخدم": 1، "معرف الإجابة": 1، "تخمين المستخدم": 3 } |
المضيف المحلي:8080/تنافسية/{id} | يمسح | حذف اللعبة عن طريق الهوية |
المضيف المحلي:8080/تنافسية/{id} | يحصل | الحصول على اللعبة عن طريق الهوية |
المضيف المحلي: 8080/إجابات | يحصل | احصل على جميع الإجابات. |
المضيف المحلي:8080/answers/{id} | يحصل | الحصول على إجابة عن طريق معرف الإجابة. |
المضيف المحلي:8080/answers/addanswer | بريد | أضف إجابة (JSON) باستخدام نص الطلب. مثال: { "تاريخ الإجابة": "04/01/2025", "answerOfDay": "الخصر", "نتيجة الآلة": 3 } |
المضيف المحلي:8080/answers/{id} | يمسح | حذف الإجابة بواسطة معرف. |
المضيف المحلي:8080/answers/update/{id} | يضع | تحديث الإجابة (JSON) بالمعرف باستخدام نص الطلب. مثال: { "تاريخ الإجابة": "04/01/2025", "answerOfDay": "الخصر", "نتيجة الآلة": 3 } |
المضيف المحلي:8080/مستخدم/{userId} | يمسح | حذف المستخدم عن طريق الهوية. |
المضيف المحلي:8080/مستخدم/{userId} | يضع | قم بتحديث المستخدم (JSON) بالمعرف باستخدام نص الطلب. مثال: { "الاسم": "سعاد"، "البريد الإلكتروني": "[email protected]"، "اسم المستخدم": "SusuTheFlowerPot" } |
شكرًا جزيلاً لفريق BNTA، وخاصة لمدربينا كولن ونيلسون وإيان!