""" The sneaky agent is built to trick the naive line counter agent. I believe if the sneaky agent starts, they will win against the line counter agent. I have not tested this yet, as the naive line counter agent wasn't in the branch I checked out and I'm lazy, so time will tell... """ from __future__ import annotations import random from .agent import Agent, Payload class SneakyAgent(Agent): """ It tries to get both opposite corners (1 and 9) and then get another corner that would give it two routes to win """ def __init__(self) -> None: """ Create a new instance of the sneaky agent. """ super().__init__( # Give your bot a name to display in leaderboards name="Sneaky agent", # Your name, to give you credit author="Sam", # Update the version to indicate the agent behaves differently. # This will later allow you to compare different versions of your # agent against one another. version="1.0.0", # Add extra custom information about the agent to this dictionary. profile={}, ) # Indicate that you're willing to play tic-tac-toe # Remove this if you don't want your bot to participate there. self.add_tic_tac_toe(on_move=self.play_tic_tac_toe, profile={}) @staticmethod def play_tic_tac_toe(payload : Payload) -> Payload: """ I've placed move comments to indicate which move that would be in the ideal game against the line counter. This assumes this agent starts and so move 1 is {"move": 1}, etc... If none of the options are valid, we return a random move """ # Try printing the payload to see what it looks like! print(payload) # Current State cs = dict(payload) # Move 1 if cs["1"] == "": return { "move": 1} # Move 2 if cs["9"] == "": return { "move": 9} # Move 4 if cs["2"] == "" and cs["1"] == cs["your_token"] and cs["3"] == cs["your_token"]: return { "move": 2} if cs["6"] == "" and cs["3"] == cs["your_token"] and cs["9"] == cs["your_token"]: return { "move": 6} if cs["8"] == "" and cs["7"] == cs["your_token"] and cs["9"] == cs["your_token"]: return { "move": 8} if cs["4"] == "" and cs["1"] == cs["your_token"] and cs["7"] == cs["your_token"]: return { "move": 4} # Move 3 if cs["2"] == "" and cs["6"] == "" and cs["3"] == "": return { "move": 3} if cs["4"] == "" and cs["8"] == "" and cs["7"] == "": return { "move": 7} # If the sneaky strategy doesn't work options = [ 1, 2, 3, 4, 5, 6, 7, 8, 9, ] return { "move": random.choice(options) }