python将代码与raw_input超时集成

时间:2012-09-30 17:48:35

标签: python timeout python-2.7 raw-input

这是我现在工作的python二十一点游戏(或者至少像游戏一样的二十一点)的大部分代码我现在被告知我需要实现一个时间限制(用户被要求输入一些东西而且只有3个左右几秒钟给出回应)。

def deck():
        cards = range(1, 12)
        return choice(cards)


def dealer():
    total = deck() + deck()
    if total <= 15:
        totalf = total + deck()
        while totalf <= 21:
            return totalf
    if total > 15:
        return total

def player():
    card1 = deck()
    card2 = deck()
    hand = card1 + card2
    print "Cards dealt: %d and %d" % (card1, card2)
    while hand <= 21:
        choice = raw_input("Would you like to hit or stand?: ")
        print choice
        if choice == "hit":
            hand = hand + deck()
            print "Current Total: %d" % hand        
        elif choice == "stand": 
            return hand 

money = 100
highscore = 0

while money > 0:
    opp = dealer()
    me = player()
    if me > opp:
        highscore = highscore + 10
        money = money + 10
        print "Winner, winner, chicken dinner! You have $%d!" % money
        print "********************************************"
    elif opp > 21:
        highscore = highscore + 10
        money = money + 10
        print "Winner, winner, chicken dinner! You have $%d!" % money
        print "********************************************"
    elif me > 21:
        money = money - 20
        print "Bust! Dealer wins with %d. You have $%d reamaining." % (opp, money)      
        print "********************************************"
    elif opp > me:
        money = money - 20
        print "Dealer wins with %d. You have $%d reamaining." % (opp, money)
        print "********************************************"
    elif me == 21:
        highscore = highscore + 10
        money = money + 10
        print "Blackjack! You have $%d!" % money
        print "********************************************"
    sleep(1)    

print "Thank you for playing! Your highscore was $%d." % highscore

这是我教授为我们提供的代码:

   import sys, time
from select import select

import platform
if platform.system() == "Windows":
    import msvcrt

def input_with_timeout_sane(prompt, timeout, default):
    """Read an input from the user or timeout"""
    print prompt,
    sys.stdout.flush()
    rlist, _, _ = select([sys.stdin], [], [], timeout)
    if rlist:
        s = sys.stdin.readline().replace('\n','')
    else:
        s = default
        print s
    return s

def input_with_timeout_windows(prompt, timeout, default): 
    start_time = time.time()
    print prompt,
    sys.stdout.flush()
    input = ''
    while True:
        if msvcrt.kbhit():
            chr = msvcrt.getche()
            if ord(chr) == 13: # enter_key
                break
            elif ord(chr) >= 32: #space_char
                input += chr
        if len(input) == 0 and (time.time() - start_time) > timeout:
            break
    if len(input) > 0:
        return input
    else:
        return default

def input_with_timeout(prompt, timeout, default=''):
    if platform.system() == "Windows":
        return input_with_timeout_windows(prompt, timeout, default)
    else:
        return input_with_timeout_sane(prompt, timeout, default)

我完全迷失了如何合并这两段代码。我已经尝试过去几个小时让它工作,但无论出于什么原因它只是不工作。任何帮助都会很棒。 (我为代码墙道歉。)

1 个答案:

答案 0 :(得分:1)

您只需要在用户输入的地方调用input_with_timeout功能。

在你的播放器功能中:

def player():
    card1 = deck()
    card2 = deck()
    hand = card1 + card2
    print "Cards dealt: %d and %d" % (card1, card2)
    while hand <= 21:
        choice = input_with_timeout("Would you like to hit or stand?: ", 3, "stand")
        print choice
        if choice == "hit":
            hand = hand + deck()
            print "Current Total: %d" % hand        
        elif choice == "stand": 
            return hand 

将提示输入,在其前写下“会...或站立”句子。如果用户在超时之前没有应答(在这种情况下为3秒),则该功能将返回“stand”。

请确保将您教授的代码包含在主文件中。