下面我将为您提供一个完整的扑克牌发牌器的Python实现,包含图形界面和基本功能。
python
import random
import tkinter as tk
from tkinter import messagebox
from PIL import Image, ImageTk
import os
class PokerDealer:
aler:
def __init__(self):
aapoker下载地址self.suits = ['Hearts', 'Diamonds', 'Clubs', 'Spades'] # 红心、方块、梅花、黑桃
self.values = ['2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K', 'A']
self.deck = []
self.player_hands = {}
self.card_images = {}
# 初始化主窗口
self.root = tk.Tk
self.root.title("扑克牌发牌器")
self.root.geometry("800x600")
self.root.resizable(True, True)
# 加载卡牌图片 (如果有图片文件)
self.load_card_images
# 创建GUI组件
self.create_widgets
def load_card_images(self):
加载卡牌图片
try:
# 尝试从当前目录下的cards文件夹加载图片
for suit in self.suits:
for value in self.values:
filename = f"cards/{value}_of_{suit.lower}.png
if os.path.exists(filename):
image = Image.open(filename)
image = image.resize((80, 120), Image.LANCZOS)
self.card_images[f"{value}_{suit}"] = ImageTk.PhotoImage(image)
except Exception as e:
print(f"无法加载卡牌图片: {e}")
def create_widgets(self):
创建界面组件
# 顶部控制区域
control_frame = tk.Frame(self.root, pady=10)
control_frame.pack(fill=tk.X)
tk.Label(control_frame, text="玩家数量:", font=("Arial", 12)).grid(row=0, column=0, padx=5)
self.player_count_var = tk.StringVar(value="4")
player_count_entry = tk.Entry(control_frame, textvariable=self.player_count_var, width=5, font=("Arial", 12))
player_count_entry.grid(row=0, column=1, padx=5)
tk.Label(control_frame, text="每手牌数:", font=("Arial", 12)).grid(row=0, column=2, padx=5)
self.cards_per_hand_var = tk.StringVar(value="5")
cards_per_hand_entry = tk.Entry(control_frame, textvariable=self.cards_per_hand_var, width=5, font=("Arial", 12))
cards_per_hand_entry.grid(row=0, column=3, padx=5)
new_game_btn = tk.Button(control_frame, text="新游戏", command=self.new_game,
bg="#4CAF50", fg="white", font=("Arial", 12))
new_game_btn.grid(row=0, column=4, padx=10)
deal_cards_btn = tk.Button(control_frame, text="发牌", command=self.deal_cards,
bg="#2196F3", fg="white", font=("Arial", 12))
deal_cards_btn.grid(row=0, column=5, padx=10)
shuffle_btn = tk.Button(control_frame, text="洗牌", command=self.shuffle_deck,
bg="#FF9800", fg="white", font=("Arial", 12))
shuffle_btn.grid(row=0, column= column=6, padx=10)
# 显示区域
display_frame = tk.Frame(self.root)
display_frame.pack(fill=tk.BOTH, expand=True, padx=10, pady=10)
# 创建滚动文本框显示发牌情况
scrollbar = tk.Scrollbar(display_frame)
scrollbar.pack(side=tk.RIGHT, fill=tk.Y)
self.text_display = tk.Text(display_frame, yscrollcommand=scrollbar.set, wrap=tk.WORD, font=("Arial", 11))
self.text_display.pack(fill=tk.BOTH, expand=True)
scrollbar.config(command=self.text_display.yview)
# 状态栏
self.status_var = tk.StringVar(value="准备就绪")
status_bar = tk.Label(self.root, textvariable=self.status_var, relief=tk.SUNKEN, anchor=tk.W)
status_bar.pack(side=tk.BOTTOM, fill=tk.X)
# 初始化一副牌
self.new_game
def new_game(self):
开始新游戏
try:
player_count = int(self.player_count_var.get)
if player_count 15:
raise ValueError("玩家数量必须在1-15之间")
self.status_var.set("正在准备新游戏...")
# 重置牌局
self.deck = []
self.player_hands = {}
# 创建一副完整的扑克牌
for suit in self.suits:
for value in self.values:
self.deck.append({'value': value, 'suit': suit})
self.shuffle_deck
self.display_message(f"已创建{player_count}人游戏,每手{self.cards_per_hand_var.get}张牌")
self.status_var.set("新游戏准备就绪")
except ValueError as e:
messagebox.showerror("输入错误", f"请输入有效的数值: {str(e)}")
def shuffle_deck(self):
洗牌
random.shuffle(self.deck)
self.display_message("已洗牌")
self.status_var.set("牌已洗好")
def deal_cards(self):
发牌
try:
player_count = int(self.player_count_var.get)
cards_per_hand = int(self.cards_per_hand_var.get)
if player_count * cards_per_hand > len(self.deck):
messagebox.showerror("错误", "牌张不足,无法完成发牌")
return
self.status_var.set("正在发牌...")
self.player_hands = {}
# 发牌给每位玩家
for player in range(1, player_count + 1):
self.player_hands[player] = []
for _ in range(cards_per_hand):
if self.deck:
card = self.deck.pop
self.player_hands[player].append(card)
# 显示发牌结果
self.display_deal_result
self.status_var.set("发牌完成")
except ValueError:
messagebox.showerror("输入错误", "请输入有效的数值")
def display_deal_result(self):
显示发牌结果
self.text_display.delete(1.0, tk.END)
for player, hand in self.player_hands.items:
hand_text = f"玩家{player}的手牌:
for card in hand:
suit_symbol = self.get_suit_symbol(card['suit'])
hand_text += f"{card['value']}{suit_symbol}
self.text_display.insert(tk.END, hand_text + "\
)
remaining_cards = len(self.deck)
self.text_display.insert(tk.END, f"剩余牌张: {remaining_cards}\
)
def display_message(self, message):
在文本框中显示消息
self.text_display.insert(tk.END, f"{message}\
)
self.text_display.see(tk.END)
def get_suit_symbol(self, suit):
获取花色符号
symbols = {
'Hearts': '♥',
'Diamonds': '♦',
'Clubs': '♣',
'Spades': '♠'
return symbols.get(suit, suit[0])
def run(self):
运行应用程序
self.root.mainloop
# 运行程序
if __name__ == "__main__":
app = PokerDealer
app.run
功能说明
这个扑克牌发牌器具有以下功能:
1. 自定义设置:可设置玩家数量和每手牌数
2. 完整的扑克牌:包含52张标准扑克牌(无大小王)
3. 洗牌功能:随机打乱牌序
4. 发牌功能:按照设定向每位玩家发牌
5. 结果显示:清晰展示每位玩家的手牌和剩余牌张
6. 用户友好界面:简洁直观的操作界面
使用方法
1. 在"玩家数量"框中输入玩家人数(1-15)
2. 在"每手牌数"框中输入每人获得的牌数
3. 点击"新游戏"开始一局新的游戏
4. 点击"洗牌"打乱牌序
5. 点击"发牌"进行发牌操作
扩展建议
如果您想进一步扩展此程序,可以考虑:
1. 添加卡牌图像显示功能
2. 增加多种扑克游戏规则(如德州扑克、斗地主等)
3. 添加记分系统
4. 支持网络多人游戏
5. 添加动画效果使发牌过程更加生动
您可以直接运行上述代码,它将创建一个功能完整的扑克牌发牌器。