【条件语句的艺术】扑克牌比大小

题目简介

设计一个函数,比较两张扑克牌的大小。
规定:

  1. 给四个参数:花色1(suit1),数字1(value1),花色2(suit2),数字2(value2)
  2. 如果牌1<牌2,返回true否则返回false
  3. 比较花色比较数字。若花色能比出大小,则无需再比较数字。
  4. 花色大小规定:梅花(clubs) < 方块(diamond) < 黑桃(spades) < 红桃(hearts)
  5. 数字大小规定:2 > 1(Ace) > 13(K) > 12(Q) > 11(J) > 10 > 9 > 8 > 7 > 6 > 5 > 4 > 3
  6. 例:hearts 5 和 diamond 13 返回 false; diamond 10 和 diamond 12 返回 true; clubs 2 和 clubs 13 返回 false。

开头唠嗑

这是思睿先修课的一道题,写这个博客的时候刚布置没多久,还没讲评。

我会一步步写我的分析思路,也会斜体加粗一些知识点,主要是给自己看的XD,当然如果有人愿意浏览的话我也很开心!

如果您有好的想法,请一定评论!讲评过后,如果老师的代码和我差别很大,我会另外再加上讲评的内容!

我使用Racket和Python来做这道题。

大体思路(结构)

首先我们要确定大体的结构,才好再去探究细节对吧!打游戏也要先配置好,才能更愉悦地享受不是吗?

这道题不难,因此我希望能用一套 “if else” 解决——即,不要 if 的嵌套。

首先我们要考虑花色。可以分为三种情况:

  • suit1 < suit2
  • suit1 = suit2
  • suit1 > suit2

当且仅当 suit1 = suit2 时,我们需要再考虑数字。

知识点1:对于 if, else if, else这种结构,不满足上一条判断才会进入下一条判断(有西瓜买西瓜,买不了西瓜买葡萄)。if, if, if这种结构,每一条判断都会进入(有西瓜买,有葡萄也买)。

于是,我们可以想出一个简单的结构:

if (suit1 > suit2) 返回false
else if (suit1 < suit2) 返回true
else if (value1 < value2) 返回true
else 返回false

是不是easy?

啊,你说suit1, suit2, value1, value2没法直接比大小?没事,下一个大标题我来一个一个填这些细节。

细节填坑

if (suit1 > suit2) 返回false

知识点2:字符串比大小,不是比长度,而是比字母顺序!例如 “abcd” < “adc”。这里我们要用到ASCII码表。注意:“0” < “A” < “a”。

于是,我们发现了,直接比较字符串大小的话,“clubs” < “diamond” < “hearts” < “spades”
咦?除了最后两个不太符合要求,其他都排好了?那我 if 嵌套 if 一下试试?

emmm,是不是想到可以这样干:
if (suit1 > suit2)
{if (suit2 == “hearts”) return true
else return false}
请忽略我的写法!您能看懂啥意思就行了!
你想啊,如果 suit1 > suit2 了,是不是有六种可能?其中,只有一种,即suit1是spades, suit2是hearts时,要返回true,其他都返回false。
什么?你说为什么不写 “如果suit1是spades and suit2是hearts"?emmm你可以自己全部列出来看看为什么。

想法还可以,但是 里面的那个 if 多此一举了!

知识点3:如果 if 里直接返回 true/false,那么这个 if 通常不需要写。

整理一下,这一个小部分的代码变成了这样:
Python:

if suit1 > suit2:
    return suit2 == "hearts"

Racket:

[(string>? suit1 suit2) (string=? suit2 "hearts")]

else if (suit1 < suit2) 返回true

这一句用和上一part相同的思考方式。

如果 suit1 < suit2 了,当且仅当suit1是hearts,suit2是spades时返回false,其他都返回true。

于是你就想到了 return suit1 == “hearts”。但你仔细一看,这不对啊,如果suit

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 好的,我可以回答你的问题。如果你想编写一个程序来比较多个玩家的扑克牌大小,你可以遵循以下步骤: 1. 首先定义一副扑克牌的牌面和花色,可以用列表来表示。 2. 然后定义每张牌的点数和大小,可以使用字典来表示。 3. 接下来,定义玩家和底牌的数据结构,可以使用列表或者字典来表示。 4. 再定义发牌、比较大小和判断胜负等函数。 5. 最后,编写主程序,模拟发牌、比较大小和输出结果等流程。 实现以上步骤后,就可以完成一个简单的多人扑克牌大小的程序。当然,这只是一个初步的框架,你可以根据自己的需求和编程能力来扩展和优化这个程序。 ### 回答2: Python扑克牌多个玩家比大小的问题,可以通过以下步骤解决: 1. 创建一副牌:首先,我们需要创建一副标准的52张扑克牌。可以使用两个列表来表示,一个列表表示扑克牌花色(如['红桃','方块','梅花','黑桃']),另一个列表表示扑克牌的点数(如['A','2','3',...,'K'])。 2. 洗牌:使用random模块的shuffle函数将牌随机打乱,模拟真实洗牌的过程。 3. 发牌:将洗好的牌平均分配给每位玩家。可以使用列表来表示每个玩家的手牌,每个玩家手中初始有n张牌。 4. 比较大小:根据扑克牌大小规则,比较每位玩家手中的牌的大小。可以设置一个字典来表示不同点数的牌的大小关系(如{'A': 14, 'K': 13, 'Q': 12, 'J': 11},数字点数直接使用数字表示大小)。遍历每个玩家的手牌,根据点数的大小来比较牌的大小。 5. 输出结果:根据比较的结果,确定最大的牌或者牌面的组合,输出获胜的玩家信息。 以上是使用Python实现扑克牌多个玩家比大小的简单方法。在实际应用中,还可以考虑更复杂的规则和算法,例如考虑花色大小关系、判断是否有特殊牌型等等。 ### 回答3: Python扑克牌多个玩家比大小可以通过以下步骤实现: 1. 首先,创建一副扑克牌的列表,包括所有的花色和点数。可以使用嵌套循环的方式生成所有的牌,并将其添加到列表中。 ```python suits = ['方块', '梅花', '红心', '黑桃'] ranks = ['2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K', 'A'] deck = [(suit, rank) for suit in suits for rank in ranks] ``` 2. 接下来,创建多个玩家,并为每个玩家分发两张牌。可以使用random模块中的shuffle函数随机打乱扑克牌列表,并使用切片操作将前两张牌分给每个玩家。 ```python import random random.shuffle(deck) num_players = 4 players = [[] for _ in range(num_players)] for i in range(2): for j in range(num_players): players[j].append(deck.pop(0)) ``` 3. 定义一个函数来计算每个玩家手中牌的总点数。根据扑克牌的点数规则,使用条件语句逐张判断并累加总点数。 ```python def calculate_points(hand): total = 0 for card in hand: rank = card[1] if rank.isdigit(): total += int(rank) elif rank in ('J', 'Q', 'K'): total += 10 elif rank == 'A': total += 11 return total ``` 4. 最后,比较每个玩家的总点数,并找到最大点数的玩家。可以使用内置的max函数和列表推导式找到最大值,以及index方法找到最大值对应的索引。 ```python max_points = max([calculate_points(player) for player in players]) winner = players[[calculate_points(player) for player in players].index(max_points)] ``` 以上就是使用Python实现扑克牌多个玩家比大小的简单方法。根据实际需要可以添加更多功能,如同花顺判断、游戏回合等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值