python模擬簡單的撲克牌遊戲

這個代碼實現的是J來家遊戲,規則是這樣的:

兩個玩家隨機平分一副撲克牌中的紙牌,然後從最上面出牌,名牌擺出,如果玩家出的牌是J,則將已經落地的名牌全部收歸自己,放到自己牌的最下方,再出一張牌;如果出的牌在擺出的牌中存在了,則將剛出的牌和相同的牌之間的所有撲克牌歸爲自己;如果出的牌不滿足上述兩種條件,則對方出牌,規則同上。

這裏的規則其實很簡單,要注意的一點就是需要使用遞歸編程,因爲玩家出牌不是一人只出一手牌,而是當你出了J或者底牌中存在的撲克牌時候,在收回底落地的名牌之後,需要再次出一張牌。代碼如下所示:

import random
import time

def cards_init():
    source_cards = [ ['3',4],['4',4],['5',4],['6',4],['7',4],['8',4],['9',4],['10',4],['J',4],['Q',4],['K',4],['A',4],['2',4]] #除去大小王的撲克牌
    player_1 = []   #抓牌前玩家palyer_1手牌
    player_2 = []   #抓牌前玩家palyer_2手牌
    indexs = [ i for i in range(52) ]   #對52張牌進行索引
    index_player_1 = []  #玩家palyer_1手牌索引
    index_player_2 = []  #玩家palyer_1手牌索引
    for i in range(26):
        index = random.choice(indexs)   #爲玩家player_1隨機分配撲克牌
        index_player_1.append( index )  #爲玩家player_1隨機分配撲克牌
        indexs.remove(index)            #牌已經被抓走,則在底牌中刪除這張牌

        index = random.choice(indexs)
        index_player_2.append(index)
        indexs.remove(index)

    for i in index_player_1:   #將分配到的牌放到手裏
        player_1.append( source_cards[ i//4 ][0] )

    for i in index_player_2:
        player_2.append( source_cards[ i//4 ][0] )

    return player_1, player_2

player_1, player_2 = cards_init()  #遊戲的初始化
print(player_1)
print(player_2)
lover = input('希望誰爲獲勝者?player1 or player2 or impartial: ')    #加了一個玩賴的設置
if lover=='player1':
    while 'J' in player_2:
        player_2.remove('J')

if lover=='player2':
    while 'J' in player_1:
        player_1.remove('J')
print(player_1)
print(player_2)

land_cards = []    #打出的撲克牌
is_end = False     #遊戲是否結束的標誌




'''
push_card(players)是遊戲的邏輯設置,使用了遞歸。如果玩家的底牌數量爲零,則遊戲結束;如果出的牌在底牌中不存在並且不是J,則下一個玩家出牌;如果出的牌在底牌中存在,
則將出的牌和相同的牌之間的所有牌歸爲自己,再重新出牌;如果出的牌爲J,則將所有的底牌都歸爲自己。
'''
def push_card(players):
    if len(players)<5:  #檢測玩家是否還有底牌
        print('game over')
        is_end=True      #將遊戲的結束標誌設置爲True
        return -1

    temp_card = players[0]    #獲得玩家的出牌信息

    if temp_card not in land_cards and temp_card != 'J':    #出的牌再底牌中不存在,並且不是J
        print('玩家手牌爲:', players)
        print('底牌爲:', land_cards)
        print('出牌爲:', temp_card)
        print('不能收牌')
        print()
        time.sleep(1)
        land_cards.append(temp_card)    #將玩家的出牌追加到底牌的末尾
        del players[0]    #在玩家手牌中刪除已經出過的牌
        return -2
    elif temp_card in land_cards:    #出的牌在底牌中存在
        print('玩家手牌爲:', players)
        print('底牌爲:', land_cards)
        print('出牌爲:', temp_card)
        print('收牌')
        time.sleep(1)
        cut = land_cards[land_cards.index(temp_card):]    #截取底牌中與玩家出牌相同的紙牌之間的所有紙牌
        for i in range( land_cards.index(temp_card), len(land_cards) ):    #將截取後的牌在底牌中刪除
            del land_cards[-1]
        players.extend(cut)    #將截取到的紙牌追加到玩家手牌的末尾
        players.append(temp_card)  #將玩家打出的紙牌收歸到末尾
        del players[0]    #刪除剛剛出手的紙牌
        print('收牌後爲:',players)
        print()
        push_card(players)    #遞歸調用
    elif temp_card=='J':    #如果玩家的出牌爲J
        print('玩家手牌爲:', players)
        print('J來家')
        print('底牌爲:', land_cards)
        print('出牌爲:', temp_card)
        time.sleep(1)
        players.extend(land_cards)    #將所有底牌收回來
        players.append(temp_card)
        for i in range(len(land_cards)):    #將底牌列表中的所有牌刪除
            del land_cards[-1]
        del players[0]
        print('收牌後爲:', players)
        print()
        push_card(players)

while not is_end:    #遊戲循環
    push_card(player_1)
    push_card(player_2)

這個代碼也可以到github上下載,地址爲:https://github.com/t20134297/simple-poker-game

在最開始編寫代碼的時候本想做一個可視化的過程,可是後來太懶了,再加上作可視化,需要解決一下Python當中那個僞線程的問題,就沒有實現它,不過可以fork我的代碼,備不住哪天心血來潮了就補充一下這個內容。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章