百度360必应搜狗淘宝本站头条
当前位置:网站首页 > IT技术 > 正文

打扑克嘛?Python教你“经典纸牌游戏21点”玩法

wptr33 2025-02-27 16:56 17 浏览

导语


?昨天不是周天嘛?


你们在家放松一般都会做什么呢?


周末逛逛街,出去走走看电影......这是你们的周末。


程序员的周末就是在家躺尸唐诗躺尸,偶尔加班加班加班,或者跟着几个朋友在家消遣时间打打麻将,扑克牌玩一下!


??尤其是放长假【ps:也没啥假,长假就是过年】在老家的时候,亲戚尤其多,七大姑八大姨的一年好不容易聚一次,打打麻将跟扑克这是常有的事儿,联络下感情这是最快的方式~

??说起打扑克,我们经常就是玩儿的二百四、炸金花、三个打一个那就是叫啥名字来着,容我想想......


?话说真词穷,我们那都是方言撒,我翻译不过来普通话是叫什么了,我估计240你们也没听懂是啥,23333~


??今天的话小编是带大家做一款21点的扑克游戏!


有大佬可优化一下这个代码,做一个精致豪华的界面就好了~~



正文


游戏规则:21点又名黑杰克,该游戏由2到6个人玩,使用除大小王之外的52张牌,游戏者的目标是使手中的牌的点数之和不超过21点且尽量大。当使用1副牌时,以下每种牌各一张(没有大小王):



(1)初始化玩家数:


def iniGame():
    global playerCount, cards
    while(True):
        try:
            playerCount = int(input('输入玩家数:'))
        except ValueError:
            print('无效输入!')
            continue
        if playerCount < 2:
            print('玩家必须大于1!')
            continue
        else:
            break
    try:
        decks = int(input('输入牌副数:(默认等于玩家数)'))
    except ValueError:
        print('已使用默认值!')
        decks = playerCount
    print('玩家数:', playerCount, ',牌副数:', decks)
    cards = getCards(decks)  # 洗牌

(2)建立了玩家列表,电脑跟玩家对战。


def createPlayerList():
    global playerList
    playerList = []
    for i in range(playerCount):
        playerList += [{'id': '', 'cards': [], 'score': 0}].copy()
        playerList[i]['id'] = '电脑' + str(i+1)
    playerList[playerCount-1]['id'] = '玩家'
    random.shuffle(playerList)  # 为各玩家随机排序

(3)开始会设置2张明牌玩法都可以看到点数。


def gameStart():
    print('为各玩家分2张明牌:')
    for i in range(playerCount):  # 为每个玩家分2张明牌
        deal(playerList[i]['cards'], cards, 2)
        playerList[i]['score'] = getScore(playerList[i]['cards'])  # 计算初始得分
        print(playerList[i]['id'], ' ', getCardName(playerList[i]['cards']),
              ' 得分 ', playerList[i]['score'])
        time.sleep(1.5)


(4)游戏为电脑跟玩家依次分发第三张暗牌,这是别人看不到的。


def gamePlay():
    for i in range(playerCount):
        print('当前', playerList[i]['id'])
        if playerList[i]['id'] == '玩家':  # 玩家
            while(True):
                print('当前手牌:', getCardName(playerList[i]['cards']))
                _isDeal = input('是否要牌?(y/n)')
                if _isDeal == 'y':
                    deal(playerList[i]['cards'], cards)
                    print('新牌:', getCardName(playerList[i]['cards'][-1]))
                    # 重新计算得分:
                    playerList[i]['score'] = getScore(playerList[i]['cards'])
                elif _isDeal == 'n':
                    break
                else:
                    print('请重新输入!')
        else:  # 电脑
            while(True):
                if isDeal(playerList[i]['score']) == 1:  # 为电脑玩家判断是否要牌
                    deal(playerList[i]['cards'], cards)
                    print('要牌。')
                    # 重新计算得分:
                    playerList[i]['score'] = getScore(playerList[i]['cards'])
                else:
                    print('不要了。')
                    break
        time.sleep(1.5)

(5)随机洗牌:


def getCards(decksNum):
    cardsList = ['Aa', 'Ab', 'Ac', 'Ad',
                 'Ka', 'Kb', 'Kc', 'Kd',
                 'Qa', 'Qb', 'Qc', 'Qd',
                 'Ja', 'Jb', 'Jc', 'Jd',
                 '0a', '0b', '0c', '0d',
                 '9a', '9b', '9c', '9d',
                 '8a', '8b', '8c', '8d',
                 '7a', '7b', '7c', '7d',
                 '6a', '6b', '6c', '6d',
                 '5a', '5b', '5c', '5d',
                 '4a', '4b', '4c', '4d',
                 '3a', '3b', '3c', '3d',
                 '2a', '2b', '2c', '2d']
    cardsList *= decksNum       # 牌副数
    random.shuffle(cardsList)   # 随机洗牌
    return cardsList

