效果如下:

代码如下:

import random
import timedef main():while (True):iniGame()createPlayerList()gameStart()gamePlay()showResult()showWinAndLose()startNewGame = input('开始新游戏?(y)')if startNewGame != 'y':break# 初始化玩家参数
def iniGame():global playerCount, cardswhile (True):try:playerCount = int(input('输入玩家数:'))except ValueError:print('无效输入!')continueif playerCount < 2:print('玩家必须大于1!')continueelse:breaktry:decks = int(input('输入牌副数:(默认等于玩家数)'))except ValueError:print('已使用默认值!')decks = playerCountprint('玩家数:', playerCount, ',牌副数:', decks)cards = getCards(decks)  # 洗牌# 建立玩家列表
def createPlayerList():global playerListplayerList = []for i in range(playerCount):playerList += [{'id': '', 'cards': [], 'score': 0}].copy()playerList[i]['id'] = '电脑' + str(i + 1)playerList[playerCount - 1]['id'] = '玩家'random.shuffle(playerList)  # 为各玩家随机排序# 分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)# 按顺序询问玩家是否要牌
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':breakelse: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('不要了。')breaktime.sleep(1.5)# 展示最终得分、手牌情况
def showResult():print('最终得分:')for i in range(playerCount):print(playerList[i]['id'], playerList[i]['score'],getCardName(playerList[i]['cards']))# 胜负情况判定
def showWinAndLose():loserList = []  # [['id', score], ['id', score], ...]winnerList = []  # [['id', score], ['id', score], ...]winnerCount = 0loserCount = 0for 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 = 1breakelse: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 = 1breakelse: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 = 1breakelse: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])# 获取洗好的牌
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# 要牌概率
probDict = {12: 0.92, 13: 0.87, 14: 0.74, 15: 0.5,16: 0.205, 17: 0.1294, 18: 0.07580895, 19: 0.033117337}
# 牌名字典
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'}# 判断是否要牌
def isDeal(currentScore):if currentScore > 11:if currentScore > 19:return 0  # 点数大于19点或已爆牌必定不要牌prob = probDict[currentScore]  # 获取要牌概率if prob > random.uniform(0, 1):  # 使用投骰子的方式根据概率判断return 1else:return 0else:return 1  # 点数不大于11必定要牌# 当前得分
def getScore(cardsList):scoreNum = 0for i in range(len(cardsList)):if cardsList[i][0] == 'A':scoreNum += 1elif (cardsList[i][0] == '0' or cardsList[i][0] == 'K' orcardsList[i][0] == 'Q' or cardsList[i][0] == 'J'):scoreNum += 10else:scoreNum += int(cardsList[i][0])return scoreNum# 分牌函数
def deal(playerCardsList, cardsList, num=1):for i in range(num):playerCardsList.append(cardsList.pop(0))# 打印卡牌名字
def getCardName(playerCardsList):nameStr = ''if isinstance(playerCardsList, str) != 1:for i in range(len(playerCardsList)):nameStr += cardNameDict[playerCardsList[i]]if i != len(playerCardsList):nameStr += ' 'else:nameStr = cardNameDict[playerCardsList]return nameStrmain()

