Giter Club home page Giter Club logo

spelling-bee's Introduction

Spelling Bee

Play the latest NY Times "Spelling Bee" puzzle with a group of friends.

This is the real puzzle, just like playing on the NY Times site/apps:

  • only words from the official list are accepted
  • the same scoring rules apply

In addition, you get these features:

  • see the total score for each player
  • for each word you've found, see which other player(s) also found it
  • see how many points each of the other players has for words that you haven't found
  • see the group score considering your words and your friends' words
  • no hints, even if you open Web Inspector

You can also review every previous puzzle, including all the words and who found them.

For a demo, see https://spellingbee.theprescotts.com, but please note that not all of the features work. If you're interested in hosting a server for yourself and your friends, get in touch and I can help you get started.

UI

Some things about the UI that might not be obvious:

A player's score "bubble" is filled with a solid color if they have found all the pangrams.

The number in the main, colored score bubble for the player is the score for all of the words found by the player so far. A number like "+7" in the grey bubble to the right of it is the number of points needed to reach the next level.

The last bubble is colored when the player reaches the "Genius" score for the day. If the player finds all possible words, the bubble turns yellow (and the secret "Queen Bee" level is shown.)

Friend and Group Scores

The server keeps track of a set of friends for each player. When authenticated, the current player's score and each friend's score is shown below the word list.

Score bubbles for each friend work just like the main score display, except that the total score is shown to the right of the bubbles to make it easier to read. Note: the score shown is each players' actual total score, including words they found which don't appear anywhere in the UI (because the current player hasn't found them.)

The name and score of the current player (that's you!) are shown in bold. Otherwise it just shows the same score as appears at the top of the page.

When a number appears in parens after a friend's score, it shows the points that friend has earned for words which you do not have. For example, if a friend has found all the words you have, but also has one additional 5-letter word that you don't, "(5)" will appear.

The last row of scores shows the score for the whole Group, which is the total point value of all words found by the player and any of the friends. The maximum score possible for the day is also shown on the right.

The "Group" score bubble is filled if every pangram has been found by someone in the group. That is, on days when more than one pangram is available, the Group score bubble remains unfilled as long as there is a pangram that no one has found yet.

Backend

This repo provides a UI for playing. It requires a backend that provides the letters each day, checks words, and keeps track of which players have found each word. The required API is as follows:

GET /puzzle

Ask the server for the latest puzzle and the state of solving. The request body is empty and can be ignored. The response contains the day's letters, all the words found by the client, and the total score for each user (including the client itself.) For each word already found, it indicates the name of each user who has already found that word (including the current user.) When the puzzle is still active, only words already found by the current user are included.

Example response body:

{
    "user": "jeff",
    "id": 12021,
    "nextPuzzleId": null,
    "previousPuzzleId": 12020,
    "puzzle": {
        "expiration": 1614326400,
        "printDate": "2021-02-25",
        "displayDate": "February 25, 2021",
        "displayWeekday": "Thursday",
        "editor": "Sam Ezersky",
        "centerLetter": "o",
        "outerLetters": ["a", "g", "l", "m", "r", "u",
        ]
    },
    "found": [
        ["gloom", ["jeff"]],
        ["glom", ["jeff", "steve"]]
    ],
    "hints": {
        "maxScore": 150,
        "pangramCount": 1
    },
    "friends": {
        "steve": { "hasPangram": true, "score": 120, "hasAllPangrams": false },
        "jeff": { "hasPangram": false, "score": 6, "hasAllPangrams": false },
        "dave": { "hasPangram": false, "score": 0, "hasAllPangrams": false }
    },
    "co-op": {
        "hasAllPangrams": true,
        "score": 121
    }
}

This request can be repeated as often as desired to get the latest scores for each player.

GET /puzzle/{id}

Get a puzzle by id, which can be the latest, active puzzle or any previous day's (expired) puzzle. The response is the same as for /puzzle except: if the puzzle is expired, then found will also contain words that the user didn't find.

Note: no assumption is made about ids being in any particular sequence. The client always asks for the latest puzzle and uses previousPuzzleId to walk backwards.

POST /word

Submit a word to the server to be checked against the list of accepted words for the latest, non-expired puzzle.

Example request body:

"glum"

If the word is acceptable, it is recorded as found by the client's user (if authenticated), and a 200 OK response is returned with no body.

If the word is not correct, a 400 Bad Request response is returned, possibly with some explanatory information in the body (but the format of that information is not specified.) A correctly implemented client will not submit any badly-formed words, so it can infer that the problem is that the word does not appear on the list of accepted words.

Authentication

The backend must somehow authenticate users and identify who's who so it can show the correct state to each user. The client doesn't provide any UI for login.

If there's no authenticated user, the backend cannot save state, so the client keeps track of the list of found words locally.

Scoring

Ranks are based on a percentage of possible points in a puzzle.

For example, when the total possible is 180:

  • Beginner: 0 = 0%
  • Good Start: 4 = 2% (rounded down to the nearest even integer)
  • Moving Up: 9 = 5%
  • Good: 14 = 8% (rounded up to the nearest even integer)
  • Solid: 27 = 15%
  • Nice: 45 = 25%
  • Great: 72 = 40%
  • Amazing: 90 = 50%
  • Genius: 126 = 70%
  • Queen Bee: 180 = 100%

4-letter words are worth one point each. Longer words are worth one point per letter. A "pangram" (a word containing all seven letters) earns an additional seven points.

spelling-bee's People

Contributors

mossprescott avatar

Watchers

 avatar  avatar

spelling-bee's Issues

Show who’s currently active

Sometimes you can tell other people are playing at the same time, because their score changes. It would be fun if the app made it more obvious when others were playing at the same time.

One or more of the following:

  1. Periodically sync the scores, so you don’t have to manually reload the page to see updates.
  2. Some kind of pop up when somebody else finds a word. It would be similar to what you see when you find a word, but hide the word/points if you don’t have the word yet.
  3. Indicate who’s “currently active” (i.e. some interaction with the server in the last 5 minutes), with something like a green light next to their name.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.