""" This module enables a user to host a server that is able to play games. """ from __future__ import annotations import random from pyserver import PyServer from typing import Any def main() -> int: """ Start a server. :return: Exit code :rtype: int """ player = PyServer( # Customize this to whatever you'd like to call your player name="My super smart robot player", # Custom information that you can use to tell people about this player profile={}, # Unless you know what you're doing, don't touch this. import_name=__name__, ) # Register games! Comment out any you don't want your player to play. player.add_tic_tac_toe(on_move=play_tic_tac_toe, profile={}) # Start listening for games player.start( host="0.0.0.0", # Comment out when using only locally port=5000, ) return 0 def play_tic_tac_toe(payload : dict[str, Any]) -> dict[str, Any]: """ Play a game of tic-tac-toe. You receive a payload that looks like this: { "1": "X", "2": "", "3": "O", "4": "X", "5": "O", "6": "", "7": "", "8": "", "9": "", "your_token": "X" } And you're expected to return a response of which field you'd like to place your piece in. For example, if you wish to place your token in field 7, your response should look like this: { "move": 7 } The board is arranged as follows: 1 | 2 | 3 ---+---+--- 4 | 5 | 6 ---+---+--- 7 | 8 | 9 :param payload: The incoming JSON that contains the game state. :type payload: dict[str, Any] :return: The move you wish to take. :rtype: dict[str, Any] """ # Try printing the payload to see what it looks like! print(payload) options = [ 1, 2, 3, 4, 5, 6, 7, 8, 9, ] # 1. Try filtering out the impossible moves! # If an X or O was already placed at a field, remove it from the options # # 2. Try finding two in a row! If possible, you can try to place the third # item on the board and get 3 in a row. # # 3. Perhaps you can block the opponent from getting 3 in a row? # # Now, pick any of the remaining options. # This is just a simple implementation. Naturally, you're welcome to try # your own logic. return { "move": random.choice(options) } if __name__ == "__main__": raise SystemExit(main())