py用gui界面实现21点数字游戏
时间: 2024-02-01 09:16:17 浏览: 26
以下是一个简单的21点数字游戏GUI实现的示例代码:
```python
import tkinter as tk
import random
class TwentyOneGame:
def __init__(self):
self.deck = list(range(1, 14)) * 4
self.dealer_cards = []
self.player_cards = []
self.player_score = 0
self.dealer_score = 0
def deal(self):
random.shuffle(self.deck)
self.player_cards = [self.deck.pop(), self.deck.pop()]
self.dealer_cards = [self.deck.pop()]
def hit(self, hand):
hand.append(self.deck.pop())
def calculate_score(self, hand):
score = sum(hand)
if score > 21 and 11 in hand:
hand.remove(11)
hand.append(1)
score = sum(hand)
return score
def player_turn(self):
while True:
self.hit(self.player_cards)
self.player_score = self.calculate_score(self.player_cards)
if self.player_score > 21:
return 'lose'
elif self.player_score == 21:
return 'win'
else:
if not self.hit_again():
return 'stand'
def dealer_turn(self):
while self.calculate_score(self.dealer_cards) < 17:
self.hit(self.dealer_cards)
self.dealer_score = self.calculate_score(self.dealer_cards)
if self.dealer_score > 21:
return 'win'
elif self.dealer_score > self.player_score:
return 'lose'
elif self.dealer_score < self.player_score:
return 'win'
else:
return 'push'
def hit_again(self):
root = tk.Tk()
root.geometry('200x100')
root.title('21点')
label = tk.Label(root, text='想要再要一张牌吗?')
label.pack(pady=10)
button_frame = tk.Frame(root)
yes_button = tk.Button(button_frame, text='是', width=10, command=lambda: self.hit_again_callback(root, True))
yes_button.pack(side=tk.LEFT, padx=5)
no_button = tk.Button(button_frame, text='否', width=10, command=lambda: self.hit_again_callback(root, False))
no_button.pack(side=tk.RIGHT, padx=5)
button_frame.pack()
root.mainloop()
return self.hit_again_result
def hit_again_callback(self, root, result):
self.hit_again_result = result
root.destroy()
class TwentyOneGUI:
def __init__(self, master):
self.master = master
self.master.title('21点')
self.game = TwentyOneGame()
self.dealer_label = tk.Label(self.master, text='庄家:')
self.dealer_label.grid(row=0, column=0, padx=5, pady=5)
self.player_label = tk.Label(self.master, text='玩家:')
self.player_label.grid(row=1, column=0, padx=5, pady=5)
self.deal_button = tk.Button(self.master, text='发牌', command=self.deal)
self.deal_button.grid(row=2, column=0, padx=5, pady=5)
self.hit_button = tk.Button(self.master, text='要牌', command=self.hit)
self.hit_button.grid(row=2, column=1, padx=5, pady=5)
self.stand_button = tk.Button(self.master, text='停牌', command=self.stand)
self.stand_button.grid(row=2, column=2, padx=5, pady=5)
self.result_label = tk.Label(self.master, text='')
self.result_label.grid(row=3, column=0, columnspan=3, padx=5, pady=5)
def deal(self):
self.game.deal()
self.update_cards()
def hit(self):
result = self.game.player_turn()
if result == 'lose':
self.result_label['text'] = '你输了!'
self.update_scores()
elif result == 'win':
self.result_label['text'] = '你赢了!'
self.update_scores()
elif result == 'stand':
self.dealer_turn()
def stand(self):
self.dealer_turn()
def dealer_turn(self):
result = self.game.dealer_turn()
if result == 'lose':
self.result_label['text'] = '你赢了!'
self.update_scores()
elif result == 'win':
self.result_label['text'] = '你输了!'
self.update_scores()
elif result == 'push':
self.result_label['text'] = '平局!'
self.update_scores()
def update_cards(self):
dealer_text = '庄家:{}\n\n'.format(str(self.game.dealer_cards[0]))
player_text = '玩家:{}\n\n'.format(' '.join(str(card) for card in self.game.player_cards))
self.dealer_label['text'] = dealer_text
self.player_label['text'] = player_text
def update_scores(self):
dealer_score_text = '庄家:{}\n\n'.format(str(self.game.dealer_score))
player_score_text = '玩家:{}\n\n'.format(str(self.game.player_score))
self.dealer_label['text'] += dealer_score_text
self.player_label['text'] += player_score_text
root = tk.Tk()
TwentyOneGUI(root)
root.mainloop()
```
在这个示例代码中,我们使用了Python的GUI工具包Tkinter来实现21点数字游戏的用户界面。我们首先定义了一个TwentyOneGame类来处理游戏逻辑,然后定义了一个TwentyOneGUI类来处理用户界面。在TwentyOneGUI的构造函数中,我们创建了一个发牌按钮、一个要牌按钮和一个停牌按钮,并且将它们绑定到相应的函数上。我们还创建了一个庄家Label和一个玩家Label来显示庄家和玩家的牌,以及一个结果Label来显示游戏结果。当玩家点击发牌按钮时,我们调用TwentyOneGame的deal()函数来发牌,并更新庄家和玩家的牌。当玩家点击要牌按钮时,我们调用TwentyOneGame的player_turn()函数来让玩家继续要牌或停牌,并根据游戏结果更新结果Label。当玩家停牌或爆牌时,我们调用TwentyOneGame的dealer_turn()函数来让庄家继续要牌,并根据游戏结果更新结果Label。最后,我们使用Tkinter的mainloop()函数来启动GUI界面。