From 69b5a9bb76e1fde9d966dbc4db32725eed2ca020 Mon Sep 17 00:00:00 2001 From: Dominik Roth Date: Fri, 15 Apr 2022 14:35:58 +0200 Subject: [PATCH] New README --- README.md | 5 +++-- brains/uttt.pth | Bin 15175 -> 15175 bytes 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 482fcd0..23784dc 100644 --- a/README.md +++ b/README.md @@ -17,5 +17,6 @@ A new AI is created by subclassing the State-class and defining the following fu - (optional) interface to allow a human to select an action ### Current state of the project -It currently does not work and implements none of the named functionality in a working fashion. -Experiment for TicTacToe, Dikehiker and an encryption-breaker for rc4 are being worked on. +The only thing that currently works is the AI for Ultimate TicTacToe. +It uses a trained neural heuristic (neuristic) +You can train it or play against it (will also train it) using 'python ultimatetictactoe.py' diff --git a/brains/uttt.pth b/brains/uttt.pth index 200b67328140e60c995987af7bc9a9145ff9622a..63095f8e5c5c1167bd15e48c126e0b71086b8045 100644 GIT binary patch delta 8796 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 delta 8796 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