99 lines
2.9 KiB
Python
99 lines
2.9 KiB
Python
|
|
import collections
|
||
|
|
|
||
|
|
def isFull(board):
|
||
|
|
for row in board.board:
|
||
|
|
for col in row:
|
||
|
|
if col[-1] == 0:
|
||
|
|
return False
|
||
|
|
return True
|
||
|
|
|
||
|
|
def outOfPieces(board):
|
||
|
|
pC = board.countTotalPieces()
|
||
|
|
return (pC[1] + pC[2] == board.pieces and pC[3] == board.capstones) or (pC[-1] + pC[-2] == board.pieces and pC[-3] == board.capstones)
|
||
|
|
|
||
|
|
def end(board):
|
||
|
|
en = False
|
||
|
|
if outOfPieces(board):
|
||
|
|
en = True
|
||
|
|
elif isFull(board):
|
||
|
|
en = True
|
||
|
|
elif road(board)[0] or road(board)[1]:
|
||
|
|
en = True
|
||
|
|
return en
|
||
|
|
|
||
|
|
def isRoadPiece(board, loc, player):
|
||
|
|
mod = -1*((-1)**player)
|
||
|
|
return board.getTop(loc) == 1*mod or board.getTop(loc) == 3*mod
|
||
|
|
|
||
|
|
def isGoal(board, start, loc):
|
||
|
|
return (start[0] == 0 and loc[0] == board.size-1) or (start[1] == 0 and loc[1] == board.size-1)
|
||
|
|
|
||
|
|
def checkRow(board, start, player):
|
||
|
|
return isRoadPiece(board, [start, 0], player) and roadSearch(board, [start, 0], player)
|
||
|
|
|
||
|
|
def checkCol(board, start, player):
|
||
|
|
return isRoadPiece(board, [0, start], player) and roadSearch(board, [0, start], player)
|
||
|
|
|
||
|
|
def roadSearch(board, start, player):
|
||
|
|
visited = [[False for i in range(board.size)] for j in range(board.size)]
|
||
|
|
locations = [start]
|
||
|
|
visited[start[0]][start[1]] = True
|
||
|
|
while len(locations) > 0:
|
||
|
|
check = locations.pop(-1)
|
||
|
|
adj = board.adjacent(check)
|
||
|
|
for loc in adj:
|
||
|
|
if not visited[loc[0]][loc[1]] and isGoal(board, start, loc) and isRoadPiece(board, loc, player):
|
||
|
|
return True
|
||
|
|
elif not visited[loc[0]][loc[1]] and isRoadPiece(board, loc, player):
|
||
|
|
locations.append(loc)
|
||
|
|
visited[loc[0]][loc[1]] = True
|
||
|
|
return False
|
||
|
|
|
||
|
|
def road(board):
|
||
|
|
p1road, p2road = False, False
|
||
|
|
for i in range(board.size):
|
||
|
|
if checkRow(board, i, 1) or checkCol(board, i, 1):
|
||
|
|
p1road = True
|
||
|
|
elif checkRow(board, i, 2) or checkCol(board, i, 2):
|
||
|
|
p2road = True
|
||
|
|
return p1road, p2road
|
||
|
|
|
||
|
|
def points(board, player):
|
||
|
|
win = player
|
||
|
|
piecesLeft = board.capstones + board.pieces
|
||
|
|
if win == 1:
|
||
|
|
piecesLeft = piecesLeft - (board.countTotalPieces()[1] + board.countTotalPieces()[3])
|
||
|
|
else:
|
||
|
|
piecesLeft = piecesLeft - (board.countTotalPieces()[-1] + board.countTotalPieces()[-3])
|
||
|
|
return (board.size**2) + piecesLeft
|
||
|
|
|
||
|
|
def winRoad(board, player=1):
|
||
|
|
rd = road(board)
|
||
|
|
if rd[0] and rd[1]:
|
||
|
|
return player
|
||
|
|
elif rd[0] == True:
|
||
|
|
return 1
|
||
|
|
elif rd[1] == True:
|
||
|
|
return 2
|
||
|
|
return False
|
||
|
|
|
||
|
|
def flatStones(board, player):
|
||
|
|
flatCount = 0
|
||
|
|
for i in range(board.size):
|
||
|
|
for j in range(board.size):
|
||
|
|
if isRoadPiece(board, [i,j], player):
|
||
|
|
flatCount += 1
|
||
|
|
return flatCount
|
||
|
|
|
||
|
|
def winFlat(board):
|
||
|
|
if flatStones(board, 1) > flatStones(board, 2):
|
||
|
|
return 1
|
||
|
|
else:
|
||
|
|
return 2
|
||
|
|
|
||
|
|
def winner(board, player=1):
|
||
|
|
if winRoad(board, player):
|
||
|
|
return winRoad(board, player)
|
||
|
|
else:
|
||
|
|
return winFlat(board)
|