python實現一個簡單的21點游戲


#21點撲克牌游戲python實現
#游戲者的目標是使手中的牌的點數之和不超過21點且盡量大。
#計算規則是:
#2至9牌,按其原點數計算,A算作1點(在我這個程序里)
#10、J、Q、K牌都算作10點(一般記作T,即Ten)
""" 21點撲克牌游戲設計思路
按下列規則模擬21點撲克牌游戲:
計算機人工智能AI作為庄家(House),用戶作為玩家(Player) 。
游戲開始時, 庄家從洗好的一副牌中發牌:第1張牌發給玩家, 第2張牌發給庄家,第3張牌發給玩家,第4張牌發給庄家。
然后,詢問玩家是否需要繼續“拿牌”,通過一次或多次“拿牌”,玩家嘗試使手中撲克牌的點數和接近21。如果玩家手中撲克牌的點數之和超過21,則玩家輸牌。
當玩家決定 “停牌”(即,不再“拿牌”),則輪到庄家使用下列規則(“庄家規則”)“拿牌”:如果庄家手中的最佳點數之和小於17,則必須“拿牌”:,如果點數之和大於或等於17,則“停牌”。如果庄家的點數之和超過21,則玩家獲勝。
最后, 比較玩家和庄家的點數。如果玩家的點數大,則獲勝。如果玩家的點數小,則輸牌。如果點數相同,則平局。但玩家和庄家的牌值都是21點,此時擁有blackjack (一張Ace 和一張點數為10的牌)方獲勝。
"""
import random
def get_shuffled_deck(): #初始化洗好的牌
    suits={'', '', '', ''}
    ranks={'2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K', 'A'}
    deck=[]
    #創建一副52張的撲克牌
    for suit in suits:
        for rank in ranks:
            deck.append(suit+' '+rank)
    random.shuffle(deck)
    return deck

#發一張牌給參與者participant
def deal_card(deck,participant):
    card=deck.pop()#取一張牌賦值給card,一般是最后一張
    participant.append(card)
    return card

#玩家拿牌: 詢問玩家是否繼續拿牌,如果是,繼續給玩家發牌(調用函數deal_ card()) ,並計算玩家牌點compute_total(),如果大於21點,輸出“玩家輸牌!”信息,並返回。

#計算並返回一手牌的點數和
def compute_total(hand):
    values={'A':1,'2':2,'3':3,'4':4,'5':5,'6':6,'7':7,'8':8,'9':9,'10':10,'J':10,'Q':10,'K':10}
    result=0 #初始化點數為0
    for card in hand:
        result+=values[card[2:]]
    return result

def print_hand(hand):
    for card in hand:
        print(card,end=',')
    print()

def blackjack():
    deck=get_shuffled_deck()
    house=[]  #庄家的牌
    Player=[] #玩家的牌

    #依次給玩家和庄家各發兩張牌
    for i in range(2):
        deal_card(deck,Player)
        deal_card(deck,house)
    #打印一手牌
    print('庄家的牌:',end=' ');print_hand(house)
    print('玩家的牌:',end=' ');print_hand(Player)

    #詢問玩家是否繼續拿牌,如果是,繼續給玩家發牌
    answer=input('是否繼續拿牌(y/n,缺省為y):')
    while answer in('','y','Y'):
        card=deal_card(deck,Player)
        print('玩家拿到的牌為:',end='');print_hand(Player);
        #計算牌點
        if compute_total(Player)>21:
            print('爆掉,玩家輸了!')
            return
        answer=input('是否繼續拿牌(y/n,缺省為y):')

    #庄家(計算人工智能)按“庄家規則”確定是否拿牌
    while compute_total(house)<17:
        card=deal_card(deck,house)
        print('庄家拿到的牌為:',end='');print_hand(house)
        #計算牌點
        if compute_total(house)>21:
            print('爆掉,庄家輸了!')
            return
    
    #分別計算庄家和玩家的點數,比較點數大小,輸出輸贏結果信息
    houseTotal,playerTotal=compute_total(house),compute_total(Player)
    if houseTotal>=playerTotal:
        print('庄家贏!')
    else:
        print('玩家贏!')

if __name__ == '__main__':
    blackjack()




    

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM