python实现21点小游戏
作者:清风er 发布时间:2023-11-21 08:58:27
标签:python,21点游戏
用python实现21点小游戏,供大家参考,具体内容如下
from random import shuffle
import random
import numpy as np
from sys import exit
# 初始化扑克牌
playing_cards = {
"黑桃A": 1, "黑桃2": 2, "黑桃3": 3, "黑桃4": 4, "黑桃5": 5, "黑桃6": 6, "黑桃7": 7, "黑桃8": 8, "黑桃9": 9, "黑桃10": 10,
"黑桃J": 10, "黑桃Q": 10, "黑桃K": 10,
"红桃A": 1, "红桃2": 2, "红桃3": 3, "红桃4": 4, "红桃5": 5, "红桃6": 6, "红桃7": 7, "红桃8": 8, "红桃9": 9, "红桃10": 10,
"红桃J": 10, "红桃Q": 10, "红桃K": 10,
"梅花A": 1, "梅花2": 2, "梅花3": 3, "梅花4": 4, "梅花5": 5, "梅花6": 6, "梅花7": 7, "梅花8": 8, "梅花9": 9, "梅花10": 10,
"梅花J": 10, "梅花Q": 10, "梅花K": 10,
"方块A": 1, "方块2": 2, "方块3": 3, "方块4": 4, "方块5": 5, "方块6": 6, "方块7": 7, "方块8": 8, "方块9": 9, "方块10": 10,
"方块J": 10, "方块Q": 10, "方块K": 10
}
# 扑克牌面
poker_name = list(playing_cards.keys())
# 扑克牌的数量
poker_count = 1
poker_list = poker_count*poker_name
# 用于判断手中的牌是否有A,再根据牌面判断A是否取值1还是11
four_a = {'黑桃A', '红桃A', '梅花A', '方块A'}
# 计分器
total_score = np.array([0, 0])
# 记录回合数
game_round = 1
def random_cards(poker_name_list):
"""
定义洗牌函数:重新对牌进行随机排列
"""
shuffle(poker_name_list)
def score_count(hand_poker):
"""
计算手中牌的分数
:param hand_poker:一个含有牌名的列表
:return: 手中牌 的分数poker_score
"""
# 声明一个变量,记录牌的总分数
poker_score = 0
# 标记:判断是否有A的标记,默认没有
have_a = False
# 计算手中牌的分数
for k in hand_poker:
poker_score += playing_cards[k]
# 判断手中的牌是否含有A,再根据A的规则进行分数的计算
for i in hand_poker:
if i in four_a:
have_a = True
break
else:
continue
if have_a:
if poker_score + 10 <= 21:
poker_score = poker_score + 10
return poker_score
def who_win(your_score, pc_score):
"""
判断游戏的胜负
:param your_score: 玩家分数
:param pc_score: 电脑分数
:return: 胜负的数组
"""
if your_score > 21 and pc_score > 21:
print('平局')
return np.array([0, 0])
elif your_score > 21 and pc_score <= 21:
print('对不起,玩家输了')
return np.array([0, 1])
elif your_score <= 21 and pc_score > 21:
print('恭喜!!玩家胜利了')
return np.array([1, 0])
elif your_score <= 21 and pc_score <= 21:
if your_score > pc_score:
print('恭喜!!玩家胜利了')
return np.array([1, 0])
elif your_score < pc_score:
print('对不起,玩家输了')
return np.array([0, 1])
else:
print('平局!!')
return np.array([0, 0])
def if_get_next_poker():
"""
是否继续要牌
"""
if_continue = input("是否继续要下一张牌?(Y/N)>>>>:")
if if_continue.upper() == "Y":
return get_one_poker()
elif if_continue.upper() == "N":
print('玩家停止叫牌')
return False
else:
print("输入有误,请重新输入")
return if_get_next_poker()
def get_one_poker():
"""
发牌函数:随机将poker_list里的牌取出一张
:return:
"""
return poker_list.pop(random.randint(0, len(poker_list)-1))
def continue_or_quit():
"""
一轮游戏结束后,询问玩家是否进行下一轮
"""
if_next_round = input("是否进行下一轮游戏(Y/N)>>>>:")
if if_next_round.upper() == 'Y':
# 判断扑克牌是否玩的了下一轮
if len(poker_list) <= 15:
print('对不起,剩余牌数不足,无法进行下一轮,游戏结束。')
exit(1)
else:
return True
elif if_next_round.upper() == "N":
print("玩家不玩了。游戏结束!!")
exit(1)
else:
print("输入有误,请重新输入")
return continue_or_quit()
def start_game_init_two_poker(poker_database):
"""
初始化游戏,给玩家和电脑随机发两张牌
:param poker_database: 牌堆
:return: 玩家和电脑的初始牌面列表
"""
return [poker_database.pop(random.randint(0, len(poker_list)-1)),
poker_database.pop(random.randint(0, len(poker_list)-1))]
def every_round(porker_list):
"""
每一轮游戏的流程
:param porker_list:牌堆
:return:游戏的获胜者
"""
# 声明一个变量,代表玩家手里的牌
your_hand_poker = []
# 声明一变量,代表电脑手里的牌
pc_hand_poker = []
# 游戏开始,先从牌堆中取两张牌
you_init_poker = start_game_init_two_poker(porker_list)
pc_init_poker = start_game_init_two_poker(porker_list)
# 展示玩家获得的扑克
print(f"玩家所获得的牌是:{you_init_poker[0]}和{you_init_poker[1]}")
print(f"电脑所获得的第一张牌是:{pc_init_poker[0]}")
# 玩家和电脑得到所发的两张扑克牌
your_hand_poker.extend(you_init_poker)
pc_hand_poker.extend(pc_init_poker)
# 计算初始扑克的分数
your_score = score_count(your_hand_poker)
pc_score = score_count(pc_hand_poker)
# 根据初始牌面分数,判断是否能有21点,如果有直接使用判断输赢函数
if your_score == 21 or pc_score == 21:
print("初始牌中有21点了。")
return who_win(your_score, pc_score)
# 如果没有,根据自己手中的牌,判断是否要牌。
else:
while True:
get_new_poker = if_get_next_poker()
# 玩家要牌
if get_new_poker != False:
# 将新牌拿到手里并重新计算手里的牌的分数
your_hand_poker.append(get_new_poker)
print(f"玩家手里的牌是{your_hand_poker}")
your_score = score_count(your_hand_poker)
if your_score > 21:
print("玩家的牌已经超过21点")
print(f"电脑手里的牌是{pc_hand_poker}")
return who_win(your_score, pc_score)
else:
continue
# 玩家停止要牌,则电脑开始要牌
elif get_new_poker == False:
# 电脑要牌规则一:只要比玩家分数就要牌
# while pc_score < your_score:
# pc_new_poker = get_one_poker()
# pc_hand_poker.append(pc_new_poker)
# # 重新计算电脑手中的牌的分数
# pc_score = score_count(pc_hand_poker)
# 电脑要牌规则二:当电脑的手中牌的分数落在区间[1:18]时,就一直要牌
while pc_score in range(1, 19):
pc_new_poker = get_one_poker()
pc_hand_poker.append(pc_new_poker)
# 重新计算电脑的分数
pc_score = score_count(pc_hand_poker)
print(f"电脑手里的牌为{pc_hand_poker}")
return who_win(your_score, pc_score)
else:
continue
"""
游戏调用主程序
"""
while True:
print("游戏即将开始,祝你好运!!!")
input("按下【enter】开始游戏>>>")
print(f"现在是第{game_round}轮游戏")
# 洗牌
random_cards(poker_list)
# 游戏开始
score = every_round(poker_list)
# 计算总分
total_score = np.add(total_score, score)
print(f'此轮游戏结束,目前比分:{total_score[0]}:{total_score[1]}')
game_round += 1
continue_or_quit()
running result
来源:https://blog.csdn.net/qq_43727105/article/details/116099339


