set
から返される a で呼び出された数値を累積しますpop
。次に、「勝った」数字を(セットに)読み込む関数を追加し、その新しいセットが呼び出された数字のサブセットであるかどうかを確認します。
import random
import ast
def pop(a,accumulated=None):
print "type q to move on to verification"
if accumulated is None:
accumulated = set()
v = 'I can put any string here, as long as it is not "q" :-)'
while v.lower() != 'q':
b = a.pop(0)
if b <= 15:
print 'b', b,
elif b > 15 and b <=30:
print 'i', b,
elif b > 30 and b <=45:
print 'n', b,
elif b > 45 and b <=60:
print 'g', b,
else:
print 'o', b,
accumulated.add(b)
v = raw_input('')
return accumulated
def verify(numbers):
new_nums = raw_input("enter numbers separated by ',': ")
nums = ast.literal_eval(new_nums)
assert( len(nums) == 5 ) #Need 5 numbers to win
result = set(nums).issubset(numbers)
print "Verified? ",result
return result
#alternatively, and probably slightly more efficient
# print numbers.issuperset(nums)
#I prefer the other though as `subset` is easier for me to remember
def robust_verify(numbers):
"""
keep trying to verify the numbers until we succeed
"""
try:
verify(numbers)
except (AssertionError,SyntaxError,TypeError): #other error conditions might go here too, but these are the ones I can think of right now ...
robust_verify(numbers)
def play_bingo(game_vals=None,accumulated=None):
if game_vals is None:
game_vals = list(range(1,76)) #list strictly not necessary here, but why not?
random.shuffle(game_vals)
nums = pop(game_vals,accumulated=accumulated)
if not robust_verify(nums):
play_bingo(game_vals=game_vals,accumulated=nums)
play_bingo()
が成功することを確認することで、これはもう少し堅牢になりverify
ます (たとえば、ユーザーが誤って として数字を入力しないようにするなど15a,17,22,...
) 。
補足として、ファイルを開こうとして失敗し、ファイルに数値を書き込んで、新しい数値を「描画」するたびにファイルを閉じました。既にそこにあるファイルと同じようにファイルを開いているため、そのメソッドによって描画された最後の'w'
番号しか保存できません。そのメソッドを適切に機能させるために、ループをステートメントに移動する必要があります (または、追加するためにファイルを開きます ( )。ただし、追加するためにファイルを繰り返し開くことは、通常、適切な解決策ではありません)。while
with
'a'