0

そこで、妻がキャンドル パーティーで使用する小さなビンゴ プログラムを作成しました。ボードはすでに生成されています。これは数字を呼び出すだけのプログラムです。

import random
a = []
a = list(range(1,76))
random.shuffle(a)

def pop(x):
    while 1:
        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,
        raw_input('')

pop(1)

今、彼女のパーティーは大きくなり、誰かが不正行為をしているのではないかと心配しているので、勝ったと思われる番号を入力して、それらの番号が実際に呼び出されたかどうかをプログラムに知らせる機能を追加したいと思います. 私はそれをファイルに実行しようとしました

def pop(x):
    while 1:
        b = a.pop(0)
        with open('bingo.txt', 'w') as file1:
            file1.write(b,'\n')
        if b ...

しかし、それは開いてから閉じます。エラーやファイルへのテキストはありません。ファイルに移動する必要はありません。もしそうなら、検索ファイル機能を最後に追加して、番号が呼び出されたかどうかを知ることができると思いました. 「勝った」行の番号が実際に呼び出されたかどうかを確認する最良の方法は何ですか?

4

1 に答える 1

4

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'番号しか保存できません。そのメソッドを適切に機能させるために、ループをステートメントに移動する必要があります (または、追加するためにファイルを開きます ( )。ただし、追加するためにファイルを繰り返し開くことは、通常、適切な解決策ではありません)。whilewith'a'

于 2012-11-14T17:38:30.527 に答える