Ներածություն

Wordle-ը վիրուսային էր Twitter-ում վերջին մի քանի շաբաթների ընթացքում: Դա իսկապես պարզ խաղ է և իսկապես հաջողակ է: Սակայն մարդիկ կարողացան հակադարձ ինժեներականացնել այն և պարզել, թե ինչ են լինելու բառերը ապագայում: Ես ուզում էի փորձել և պատրաստել այնպիսի մեկը, որը հնարավոր չէ նման կերպ մշակել: Ես պատրաստեցի մեկը, բայց քանի որ կան հարյուրավոր Ինչպես ստեղծել Wordle ձեռնարկները, ես կկենտրոնանամ միայն Ինչպես դարձնել այն մի փոքր ավելի անվտանգ մասի վրա: Ես դրա համար կօգտագործեմ առանց սերվերի գործառույթներ:

Նշում. առանց սերվերի գործառույթները կարող են մի փոքր արժենալ, եթե ձեր Wordle-ը վիրուսային դառնա:

Ի՞նչն է սխալ Wordle-ի հետ:

Չեմ ասի, որ Wordle-ի հետ ինչ-որ բան սխալ է: Դա պարզապես ընտրություն է, որը կատարել է դրա մշակողը: Համոզված եմ, որ եթե Ջոշ Ուորդլը ցանկանար, կարող էր ավելի ապահով դարձնել, իսկ եթե ես նրա տեղում լինեի, ես նույնպես կպատրաստեի այնպես, ինչպես նա է անում։

Ինչո՞ւ։ Քանի որ առանց սերվերի գործառույթների օգտագործումը ծախսատար է, եթե տրաֆիկը չափազանց շատ է:

Ռոբերտ Ռեյխելը գրել է լավ հոդված Reverse Engineering Wordle-ի մասին, որը բացատրում է, թե ինչպես է Josh Wardle’s Wordle-ը որոշում հաճախորդի կողմից նշված բառերը:

Այս պահին մենք բավականաչափ ուսումնասիրություն ենք կատարել՝ իմանալու համար, թե ինչպես է Wordle-ն ընտրում օրվա բառը: Մենք գիտենք, որ Wordle-ն օգտագործում է հաճախորդի կողմից ամսաթվերի վրա հիմնված ալգորիթմ՝ որոշելու համար, թե որ բառն օգտագործել ստատիկ բառացանկից: Յուրաքանչյուր օր կանխատեսելի է այնքան ժամանակ, քանի դեռ մենք ունենք բոլոր ծածկագիրը միասին

Reverse Engineering Wordle | Ռոբերտ Ռեյխելը

Ի՞նչ նկատի ունեմ ապահով ասելով:

Ապահով ասելով ես նկատի ունեմ, որ ոչ ոք չի կարողանա իմանալ, թե որն է վաղվա (կամ հաջորդ օրը, կամ ապագայի ցանկացած օր) բառը: Միշտ կարելի է իմանալ, թե որն է այսօրվա խոսքը՝ մեկ անգամ խաղալով խաղը, տեսնելով բառը և նորից խաղալով այն այլ բրաուզերում: Կամ եթե գիտեք, թե ինչպես դա անել, կարող եք հարցում ուղարկել API-ին և այն ձեզ կասի այսօրվա խոսքը: Սա ի՞նչ կանի։ Սա կկանխի The Wordlinator-ի նման բոտերը, որոնք փչացնում են խաղը ուրիշների համար:

Բացի այդ, այս մեթոդի կիրառման մեկ այլ առավելություն է. Անկախ նրանից, թե աշխարհի որտեղից եք խաղում, բոլորը միաժամանակ կստանան նոր բառը, քանի որ ընտրությունը հիմնված կլինի սերվերի ժամացույցի վրա, այլ ոչ թե հաճախորդի: Wordle-ի շատ խաղերում այս խնդիրը կա, երբ որոշ մարդիկ սկսում են նոր բառը ստանալ ավելի շուտ, քան մնացած աշխարհը, քանի որ նրանց համար նոր օրվա ժամը 12:00-ն է, իսկ մնացած աշխարհը դեռ նախորդ օրը է:

Ինչպե՞ս դա անել:

Ես չեմ գրի այն մասին, թե ինչպես պատրաստել ամբողջ Wordle խաղը, այլ միայն API/Serverless Functions մասը: Այն կարող է տեղակայվել ցանկացած հարթակում, որը ցանկանում եք: Ես իմը տեղադրեցի Next.js և Vercel վրա:

Պահանջներ:

  • Բառերի ցանկ, որոնցից կընտրվի յուրաքանչյուր օրվա խոսքը: Ավելի լավ է, եթե սա բառերի ավելի մեծ ցուցակի ենթաբազմություն է, որը որոշում է, թե որ բառն է ընդունված, իսկ որը` ոչ: Բառի ընդունման տրամաբանությունը և մեծ ցուցակը կարող են լինել հաճախորդի կողմից: (Ավելի լավ կլինի, քանի որ դա կնվազեցնի API-ի բեռը և կարող է խնայել գումար): Բառերի ավելի փոքր ցուցակը երբեք չի բեռնվում հաճախորդի վրա:

Տրամաբանություն:

Դրա տրամաբանությունը բավականին պարզ է. Մենք կստեղծենք API երթուղի, որը.

  1. Բեռնում է բառերի ցանկը, որոնցից մենք ամեն օր ընտրում ենք մեկ բառ
  2. Հաշվում է որոշ ֆիքսված տվյալների (օրինակ՝ հավելվածի/խաղի գործարկման օրը) օրերի քանակը։
  3. Հաշվարկված տարբերությունը օգտագործելով բառերի ցանկից ընտրել և պատասխանել բառով:

Կոդ:

// Next.js API route support: https://nextjs.org/docs/api-routes/introduction  
import { DateTime } from 'luxon';  
import type { NextApiRequest, NextApiResponse } from 'next'  
import { GameData } from '../../lib/interfaces';  
import gameWords from "../../data/selected.json"; // The list of words
// Function to calculate the difference between today and and a fixed date  
function getIndex():number {  
    let start = DateTime.fromFormat("31/01/2022","dd/mm/yyyy").setZone("UTC+5:30").startOf("day")  
    let today = DateTime.now().setZone("UTC+5:30").startOf("day")  
    return today.diff(start,'days').get('days');  
}
export default function handler(req: NextApiRequest,res: NextApiResponse<GameData>) {  
    let id = getIndex();  
    res.status(200).json({  
        id: id,  
        word: gameWords\[id\]  
    });  
}

Բացի այդ, եթե ցանկանում եք, կարող եք ստեղծել մեկ այլ API վերջնակետ, որը վերադարձնում է հաջորդ բառի համար մնացած ժամանակը:

import { NextApiRequest, NextApiResponse } from "next/types";  
import {DateTime} from "luxon";
export default function handler(  
    req: NextApiRequest,  
    res: NextApiResponse<number>  
  ) {  
    let t = DateTime.now().setZone("UTC+5:30").startOf('day').plus({days:1}).valueOf()  
    res.status(200).send(t)  
  }

Այս երկու API-ներով դուք կարող եք Wordle խաղ ստեղծել, որը մի փոքր ավելի ապահով է:

Հղումներ:

Նաև