鱼C论坛

 找回密码
 立即注册
12
返回列表 发新帖
楼主: pan11

python 二人21点游戏

[复制链接]
 楼主| 发表于 2023-12-10 05:35:25 | 显示全部楼层
FishC 发表于 2023-12-10 05:31
这两行代码是使用了列表推导式来计算总黑杰克值和筛选出A牌。

首先,total = sum(card.bjValue for card ...

可以用for loop的形式展示一下这两个代码吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-12-10 05:35:38 | 显示全部楼层
pan11 发表于 2023-12-10 05:35
可以用for loop的形式展示一下这两个代码吗

当然可以!这里是使用for循环来展示这两行代码的实现:
# 计算总黑杰克值total = 0for card in player.hand:    total += card.bjValue# 筛选出A牌aces = []for card in player.hand:    if card.rank == "A":        aces.append(card)
第一部分代码使用一个for循环遍历玩家手牌中的每张牌,然后将每张牌的bjValue属性加到total变量上,最终得到总黑杰克值。

第二部分代码也是使用一个for循环遍历玩家手牌中的每张牌,然后检查卡牌的rank属性是否为"A"。如果是,就将这张牌添加到aces列表中。

希望这样的展示对你有所帮助!如还有其他问题,请随时提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-12-10 06:00:17 | 显示全部楼层
FishC 发表于 2023-12-10 05:31
这两行代码是使用了列表推导式来计算总黑杰克值和筛选出A牌。

首先,total = sum(card.bjValue for card ...

import random
class Player:
    def __init__(self, name):
        self.name = name
        self.hand = []
        self.bjvalue = 0
        
    def __str__(self):
        return (self.name+ " has the bjvalue "+self.bjvalue)

class Card:
    def __init__(self, rank, suit):
        self.rank = rank
        self.suit = suit
        if rank == 'A':
            self.bjValue = 11
        elif rank in ['J', 'Q', 'K']:
            self.bjValue = 10
        else:
            self.bjValue = int(rank)
        
    def __str__(self):
        return (self.rank+self.suit)
   
   

def instructions():
    print("You two will play this Black Jack game in turn.")
    print("Each of you can get two cards randomly and you can choose request or hold a card.")
    print("The winner will be the person whose bjvalue is the closet to 21 and less than 21.")

def makeADeckOf52():
    cardSuits = ["♣","♦","♥","♠"]
    cardRanks = ["A","2","3","4","5","6","7","8","9","10","J","Q","K"]
    deck = []
    for s in cardSuits:
        for r in cardRanks:
            deck.append(s+r)
    random.shuffle(deck)
    return(deck)

  
def update_hand_value(player):
    # 计算并更新玩家的手牌的黑杰克值
    values={'2':2,'3':3,'4':4,'5':5,'6':6,'7':7,'8':8,\
            '9':9,'10':10,'J':10,'Q':10,'K':10,"A":10}
    numA=0
    for card in player.hand:
        player.bjvalue=values[card[0]]
        if card=="A":
            numA=numA+1

    while player.bjvalue>=21 and numA>0:
        player.bjvalue=player.bjvalue-10
        numA=numA-1


def dealAHand(deck, player):
    # 从牌组中发出两张牌给玩家,并将这两张牌存入玩家的手牌列表
    card=deck.pop()
    player.hand.append(card)
   
   
def displayHand(player):
    # 显示玩家的手牌
    print(player.name+" has card "+str(player.hand))
def bjHandValue(hand):
    # display the total玩家手牌的总黑杰克值
    pass
def turn(deck, player):
    # 玩家的一轮操作,包括是否要牌的选择
    update_hand_value(player)
    while player.bjvalue<21:
        answer=input("Do you want more card?[y/n] ")
        while answer.lower=="y":
            card=dealAHand(deck, player)
            print(player.name+" has a new card: "+card)
    if player.bjvalue>=21:
        print(player.name+", you lose! Game over!")

def declare_winner(player1,player2):
    # 根据所有玩家的手牌总黑杰克值,声明胜利者
    if (21-player1.bjvalue)<(21-player2.bjvalue):
        print(player1.name+", you win!")
    else:
        print(player2.name+", you win!")
def main():
    instructions()
    deck = makeADeckOf52()
   
    name1 = input("Enter the name of the first player: ")
    player1 = Player(name1)
    name2 = input("Enter the name of the second player: ")
    player2 = Player(name2)
   
    # 发牌
    for i in range(2):
        dealAHand(deck, player1)
        dealAHand(deck, player2)
   
    # 显示玩家的手牌
    displayHand(player1)
    displayHand(player2)
   
    # 玩家进行操作,直到不再要牌或手牌总黑杰克值超过21点
    turn(deck, player1)
    turn(deck, player2)

    bjHandValue(player1)
    bjHandValue(player2)
   
    # 声明胜利者
    while player1.bjvalue<21 and player2.bjvalue<21:
        declare_winner(player1,player2)
main()
这是我目前的代码,
我可以怎么修改做到减少代码的重复,让两个玩家是有先后顺序的玩,也就是说让游戏可以进行两次,而不是同时玩?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-12-10 06:00:37 | 显示全部楼层
pan11 发表于 2023-12-10 06:00
import random
class Player:
    def __init__(sel ...

你的代码基本上是正确的,但还有一些小问题需要修复。首先,你在Player类的初始化方法中定义了self.hand和self.bjvalue变量,但没有为其赋初始值。你可以将它们都设置为空列表和0,例如:
def __init__(self, name):    self.name = name    self.hand = []    self.bjvalue = 0
其次,在Card类中的if-elif-else语句中,你只提供了'A'的情况来计算A牌的黑杰克值,但缺少了其他牌面(2到10)的处理。你可以使用一个字典来存储各个牌面的黑杰克值,例如:
values = {'2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9, '10': 10, 'J': 10, 'Q': 10, 'K': 10, 'A': 11}
然后,在遍历玩家手牌时,你在update_hand_value函数中的计算方式有问题。你将每张牌的bjvalue直接赋值给了player.bjvalue,这样会导致只有最后一张牌的值会被保留。你应该将每张牌的bjvalue累加到player.bjvalue上,例如:
for card in player.hand:    player.bjvalue += values[card]    if card == "A":        numA += 1
另外,在while循环中的判断条件应该是player.bjvalue > 21而不是player.bjvalue >= 21。因为当bjvalue等于21时,玩家已经赢了,不需要再减去A牌的值。

最后,在turn函数中的while循环条件应该是player.bjvalue <= 21 而不是player.bjvalue = 21,因为这样会导致死循环。

其他部分的代码看起来是正确的,可以进一步完善和调试。希望能帮助到你!如果还有其他问题,请随时提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-12-13 10:04:59 | 显示全部楼层
新的一周,加油!!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-24 00:11

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表