//完整代码importrandomimportnumpy as npfrom sys importexitclassRole:def __init__(self):"""初始化方法"""
#定义列表,用来保存当前角色手中的牌,初始牌为空,保存的类型为Card对象
self.cards =[]#向控制台打印手中所有的牌
def show_card(self, style=0, show=True):
lastpos= len(self.cards) - 1
if style == 1:
msg= "你拥有的牌:"
else:
msg= "庄家的牌:"cardSow= ""
for i, card inenumerate(self.cards):ifshow:if i
cardSow= cardSow + (card.card_tpye + card.card_text) + ","
else:
cardSow= cardSow + (card.card_tpye +card.card_text)else:if i
cardSow= cardSow + (card.card_tpye + card.card_text) + ","
else:
cardSow= cardSow + "? "
print(msg + cardSow, sep="", end="")#打印当前角色手中所有牌之后,在进行换行。
print()defget_value(self):"""获取当前角色牌的点数(分为最小值和最大值)"""Score=0
Have_Ace=Falsefor card inself.cards:
Score+=card.card_valuefor i inself.cards:if i.card_text == "A":
Have_Ace=Truebreak
else:continue
ifHave_Ace:if Score + 10 <= 21:
Score= Score + 10
returnScoredefclear_card(self):#清空牌,重新开始
self.cards =[]classCard: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_valueclassCardManager:"""管理一整副扑克牌,并且能够进行发牌"""
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 inall_card_type:for index, card_text inenumerate(all_card_text):
card=Card(card_type, card_text, all_card_value[index])
self.cards.append(card)#洗牌
random.shuffle(self.cards)defgetCard(self):returnself.cards#发牌
def send_card(self, role, num=1):"""给电脑或玩家发牌,
Parameters
------
role:Role
电脑或玩家
num:int
发牌的数量,默认1张"""
for i inrange(num):
card=self.cards.pop()
role.cards.append(card)"""游戏管理类,检测用户输入,分数判断等"""
classGameManager:def __init__(self):#创建扑克牌管理器类
self.cards =CardManager()#创建玩家角色
self.player =Role()#创建电脑角色
self.computer =Role()
self.total_score= np.array([0, 0]) #总分的计分器
defstart_game(self):
Round= 1
while len(self.cards.getCard()) > 10:
self.player.clear_card()
self.computer.clear_card()
input("开始, good luck...<> ")print(f"第 {Round} 轮:")print("." * 60)
score=self.one_round()
self.total_score+=scoreprint(f"总分数:{self.total_score[0]}:{self.total_score[1]}")
Round+= 1self.continue_or_quit()defjudgement(self, your_score, pc_score):#结束要牌的时候,计算双方的点数,判断输赢
if your_score > 21 and pc_score > 21:print(f"平局,分数: {your_score}:{pc_score}")returnnp.array([0, 0])elif your_score > 21 and pc_score <= 21:print(f"你输了,分数: {your_score}:{pc_score}")return np.array([0, 1])elif your_score <= 21 and pc_score > 21:print(f"你赢了,分数: {your_score}:{pc_score}")return np.array([1, 0])elif your_score <= 21 and pc_score <= 21:if your_score pc_score:print(f"你赢了,分数: {your_score}:{pc_score}")return np.array([1, 0])else:print(f"平局,分数: {your_score}:{pc_score}")returnnp.array([0, 0])defone_round(self):#一个回合的游戏
self.cards.send_card(self.player, 2)
self.cards.send_card(self.computer,2)
self.player.show_card(1)
self.computer.show_card(0, False)
score=np.array([self.player.get_value(), self.computer.get_value()])if score[0] == 21 or score[1] == 21:print("BlackJack 21点直接获胜")return self.judgement(score[0], score[1])else:while score[0] <= 21:
Get_New_Poker=self.hit_or_stand()#要了一张牌
ifGet_New_Poker:
self.player.show_card(1)
self.computer.show_card(0, False)
score[0]=self.player.get_value()if score[0] > 21:print("你超过21点")
self.computer.show_card(0)print()return self.judgement(score[0], score[1])else:continue
elif notGet_New_Poker:#npc点数比玩家低,则要牌
while score[1]
self.cards.send_card(self.computer)
score[1] =self.computer.get_value()
self.player.show_card(1)
self.computer.show_card(0)print()return self.judgement(score[0], score[1])else:continue
defhit_or_stand(self):#玩家需要判断是否继续叫牌
AskPoker = input("是否叫牌? 【Y/N】>>:")if AskPoker.upper() == "Y":print()
self.cards.send_card(self.player)returnTrueelif AskPoker.upper() == "N":print("你没加牌.")print()returnFalseelse:print("输入错误 Y/y or N/n!>>")returnself.hit_or_stand()defcontinue_or_quit(self):#在每一轮结束后,判断是否继续下一轮的游戏。当牌堆里面牌的数目不足的时候,自动停止游戏
NextRound = input("是否继续? 【Y/N】>>")if NextRound.upper() == "Y":if len(self.cards.getCard()) < 10:print("牌不够了")
input("Game Over")
exit(1)else:returnTrueelif NextRound.upper() == "N":
input("Game Over")
exit(1)else:print("输入有误")
self.continue_or_quit()if __name__ == "__main__":
startGame=GameManager()
startGame.start_game()