撲克發牌器,撲克牌發牌器
下面我將為您提供一個完整的撲克牌發牌器的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):
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': '?'
online poker platformreturn 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. 添加動畫效果使發牌過程更加生動
您可以直接運行上述代碼,它將創建一個功能完整的撲克牌發牌器。