Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- class TreeNode(object):
- def __init__(self, data, sign="O"):
- self._data = data
- self.parent = None
- self.children = []
- if self.get_score("X", "O") == 0:
- for x in range(len(self._data)):
- if self._data[x] == " ":
- if sign == "X":
- nextSign = "O"
- else:
- nextSign = "X"
- l = list(self._data)
- l[x] = nextSign
- temp = TreeNode(l, nextSign)
- self.add_child(temp)
- def __getitem__(self, key):
- return self._data[key]
- def __setitem__(self, key, value):
- self._data[key] = value
- def is_root(self):
- return self.parent is None
- def is_leaf(self):
- return len(self.children) == 0
- def add_child(self, n):
- n.parent = self
- self.children.append(n)
- def get_score(self, signComputer, signPlayer):
- threes = [[self._data[0], self._data[1], self._data[2]],
- [self._data[3], self._data[4], self._data[5]],
- [self._data[6], self._data[7], self._data[8]],
- [self._data[0], self._data[3], self._data[6]],
- [self._data[1], self._data[4], self._data[7]],
- [self._data[2], self._data[5], self._data[8]],
- [self._data[0], self._data[4], self._data[8]],
- [self._data[2], self._data[4], self._data[6]]]
- for x in threes:
- if x.count(signComputer) == 3:
- return 1
- elif x.count(signPlayer) == 3:
- return -1
- return 0
- def get_children_value(self, signComputer, signPlayer, depth=1):
- if self.get_score(signComputer, signPlayer) != 0:
- return self.get_score(signComputer, signPlayer)
- else:
- suma = None
- suma2 = self.get_score(signComputer, signPlayer)
- if suma == None or suma2 > suma:
- suma = suma2
- return suma
- class Tree(object):
- def drawBoard(self):
- board = self.root._data
- f = open ('log.txt', 'a')
- f.write("#######\n")
- f.write(' | |')
- f.write(' ' + board[0] + ' | ' + board[1] + ' | ' + board[2])
- f.write(' | |')
- f.write('-----------\n')
- f.write(' | |')
- f.write(' ' + board[3] + ' | ' + board[4] + ' | ' + board[5])
- f.write(' | |')
- f.write('-----------\n')
- f.write(' | |')
- f.write(' ' + board[6] + ' | ' + board[7] + ' | ' + board[8])
- f.write(' | |')
- f.write("\n")
- f.close()
- """docstring for Tree"""
- def __init__(self, signComputer, signPlayer):
- self.root = TreeNode([" ", " ", " ", " ", " ", " ", " ", " ", " "])
- self.signComputer = signComputer
- self.signPlayer = signPlayer
- self.end = False
- self.win = 0
- self.lastMove = []
- def is_empty(self):
- return self.root is None
- def depth(self, n):
- if self.is_root():
- return 0
- else:
- return 1 + self.depth(n.parent)
- def height(self, n):
- if self.is_root is None:
- return 0
- else:
- return 1 + max(self.height(c) for c in n.children)
- def postorder(self, n):
- if not self.is_empty():
- for c in n.children:
- self.postorder(c)
- print n._data
- def preorder(self, n):
- if not self.is_empty():
- print n._data
- for c in n.children:
- self.preorder(c)
- def checkEnd(self):
- full = True
- if self.root._data.count(" ") > 0:
- full = False
- if full:
- self.end = True
- if self.root.get_score(self.signComputer, self.signPlayer) != 0:
- self.end = True
- def movePlayer(self, pozicija):
- self.root[pozicija] = self.signPlayer
- for child in self.root.children:
- if self.root._data == child._data:
- self.root = child
- break
- self.checkEnd()
- def cancelLastMove(self):
- #while self.lastMove:
- self.root = self.lastMove.pop()
- def playNextMove(self):
- self.lastMove.append(self.root)
- def moveOpponent (self):
- best = self.root
- maxScore = None
- score = None
- root = self.root
- for child in root.children:
- self.checkEnd()
- if self.end:
- self.root = best
- return
- else:
- #self.drawBoard()
- self.playNextMove()
- self.root = child
- #self.drawBoard()
- self.moveComputer()
- score = self.root.get_score(self.signPlayer, self.signComputer)
- self.cancelLastMove()
- if maxScore == None or score < maxScore:
- maxScore = score
- best = child
- self.root = best
- def moveComputer(self):
- best = self.root
- maxScore = None
- score = None
- root = self.root
- for child in root.children:
- self.checkEnd()
- if self.end:
- self.root = best
- return
- else:
- self.playNextMove()
- #self.drawBoard()
- self.moveOpponent()
- score = self.root.get_score(self.signComputer, self.signPlayer)
- self.cancelLastMove()
- if maxScore == None or score > maxScore:
- maxScore = score
- best = child
- self.root = best
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement