扑克牌项目
这是一个完整的扑克牌项目,包含创建、洗牌、发牌和游戏模拟功能。
python
import random
class Card:
表示一张扑克牌的类
suits = ["♠", "♥", "♦", "♣"]
ranks = ["2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A"]
]
def __init__(self, suit, rank):
self.suit = suit
self.rank = rank
def __str__(self):
return f"{self.suits[self.suit]}{self.ranks[self.rank]}
def __repr__(self):
return self.__str__
def get_value(self):
获取牌的点数
if self.rank >= 9: # J, Q, K, A
if self.rank == 12: # A
return (1, 11) # A可以是1点或11点
return 10
return self.rank + 2
class Deck:
表示一副扑克牌的类
def __init__(self):
self.cards = []
self.create_deck
def create_deck(self):
创建一副标准的52张扑克牌
self.cards = []
for suit in range(4):
for rank in range(13):
self.cards.append(Card(suit, rank))
def shuffle(self):
洗牌
random.shuffle(self.cards)
def deal_card(self):
从牌堆顶部发一张牌
if len(self.cards) > 0:
return self.cards.pop
return None
def __len__(self):
return len(self.cards)
def __str__(self):
return f"牌堆中有 {len(self)} 张牌
牌
class Player:
表示一个玩家
def __init__(self, name):
self.name = name
self.hand = []
self.chips = 1000 # 初始筹码
def receive_card(self, card):
接收一张牌
self.hand.appendand.append(card)
def clear_hand(self):
清空手牌
self.hand = []
def get_hand_value(self):
计算手牌总点数
value = 0
aces = 0
for card in self.hand:
card_value = card.get_value
if isinstance(card_value, tuple): # A
value += 11
aces += 1
else:
value += card_value
# 处理A的点数
while value > 21 and aces > 0:
value -= 10
aces -= 1
return value
def place_bet(self, amount):
amount):
下注
if amount
self.chips -= amount
return amount
else:
bet = self.chips
self.chips = 0
return bet
def win_bet(self, amount):
赢得下注
self.chips += amount
def __str__(self):
hand_str = ", ".join(str(card) for card in self.hand)
return f"{self.name}: {hand_str} (点数: {self.get_hand_value})
class PokerGame:
简单的扑克游戏类
def __init__(self, player_names):
self.deck = Deck
self.deck.shuffle
self.players = [Player(name) for name in player_names]
self.dealer = Player("庄家")
def deal_initial_cards(self):
发初始牌
for _ in range(2):
for player in self.players + [self.dealer]:
player.receive_card(self.deck.deal_card)
def player_turn(self, player):
玩家回合
print(f"\
{player.name}的回合:")
print(player)
while player.get_hand_value
action = input("要牌(h)还是停牌(s)? ").lower
if action == 'h':
player.receive_card(self.deck.deal_card)
print(player)
if player.get_hand_value > 21:
print(f"{player.name} 爆牌了!")
!")
break
elif action == 's':
break
def dealer_turn(self):
庄家回合
print(f"\
{self.dealer.name}的回合:")
print(self.dealer)
# 庄家规则家规则: 点数小于17必须继续要牌
while self.dealer.get_hand_value
self.dealer.receive_card(self.deck.deal_card)
print(self.dealer)
if self.dealer.get_hand_value > 21:
print(f"{self.dealer.name} 爆牌了!")
break
def determine_winners(self):
确定赢家
dealer_value = self.dealer.get_hand_value
print("\
=== 游戏结果 ===")
print(f"庄家: {dealer_value}")
for player in self.players:
player_value = player.get_hand_value
print(f"{player.name}: {player_value}")
if player_value > 21:
print(f"{player.name} 输掉了下注")
elif dealer_value > 21 or player_value > dealer_value:
print(f"{player.name} 赢了!")
player.win_bet(20) # 简单起见,固定赔率
elif player_value
print(f"{player.name} 输掉了下注")
else:
print(f"{player.name} 平局")
局")
def play_round(self):
进行一轮游戏
# 重置牌局
self.deck = Deck
self.deck.shuffle
for player in self.players + [self.dealer]:
player.clear_hand
# 下注
print("\
=== 下注阶段 ===")
for player in self.players:
print(f"{player.name} 的筹码: {player.chips}")
bet = int(input(f"{player.name} 请下注 (1-{min(100, player.chips)}): "))
player.place_bet(bet)
# 发牌
self.deal_initial_cards
# 玩家回合
for player in self.players:
self.player_turn(player)
# 庄家回合
self.dealer_turn
# 结算
self.determine_winners
def demonstrate_poker_functions:
演示扑克牌的基本功能
print("=== 扑克牌功能演示 ===\
)
# 创建一副牌并洗牌
deck = Deck
print("初始牌堆:", deck)
deck.shuffle
print("洗牌后:", deck)
# 展示前5张牌
print("\
前5张牌:")
for i in range(5):
card = deck.deal_card
print(f"第{i+1}张: {card}, 点数: {card.get_value}")
print("\
发牌后剩余:", deck)
# 创建玩家并发牌
print("\
=== 玩家示例 ===")
player1 = Player("小明")
player2 = Player("小红")
# 重置牌堆
deck = Deck
deck.shuffle
# 发两张牌给每个玩家
for _ in range(2):
player1.receive_card(deck.deal_card)
player2.receive_card(deck.deal_card)
print(player1)
print(player2)
def main:
主函数
print("欢迎来到扑克牌游戏!")
# 演示基本功能
demonstrate_poker_functions
# 是否开始游戏
start_game = input("\
是否开始游戏? (y/n): ").lower
if start_game == 'y':
player_count = int(input("请输入玩家数量: "))
player_names = []
for i in range(player_count):
name = input(f"请输入玩家{i+1}的名字: ")
player_names.append(name)
game = PokerGame(player_names)
while True:
game.play_round
continue_game = input("\
是否继续下一轮? (y/n): ").lower
if continue_game != 'y':
break
# 检查是否有玩家没有筹码
active_players = [p for p in game.players if p.chips > 0]
if not active_players:
悟空德州print("所有玩家都没有筹码了,游戏结束!")
break
if __name__ == "__main__":
main
项目特点
1. 完整的扑克牌系统:
2. 核心功能:
3. 游戏模拟:
4. 扩展性:
使用方法
1. 运行程序后,会先演示基本的扑克牌功能
2. 可以选择开始游戏,输入玩家数量和名称
3. 每轮游戏中玩家可以下注、要牌或停牌
4. 游戏会持续直到玩家选择退出或没有筹码
这个项目展示了面向对象编程的基本原则,适合学习Python类和对象的概念。