用Python实现斗地主游戏(终端版)

本文将介绍如何使用Python编程实现一个终端版的斗地主游戏。首先,我们需要建立卡牌系统作为游戏的基础,接着创建玩家角色,最后设计游戏规则和流程。完成这些后,我们就得到了一个基本的斗地主游戏终端版。文章末尾提供了游戏效果的展示,并邀请读者提问或获取源码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

马上就要过年了
大家也都放假了吧
过年必不可少的活动 打牌!
今天带大家来写一份斗地主

那么实现一个斗地主呢
我们肯定要先完善卡牌系统

from collections import Counter
import numpy as np
import itertools


def cmp_to_key(mycmp):
    'Convert a cmp= function into a key= function'
    class K:
        def __init__(self, obj, *args):
            self.obj = obj
        def __lt__(self, other):
            return mycmp(self.obj, other.obj) < 0
        def __gt__(self, other):
            return mycmp(self.obj, other.obj) > 0
        def __eq__(self, other):
            return mycmp(self.obj, other.obj) == 0
        def __le__(self, other):
            return mycmp(self.obj, other.obj) <= 0
        def __ge__(self, other):
            return mycmp(self.obj, other.obj) >= 0
        def __ne__(self, other):
            return mycmp(self.obj, other.obj) != 0
    return K

def get_action_space():
    actions = [[]]
    # max_cards = 20
    # single
    for card in Card.cards:
        actions.append([card])
    # pair
    for card in Card.cards:
        if card != '*' and card != '$':
            actions.append([card] * 2)
    # triple
    for card in Card.cards:
        if card != '*' and card != '$':
            actions.append([card] * 3)
    # 3 + 1
    for main in Card.cards:
        if main != '*' and main != '$':
            for extra in Card.cards:
                if extra != main:
                    actions.append([main] * 3 + [extra])
    # 3 + 2
    for main in Card.cards:
        if main != '*' and main != '$':
            for extra in Card.cards:
                if extra != main and extra != '*' and extra != '$':
                    actions.append([main] * 3 + [extra] * 2)
    # single sequence
    for start_v in range(Card.to_value('3'), Card.to_value('2')):
        for end_v in range(start_v + 5, Card.to_value('2')):
            seq = list(range(start_v, end_v))
            actions.append(Card.to_cards(seq))
    # double sequence
    for start_v in range(Card.to_value('3'), Card.to_value('2')):
        for end_v in range(start_v + 3, min(start_v + 20 // 2, Card.to_value('2'))):
            seq = list(range(start_v, end_v))
            actions.append(Card.to_cards(seq) * 2)
    # triple sequence
    for start_v in range(Card.to_value('3'), Card.to_value('2')):
        for end_v in range(start_v + 2, min(start_v + 20 // 3, Card.to_value('2'))):
            seq = list(range(start_v, end_v))
            actions.append(Card.to_cards(seq) * 3)
    # 3 + 1 sequence
    for start_v in range(Card.to_value('3'), Card.to_value('2')):
        for end_v in range(start_v + 2, min(start_v + 20 // 4, Card.to_value('2'))):
            seq = list(range(start_v, end_v))
            main = Card.to_cards(seq)
            remains = [card for card in Card.cards if card not in main]
            for extra in list(itertools.combinations(remains, end_v - start_v)):
                if not ('*' in list(extra) and '$' in list(extra)):
                    actions.append(main * 3 + list(extra))
    # 3 + 2 sequence
    for start_v in range(Card.to_value('3'), Card.to_value('2')):
        for end_v in range(start_v + 2, min(start_v + 20 // 5, Card.to_value('2'))):
            seq = list(range(start_v, end_v))
            main = Card.to_cards(seq)
            remains = [card for card in Card.cards if card not in main and card not in ['*', '$']]
            for extra in list(itertools.combinations(remains, end_v - start_v)):
                actions.append(main * 3 + list(extra) * 2)
    # bomb
    for card in Card.cards:
        if card != '*' and card != '$':
            actions.append([card] * 4)
    # bigbang
    actions.append(['*', '$'])
    # 4 + 1 + 1
    for main in Card.cards:
        if main != '*' and main != '$':
            remains = [card for card in Card.cards if card != main]
            for extra in list(itertools.combinations(remains, 2)):
                if not ('*' in list(extra) and '$' in list(extra)):
                    actions.append([main] * 4 + list(extra))

    return actions


class Card:
    cards = ['3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K', 'A', '2', '*', '$']
    # full_cards = [x for pair in zip(cards, cards, cards, cards) for x in pair if x not in ['*', '$']]
    # full_cards += ['*', '$']
    cards.index('3')
    cards_to_onehot_idx = dict((x, i * 4) for (i, x) in enumerate(cards))
    cards_to_onehot_idx['*'] = 52
    cards_to_onehot_idx['$'] = 53
    cards_to_value = dict(
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值