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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • 用Python写一个简易版弹球游戏

    我们前面讲了几篇关于类的知识点,为了让大家更好的掌握类的概念,并灵活的运用这些知识,我写了一个有趣又好玩的弹球的游戏,一来可以把类的知识融会一下,二来加深对Python的兴趣.你会发现哎呀Python写小游戏还是蛮方便的,蛮有意思的~~ 先看一下我们的最终效果图 我们分9步来讲解如何写这个小游戏 1.创建游戏的主界面 我们用Python的内置模块Tkinter来完成了,它是Python的标准GUI工具包,可以非常方便在制作GUI小工具,因为是跨平台的,可以方便的在win和linux下运行,我们用

  • 详解Python 实现元胞自动机中的生命游戏(Game of life)

    简介 细胞自动机(又称元胞自动机),名字虽然很深奥,但是它的行为却是非常美妙的.所有这些怎样实现的呢?我们可以把计算机中的宇宙想象成是一堆方格子构成的封闭空间,尺寸为N的空间就有NN个格子.而每一个格子都可以看成是一个生命体,每个生命都有生和死两种状态,如果该格子生就显示蓝色,死则显示白色.每一个格子旁边都有邻居格子存在,如果我们把33的9个格子构成的正方形看成一个基本单位的话,那么这个正方形中心的格子的邻居就是它旁边的8个格子. 每个格子的生死遵循下面的原则: 1. 如果一个细胞周围有3个细胞

  • python实现简单反弹球游戏

    python简单游戏-反弹球,供大家参考,具体内容如下 tkinter实现,直接贴上代码 from tkinter import* import time import random class Ball: def __init__(self,canvas,paddle,color): self.canvas = canvas self.paddle = paddle self.id = canvas.create_oval(10,10,25,25,fill=color) self.canvas

  • Python生命游戏实现原理及过程解析(附源代码)

    1. 生命游戏是什么 生命游戏是英国数学家约翰·何顿·康威在1970年发明的细胞自动机.它包括一个二维矩形世界,这个世界中的每个方格居住着一个活着的或死了的细胞.一个细胞在下一个时刻生死取决于相邻八个方格中活着的或死了的细胞的数量.如果相邻方格活着的细胞数量过多,这个细胞会因为资源匮乏而在下一个时刻死去:相反,如果周围活细胞过少,这个细胞会因太孤单而死去. 规则看起来很简单,但却能演绎出无穷无尽的内容. 滑翔者:每4个回合"它"会向右下角走一格.虽然细胞早就是不同的细胞了,但它能保持原

  • python实现生命游戏的示例代码(Game of Life)

    生命游戏的算法就不多解释了,百度一下介绍随处可见. 因为网上大多数版本都是基于pygame,matlab等外部库实现的,二维数组大多是用numpy,使用起来学习成本比较高,所以闲暇之余写一个不用外部依赖库,console输出的版本. # -*- coding: utf-8 -*- from time import sleep from copy import deepcopy WORLD_HIGH = 20 #世界长度 WORLD_WIDE = 40 #世界宽度 ALIVE_CON = 3 #复

  • Python实战之实现康威生命游戏

    前言 康威生命游戏设计并不难,我的思路就是借助pygame进行外观的展示,最近一段时间的游戏项目都是使用pygame进行的,做起来比较顺利.内部代码的实现也比较简单根据他的规则我们需要的是多次的计算和判断,再刷新数组. 一.康威生命游戏规则 当周围仅有1个或没有存活细胞时, 原来的存活细胞进入死亡状态.(模拟生命数量稀少)当周围有2个或3个存活细胞时, 网格保持原样.当周围有4个及以上存活细胞时,原来的存活细胞亦进入死亡状态.(模拟生命数量过多)当周围有3个存活细胞时,空白网格变成存活细胞.(模

  • python实战之90行代码写个猜数字游戏

    一.导入库 import random import time 二.注册用户 我们用变量与input实现 name = str(input('请输入用户名:')) print('欢迎您,'+name) 三.注册年龄 这里我们得用except制作乱输文本就游戏结束的程序 乱输文本就结束 try: age = int(input('请输入年龄:')) except ValueError: print('非法输入') age = 30000 顺便把年龄设为30000[滑稽] 再根据年龄大小分配金币 四

  • 教你用Python写一个植物大战僵尸小游戏

    一.前言 上次写了一个俄罗斯方块,感觉好像大家都看懂了,这次就更新一个植物大战僵尸吧 二.引入模块 import pygame import random 三.完整代码 配置图片地址 IMAGE_PATH = 'imgs/' 设置页面宽高 scrrr_width = 800 scrrr_height = 560 创建控制游戏结束的状态 GAMEOVER = False 图片加载报错处理 LOG = '文件:{}中的方法:{}出错'.format(__file__, __name__) 创建地图类

  • 教你如何用python开发一款数字推盘小游戏

    今年年初,新一季的<最强大脑>开播了,第一集选拔的时候大家做了一个数字游戏,名叫<数字华容道>,当时何猷君以二十几秒的成绩夺得该项目的冠军,看了这个游戏之后我决定要写一个<数字华容道>的程序,过去了半年,我终于记起了这件事,今天就来实现. 数字推盘游戏(n-puzzle)是一种智力游戏,常见的类型有十五数字推盘游戏和八数字推盘游戏等.十五数字推盘游戏的板上会有十五个方块和一个大小相当于一个方块的空位(供方块移动之用),当15个数字依次排序并且最后一个格子为空位即代表挑战

  • 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

  • Python实现21点小游戏的示例代码

    目录 游戏玩法 代码 - v1 测试 代码 - v2 测试 游戏玩法 游戏玩法: 该游戏由 2 到 6 个人玩,使用除大小王之外的 52 张牌, 游戏者的目标是使手中的牌的点数之和不超过 21 点且尽量大. 有着悠久的历史.黑杰克简称为21点,1700年左右法国赌场就有这种21点的纸牌游戏. 1931年,当美国内华达州宣布赌博为合法活动时,21点游戏第一次公开出现在内华达州的赌场俱乐部, 15年内,它取代掷骰子游戏,而一举成为非常流行的赌场庄家参与的赌博游戏. 代码 - v1 import ra

  • 用Python设计一个经典小游戏

    本文主要介绍如何用Python设计一个经典小游戏:猜大小. 在这个游戏中,将用到前面我介绍过的所有内容:变量的使用.参数传递.函数设计.条件控制和循环等,做个整体的总结和复习. 游戏规则: 初始本金是1000元,默认赔率是1倍,赢了,获得一倍金额,输了,扣除1倍金额. 玩家选择下注,押大或押小: 输入下注金额: 摇3个骰子,11≤骰子总数≤18为大,3≤骰子总数≤10为小: 如果赢了,获得1倍金额,输了,扣除1倍金额,本金为0时,游戏结束. 程序运行结果是这样的: 现在,我们来梳理下思路. 我们

  • Python实现的弹球小游戏示例

    本文实例讲述了Python实现的弹球小游戏.分享给大家供大家参考,具体如下: 弹球 1. Ball 类 draw负责移动Ball 碰撞检测,反弹,Ball检测Paddle 2.Paddle类 draw负责移动Paddle 碰撞检测,确定能不能继续 监听键盘事件 3.主循环 绘制Ball和Paddle update sleep 代码 from Tkinter import * import random import time class Ball: def __init__(self, canv

  • Python实现Pig Latin小游戏实例代码

    前言: 本文研究的主要是Python实现pig Latin小游戏的简单代码,具体介绍如下. Pig Latin是一个语言游戏. 步骤: 1.让用户输入一个英文单词 2.确保用户输入一个有效单词 3.将单词转换成Pig Latin 4.显示转换结果 一.Input 函数:raw_input()用于输出一个字符串并等待键盘输入某字符串,最后以Enter(或Return)结束输入 original = raw_input("Enter a word:") print original 上述中

  • python编写猜数字小游戏

    本文实例为大家分享了python编写猜数字小游戏的具体代码,供大家参考,具体内容如下 import random secret = random.randint(1, 30) guess = 0 tries = 0 print("我叫丁丁,我有一个秘密数字!") print("数字从1到30,你只有6次机会!") while int(guess) != secret and tries < 6: print("你猜的数字是?") guess

  • python实现吃苹果小游戏

    本文实例为大家分享了python实现吃苹果小游戏的具体代码,供大家参考,具体内容如下 1.公共类模块 import pygame from pygame.rect import Rect def print_text(font, x, y, text, color=(255, 255, 255)): imgText=font.render(text, True, color) screen=pygame.display.get_surface() screen.blit(imgText,(x,

  • python实现移动木板小游戏

    本文实例为大家分享了python实现移动木板小游戏的具体代码,供大家参考,具体内容如下 一.游戏简介 本游戏是通过python编写的小游戏,给初学者熟悉python编程语言抛砖引玉,希望有所帮助. 成型的效果图如下: 二.编写步骤 1.引入库 代码如下: ###### AUTHOR:破茧狂龙 ###### ###### DATE:20201002 ###### ###### DESCRIPTION:移动的木板 ###### import pygame from pygame.locals imp

  • python代码实现猜拳小游戏

    本文实例为大家分享了python代码实现猜拳小游戏的具体代码,供大家参考,具体内容如下 游戏实现具体功能 原有的用户登录的信息均能保存在txt文件里,注册的信息也能保存在txt里面 格式如下: 便于之后转换成列表字典形式添加注册数据 用户的猜拳记录也能保存在txt中并以如下格式显示 格式如下: 具体Python代码: #-*- coding=utf8 -*- # @author:sololi # date: 2020/10/24 # 文件说明 : # 123文件存放 用户信息 456 文件存放猜

  • Python约瑟夫生者死者小游戏实例讲解

    问题描述: 30 个人在一条船上,超载,需要 15 人下船.于是人们排成一队,排队的位置即为他们的编号. 报数,从 1 开始,数到 9 的人下船.如此循环,直到船上仅剩 15 人为止,问都有哪些编号的人下船了呢? 解决思路: 给30个人编号1-30,每个人的初值都是1(在船上),i代表他们的编号,j代表被扔下船的人数(j=15时循环结束),用check记数,check=9时将对应编号i的人置0(扔下船)并让check重新记数. 当i等于31时,手动将i置为1 当对应编号i的人值为0时,代表此人已

随机推荐