Python 21點小遊戲

2021-08-28 11:51:58 字數 4113 閱讀 1611

#建立一副撲克牌

#建立莊家(計算機)和玩家(我)

#發牌:莊家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會完成其他所有事情。借助...