-
Notifications
You must be signed in to change notification settings - Fork 17
/
Copy pathplayer.py
74 lines (59 loc) · 2.4 KB
/
player.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
from board import TTTBoardDecision, TTTBoard
from learning import TableLearning
import random
class TTTPlayer(object):
def __init__(self):
self.board = None
self.player = None
def setBoard(self, board, player):
self.board = board
self.player = player # X or O
def isBoardActive(self):
return (self.board is not None and self.board.getBoardDecision() == TTTBoardDecision.ACTIVE)
def makeNextMove(self):
raise NotImplementedError
def learnFromMove(self, prevBoardState):
raise NotImplementedError
def startNewGame(self):
pass
def finishGame(self):
pass
class RandomTTTPlayer(TTTPlayer):
def makeNextMove(self):
previousState = self.board.getBoardState()
if self.isBoardActive():
emptyPlaces = self.board.getEmptyBoardPlaces()
pickOne = random.choice(emptyPlaces)
self.board.makeMove(self.player, pickOne[0], pickOne[1])
return previousState
def learnFromMove(self, prevBoardState):
pass # Random player does not learn from move
class RLTTTPlayer(TTTPlayer):
def __init__(self):
self.learningAlgo = TableLearning()
super(RLTTTPlayer, self).__init__()
def printValues(self):
self.learningAlgo.printValues()
def testNextMove(self, state, i, j):
boardCopy = list(state)
boardCopy[3*i+j] = self.player
return ''.join(boardCopy)
def makeNextMove(self):
previousState = self.board.getBoardState()
if self.isBoardActive():
emptyPlaces = self.board.getEmptyBoardPlaces()
pickOne = random.choice(emptyPlaces)
if random.uniform(0, 1) < 0.8: # Make a random move with probability 0.2
moveChoices = {}
for (i, j) in emptyPlaces:
possibleNextState = self.testNextMove(previousState, i, j)
moveChoices[(i, j)] = self.learningAlgo.getBoardStateValue(self.player, self.board, possibleNextState)
pickOne = max(moveChoices, key=moveChoices.get)
self.board.makeMove(self.player, pickOne[0], pickOne[1])
return previousState
def learnFromMove(self, prevBoardState):
self.learningAlgo.learnFromMove(self.player, self.board, prevBoardState)
if __name__ == '__main__':
board = TTTBoard()
player1 = RLTTTPlayer()
player2 = RandomTTTPlayer()