Skip to content

Instantly share code, notes, and snippets.

@qoelet
Created July 8, 2011 18:29
Show Gist options
  • Save qoelet/1072454 to your computer and use it in GitHub Desktop.
Save qoelet/1072454 to your computer and use it in GitHub Desktop.
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