Experiments
Experiments
methods
Breadth First Search
class Graph:
self.edges = {}
self.directed = directed
neighbors.add(node2)
self.edges[node1] = neighbors
print('--------------------')
current = fringe.pop()
print(', '.join(fringe))
@staticmethod
parent = came_from[goal]
if parent:
Graph.print_path(came_from, parent)
return str(self.edges)
graph = Graph(directed=False)
graph.add_edge('A', 'B')
graph.add_edge('A', 'S')
graph.add_edge('S', 'G')
graph.add_edge('S', 'C')
graph.add_edge('C', 'F')
graph.add_edge('G', 'F')
graph.add_edge('C', 'D')
graph.add_edge('C', 'E')
graph.add_edge('E', 'H')
graph.add_edge('G', 'H')
class Graph:
self.edges = {}
self.directed = directed
neighbors.add(node2)
self.edges[node1] = neighbors
print('--------------------')
current = fringe.pop()
print(', '.join(fringe))
@staticmethod
parent = came_from[goal]
if parent:
Graph.print_path(came_from, parent)
return str(self.edges)
graph = Graph(directed=False)
graph.add_edge('A', 'B')
graph.add_edge('A', 'S')
graph.add_edge('S', 'G')
graph.add_edge('S', 'C')
graph.add_edge('C', 'F')
graph.add_edge('G', 'F')
graph.add_edge('C', 'D')
graph.add_edge('C', 'E')
graph.add_edge('E', 'H')
graph.add_edge('G', 'H')
class Graph:
self.edges = {}
self.directed = directed
neighbors.add(node2)
self.edges[node1] = neighbors
print('--------------------')
came_from[node] = current
@staticmethod
parent = came_from[goal]
if parent:
Graph.print_path(came_from, parent)
def __str__(self):
return str(self.edges)
graph = Graph(directed=False)
graph.add_edge('A', 'B')
graph.add_edge('A', 'S')
graph.add_edge('S', 'G')
graph.add_edge('S', 'C')
graph.add_edge('C', 'F')
graph.add_edge('G', 'F')
graph.add_edge('C', 'D')
graph.add_edge('C', 'E')
graph.add_edge('E', 'H')
graph.add_edge('G', 'H')
class Graph:
self.edges = {}
self.directed = directed
neighbors.add(node2)
self.edges[node1] = neighbors
while True:
traced_path, visited = self.depth_limited_search(start, goal, depth)
print('--------------------')
came_from[node] = current
parent = came_from[goal]
if parent:
Graph.print_path(came_from, parent)
def __str__(self):
return str(self.edges)
graph = Graph(directed=False)
graph.add_edge('A', 'B')
graph.add_edge('A', 'S')
graph.add_edge('S', 'G')
graph.add_edge('S', 'C')
graph.add_edge('C', 'F')
graph.add_edge('G', 'F')
graph.add_edge('C', 'D')
graph.add_edge('C', 'E')
graph.add_edge('E', 'H')
graph.add_edge('G', 'H')
start, goal = 'A', 'H'
class Graph:
self.edges = {}
self.huristics = {}
self.directed = directed
neighbors[node2] = cost
self.edges[node1] = neighbors
self.huristics = huristics
print('--------------------')
_, current = heappop(fringe)
@staticmethod
parent = came_from[goal]
if parent:
Graph.print_path(came_from, parent)
def __str__(self):
return str(self.edges)
graph = Graph(directed=True)
graph.add_edge('A', 'B', 4)
graph.add_edge('A', 'C', 1)
graph.add_edge('B', 'D', 3)
graph.add_edge('B', 'E', 8)
graph.add_edge('C', 'C', 0)
graph.add_edge('C', 'D', 7)
graph.add_edge('C', 'F', 6)
graph.add_edge('D', 'C', 2)
graph.add_edge('D', 'E', 4)
graph.add_edge('E', 'G', 2)
graph.add_edge('F', 'G', 8)
class Graph:
self.edges = {}
self.huristics = {}
self.directed = directed
neighbors[node2] = cost
self.edges[node1] = neighbors
self.huristics = huristics
print('--------------------')
_, current = heappop(fringe)
@staticmethod
parent = came_from[goal]
if parent:
Graph.print_path(came_from, parent)
def __str__(self):
return str(self.edges)
graph = Graph(directed=True)
graph.add_edge('A', 'B', 4)
graph.add_edge('A', 'C', 1)
graph.add_edge('B', 'D', 3)
graph.add_edge('B', 'E', 8)
graph.add_edge('C', 'C', 0)
graph.add_edge('C', 'D', 7)
graph.add_edge('C', 'F', 6)
graph.add_edge('D', 'C', 2)
graph.add_edge('D', 'E', 4)
graph.add_edge('E', 'G', 2)
graph.add_edge('F', 'G', 8)
class Graph:
self.edges = {}
self.huristics = {}
self.directed = directed
neighbors[node2] = cost
self.edges[node1] = neighbors
self.huristics = huristics
print('--------------------')
_, current = heappop(fringe)
@staticmethod
parent = came_from[goal]
if parent:
Graph.print_path(came_from, parent)
def __str__(self):
return str(self.edges)
graph = Graph(directed=True)
graph.add_edge('A', 'B', 4)
graph.add_edge('A', 'C', 1)
graph.add_edge('B', 'D', 3)
graph.add_edge('B', 'E', 8)
graph.add_edge('C', 'C', 0)
graph.add_edge('C', 'D', 7)
graph.add_edge('C', 'F', 6)
graph.add_edge('D', 'C', 2)
graph.add_edge('D', 'E', 4)
graph.add_edge('E', 'G', 2)
graph.add_edge('F', 'G', 8)
class Graph:
self.edges = {}
self.huristics = {}
self.directed = directed
neighbors[node2] = cost
self.edges[node1] = neighbors
self.huristics = huristics
def neighbors(self, node):
prev_visited, depth = 0, 0
while True:
prev_visited = visited
depth += 1
print('--------------------')
@staticmethod
parent = came_from[goal]
if parent:
Graph.print_path(came_from, parent)
return str(self.edges)
graph = Graph(directed=True)
graph.add_edge('A', 'B', 4)
graph.add_edge('A', 'C', 1)
graph.add_edge('B', 'D', 3)
graph.add_edge('B', 'E', 8)
graph.add_edge('C', 'C', 0)
graph.add_edge('C', 'D', 7)
graph.add_edge('C', 'F', 6)
graph.add_edge('D', 'C', 2)
graph.add_edge('D', 'E', 4)
graph.add_edge('E', 'G', 2)
graph.add_edge('F', 'G', 8)
TicTacToe Game
#Header Files
import cv2
import numpy as np
import time
#-----------------------------------------------------------------------------------
#Classes
class Block() :
def __init__(self,i,j) :
self.value = None
self.pos = (i,j)
def setValue(self,value) :
self.value = value
#-----------------------------------------------------------------------------------
class GUI() :
def __init__(self,windowName) :
self.windowName = windowName
self.width,self.height = 400,400
self.menuHeight = 100
self.image = np.zeros((self.height+self.menuHeight,self.width,3),np.uint8)
self.turn = 1
self.vsCom = 0
self.reset()
#-----------------------------------------------------------------------------------
#Reset Game
def reset(self) :
self.blocks = []
self.win = False
self.change = True
self.selected = False
for i in range(3) :
row = []
for j in range(3) :
row.append([Block(i,j),(j*(self.width//3)+3,i*(self.height//3)+3),((j+1)*
(self.width//3)-3,(i+1)*(self.height//3)-3)])
self.blocks.append(row)
#-----------------------------------------------------------------------------------
self.image = np.zeros((self.height+self.menuHeight,self.width,3),np.uint8)
for i in range(3) :
for j in range(3) :
start_point = self.blocks[i][j][1]
end_point = self.blocks[i][j][2]
cv2.rectangle(self.image,start_point,end_point,(255,255,255),-1)
cv2.putText(self.image,value,(j*(self.width//3)+25,(i*self.height//3)+1
00),cv2.FONT_HERSHEY_SIMPLEX,5,(0,0,0),5)
if self.checkWin() :
else :
if not self.checkDraw() :
else :
cv2.putText(self.image,string,(self.width//2-
70,self.height+30),cv2.FONT_HERSHEY_SIMPLEX,0.5,(255,255,255),1)
cv2.putText(self.image,"R -
Reset",(10,self.height+60),cv2.FONT_HERSHEY_SIMPLEX,0.5,(255,255,255),1)
cv2.putText(self.image,"Esc -
Exit",(10,self.height+80),cv2.FONT_HERSHEY_SIMPLEX,0.5,(255,255,255),1)
cv2.putText(self.image,"Space -
"+string,(self.width//2+10,self.height+80),cv2.FONT_HERSHEY_SIMPLEX,0.5,(2
55,255,255),1)
self.change = True
self.selected = False
self.turn *= -1
#-----------------------------------------------------------------------------------
cv2.namedWindow(self.windowName)
cv2.setMouseCallback(self.windowName,self.mouseCall)
try:
if self.change :
self.change=False
self.draw()
block = self.nextMove()
block.setValue("x" if self.turn==1 else "o")
self.selected = True
self.change = True
cv2.imshow(self.windowName,self.image)
#Keyboard Hits
key = cv2.waitKey(1)
if key == 27 : break
self.reset()
if self.vsCom :
self.vsCom = 0
else :
self.vsCom = self.turn
self.change = True
cv2.destroyAllWindows()
except:
def checkWin(self) :
self.win = False
self.win = True
return self.win
def checkDraw(self) :
flag = True
for i in range(3) :
for j in range(3) :
if self.blocks[i][j][0].value == None :
flag=False
return flag
#-----------------------------------------------------------------------------------
#Computers Move Decided Using Minmax Algorithm
flag=0
blocks = []
for i in range(3) :
for j in range(3) :
if self.blocks[i][j][0].value == None :
blocks.append(self.blocks[i][j][0])
scoresList={}
if block.value == None :
if self.computerWins(block) :
scoresList[block] = 50
elif self.playerWins(block) :
scoresList[block] = -50
scoresList[block] = self.min_max(1,self.vsCom)
block.value = None
else :
scoresList[block] = 0
#Choosing Either Best Closest Winning Score or Next Closest Losing
Score
bestScore = (min(scoresList.values()) if
abs(min(scoresList.values()))>abs(max(scoresList.values())) else
max(scoresList.values()))
blocks = []
if scoresList[block] == bestScore :
##print(block.pos,bestScore)
blocks.append(block)
choice = blocks[randint(0,len(blocks)-1)]
#print(choice.pos)
return choice
scoresList = []
if block[0].value == None :
if self.computerWins(block[0]) :
return (50-depth)
elif self.playerWins(block[0]) :
return (-50+depth)
else :
block[0].value = ("x" if self.turn == 1 else "o")
scoresList.append(self.min_max(depth+1,player*-1))
block[0].value = None
if scoresList:
return 0
def computerWins(self,block) :
flag = False
self.win = False
block.value = None
return flag
def playerWins(self,block) :
flag = False
self.win = False
block.value = None
return flag
#-----------------------------------------------------------------------------------
#Mouse Click Functions - (For User Players)
def mouseCall(self,event,posx,posy,flag,param) :
self.setBlockInPos(posx,posy)
def setBlockInPos(self,x,y) :
for i in range(3) :
for j in range(3) :
self.change = True
self.selected = True
break
#-----------------------------------------------------------------------------------
#Main Program
game = GUI("TicTacToe")
game.mainLoop()