(6)?设置牌名字典:


cardNameDict = {'Aa': '黑桃A', 'Ab': '红桃A', 'Ac': '梅花A', 'Ad': '方片A',
                'Ka': '黑桃K', 'Kb': '红桃K', 'Kc': '梅花K', 'Kd': '方片K',
                'Qa': '黑桃Q', 'Qb': '红桃Q', 'Qc': '梅花Q', 'Qd': '方片Q',
                'Ja': '黑桃J', 'Jb': '红桃J', 'Jc': '梅花J', 'Jd': '方片J',
                '0a': '黑桃10', '0b': '红桃10', '0c': '梅花10', '0d': '方片10',
                '9a': '黑桃9', '9b': '红桃9', '9c': '梅花9', '9d': '方片9',
                '8a': '黑桃8', '8b': '红桃8', '8c': '梅花8', '8d': '方片8',
                '7a': '黑桃7', '7b': '红桃7', '7c': '梅花7', '7d': '方片7',
                '6a': '黑桃6', '6b': '红桃6', '6c': '梅花6', '6d': '方片6',
                '5a': '黑桃5', '5b': '红桃5', '5c': '梅花5', '5d': '方片5',
                '4a': '黑桃4', '4b': '红桃4', '4c': '梅花4', '4d': '方片4',
                '3a': '黑桃3', '3b': '红桃3', '3c': '梅花3', '3d': '方片3',
                '2a': '黑桃2', '2b': '红桃2', '2c': '梅花2', '2d': '方片2'}

?(7)判断胜负:


def showWinAndLose():
    loserList = []  # [['id', score], ['id', score], ...]
    winnerList = []  # [['id', score], ['id', score], ...]
    winnerCount = 0
    loserCount = 0
    for i in range(playerCount):
        if playerList[i]['score'] > 21:  # 爆牌直接进入败者列表
            loserList.append([playerList[i]['id'],  playerList[i]['score']])
        else:  # 临时胜者列表
            winnerList.append([playerList[i]['id'], playerList[i]['score']])
    if len(winnerList) == 0:  # 极端情况:全部爆牌
        print('全部玩家爆牌:')
        for i in range(len(loserList)):
            print(loserList[i][0], loserList[i][1])
    elif len(loserList) == 0:  # 特殊情况:无人爆牌
        winnerList.sort(key=lambda x: x[1], reverse=True)  # 根据分数值排序胜者列表
        for i in range(len(winnerList)):  # 计算最低分玩家数量
            if i != len(winnerList)-1:
                if winnerList[-i-1][1] == winnerList[-i-2][1]:
                    loserCount = (i+2)
                else:
                    if loserCount == 0:
                        loserCount = 1
                    break
            else:
                loserCount = len(loserList)
        if loserCount == 1:
            loserList.append(winnerList.pop())
        else:
            while(len(loserList) != loserCount):
                loserList.append(winnerList.pop())
        for i in range(len(winnerList)):  # 计算最高分玩家数量
            if i != len(winnerList)-1:
                if winnerList[i][1] == winnerList[i+1][1]:
                    winnerCount = (i+2)
                else:
                    if winnerCount == 0:
                        winnerCount = 1
                    break
            else:
                winnerCount = len(winnerList)
        while(len(winnerList) != winnerCount):
            winnerList.pop()
        print('获胜:')
        for i in range(len(winnerList)):
            print(winnerList[i][0], winnerList[i][1])
        print('失败:')
        for i in range(len(loserList)):
            print(loserList[i][0], loserList[i][1])
    else:  # 一般情况:有人爆牌
        winnerList.sort(key=lambda x: x[1], reverse=True)  # 根据分数值排序胜者列表
        for i in range(len(winnerList)):  # 计算最高分玩家数量
            if i != len(winnerList)-1:
                if winnerList[i][1] == winnerList[i+1][1]:
                    winnerCount = (i+2)
                else:
                    if winnerCount == 0:
                        winnerCount = 1
                    break
            else:
                winnerCount = len(winnerList)
        while(len(winnerList) != winnerCount):
            winnerList.pop()
        print('获胜:')
        for i in range(len(winnerList)):
            print(winnerList[i][0], winnerList[i][1])
        print('失败:')
        for i in range(len(loserList)):
            print(loserList[i][0], loserList[i][1])

