【python】模拟斗牛纸牌游戏「牛牛」

相信大家都玩过或者看别人玩过一个纸牌游戏斗牛,或者也叫牛牛的吧,我们进行就来使用python来实现一下简单的模仿.
在这里插入图片描述


请你写一个模拟纸牌斗牛(或者也叫做牛牛)的程序,用以模拟纸牌的生成,洗牌,发牌,点数计算,牌的显示等过程。
附:先完成基本功能,(同花顺 ,五小牛 , 金牛 , 炸弹 , 葫芦 ,同花 ,顺子,倍数)等情况可以先不考虑.

如果牌型大小一样的话,假设算庄家胜,比如同样牛9的牌,算庄家胜。在1庄家3个闲家,每家都押注10块的情况下,试计算连玩10局庄家的输赢值

至于相关的规则我这里简要的讲述一下:
就是每人五张牌,自己进行分堆,分成3,2两堆.三张牌的点数要是10的倍数,然后剩下两张牌的点数之和取个位就是你的牛数,当然如果没有任何三张牌可以凑成10的倍数,那么就是没牛.(JKQ都是按照10来计算,A按照1来计算)
举个例子:
♥2 ♠5 ♦8 ♣J ♥A
我们可以分成
♥2 ♦8 ♣J一堆,♠5 ♥A一堆
那么这幅牌就是牛六
(是不是非常好理解~)
如果还不能理解的,建议自行去百度(没有看不起你的意思hh)


思路讲解:

  1. 首先需要先初始化纸牌,将花色和数字对应好存入pokers变量中.
  2. 再洗牌,我这里使用的random库中的shuffle方法来洗的(注意!这个方法没有返回值,所以直接调用就可以了)为了确保是真的随机,我加了一个随机的洗牌次数,这样应该会更接近真随机一点.(其实一开始我想使用的是py里面切片来进行三等分交换位置来达到洗牌的目的但不知为何,就是洗很多遍也还是不是很乱,搞不懂,后来也就直接使用了shuffle方法来做了.)
  3. 然后是发牌,按照顺序依次发给四名玩家,然后再用切片来减少pokers中的前四张牌,一共发五次也就是每人五张牌.
  4. 接下来是展示玩家的手牌,这个很简单就是简单print就可以了
  5. 然后需要对玩家手里的牌进行计算来求出一个牛的数量.但是因为存在JKQA这些字母存在所以直接进行计算会显得很麻烦,所以我首先调用fmt函数来对手牌进行"格式化",也就是把JKQ变为10,然后将A变为1,存入手牌中(因为之前已经输出过手牌了,所以不用担心会把手牌搞错)
  6. 接下来这才是计算牛数,因为需要对五张牌进行排列组合,为了简单一点,我是用itertools库中的combinations方法来求排列组合,然后对不同组合进行判断,如果他们的和是10的倍数,也就是符合3那堆的条件,这时候再把全部5张牌相加对10取余,这个余数就是牛的数量(为什么可以这么做?因为有三个数可以被10整除了,所以加上他们也无伤大雅,最后求的还是剩下两个数的对于10的取余).最后因为五张牌里面可能存在多组符合条件的分堆法,所以需要进行求最大值,这个就很简单了,我就不细说了.
  7. 最后,需要进行判断谁是最终赢家.如果庄家的点数是四人中的最大,那么就是庄家赢,要不然就是剩下三者中的最大值那方获得胜利.
  8. 因为题目还有一个条件需要计算玩10把庄家赢的概率,所以再来一个函数来求胜率.把游戏循环进行10次,每次庄家赢就使cnt加一,最后就可以知道庄家的胜率了.这里有个地方需要注意,因为使连续玩玩很多次,所以需要再每次开始的时候把玩家和庄家的手牌都置为0,要不然会影响新游戏的运行.
  9. 好了!!

代码:

import random
import itertools


def initCards():
    poker = []
    pokers = []
    for i in {"梅花", "方块", "红桃", "黑桃"}:
        for j in {"A", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "K", "Q"}:
            poker.append(i)
            poker.append(j)
            pokers.append(poker)
            poker = []
    return pokers


def shuffleCards(pokers):
    for i in range(100):
        c = random.randint(0, 100)
        for j in range(c):
            random.shuffle(pokers)
    return pokers


player1 = []
player2 = []
player3 = []
playerZhuang = []


def deal(pokers):
    for i in range(5):
        playerZhuang.append(pokers[0])
        player1.append(pokers[1])
        player2.append(pokers[2])
        player3.append(pokers[3])
        pokers = pokers[4:]


def showCards():
    print(player1)
    print(player2)
    print(player3)
    print(playerZhuang)


