Compare commits
No commits in common. "bram/greedy" and "main" have entirely different histories.
bram/greed
...
main
106
agents/greedy.py
106
agents/greedy.py
|
|
@ -1,106 +0,0 @@
|
||||||
"""
|
|
||||||
This module contains a greedy agent that has little respect for risks and
|
|
||||||
downsides. All they care about is trying to win as fast as possible!
|
|
||||||
"""
|
|
||||||
|
|
||||||
from __future__ import annotations
|
|
||||||
|
|
||||||
import random
|
|
||||||
|
|
||||||
from .agent import Agent, Payload
|
|
||||||
|
|
||||||
class GreedyAgent(Agent):
|
|
||||||
"""
|
|
||||||
The greedy agent attempts the quickest way to win a game.
|
|
||||||
They do not care for risks.
|
|
||||||
"""
|
|
||||||
|
|
||||||
def __init__(self) -> None:
|
|
||||||
"""
|
|
||||||
The greedy agent attempts the quickest way to win. In some games,
|
|
||||||
they act extremely aggressive, with little care for protection.
|
|
||||||
"""
|
|
||||||
|
|
||||||
super().__init__(
|
|
||||||
name="Greedy agent",
|
|
||||||
author="Bram",
|
|
||||||
version="1.0.0",
|
|
||||||
profile={},
|
|
||||||
)
|
|
||||||
|
|
||||||
self.add_tic_tac_toe(on_move=self.play_tic_tac_toe, profile={})
|
|
||||||
self.add_royal_game_of_ur(on_move=self.play_royal_game_of_ur, profile={})
|
|
||||||
|
|
||||||
@staticmethod
|
|
||||||
def play_tic_tac_toe(payload : Payload) -> Payload:
|
|
||||||
"""
|
|
||||||
Play a game of tic-tac-toe.
|
|
||||||
|
|
||||||
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]
|
|
||||||
"""
|
|
||||||
lines = [
|
|
||||||
[ 1, 2, 3, ],
|
|
||||||
[ 4, 5, 6, ],
|
|
||||||
[ 7, 8, 9, ],
|
|
||||||
|
|
||||||
[ 1, 4, 7, ],
|
|
||||||
[ 2, 5, 8, ],
|
|
||||||
[ 3, 6, 9, ],
|
|
||||||
|
|
||||||
[ 1, 5, 9, ],
|
|
||||||
[ 3, 5, 7, ],
|
|
||||||
|
|
||||||
]
|
|
||||||
|
|
||||||
lines_0 = set()
|
|
||||||
lines_1 = set()
|
|
||||||
lines_2 = set()
|
|
||||||
|
|
||||||
for i in range(1, 10):
|
|
||||||
if payload.get(str(i), "") != "":
|
|
||||||
continue
|
|
||||||
|
|
||||||
lines_0.add(i)
|
|
||||||
|
|
||||||
for line in lines:
|
|
||||||
if i not in line:
|
|
||||||
continue
|
|
||||||
items = [ str(payload.get(str(l), "")) for l in line ]
|
|
||||||
|
|
||||||
match items.count(payload.get("your_token", "X")):
|
|
||||||
case 1:
|
|
||||||
lines_1.add(i)
|
|
||||||
case 2:
|
|
||||||
lines_2.add(i)
|
|
||||||
|
|
||||||
# If you can create 3 in a row, take it
|
|
||||||
if len(lines_2) > 0:
|
|
||||||
return { "move": random.choice(list(lines_2)) }
|
|
||||||
|
|
||||||
# If you can create 2 in a row, take it
|
|
||||||
elif len(lines_1) > 0:
|
|
||||||
return { "move": random.choice(list(lines_1)) }
|
|
||||||
|
|
||||||
# Otherwise, just pick something random
|
|
||||||
return { "move": random.choice(list(lines_0)) }
|
|
||||||
|
|
||||||
@staticmethod
|
|
||||||
def play_royal_game_of_ur(payload : Payload) -> Payload:
|
|
||||||
"""
|
|
||||||
Play a game of Royal Game of Ur.
|
|
||||||
|
|
||||||
In this game, we always care about moving the piece forward that
|
|
||||||
is already closest to the finish.
|
|
||||||
"""
|
|
||||||
return { "move": max(payload.get("valid_moves", [0])) }
|
|
||||||
|
|
@ -4,7 +4,7 @@
|
||||||
|
|
||||||
from __future__ import annotations
|
from __future__ import annotations
|
||||||
|
|
||||||
import agents.greedy
|
import agents
|
||||||
|
|
||||||
from pyserver import PyServer
|
from pyserver import PyServer
|
||||||
|
|
||||||
|
|
@ -15,7 +15,7 @@ def main() -> int:
|
||||||
:return: Exit code
|
:return: Exit code
|
||||||
:rtype: int
|
:rtype: int
|
||||||
"""
|
"""
|
||||||
player = PyServer(agents.greedy.GreedyAgent())
|
player = PyServer(agents.AgentOfChaos())
|
||||||
|
|
||||||
# Start listening for games
|
# Start listening for games
|
||||||
player.start(
|
player.start(
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue