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

Python实现斗地主 你好! 要实现斗地主,你需要了解游戏的规则和基本流程。然后,你可以使用 Python 的类来模拟游戏的各个部分,包括玩家、牌堆、牌组、游戏流程等。 下面是一个简单的示例,展示了如何使用 Python 类来模拟斗地主游戏: ``` 定义一个 Card 类表示单张牌 class Card: def init(self, suit, value): self.suit = sui... 阅读详情

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

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

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(zip(cards, range
python 斗地主最优解法,python模拟斗地主发牌 大家好,本文将围绕python 斗地主最优解法展开说明,python模拟斗地主发牌是一个很多人都想弄明白的事情,想搞清楚python斗地主游戏源码需要先了解以下几个事情。 阅读详情

相关推荐

Python编写斗地主游戏(单机版)

斗地主玩法介绍: 斗地主是三个人玩,两个人斗一个地主,地主20张牌。农民每人17张牌。 王炸:大王+小王 是最大牌,可以炸别人任意的牌,单张的话 大王比小王大,两者都可以代替任意牌型。 第二大是炸弹:从2点A点K以此推类到3点炸,四只牌一起就是炸弹,可以炸对方的连牌,单牌,对子,三代一 飞机就是说要有三个三跟三个四,或三个十跟三个J三张两个连在一起才叫飞机,飞机带翅膀就是飞机在带上两只单牌就叫飞机带翅膀。 三带一就是说三张一样的牌,可以带上一只单独的牌就叫三带一 连对的组合就是三个三对牌连在一起

小石头的博客 1万+

基于python的简单斗地主实现

poker_num = [str(i) for i in range(2,11)] poker_str = [‘A’,’J’,’Q’,’K’] poker_king = [‘大王’,’小王’] poker_color = [‘红桃’,’黑桃’,’方块’,’梅花’] pokers = [‘%s%s’%(i,j) for i in poker_color for j in poker_num+...

weixin_41275510的博客 1万+

python 模拟斗地主发牌(简易代码实现)

题目:趣味百题之斗地主 扑克牌是一种非常大众化的游戏,在计算机中有很多与扑克牌有关的游戏。例如,在Windows操作系统下自带的纸牌、红心大战等。在扑克牌类的游戏中,往往都需要执行洗牌操作,就是将一副牌完全打乱,使其排列没有规律。 要求: 54张扑克牌发个3个玩家,农民17张,地主20张。 自动生成一幅扑克牌组;洗牌;发牌到玩家手中;将玩家手中扑克牌按花色大小整理好。** ''' 趣味百题-发...

金鞍少年的博客 5031

Python练习题(1)_斗地主实现

用Python的类实现斗地主的初始化、洗牌、发牌、抢地主、码牌、映射功能。代码如下 # -*- coding: cp936 -*- import random class Doudizhu:#斗地主的一个类,下面使用的变量如果在两个实例方法里使用,要定义成实例属性。要不然会出现后面不能引用前面的变量。 def __init__(self): self.a=[0,1,2

WangQuanNetwork专栏 9727

用python写一个有AI的斗地主游戏(一)——开始前的准备

从零用python开发斗地主游戏/写一个项目需要哪些步骤呢?项目建议书里应该有哪些内容呢?本专栏将会实现哪些部分呢?请阅博主的文章获得解答

EricFrenzy的博客 2189

使用Python装饰器开发斗地主游戏

装饰器是Python中用于修改或增强函数或类的行为的函数。它本身是一个函数,接收另一个函数作为参数,并返回一个新的函数。装饰器为被装饰函数增加额外功能,而不改变原有函数的代码。斗地主游戏中的抓牌算法是保证游戏公平性和趣味性的关键。抓牌规则遵循斗地主的标准规则,即一副牌共54张,3个玩家轮流抓牌,每人抓17张,留3张作为底牌。抓牌过程中,每个玩家所抓的牌必须随机分配,不能有任何的偏向或模式出现,以确保游戏的不可预测性和公平性。扩展性是指软件能够适应新的需求变化,而不需要进行大规模的重写或重构的能力。

weixin_35732273的博客 903

欢乐斗地主python项目游戏源码下载

AI欢乐斗地主Python项目是一个融合了先进人工智能技术的斗地主游戏实现。该项目不仅仅包括游戏的核心逻辑和界面设计,还涵盖了AI出牌策略等多个关键部分。通过Python编程语言,我们可以实现斗地主游戏的自动化运行,并且借助强大的AI算法优化出牌策略,从而提高游戏的趣味性和挑战性。 在这个项目中,游戏的核心逻辑是至关重要的。这包括牌局的初始化、发牌、出牌、牌型判断、结算等关键步骤。通过精心设计和优化,我们可以确保游戏运行流畅,玩家能够获得极致的游戏体验。同时,界面设计也是项目中不可或缺的一部分。优秀的界面设计可以提升游戏的美感和用户友好度,让玩家更加沉浸于游戏之中。 AI出牌策略则是项目中的亮点之一。通过AI算法的优化,我们可以使得电脑玩家具备更加智能化的出牌能力。这不仅可以提高游戏的挑战性,还可以让玩家感受到与真人对战相似的游戏体验。AI出牌策略的优化也是项目中的一个持续改进的方向,通过不断地调整和完善算法,我们可以使得游戏变得更加有趣和富有挑战性。

FPGA DMA IP核使用指南

数据传输:支持从源地址到目标地址的数据传输。中断管理:提供中断信号,便于CPU处理传输完成事件。传输控制:支持传输大小、方向和暂停/恢复控制。

weixin_66634995的博客 2428

从FOC到你的无人机:深入浅出讲透Clark/Park变换在无刷电机控制中的核心作用

本文深入解析Clark变换与Park变换在无刷电机控制中的核心作用,揭示其如何将三相交流电转换为旋转坐标系下的直流量,实现无人机电机的高效精准控制。通过STM32硬件加速和工程实践案例,展示这对数学变换如何成为FOC算法的神经中枢,大幅提升系统响应速度和能效表现。

weixin_42628941的博客 169

MC33PT2000控制详解一:PT2000 Dev Studio工具的使用

MC33PT2000共可控制6个高低端(如控制6个高压喷油器),1个高低端(如控制高压油泵)和DC-DC模块(如升压到65V).

m0_69929716的博客 1359

别再乱改基础库了!手把手教你搞定uni-app小程序上传图片报错(chooseAndUploadFile权限篇)

本文详细解析了uni-app开发微信小程序时遇到的`chooseAndUploadFile`权限报错问题,并提供了四步解决方案。从隐私协议与API权限的关联入手,指导开发者正确配置后台声明、双重提交策略和版本管理,避免降级基础库等常见误区,确保小程序合规运行。

weixin_33709364的博客 277

Windows 11任务管理器隐藏技能:一眼揪出内存泄漏的“元凶”(分页/非分页缓冲池详解)

本文详细介绍了Windows 11任务管理器中隐藏的分页缓冲池和非分页缓冲池功能,帮助用户精准定位内存泄漏问题。通过启用隐藏列、解读数据异常信号,并结合实战案例和高级工具推荐,为开发者和IT运维人员提供了高效的内存问题诊断与解决方案。

weixin_29284885的博客 633

运用AD进行stm32最小系统PCB图的绘制

运用AD进行stm32最小系统PCB图的绘制一、PCB图的绘制(1)布局(2)布线(3)覆铜(4)电气规则检查二、给PCB添加logo三、生成garber文件总结 一、PCB图的绘制 (1)布局 1.画好原理图后,新建一个PCB项目 2.在Design中选择第二项,导入器件 3.先点击右下角第一项,再点第二项导入器件 导入成功 4.导入后效果 选择紫红色方框,按电脑上的delete键把它删掉 5.在Tools选择Outside Board,自动排布器件 排布后效果如图 6.画线,确定板子范围

lucario1的博客 2150

2026年紫光同创数字IC笔试试卷带答案

FPGA基础知识与设计要点摘要 本文围绕FPGA与数字IC设计核心概念,通过单选题、波形分析题、多选题和简答题形式,系统梳理了以下关键知识点: FPGA基础架构 查找表(LUT)是实现组合逻辑的基本单元(题1) CLB包含LUT、触发器和进位链,后者加速算术运算(题6,10) 布局布线优化是减少关键路径延迟的核心方法(题7) 时序分析要点 建立时间(时钟沿前数据需稳定)与保持时间(时钟沿后需保持)的定义(题2,简答1) 亚稳态成因及两级同步器处理跨时钟域信号的方法(多选题1,波形题5) 特殊设计技术 异步复

Open 117

【WorkBuddy专栏40】从「帮你干活」到「帮你创造」——WorkBuddy设计创意功能深度拆解

【WorkBuddy专栏40】从「帮你干活」到「帮你创造」——WorkBuddy设计创意功能深度拆解

AI人人懂 1315

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

上一篇: 用代码实现五子棋小游戏
下一篇: Python实现发送邮件功能
Python_xP
博客等级 码龄6年 12粉丝 5原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值