#建立一副撲克牌
#建立莊家(計算機)和玩家(我)
#發牌:莊家1張,玩家2張
#玩家根據自己的牌面與莊家的牌面來選擇是否要牌?詢問方式
#如果玩家要牌,則繼續發牌,發牌後判斷是否爆牌。如果爆牌,則玩家負
#如果玩家停牌,則莊家開始要牌。如果莊家小於17點,無條件要牌;如果牌面》=17,<=21,無條件停牌;如果莊家大於21點,則莊家爆牌,莊家負
#如果莊家與玩家都沒有爆牌,則比較點數大小。接近21點勝出
import random
import sys
import time
"""定義撲克牌類,每個物件代表一張撲克牌
"""class card:
def __init__(self,card_tpye,card_text,card_value):
"""初始化方法
parameters
---------
card_type:str
牌的型別:(紅桃,黑桃,梅花,方片)
card_text:str
牌面顯示的文字(a,k,q,j)
card_value:int
牌面的真實值(例如a為1點或11點,k為10點)
"""self.card_tpye = card_tpye
self.card_text = card_text
self.card_value = card_value
"""定義角色類,用來表示莊家(電腦),使用者(玩家)
"""class role:
def __init__(self):
"""初始化方法"""
#定義列表,用來儲存當前角色手中的牌,初始牌為空,儲存的型別為card物件
self.cards =
#向控制台列印手中所有的牌
def show_card(self):
for card in self.cards:
print(card.card_tpye,card.card_text,sep='',end='')
#列印當前角色手中所有牌之後,在進行換行。
print()
def get_value(self,min_or_max):
"""獲取當前角色牌的點數(分為最小值和最大值)
parameters
-----
min_or_max:str,職位min或max
當值為min時,返回的是最小值。所有的a當成1時的點數。(判斷是否爆牌)
當值為max時,反水的是最大值。可表示的最大點數。此時a可能是11,也可能是1
returns
----
value:int
返回手中牌的點數(最小點或最大點)
"""sum2 = 0
#表示牌面中a的數量
a = 0
for card in self.cards:
#累計相加所有點數
sum2 += card.card_value
#累加a的數量
if card.card_text == 'a':
a += 1
if min_or_max == "max":
#通過迴圈減少a的數量,選擇乙個小於等於21的最大值
for i in range(a):
value = sum2 -i * 10
if value <= 21:
return value
return sum2 - a * 10
def burst(self):
"""判斷是否爆牌
return
------
b:bool
是否爆牌,爆牌返回true,否則返回false
"""#判斷是否爆牌,只需要判斷最小值是否大於21點即可
return self.get_value("min") > 21
class cardmanager:
"""管理一整副撲克牌,並且能夠進行發牌"""
def __init__(self):
"""初始化方法"""
#用來儲存一整副52張撲克牌
self.cards =
#定義所有牌的花色型別
all_card_type = "♥♠♣♦"
all_card_text = ["a","k","q","j","10","9","8","7","6","5","4","3","2"]
all_card_value = [11,10,10,10,10,9,8,7,6,5,4,3,2]
#對牌面型別、牌面值、牌面文字巢狀迴圈
for card_type in all_card_type:
for index,card_text in enumerate(all_card_text):
card = card(card_type,card_text,all_card_value[index])
#洗牌random.shuffle(self.cards)
#發牌def send_card(self,role,num=1):
"""給電腦或玩家發牌,
parameters
------
role:role
電腦或玩家
num:int
發牌的數量,預設1張
"""for i in range(num):
card = self.cards.pop()
#建立撲克牌管理器類
cards = cardmanager()
#建立電腦角色
computer = role()
#建立玩家角色
player = role()
#初始時,給莊家發1張牌,給玩家發兩張牌
cards.send_card(computer)
cards.send_card(player,num=2)
#顯示莊家與玩家手中的牌
computer.show_card()
player.show_card()
#詢問玩家是否要牌,如果玩家要牌,則繼續發牌,否則停牌
while(true):
choice = input("是否在要一張牌?【y/n】")
if choice == 'y':
cards.send_card(player)
#發牌後顯示莊家與玩家手中的牌
computer.show_card()
player.show_card()
#判斷玩家是否爆牌
if player.burst():
print("玩家爆牌,您輸了")
sys.exit()
else:
break
#玩家停牌之後莊家發牌,莊家在小於17之前必須要牌,在17~21之間停牌,大於21點爆牌
while(true):
print("莊家發牌中……")
#因為莊家不需要詢問是否發牌,所以建立時間間隔
time.sleep(1)
#向莊家發牌
cards.send_card(computer)
#顯示莊家與玩家的牌
computer.show_card()
player.show_card()
#判斷莊家是否爆牌
if computer.burst():
print("莊家爆牌,您贏了")
sys.exit()
#如果沒有爆牌,則判斷莊家的牌面值
elif computer.get_value("max") >=17:
break
#如果莊家和玩家都沒有爆牌則比較點數大小
player_value = player.get_value()
computer_value = computer.get_value()
#比較大小,多者勝出
if player_value > computer_value :
print("您贏了")
elif player_value == computer_value:
print("和棋")
else:
print("您輸了")
C 小遊戲 撲克牌21點
21點撲克牌遊戲 程式說明 該程式是模擬21點撲克牌遊戲,玩家最多可以要5張牌,但是如果牌的點數之和超過21點,則自動出局,在不超過21點的情況下,玩家與莊家比牌的大小,大者為贏家 程式片段分析 標頭檔案處 include include include using namespace std cs...
重新學習python21
0,將fun a函式轉換為lambda表示式 def fun a x,y 3 return x y a fun a 5,print a b fun a 5,5 print b lambda表示式 lambda x,y 3 x y 1,lambda表示式 轉化為 一般函式 3 利用lambda表示式 ...
python(21)實現多程序(1)
python多程序 multiprocessing python中的多執行緒其實並不是真正的多執行緒,如果想要充分使用多核cpu的資源,在python中大部分情況下還是多程序。python提供了非常好用的多程序包multiprocessing,只需要定義乙個函式,python會完成其他所有事情。借助...