2013-05-08 158 views
-1

我正在寫一個基於手風琴風格的紙牌的python程序。我已經寫了上面的代碼,並且在過去的幾個小時裏一直在玩它,但我似乎無法使循環正確運行。無論出於何種原因,它將只運行一次循環,而不再要求輸入,或者它會一次運行,詢問輸入,不管輸入什麼,它都會崩潰。任何想法我在這裏做錯了嗎?雖然循環併發症

這裏是我的代碼:

import random 

print("Command Options:") 
print("1C - Play card C onto pile 1 position back, ignored if invalid") 
print("3C - Play card C onto pile 3 positions back, ignored if invalid") 
print("C - Count of undealt cards") 
print("D - Deal next card") 
print("H - Print this help screen") 
print("R - Resign this game (quit early)") 
print("X - Exit Program") 

cards=['AC','2C','3C','4C','5C','6C','7C','8C','9C','TC','JC','QC','KC','AD','2D','3D','4D','5D','6D','7D','8D','9D','TD','JD','QD','KD','AH','2H','3H','4H','5H','6H','7H','8H','9H','TH','JH','QH','KH','AS','2S','3S','4S','5S','6S','7S','8S','9S','TS','JS','QS','KS'] 
random.shuffle(cards,random.random) 

playable=[] 
done=False 
while not done: 
    move=input("Enter move: ") 
    move_upper=move.upper() 
    if move_upper == 'D': 
     playable.append(cards.pop()) 
     print(playable) 
    if move_upper == 'X' or 'R': 
     done=True 

    if move_upper == 'H': 
     print("Command Options:") 
     print("1C - Play card C onto pile 1 position back, ignored if invalid") 
     print("3C - Play card C onto pile 3 positions back, ignored if invalid") 
     print("C - Count of undealt cards") 
     print("D - Deal next card") 
     print("H - Print this help screen") 
     print("R - Resign this game (quit early)") 
     print("X - Exit Program") 
    if move_upper == 'C': 
     k=0 
     for item in cards: 
      k+=1 
      print(K,'cards left') 

回答

3

你是誤解如何or作品。使用:

if move_upper in ('X', 'R'): 

改爲。

表達move_upper == 'X' or 'R'被解釋爲(move_upper == 'X') or 'R'代替,和一個非空字符串是總是考慮True。因此,您本質上正在測試(move_upper == 'X') or True,然後它真的不再是什麼move_upper

你並不需要在這裏使用done標誌變量;使用break結束循環,而不是:

while True: 
    # ... 

    if move_upper in ('X', 'R'): 
     break 
0

我目前一個代碼審查心情很好,所以請原諒我。

cards = [ number + suite for number in 'A23456789TJQK' for suite in 'CDHS' ] 

更具可讀性,並且這種方式減少了錯誤發生的可能性。