這個代碼實現的是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我的代碼,備不住哪天心血來潮了就補充一下這個內容。