用python实现的游戏-用python实现的21点游戏

//完整代码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()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值