我曾嘗試解決叔叔鮑勃斯保齡球遊戲kata(http://www.butunclebob.com/ArticleS.UncleBob.TheBowlingGameKata),但並未真正找到足以感受pythonic的解決方案。pythonic python中的保齡球遊戲kata
該解決方案或多或少是Martins C++解決方案的改編版,並使用數組索引來計算罷工和備件的分數。它的工作原理,但並不像我希望的那樣pythonic。
class Game():
def __init__(self):
self.rolls = []
def roll(self, pins):
self.rolls.append(pins)
def score_c(self):
total_score = 0
frame_index = 0
for frame in range(10):
if self.rolls[frame_index] == 10:
total_score += 10 + self.rolls[frame_index + 1] + self.rolls[frame_index + 2]
frame_index +=1
elif self.rolls[frame_index] + self.rolls[frame_index + 1] == 10:
total_score += 10 + self.rolls[frame_index + 1]
frame_index += 2
else:
total_score += self.rolls[frame_index] + self.rolls[frame_index + 1]
frame_index += 2
return total_score
我本來可以使用便利功能的罷工和備用條件,但你得到的圖片。
但我認爲必須有辦法做到這一點,而無需通過索引直接訪問卷數組。這感覺就像一個非常類似C的方式,直接增加frame_index在python中肯定不對。所以我認爲必須有一個更好的方法來做到這一點。我在下面做了一個嘗試,完全不適合完美的遊戲。
這一個使用發電機提供的感覺非常整齊的幀,但它也意味着0必須添加罷工,使完整的2卷框架。
class Game():
def __init__(self):
self.rolls = []
def _frame_iterator(self):
for i in range(0, 20, 2):
yield (self.rolls[i], self.rolls[i+1])
def roll(self, pins):
self.rolls.append(pins)
if pins == 10:
self.rolls.append(0)
def score(self):
total_score = 0
spare = False
strike = False
for frame in self._frame_iterator():
if spare:
total_score += frame[0]
spare = False
if strike:
total_score += frame[1]
strike = False
if frame[0] + frame[1] == 10:
spare = True
if frame[0] == 10:
strike = True
total_score += frame[0] + frame[1]
return total_score
我的問題基本上是,有沒有人解決在Python保齡球卡塔比叔叔鮑勃C++的解決方案不同,更Python的方式?並建議如何改進我的嘗試?