mirror of
https://github.com/sigmasternchen/html-tictactoe
synced 2025-03-15 03:28:55 +00:00
feat: Remove duplicate states
This commit is contained in:
parent
e4b0ec83dc
commit
110935e6e8
3 changed files with 26 additions and 13 deletions
|
@ -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)
|
||||||
|
|
|
@ -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):
|
||||||
|
|
|
@ -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 -%}
|
||||||
|
|
Loading…
Reference in a new issue