Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion Board.py
Original file line number Diff line number Diff line change
Expand Up @@ -395,7 +395,6 @@ def movable_tigers(self):
"""
Returns the number of movable tigers on the board
"""

return sum(int(self._movable(t)) for t in self.tigerPos)

def generate_move_list(self, rdm=True):
Expand Down
35 changes: 21 additions & 14 deletions Engine.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ def evaluate(self, depth=0):
"""
winner = self.board.winner
if not winner:
return 3 * self.board.movable_tigers() + 7 * self.board.deadGoats - depth
return 30 * self.board.movable_tigers() + 70 * self.board.deadGoats - depth

if winner == Board.Player.G:
return -Engine.INF
Expand All @@ -37,49 +37,56 @@ def minmax(self, is_max=True, depth=0, alpha=-INF, beta=INF):

# find the minimum attainable value for the minimizer
if not is_max:
value = self.INF
for move in self.board.generate_move_list():
# first make the move
self.board.make_move(move)

# go deeper in the search tree recursively
value = self.minmax(True, depth + 1, alpha, beta)
value_t = self.minmax(True, depth + 1, alpha, beta)

if value <= beta:
beta = value
beta = min(beta, value_t)


if value_t <= value:
value = value_t
beta = min(beta, value)
if depth == 0:
self.best_move = move

# then revert the move
self.board.revert_move(move)

# ab pruning
if alpha >= beta:
return beta
break

return beta
return value

# find the maximum attainable value for the maximizer
else:
value = -self.INF
for move in self.board.generate_move_list():
# first make the move
self.board.make_move(move)

# go deeper in the search tree recursively
value = self.minmax(False, depth + 1, alpha, beta)
value_t = self.minmax(False, depth + 1, alpha, beta)

if value >= alpha:
alpha = value
if value_t >= value:
value = value_t
alpha = max(alpha, value)
if depth == 0:
self.best_move = move



# then revert the move
self.board.revert_move(move)

# ab pruning
if alpha >= beta:
return alpha
if alpha > beta:
break

return alpha
return value

def best_tiger_move(self):
self.minmax()
Expand Down
57 changes: 29 additions & 28 deletions ui.py
100644 → 100755
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
#!/usr/bin/env python3

import os
import configparser
import itertools
Expand All @@ -17,7 +19,6 @@ class UIGame(object):
_idx_to_col = {0: 'A', 1: 'B', 2: 'C', 3: 'D', 4: 'E'}

def __init__(self, canvas, statustext):
super(UIGame, self).__init__()
# self.board = Board('1GG1G/1GGGT/1GGGG/GGTGG/GTGTG t g0 c3 mA3')
self.board = Board()

Expand All @@ -28,22 +29,22 @@ def __init__(self, canvas, statustext):
self.from_idx = None

self.tiger_radius = 7
self.sheep_radius = 5
self.goat_radius = 5

self.board_grid_x = [10, 60, 110, 160, 210]
self.board_grid_y = [10, 60, 110, 160, 210]
self.board_rect = [1, 1, 221, 221]

self.game = None
self.win = ''
self.ai_turn = False
self.ai_turn = True

self.config = configparser.SafeConfigParser(defaults={
'sheepcolor': 'gray',
self.config = configparser.ConfigParser(defaults={
'goatcolor': 'gray',
'tigercolor': 'yellow'
})
self.config.add_section('ui')
self.sheep_color = self.config.get('ui', 'sheepcolor')
self.goat_color = self.config.get('ui', 'goatcolor')
self.tiger_color = self.config.get('ui', 'tigercolor')

self.draw_board()
Expand Down Expand Up @@ -192,7 +193,7 @@ def draw(self):
self.make_ai_move()

tr = self.tiger_radius
sr = self.sheep_radius
sr = self.goat_radius

# display the tigers and goats on the ui board
for entry, (y, x) in zip(Board._get_full_position(self.board.position.split()[0]),
Expand All @@ -206,7 +207,7 @@ def draw(self):
elif entry == "G":
self.cids.append(self.canvas.create_oval(x - sr, y - sr,
x + sr, y + sr,
fill=self.sheep_color))
fill=self.goat_color))

def check_win(self):
# read the current board position
Expand All @@ -217,48 +218,48 @@ def check_win(self):
self.win = 'tigers'
return

elif self.board.winner == Board.Player.T:
elif self.board.winner == Board.Player.G:
# self.game.wait()
# self.game = None
self.statustext.set('Goats win!')
self.win = 'goats'
return

def new(self):
# self.config = configparser.SafeConfigParser()
# self.config.read(os.path.expanduser('uiconf'))

# if self.config.has_option('game', 'ai'):
# if self.config.get('game', 'ai').lower() == 'sheep':
# cmdline.append('-s')
# elif self.config.get('game', 'ai').lower() == 'tiger':
# cmdline.append('-t')
# else:
# cmdline.append('-s')

# if self.config.has_option('game', 'aistrength'):
# cmdline.append(self.config.get('game', 'aistrength'))
# else:
# cmdline.append('3')
self.config = configparser.ConfigParser()
self.config.read(os.path.expanduser('uiconf'))

if self.config.has_option('game', 'ai'):
if self.config.get('game', 'ai').lower() == 'goat':
self.ai_turn = True
elif self.config.get('game', 'ai').lower() == 'tiger':
self.ai_turn = False
else:
pass

if self.config.has_option('game', 'aistrength'):
aistrength = self.config.get('game', 'aistrength')
else:
aistrength = 6

# self.win = ''
self.init_ai()
self.init_ai(int(aistrength))
# self.engine.make_best_move()
# self.check_win()
self.draw()

def init_ai(self):
def init_ai(self, aistrength):
self.ai_vs_ai = False
self.board = Board()
self.engine = Engine(self.board, depth=5)
self.engine = Engine(self.board, depth=aistrength)

def make_ai_move(self, ev=None):
move = self.engine.get_best_move()
self.apply_move(move)


def configure():
config = configparser.SafeConfigParser()
config = configparser.ConfigParser()
config.add_section('game')
config.read(os.path.expanduser('uiconf'))

Expand Down