Botpot
Visit our website
  • Fundamentals
    • Botpot overview
    • Get action
      • Get action: game state
      • Get action: API object
      • Get action: action object
    • Specialized game concepts
      • Get action: ref data
      • Game settings
    • Botpot architecture
  • Games
    • Creating your first bot
    • Understanding game logic
    • Explore game documentations
      • Tic-Tac-Toe
      • Quoridor
      • Connect Four
      • Battleship
      • Virus War
      • Dots and Boxes
      • Hex
      • Reversi
      • Gomoku
      • Mancala
      • Uno
      • Big 2
      • Snake & Tetris
      • Checker
      • Generals
      • Blokus
      • Wordle
      • Chinese Checker
Powered by GitBook
On this page
  • Game logic
  • Game state schema
  • Action schema

Was this helpful?

  1. Games
  2. Explore game documentations

Wordle

Game logic

Game Logic code
import random
round_count = 20
def init_game(game_settings, ref_data):
    return {
        "player_turn_idx": 0,
        "answers": [random.choice(ref_data["words"]).upper() for i in range(round_count)],
        "round_index": 0,
        "guesses_each_round": [{
            "guesses": []
        } for i in range(round_count)],
        "scores": []
    }

def guess(state, ref_data, word):
    if len(word) != 5:
        raise InvalidActionError("Guesses should be 5 letters long")
    word = word.upper()
    round_index = state["round_index"]
    target = state["answers"][round_index]
    letter_bag = list(target)
    result = ['', '', '', '', '']

    for i in range(len(word)):
        if word[i] == target[i]:
            result[i] = 'G'
            letter_bag.remove(word[i])
    for i in range(len(word)):
        if result[i] == 'G':
            continue
        if word[i] in letter_bag:
            result[i] = 'Y'
            letter_bag.remove(word[i])
        else:
            result[i] = 'B'
    guesses_this_round = state["guesses_each_round"][round_index]["guesses"]
    guesses_this_round.append({
            "guess": word,
            "result": "".join(result)
        })

    if word == target or len(guesses_this_round) == 6:
        if round_index < round_count - 1:
            state["round_index"] += 1
        if word == target:
            if len(guesses_this_round) == 1:
                state["scores"].append(10)
            elif len(guesses_this_round) == 2:
                state["scores"].append(10)
            elif len(guesses_this_round) == 3:
                state["scores"].append(6)
            elif len(guesses_this_round) == 4:
                state["scores"].append(3)
            elif len(guesses_this_round) == 5:
                state["scores"].append(2)
            elif len(guesses_this_round) == 6:
                state["scores"].append(1)
        else:
            state["scores"].append(-5)

    return state

def get_game_result(state, ref_data):
    round_index = state["round_index"]
    target = state["answers"][round_index]
    guesses_this_round = state["guesses_each_round"][round_index]["guesses"]
    if (round_index == round_count - 1 and 
        len(guesses_this_round) > 0 and 
        (len(guesses_this_round) == 6 or guesses_this_round[-1]["guess"] == target)):
        return {
            "game_result": "SinglePlayerCompleted",
            "winner_idx": 0,
            "score": sum(state["scores"])
        }

    return {
        "game_result": "NoWinnerYet",
    }


def get_player_states(state, ref_data):
    player_states = []
    round_index = state["round_index"]
    target = state["answers"][round_index]
    guesses_this_round = state["guesses_each_round"][round_index]["guesses"]
    for i in range(1):
        obfuscated_answers = []
        for i in range(len(state["answers"])):
            if round_index > i:
                obfuscated_answers.append(state["answers"][i])
            elif round_index == i and len(state["guesses_each_round"][round_index]["guesses"]) == 6:
                obfuscated_answers.append(state["answers"][i])
            elif round_index == i and len(guesses_this_round) > 0 and guesses_this_round[-1]["guess"] == target:
                obfuscated_answers.append(state["answers"][i])
            else:
                obfuscated_answers.append("*****")
        player_states.append({
            "player_turn_idx": state["player_turn_idx"],
            "round_index": state["round_index"],
            "guesses_each_round": state["guesses_each_round"],
            "scores": state["scores"],
            "answers": obfuscated_answers
        })
    return player_states

Game state schema

message State {
  int32 player_turn_idx = 1;
  int32 round_index = 2;
  repeated GuessesEachRound = 3;
  repeated int32 scores = 4;
  repeated string answers = 5;
}
message GuessesEachRound {
  repeated Guess guesses = 1;
}
message Guess {
  string guess = 1;
  string result = 2;
}
message refData {
  repeated string words = 1;
}

Action schema

guess(string word)

Last updated 1 year ago

Was this helpful?

Start building now