Uploaded my most recent versions of the amazons work.
This commit is contained in:
parent
86130ecc8b
commit
c67ab96a52
Binary file not shown.
|
@ -0,0 +1,83 @@
|
||||||
|
class Board:
|
||||||
|
def __init__(self,):
|
||||||
|
self.state = self.get_initial_state()
|
||||||
|
|
||||||
|
def get_initial_state(self):
|
||||||
|
return [[0,0,0,0],[0,2,3,0],[0,3,2,0],[0,0,0,0]]
|
||||||
|
|
||||||
|
def get_active_player_code(self):
|
||||||
|
free_spaces = 0
|
||||||
|
for row in self.state:
|
||||||
|
for box in row:
|
||||||
|
if box == 0:
|
||||||
|
free_spaces += 1
|
||||||
|
if len(self.state[0])%2 == 0:
|
||||||
|
return (free_spaces%2+2)
|
||||||
|
else:
|
||||||
|
return (free_spaces%2+3)
|
||||||
|
|
||||||
|
def get_active_amazons_positions(self):
|
||||||
|
code = self.get_active_player_code()
|
||||||
|
positions=[]
|
||||||
|
for y, row in enumerate(self.state):
|
||||||
|
for x, box in enumerate(row):
|
||||||
|
if box == code:
|
||||||
|
positions.append((x, y))
|
||||||
|
return positions
|
||||||
|
|
||||||
|
def possible_moves(self):
|
||||||
|
directions = [(-1,1),(0,1),(1,1),(-1,0),(1,0),(-1,-1),(0,-1),(1,-1)]
|
||||||
|
move_options=[]
|
||||||
|
for amazon in self.get_active_amazons_positions():
|
||||||
|
amazon_move_options = self.get_reachable_squares(amazon)
|
||||||
|
for move_option in amazon_move_options:
|
||||||
|
burn_options = self.get_reachable_squares(move_option)
|
||||||
|
for burn_option in burn_options:
|
||||||
|
move_options.append((amazon, move_option, burn_option))
|
||||||
|
return move_options
|
||||||
|
|
||||||
|
def get_successor_state(self, move_and_burn):
|
||||||
|
new_state = self.state.copy()
|
||||||
|
ai, aj = [move_and_burn[0][0]], [move_and_burn[0][1]]
|
||||||
|
mi, mj = [move_and_burn[1][0]], [move_and_burn[1][1]]
|
||||||
|
bi, bj = [move_and_burn[2][0]], [move_and_burn[2][1]]
|
||||||
|
new_state[aj][ai] = 0
|
||||||
|
new_state[mj][mi] = self.get_active_player_code()
|
||||||
|
new_state[bj][bi] = 1
|
||||||
|
next_game_states.append(new_state)
|
||||||
|
return next_game_states
|
||||||
|
|
||||||
|
def get_possible_successor_states(self):
|
||||||
|
return [self.get_successor_state(move) for move in self.possible_moves()]
|
||||||
|
|
||||||
|
def is_empty(self, square):
|
||||||
|
i, j = square
|
||||||
|
if self.state[j][i] == 0:
|
||||||
|
return True
|
||||||
|
else:
|
||||||
|
return False
|
||||||
|
|
||||||
|
def in_bounds(self, square):
|
||||||
|
i, j = square
|
||||||
|
if (i < 0) or (j < 0) or (i > len(self.state[0])) or (j > len(self.state[0])):
|
||||||
|
return False
|
||||||
|
else:
|
||||||
|
return True
|
||||||
|
|
||||||
|
def get_reachable_squares(self, amazon):
|
||||||
|
directions = [(-1,1),(0,1),(1,1),(-1,0),(1,0),(-1,-1),(0,-1),(1,-1)]
|
||||||
|
reachables = []
|
||||||
|
for direction in directions:
|
||||||
|
move_option = amazon
|
||||||
|
hit_something = False
|
||||||
|
while hit_something == False:
|
||||||
|
move_option += direction
|
||||||
|
if self.in_bounds(move_option) and self.is_empty(move_option):
|
||||||
|
reachables.append(move_option)
|
||||||
|
else:
|
||||||
|
hit_something = True
|
||||||
|
return reachables
|
||||||
|
|
||||||
|
board = Board()
|
||||||
|
|
||||||
|
print(Board.possible_moves(board))
|
|
@ -0,0 +1,3 @@
|
||||||
|
import board
|
||||||
|
|
||||||
|
possible_moves()
|
Binary file not shown.
Binary file not shown.
|
@ -0,0 +1,39 @@
|
||||||
|
from unittest import TestCase
|
||||||
|
from board import Board
|
||||||
|
|
||||||
|
class TestBoard(TestCase):
|
||||||
|
def setUp(self):
|
||||||
|
self.board = Board()
|
||||||
|
self.tiny = Board()
|
||||||
|
self.tiny.state = [[3,0], [0,2]]
|
||||||
|
|
||||||
|
def test_board_size_is_correct(self):
|
||||||
|
self.assertEqual(len(self.board.state), 4)
|
||||||
|
|
||||||
|
def test_in_bounds_works(self):
|
||||||
|
bad = [
|
||||||
|
(-1, 1), (5, 1)
|
||||||
|
]
|
||||||
|
good = [
|
||||||
|
(2, 2), (0, 0), (3, 3)
|
||||||
|
]
|
||||||
|
for square in bad:
|
||||||
|
self.assertFalse(self.board.in_bounds(square))
|
||||||
|
for square in good:
|
||||||
|
self.assertTrue(self.board.in_bounds(square))
|
||||||
|
|
||||||
|
def test_get_initial_state(self):
|
||||||
|
|
||||||
|
def test_get_active_player_code(self):
|
||||||
|
|
||||||
|
def test_get_active_amazons_positions(self):
|
||||||
|
|
||||||
|
def test_possible_moves(self):
|
||||||
|
|
||||||
|
def test_get_successor_state(self, move_and_burn):
|
||||||
|
|
||||||
|
def test_get_possible_successor_states(self):
|
||||||
|
|
||||||
|
def test_is_empty(self, square):
|
||||||
|
|
||||||
|
def test_get_reachable_squares(self, amazon):
|
|
@ -0,0 +1 @@
|
||||||
|
import board
|
Loading…
Reference in New Issue