def fmtCards(player):
    points = []
    for card in player:
        if card[-1] == "A":
            points.append(1)
        elif card[-1] == "J" or card[-1] == "K" or card[-1] == "Q":
            points.append(10)
        else:
            points.append(int(card[-1]))
    return points


def calCards(points):
    maxN = 0
    for i in itertools.combinations(points, 3):
        niu = 0
        if sum(i) % 10 == 0:
            if sum(points) % 10 == 0:
                niu = 10
            else:
                niu = sum(points) % 10
        if niu > maxN:
            maxN = niu
    return maxN


def judge(zhuang, p1, p2, p3):
    if zhuang == max(zhuang, p1, p2, p3):
        return "庄家获胜"
    elif p1 == max(p1, p2, p3):
        return "player1获胜"
    elif p2 == max(p2, p3):
        return "player2获胜"
    else:
        return "player3获胜"


def clearCards():
    player1 = []
    player2 = []
    player3 = []
    playerZhuang = []


def gameStart(time):
    cnt = 0
    for i in range(time):
        clearCards()
        cards = initCards()
        cards = shuffleCards(cards)
        deal(cards)
        if judge(calCards(fmtCards(playerZhuang)), calCards(fmtCards(player1)), calCards(fmtCards(player2)), calCards(fmtCards(player3))) == "庄家获胜":
            cnt = cnt + 1
    gailv = cnt / time * 100
    print(f"庄家{time}场获胜概率为{gailv}%")


cards = initCards()
cards = shuffleCards(cards)
deal(cards)
showCards()
p1 = calCards(fmtCards(player1))
p2 = calCards(fmtCards(player2))
p3 = calCards(fmtCards(player3))
zhuang = calCards(fmtCards(playerZhuang))
print(f"玩家1 牛{p1}")
print(f"玩家2 牛{p2}")
print(f"玩家3 牛{p3}")
print(f"庄家  牛{zhuang}")
print(judge(zhuang, p1, p2, p3))
gameStart(10)


最后代码运行展示:
在这里插入图片描述


新手上路,有错请指正;

好的,斗牛游戏是一个非常经典的纸牌游戏,你可以使用 Python 语言来实现它。这里提供一个基本的框架,你可以在此基础上进行开发。 首先,你需要定义一组扑克牌。一副扑克牌共有 52 张牌,其中包括 4 种花色(方块、梅花、红心、黑桃)和 13 种点数(2、3、4、5、6、7、8、9、10、J、Q、K、A)。你可以使用列表来存储这些牌,例如: ``` suits = ['Diamonds', 'Clubs', 'Hearts', 'Spades'] ranks = ['2', '3', '4', '5', '6', '7', '8', '9', '10', 'Jack', 'Queen', 'King', 'Ace'] deck = [(s, r) for s in suits for r in ranks] ``` 接着,你需要写一个函数来洗牌。洗牌可以使用 `random` 模块来实现,例如: ``` import random def shuffle_deck(deck): random.shuffle(deck) ``` 然后,你需要写一个函数来计算手牌的点数。斗牛游戏规定,点数大于 10 的牌都算作 10 点,A 可以算作 1 点或 11 点,具体取决于哪种取值更加优势。你可以使用以下代码来计算点数: ``` def calculate_points(hand): points = 0 num_aces = 0 for card in hand: if card[1].isdigit(): points += int(card[1]) elif card[1] in ['J', 'Q', 'K']: points += 10 elif card[1] == 'A': num_aces += 1 points += 11 while num_aces > 0 and points > 21: points -= 10 num_aces -= 1 return points ``` 最后,你需要编写游戏主程序。主程序中,你可以编写一个函数来模拟一次游戏,包括发牌、要牌、结算等操作。主程序还需要提示玩家输入命令,例如是否要牌、是否继续游戏等。这里给出一个简要示例: ``` def game(): deck = [(s, r) for s in suits for r in ranks] shuffle_deck(deck) player_hand = [deck.pop(), deck.pop()] dealer_hand = [deck.pop(), deck.pop()] player_points = calculate_points(player_hand) dealer_points = calculate_points(dealer_hand) while True: print(f'Your current hand is {player_hand}, with total points of {player_points}.') command = input('Do you want another card? (y/n)') if command == 'y': player_hand.append(deck.pop()) player_points = calculate_points(player_hand) if player_points > 21: print('You busted! Game over.') return -1 elif command == 'n': break while dealer_points < 16: dealer_hand.append(deck.pop()) dealer_points = calculate_points(dealer_hand) if dealer_points > 21: print('Dealer busted, you win!') return 1 elif dealer_points > player_points: print('Dealer wins, you lose!') return -1 elif player_points > dealer_points: print('You win!') return 1 else: print('Tie!') return 0 ``` 这就是一个简单的斗牛游戏的实现,你可以根据自己的需求进行修改和扩展。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Khalil三省

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值