Python 实现炸金花游戏的核心逻辑与代码示例
概述
炸金花(又称诈金花、三张牌)是一种流行的扑克博弈游戏。本示例使用 Python 模拟其核心发牌、手型判断及比牌逻辑。通过数值化评分机制,可以快速比较不同玩家的手牌大小。
游戏规则说明
-
牌型定义:
- 豹子(三条):三张点数相同。
- 顺金(同花顺):花色相同且点数连续。
- 金花(同花):花色相同但点数不连续。
- 顺子:点数连续但花色不同。
- 对子:两张点数相同。
- 单张:以上情况均不符合。
-
点数映射:
- 数字 2-10 代表对应点数。
- J=11, Q=12, K=13, A=14。
-
比较逻辑:
- 优先比较牌型等级(如豹子 > 顺金)。
- 若牌型相同,则比较最大牌的点数。
完整代码实现
以下代码修复了原逻辑中的截断问题,补全了所有牌型判断分支,并增加了主程序入口。
import random
# 定义牌的花色和点数
SUITS = ['黑桃', '红桃', '方块', '梅花']
RANKS = [2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
# 牌型分值常量
SCORE_ZHADAN = 100000 # 豹子
SCORE_SHUNJIN = 10000 # 顺金
SCORE_SHUNZI = 1000 # 顺子
SCORE_DUIZI = 100 # 对子
SCORE_SINGLE = 1 # 单张
def create_deck():
"""
生成一副 52 张的扑克牌(除去大小王)
:return: 包含字典 {花色:点数} 的列表
"""
deck = []
suit SUITS:
rank RANKS:
deck.append({suit: rank})
deck
():
hand (hand) != :
suits = [(card.keys())[] card hand]
ranks = [(card.values())[] card hand]
ranks.sort()
is_flush = (suits[] == suits[] == suits[])
is_straight = (ranks[] - ranks[] == ) (ranks[] - ranks[] == )
count_map = {}
r ranks:
count_map[r] = count_map.get(r, ) +
max_rank = ranks[]
score =
(count_map) == :
score = max_rank * SCORE_ZHADAN
is_flush is_straight:
score = max_rank * SCORE_SHUNJIN
is_flush:
score = max_rank * +
is_straight:
score = max_rank * SCORE_SHUNZI
(count_map) == :
pair_rank = [r r, c count_map.items() c == ][]
score = pair_rank * SCORE_DUIZI
:
score = max_rank * SCORE_SINGLE
score += ranks[] /
score += ranks[] /
(score)
():
p_score = get_hand_score(player_hand)
o_score = get_hand_score(opponent_hand)
p_score > o_score:
p_score < o_score:
:
():
()
deck = create_deck()
random.shuffle(deck)
player_hand = deck[:]
opponent_hand = deck[:]
():
[ c hand]
()
()
result = compare_hands(player_hand, opponent_hand)
result == :
()
result == :
()
:
()
__name__ == :
main()

