Created
July 8, 2011 18:29
-
-
Save qoelet/1072454 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
class ScoreKeeper(object): | |
def __init__(self,f1,f2,f3,f4,f5,f6,f7,f8,f9,f10): | |
self.f1 = [f1, None] | |
self.f2 = [f2, None] | |
self.f3 = [f3, None] | |
self.f4 = [f4, None] | |
self.f5 = [f5, None] | |
self.f6 = [f6, None] | |
self.f7 = [f7, None] | |
self.f8 = [f8, None] | |
self.f9 = [f9, None] | |
self.f10 = [f10, None] | |
self.total = 0 | |
def compute_frame_state(self): | |
self.f1[1] = self.get_frame_state(self.f1[0]) | |
self.f2[1] = self.get_frame_state(self.f2[0]) | |
self.f3[1] = self.get_frame_state(self.f3[0]) | |
self.f4[1] = self.get_frame_state(self.f4[0]) | |
self.f5[1] = self.get_frame_state(self.f5[0]) | |
self.f6[1] = self.get_frame_state(self.f6[0]) | |
self.f7[1] = self.get_frame_state(self.f7[0]) | |
self.f8[1] = self.get_frame_state(self.f8[0]) | |
self.f9[1] = self.get_frame_state(self.f9[0]) | |
self.f10[1] = self.get_frame_state(self.f10[0]) | |
def get_frame_state(self, frame): | |
if frame[0] == "X": | |
return "strike" | |
elif frame[1] == "/": | |
return "spare" | |
elif (int(frame[0]) + int(frame[1])) < 10: | |
return "open frame" | |
else: | |
return None | |
def calculate_score(self): | |
scores = [ | |
self.f1, | |
self.f2, | |
self.f3, | |
self.f4, | |
self.f5, | |
self.f6, | |
self.f7, | |
self.f8, | |
self.f9, | |
self.f10, | |
] | |
scores.reverse() | |
current = None | |
next = None | |
loop_state = True | |
total = 0 | |
last = False | |
while loop_state: | |
if not current: | |
current = scores.pop() | |
else: | |
current = next | |
try: | |
next = scores.pop() | |
except IndexError: | |
loop_state = False | |
next = None | |
last = True | |
print "Loop check - current: %s, next: %s" % (current, next) | |
if current[1] == "strike": | |
print "Current frame data: %s" % current[0] | |
if next: | |
if next[1] == "strike": | |
s = 20 | |
# we need to check the next next frame | |
try: | |
next_next = scores[-1] | |
except IndexError: | |
next_next = None | |
if next_next: | |
if next_next[1] == "strike": | |
s += 10 | |
else: | |
s += int(next_next[0][0]) | |
else: | |
if next[1] == "spare": | |
s = 20 | |
else: | |
s = 10 + (int(next[0][0]) + int(next[0][1])) | |
else: | |
s = 10 | |
# check if we're on last frame | |
if last: | |
print "Last frame detected, looking forward to the next 2 bonus frames:" | |
last_frame = current[0][1:] | |
print last_frame | |
if last_frame[0] == "X": | |
s += 20 | |
if last_frame[1] == "X": | |
s += 10 | |
else: | |
s += int(last_frame[1]) | |
else: | |
if last_frame[1] == "/": | |
s += 10 | |
print "Added: %d" % s | |
total += s | |
elif current[1] == "spare": | |
print "Current frame data: %s" % current[0] | |
if next: | |
if next[1] == "strike": | |
s = 20 | |
else: | |
s = 10 + int(next[0][0]) | |
print "Added: %d" % s | |
total += s | |
else: | |
s = 10 | |
if last: | |
print "Last frame detected, looking forward to the next bonus frame:" | |
last_frame = current[0][2:] | |
if last_frame == "X": | |
last_frame = 10 | |
else: | |
last_frame = int(last_frame) | |
s += last_frame | |
print "Added: %d" % s | |
total += s | |
else: | |
print "Current frame data: %s" % current[0] | |
s = (int(current[0][0]) + int(current[0][1])) | |
print "Added: %d" % s | |
total += s | |
self.total = total | |
return total | |
if __name__ == "__main__": | |
#s = ScoreKeeper("9/", "81", "71", "1/", "X", "X", "X", "80", "63", "8/") | |
# test case 1 | |
# total should be 168 | |
s = ScoreKeeper("X", "7/", "72", "9/", "X", "X", "X", "23", "6/S", "7/3") | |
# test case 2 | |
# total should be 300 (perfect game) | |
#s = ScoreKeeper("X", "X", "X", "X", "X", "X", "X", "X", "X", "XXX") | |
# run methods | |
s.compute_frame_state() | |
print "Check frame state:" | |
print "%s | %s | %s | %s | %s | %s | %s | %s | %s | %s " % (s.f1, s.f2, s.f3, s.f4, s.f5, s.f6, s.f7, s.f8, s.f9, s.f10) | |
s.calculate_score() | |
print "Total score: %d" % s.total |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment