feat: Remove duplicate states

This commit is contained in:
sigmasternchen 2024-11-02 15:02:48 +01:00
parent e4b0ec83dc
commit 110935e6e8
3 changed files with 26 additions and 13 deletions

View file

@ -1,6 +1,6 @@
from jinja2 import Environment, select_autoescape, FileSystemLoader from jinja2 import Environment, select_autoescape, FileSystemLoader
from generator.model import Board, NOT_DETERMINED, WIN from generator.model import Board, NOT_DETERMINED, WIN, Move
from generator.tictactoe import calculate_best_move from generator.tictactoe import calculate_best_move
import random import random
@ -29,37 +29,38 @@ def get_taunt(board, outcome):
return "" return ""
def render_board(initial_prefix, prefix, board, outcome): def render_board(prefix, old_board, board, outcome):
with open("output/" + prefix + ".html", "w") as file: with open("output/" + prefix + old_board.getId() + ".html", "w") as file:
file.write( file.write(
template.render( template.render(
board=board, board=board,
prefix=prefix, prefix=prefix,
reset=initial_prefix + ".html", reset=prefix + ".html",
msg=get_taunt(board, outcome) msg=get_taunt(board, outcome),
Move=Move,
) )
) )
def generate_options(initial_prefix, prefix, board, outcome): def generate_options(prefix, old_board, board, outcome):
render_board(initial_prefix, prefix, board, outcome) render_board(prefix, old_board, board, outcome)
if board.winner() == NOT_DETERMINED: if board.winner() == NOT_DETERMINED:
for move in board.moves(): for move in board.moves():
future = board.apply(move) future = board.apply(move)
response, outcome = calculate_best_move(future) response, outcome = calculate_best_move(future)
print(prefix, move, response) print(board.getId(), move, response)
generate_options( generate_options(
initial_prefix, prefix,
prefix + str(move), future,
future.apply(response) if response else future, future.apply(response) if response else future,
outcome outcome
) )
if __name__ == "__main__": if __name__ == "__main__":
board = Board() board = Board()
generate_options("index", "index", board, NOT_DETERMINED) generate_options("index", board, board, NOT_DETERMINED)

View file

@ -97,6 +97,18 @@ class Board:
return DRAW return DRAW
def getId(self):
id = 0
for y in range(3):
for x in range(3):
id += self.field[y][x] * int(pow(3, (y * 3 + x)))
if id == 0:
return ""
else:
return hex(id)[2:]
def visualize(self): def visualize(self):
for y in range(3): for y in range(3):
for x in range(3): for x in range(3):

View file

@ -25,7 +25,7 @@
{%- elif winner != -1 -%} {%- elif winner != -1 -%}
   
{%- else -%} {%- else -%}
<a href={{ prefix }}{{ x }}{{ y }}.html>?</a> <a href={{ prefix }}{{ board.apply(Move(x, y)).getId() }}.html>?</a>
{%- endif -%} {%- endif -%}
</td> </td>
{%- endfor -%} {%- endfor -%}