-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathkalha.py
108 lines (94 loc) · 3.74 KB
/
kalha.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
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
class Kalha:
def __init__(self, holes, seeds):
self.player = 0
self.bank = [0, 0]
self.holes = holes
self.now = [[seeds for i in range(holes)] for i in range(2)]
self.winnerr = 10
def __repr__(self):
show = ' '
for i in range(self.holes):
show += str(self.now[0][self.holes-1-i])
show += '\n'
show += str(self.bank[0]) + " " * self.holes + str(self.bank[1]) + '\n' + ' '
for i in reversed(range(self.holes)):
show += str(self.now[1][self.holes-1-i])
return show
def __str__(self):
show = ' p1: '
for i in range(self.holes):
show += f"{str(self.now[0][self.holes-1-i]):>3}"
show += '\n '
show += str(self.bank[0]) + " " * (self.holes+2) + str(self.bank[1]) + '\n' + ' p2: '
for i in reversed(range(self.holes)):
show += f"{str(self.now[1][self.holes-1-i]):>3}"
return show
def play(self, hole):
if self.game_over():
return "Player {} wins.".format(self.winnerr+1)
if hole > self.holes or hole < 1:
raise IndexError
if self.now[self.player][hole - 1] == 0:
raise ValueError
stones = self.now[self.player][hole - 1]
self.now[self.player][hole - 1] = 0
play_er = self.player
flag = 0
while stones:
if hole < self.holes:
self.now[play_er][hole] += 1
hole += 1
else:
if play_er == self.player:
self.bank[play_er] += 1
else:
stones += 1
hole = 0
if stones - 1 > 0:
play_er = 1 - play_er
flag = 1
stones = stones - 1
if not any(self.now[self.player]):
self.player = 1-self.player
return self.help_function(1-self.player)#"Player 2 plays next" if self.player else "Player 1 plays next"
helper = self.help_function(1-self.player)
if not helper is 10:
return helper
if play_er == self.player:
if hole != 0 and self.now[play_er][hole - 1] == 1 and self.now[1-play_er][self.holes - hole] != 0:
self.bank[play_er] += 1
self.now[play_er][hole - 1] = 0
self.bank[play_er] += self.now[1 - play_er][(self.holes - hole)]
self.now[1 - play_er][self.holes - hole] = 0
if hole != 0 or play_er != self.player:
self.player = 1 - self.player
return "Player 2 plays next" if self.player else "Player 1 plays next"
def status(self):
listt = []
for j in range(2):
for i in range(self.holes):
listt.append(self.now[j][i])
listt.append([self.bank[j]])
return listt
def winner(self):
return self.winnerr
def help_function(self, player):
if not any(self.now[player]):
self.player = 1 - self.player
for i in range(self.holes):
self.bank[1 - player] += self.now[1 - player][i]
self.now[1-player][i] = 0
self.player = 1 - self.player
if self.bank[self.player] > self.bank[1 - self.player]:
self.winnerr = self.player
return "Player {} wins.".format(self.player + 1)
elif self.bank[1 - self.player] > self.bank[self.player]:
self.winnerr = (1 - self.player) + 1
return "Player {} wins.".format((1 - self.player) + 1)
else:
self.winnerr = None
return "Tie"
else:
return 10
def game_over(self):
return self.winnerr != 10