课设遇到这题不要慌 参考参考下面代码 瞬间通畅
import random
import sys
# 牌面列表
card_code = ['A', '2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K']
# 花色列表
card_symbol = ['♦', '♣', '♥', '♠']
# 游戏初始化
def game_init():
# 庄家手牌
bookmaker = []
# 玩家手牌
player = []
# 生成元素1~52的列表 (去掉大小鬼的扑克牌[52张])
poker = list(range(1, 53))
# 用random的shuffle函数对列表打乱顺序 (洗牌)
random.shuffle(poker)
# 返回 庄家手牌 玩家手牌 乱序52张扑克
return bookmaker, player, poker
# 打印玩家点数
def print_point(card_group):
for card in card_group:
"""
核心代码
由于牌面的数字是从1到52 所以牌面要先减1再求余才是牌面列表真正的下标
若玩家抽到牌为15 即牌面为15 - 13 = 2 且按花色顺序为♣ 即2♣
牌面 15 - 1 = 14 再 14 % 13 = 1 这个就是对应牌面列表的第二位元素 即2
花色 15 - 1 = 14 再 14 / 13 = 1 对应花色列表第二位元素 即♣
"""
# 获取牌面和花色下标
code_index = int((card - 1) % 13)
symbol_index = int((card - 1) / 13)
# 打印玩家牌信息
print(card_code[code_index] + card_symbol[symbol_index], end="\t")
print()
# 获取点数 参数:玩家的手牌
def get_point(card_group):
# 初始化
current_player = 0
# 遍历手牌
for card in card_group:
# 得到点数
current_player += int((card - 1) % 13 + 1)
# 返回玩家点数
return current_player
# 玩游戏
def game():
# 记录回合数
game_round = 1
# 记录总比分
score = [0, 0]
# 死循环 游戏一直执行
while True:
# 打印当前回合数
print("第"+str(game_round)+"轮比赛开始")
# 初始化游戏 得到庄家空列表 玩家空列表 扑克52张
bookmaker, player, poker = game_init()
# 开始发牌 给庄家和玩家各发两张牌
for i in range(2):
bookmaker.append(poker.pop())
player.append(poker.pop())
# 打印玩家和庄家当前手上的牌
print("玩家手中的牌是", end="")
print_point(player)
print("庄家手中的牌是", end="")
print_point(bookmaker)
# 玩家要牌的标记
player_isWant = True
# 如果玩家还要牌 且 牌堆里还有牌
while player_isWant and len(poker) > 0:
# 询问玩家是否要牌
print("是否继续要牌:(Y/N)", end="")
player_input = str(input())[0]
# 若玩家输入字符为 'y' 或 'Y'
if player_input == 'y' or player_input == "Y":
# 为玩家发牌
player.append(poker.pop())
# 打印玩家手上的牌
print("玩家手中的牌是", end="")
print_point(player)
else:
# 标记玩家不要牌 退出循环
player_isWant = False
# 打印庄家手中的牌
print("庄家手中的牌是", end="")
print_point(bookmaker)
# 如果庄家点数小于17 持续为庄家发牌
while get_point(bookmaker) < 17:
# 为庄家发牌
get_card = poker.pop()
# 获取牌面和花色下标
code_index = int((get_card - 1) % 13)
symbol_index = int((get_card - 1) / 13)
# 打印庄家获得的牌
print("庄家得到一张"+card_code[code_index] + card_symbol[symbol_index], end="\t")
bookmaker.append(get_card)
# 打印庄家手中的牌
print("庄家手中的牌是", end="")
print_point(bookmaker)
# 玩家点数
play_point = get_point(player)
# 庄家点数
bookmaker_point = get_point(bookmaker)
# 打印玩家点数和庄家点数
print("玩家点数为"+str(play_point)+","+"庄家点数为"+str(bookmaker_point)+",", end="")
"""
判断胜负
玩家胜的3种情况
1. 庄家点数大于21且玩家点数小于等于21
2. 玩家和庄家点数小于等于21 且玩家点数大于庄家点数
3. 玩家和庄家点数大于21 且玩家点数小于庄家点数
庄家胜的3种情况
1. 玩家点数大于21且庄家点数小于等于21
2. 玩家和庄家点数小于等于21 且庄家点数大于玩家点数
3. 玩家和庄家点数大于21 且庄家点数小于玩家点数
剩余情况 平局 玩家和庄家点数相同
"""
if (bookmaker_point > 21 and play_point <= 21) or \
(21 >= bookmaker_point and 21 >= play_point > bookmaker_point) or \
(21 < bookmaker_point and 21 < play_point < bookmaker_point):
# 玩家总分+1 打印结果
score[0] += 1
print("玩家赢了!")
elif (play_point > 21 and bookmaker_point <= 21) or \
(21 >= play_point and 21 >= bookmaker_point > play_point) or \
(21 < play_point and 21 < bookmaker_point < play_point):
# 庄家总分+1 打印结果
score[1] += 1
print("庄家赢了!")
else:
# 平局不加分 打印结果
print("平局!")
# 分隔
print("-"*30)
# 询问是否进行下一轮游戏
print("是否进行下一轮:(Y/N)", end="")
is_play_point = str(input())[0]
# 如果输入为 'N' 或 'n' 打印结果 停止程序
if is_play_point == "N" or is_play_point == "n":
# 打印总比分
print("玩家和庄家总比分为"+str(score[0])+":"+str(score[1]))
# 三目运算符嵌套 平局(true) 如果比分相同 (false)[玩家胜(true) 如果玩家比分大于庄家比分 庄家胜(false)]
print("平局") if score[0] == score[1] else (print("玩家胜出!") if score[0] > score[1] else print("庄家胜出!"))
print("游戏结束")
# 停止程序
sys.exit()
# 回合数+1
game_round += 1
# 程序主入口
if __name__ == '__main__':
# 玩游戏
game()
运行结果