?游戏效果:咳咳咳.......感觉这游戏看运气也看胆量!!



?总结?


??哈哈哈!小编玩游戏比较废,你们要来试试嘛?无聊的时候可以摸摸鱼,打打酱油~


制作不易,记得一键三连哦!! 如果需要本文完整的代码+图片素材。


Python新手安装包、免费激活码、等等更多Python资料 【私信小编06】即可免费领取哦!!

相关推荐

MySQL进阶五之自动读写分离mysql-proxy

自动读写分离目前,大量现网用户的业务场景中存在读多写少、业务负载无法预测等情况,在有大量读请求的应用场景下,单个实例可能无法承受读取压力,甚至会对业务产生影响。为了实现读取能力的弹性扩展,分担数据库压...

Postgres vs MySQL_vs2022连接mysql数据库

...

3分钟短文 | Laravel SQL筛选两个日期之间的记录,怎么写?

引言今天说一个细分的需求,在模型中,或者使用laravel提供的EloquentORM功能,构造查询语句时,返回位于两个指定的日期之间的条目。应该怎么写?本文通过几个例子,为大家梳理一下。学习时...

一文由浅入深带你完全掌握MySQL的锁机制原理与应用

本文将跟大家聊聊InnoDB的锁。本文比较长,包括一条SQL是如何加锁的,一些加锁规则、如何分析和解决死锁问题等内容,建议耐心读完,肯定对大家有帮助的。为什么需要加锁呢?...

验证Mysql中联合索引的最左匹配原则

后端面试中一定是必问mysql的,在以往的面试中好几个面试官都反馈我Mysql基础不行,今天来着重复习一下自己的弱点知识。在Mysql调优中索引优化又是非常重要的方法,不管公司的大小只要后端项目中用到...

MySQL索引解析(联合索引/最左前缀/覆盖索引/索引下推)

目录1.索引基础...

你会看 MySQL 的执行计划(EXPLAIN)吗?

SQL执行太慢怎么办?我们通常会使用EXPLAIN命令来查看SQL的执行计划,然后根据执行计划找出问题所在并进行优化。用法简介...

MySQL 从入门到精通(四)之索引结构

索引概述索引(index),是帮助MySQL高效获取数据的数据结构(有序),在数据之外,数据库系统还维护者满足特定查询算法的数据结构,这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构...

mysql总结——面试中最常问到的知识点

mysql作为开源数据库中的榜一大哥,一直是面试官们考察的重中之重。今天,我们来总结一下mysql的知识点,供大家复习参照,看完这些知识点,再加上一些边角细节,基本上能够应付大多mysql相关面试了(...

mysql总结——面试中最常问到的知识点(2)

首先我们回顾一下上篇内容,主要复习了索引,事务,锁,以及SQL优化的工具。本篇文章接着写后面的内容。性能优化索引优化,SQL中索引的相关优化主要有以下几个方面:最好是全匹配。如果是联合索引的话,遵循最...

MySQL基础全知全解!超详细无废话!轻松上手~

本期内容提醒:全篇2300+字,篇幅较长,可搭配饭菜一同“食”用,全篇无废话(除了这句),干货满满,可收藏供后期反复观看。注:MySQL中语法不区分大小写,本篇中...

深入剖析 MySQL 中的锁机制原理_mysql 锁详解

在互联网软件开发领域,MySQL作为一款广泛应用的关系型数据库管理系统,其锁机制在保障数据一致性和实现并发控制方面扮演着举足轻重的角色。对于互联网软件开发人员而言,深入理解MySQL的锁机制原理...

Java 与 MySQL 性能优化:MySQL分区表设计与性能优化全解析

引言在数据库管理领域,随着数据量的不断增长,如何高效地管理和操作数据成为了一个关键问题。MySQL分区表作为一种有效的数据管理技术,能够将大型表划分为多个更小、更易管理的分区,从而提升数据库的性能和可...

MySQL基础篇:DQL数据查询操作_mysql 查

一、基础查询DQL基础查询语法SELECT字段列表FROM表名列表WHERE条件列表GROUPBY分组字段列表HAVING分组后条件列表ORDERBY排序字段列表LIMIT...

MySql:索引的基本使用_mysql索引的使用和原理

一、索引基础概念1.什么是索引?索引是数据库表的特殊数据结构(通常是B+树),用于...