-
Notifications
You must be signed in to change notification settings - Fork 0
/
Pion.py
73 lines (63 loc) · 2.17 KB
/
Pion.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
class PionClass:
identifier : str
position : int
safe : bool
finish : bool
minpos = 0
maxpos = 15
rosette = [4,8,14]
def __init__(self, identifier, initialPosition= 0):
self.position = initialPosition
self.safe = True
self.finish = False
self.identifier = identifier
def canmove(self,n,enemyPos, playerPos):
temp = self.position + n
# if the pion will land more than the goal, decline
if(temp > self.maxpos):
return False
else:
# if the player lands on rosette in the middle while an enemy is there
if temp in [8] and (temp in enemyPos or temp in playerPos):
return False
# if the pion will land on teammate, decline
elif temp in playerPos and temp != 15:
return False
# player can move normally
return True
def move(self,n, opponentPos, selfPos):
enemyPos = []
playerPos = []
for i in opponentPos:
enemyPos.append(i[0])
for j in selfPos:
playerPos.append(j[0])
canMove = self.canmove(n, enemyPos, playerPos)
# (canmove,indicate next turn, enemy eaten)
if(canMove == False):
return (False,True,-1)
elif(self.position + n) in self.rosette:
self.changeSafe(True)
self.position += n
return (True,False,-1)
else:
self.changeSafe(False)
self.position += n
if self.position in enemyPos and self.position in [5, 6, 7, 8, 9, 10, 11, 12]:
return(True,True,self.position)
return (True,True,-1)
def changeSafe(self, state):
self.safe = state
def nextRosette(self):
distance = 99
rosette = 0
if self.position == 15:
return(0,0)
for i in range(3):
nextrs = self.rosette[i]
temp = nextrs - self.position
if temp < distance and temp >= 0:
rosette, distance = i, temp
return(rosette,distance)
def distanceToGoal(self):
return self.maxpos - self.position