猜你喜欢
- 文件打开方式当我们用open()函数去打开文件的时候,有好几种打开的模式。'r'->只读'w'->
- 第一个坑:'geckodriver' executable needs to be in PATH1.如果启动浏览器过程中报
- networkx是Python的一个包,用于构建和操作复杂的图结构,提供分析图的算法。图是由顶点、边和可选的属性构成的数据结构,顶点表示数据
- 本文实例分析了Python字符串格式化输出方法。分享给大家供大家参考,具体如下:我们格式化构建字符串可以有3种方法:1 元组占位符m = &
- 1. 带默认值的参数在了解带星号(*)的参数之前,先看下带有默认值的参数,函数定义如下:>> def defaultValueA
- 在程序运行的过程中,所有的变量都是在内存中,比如,定义一个dict:d = dict(name='Bob', age=20,
- 我就废话不多说了,大家还是直接看代码吧~import tensorflow as tfh_doc=tf.placeholder(tf.int
- 本文实例讲述了Python编程之变量赋值操作。分享给大家供大家参考,具体如下:#coding=utf8''''
- 一、算法简要我们希望有这么一种函数:接受输入然后预测出类别,这样用于分类。这里,用到了数学中的sigmoid函数,sigmoid函数的具体表
- 1.当前时间戳转换为指定格式的日期# -*- coding: utf-8 -*-# @Time : 2019/5/31 10:5
- 如下所示:var myarr=new Array(); //先声明一维 for(var i=0;i<2;i++){ //一
- 如果要用某个开源框架,需要安装多个依赖包可以如下操作:如依赖文件形式如下(可以不要版本号):txt文件名为requirements.txt,
- 在项目中时间一律显示为2014-10-20 10:22显得很呆板。在微博、QQ空间等网站通常会显示为几秒前,几分钟前,几小时前等容易阅读的时
- #_*_coding:utf_8_import sysimport osclass Graph(): d
- 楔子我们用 MySQL 客户端查询数据的时候,是以下面这种格式显示的:内容展示的非常漂亮,而 Python 有一个第三方模块叫 pretty
- 当我们使用一个数据库时,总希望数据库的内容是可靠的、正确的,但由于计算机系统的故障(包括机器故障、介质故障、误操作等),数据库有时也可能遭到
- 选项default-charaset-set=utf8;然后创建一个数据表 create table a_table(b varchar(2
- canny边缘检测原理canny边缘检测共有5部分组成,下边我会分别来介绍。1 高斯模糊(略)2 计算梯度幅值和方向。可选用的模板:sobl
- 本文为大家分享了mysql 5.7.17 winx64解压版安装配置方法,供大家参考,具体内容如下一、下载下载地址二、配置1. 解压下载的m
- 如果没有了解栅格系统是什么,建议看完这篇文章以后再回来。其实有很种 CSS 写法实现栅格系统,很多 CSS 库也都会提供类似的栅格系统实现(