扑克发牌器,扑克牌发牌器



  • 2025-12-23 13:53:20

下面我将为您提供一个完整的扑克牌发牌器的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. 添加动画效果使发牌过程更加生动

您可以直接运行上述代码,它将创建一个功能完整的扑克牌发牌器。