python小玩意——纸牌21点游戏相关推荐

  1. 用python编21点游戏_【Python3】21点游戏

    刚开始学python,试着写了一个21点游戏. 游戏过程就是,一开始给你和庄家(就是电脑啦)各发两张牌,但庄家有一张是暗牌.接下来你可以选择是要牌(hit me)还是停止发牌直接开(stand),要牌 ...

  2. 21点游戏的python实现

    21点游戏的python实现 import random import sys import timeclass Card:"""定义扑克牌类.每个对象代表一张扑克牌.& ...

  3. Python 实现简单的单机版 21 点游戏

    Python 实现简单的单机版 21 点游戏 1. 21 点游戏规则简介 2. 实现代码 3. 运行效果 4. 总结 1. 21 点游戏规则简介 21 点游戏规则: 点数计算:每张牌都有点数.2 到 ...

  4. Python|随机函数——纸牌游戏的发牌机制

    本文首发于微信公众号:"算法与编程之美",欢迎关注,及时了解更多此系列文章. 问题描述 在手机日益重要的当今社会,有很多人都在使用手机上的小程序在玩着各类纸牌游戏.那么今天,我讲述 ...

  5. 【python教程入门学习】Python扑克牌21点游戏实例代码

    大家好,本篇文章主要讲的是Python扑克牌21点游戏实例代码,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下,方便下次浏览 废话还是说太多了 直接上代码 | `import` `random ...

  6. python完成‘21点游戏’

    完成'21点游戏' 人机对战: 输入玩家姓名: 玩家可以多次要牌,其中JQK,大小王是半点,其他是正常点数,玩家每要一次牌就打印下当前点数和系统点数. 可以设置系统:只要大于等于21点就不要牌了,系统 ...

  7. 21点游戏简单开发(Python)

    程序功能 实现21点游戏 游戏规则 1.玩家共两个角色:电脑和人类,电脑是庄家 2.游戏开始时,先给人类和电脑每个玩家分别发两张牌作为底牌,庄家底牌只漏一张 3.判断双方底牌是否直接为21点,如果其中 ...

  8. c++编写手机小游戏代码_只需22行代码,用python编写自己的小游戏

    假期最后一天,有些人在外面玩累了,有些人躺在家里快发霉了,闲暇时候不如动动手做个小游戏玩一玩吧! 本文实例为大家分享了python编写猜数字小游戏的具体代码,供大家参考,具体内容如下 1 import ...

  9. Sutton 强化学习, 21 点游戏的策略蒙特卡洛值预测

    作者 | MyEncyclopedia 来源 | MyEncyclopedia(ID:MyEncyclopedia) 头图 |  CSDN 下载自东方IC 从这期开始我们进入 Sutton 强化学习第 ...

最新文章

  1. 错误记录(part1)--Error loading server extension jupyter_nbextensions_configurator
  2. 脑部手术成功,只是万里长征走完了第一步
  3. Android 网络通信架构学习
  4. java快速获取大图片的分辨率(大图片格式JPG,tiff ,eg)
  5. [转载] Java泛型详解:<T>和Class<T>的使用。泛型类,泛型方法的详细使用实例
  6. 深入理解SpringBoot(1)
  7. 计算机技能大赛初赛主持稿,职业技能大赛开幕式主持词
  8. zepto源码--filtered, contains,funcArg,setAttribute,className,deserializeVale--学习笔记
  9. 蓝桥杯2017年第八届C/C++省赛C组第七题-Excel地址
  10. 简要html漂浮广告代码,JS漂浮广告代码
  11. 把抽奖活动写成一篇技术博客是怎样一种体验
  12. Cinnamon 任务栏网速绘制内存和CPU使用率竖线
  13. 第二次作业 时事点评
  14. Qt是什么?有哪些优势用于图形界面开发
  15. Unity 特效:Particle System(粒子系统)
  16. LayUi——OA项目 03(会议排座送审)
  17. [转]gcc -ffunction-sections -fdata-sections -Wl,–gc-sections 参数详解
  18. 为网站配置免费的HTTPS证书 2-4
  19. 利用PHP编程生成蜘蛛访问记录txt文档
  20. 太离谱了!一行Python代码写的游戏,我能这样玩一天!

热门文章

  1. Modbus 通信协议详解
  2. 动态代理——CGLIB动态代理原理示例解析
  3. linux那些事之contiguous memory allocator(CMA)
  4. [Web]如何利用Boostrap框架搭建一个还可以的静态网站(五_子页_脱发指南)
  5. Access学习参考
  6. 如何把多张图片做成gif动图?
  7. MIPCMS模板开发之404页面
  8. 一个好的感人故事(爱)
  9. 《杜月笙发迹秘史》书摘
  10. 新益技术推出整车天线测试方案 助推行业发展