用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
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程网。