如何简化DJ Wild扑克游戏中对子检测的if语句?优化时间复杂度
简化扑克手牌对子检测的实现方案
问题分析
原代码通过多次调用count()方法判断是否存在对子,不仅代码冗长,而且每次count()都会遍历整个cards列表,时间复杂度较高(O(m*k),m是牌面种类数,k是手牌元素总数)。同时原user()函数存在索引错误问题:循环中使用carddeck.remove(carddeck[i])会导致牌堆长度动态变化,后续索引指向的元素会错位。
优化方案
1. 修复手牌抽取逻辑
先修正user()函数的取牌逻辑,使用pop()方法从牌堆顶部取牌,避免索引错误:
def user(n): for _ in range(n): card = carddeck.pop(0) # 从洗牌后的牌堆顶部抽取一张牌 print("Player:", card[0], card[1]) cards.append(card[0]) cards.append(card[1])
2. 简化对子检测逻辑
方法一:利用集合去重特性
手牌中的牌面如果有重复,去重后的集合长度会小于原牌面列表长度,直接通过长度对比判断是否存在对子:
# 提取所有牌面(忽略花色,cards列表中偶数索引是牌面) ranks = [cards[i] for i in range(0, len(cards), 2)] has_pair = len(set(ranks)) < len(ranks) if has_pair: print("You have a pair") else: print("You don't have a pair")
方法二:使用collections.Counter统计次数
通过Counter一次性统计所有牌面的出现次数,再检查是否有次数等于2的情况:
from collections import Counter # 提取所有牌面 ranks = [cards[i] for i in range(0, len(cards), 2)] rank_counts = Counter(ranks) # 检查是否存在出现次数为2的牌面 has_pair = any(count == 2 for count in rank_counts.values()) if has_pair: print("You have a pair") else: print("You don't have a pair")
完整优化后代码
import random import itertools from collections import Counter # 变量声明 ante = 0 bonus = 0 balance = 200 cards = [] hands0 = ['A','2','3','4','5','6','7','8','9','10','J','Q','K'] hands1 = ["Spade", "Club", "Diamond", "Heart"] # 初始化牌堆 carddeck = list(itertools.product(hands0, hands1)) # 洗牌 random.shuffle(carddeck) # 抽取n张牌的函数 def user(n): for _ in range(n): card = carddeck.pop(0) print("Player:", card[0], card[1]) cards.append(card[0]) cards.append(card[1]) user(5) # 检测对子 ranks = [cards[i] for i in range(0, len(cards), 2)] rank_counts = Counter(ranks) has_pair = any(count == 2 for count in rank_counts.values()) print("You have a pair" if has_pair else "You don't have a pair")
内容的提问来源于stack exchange,提问作者J Bo
相关产品推荐
相关产品推荐

