python实现21点小游戏

2021-05-25 0 332

用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

python实现21点小游戏

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

遇见资源网 Python python实现21点小游戏 http://www.ox520.com/28662.html

常见问题

相关文章

发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务