题目简介
设计一个函数,比较两张扑克牌的大小。
规定:
- 给四个参数:花色1(suit1),数字1(value1),花色2(suit2),数字2(value2)
- 如果牌1<牌2,返回true,否则返回false。
- 先比较花色,再比较数字。若花色能比出大小,则无需再比较数字。
- 花色大小规定:梅花(clubs) < 方块(diamond) < 黑桃(spades) < 红桃(hearts)
- 数字大小规定:2 > 1(Ace) > 13(K) > 12(Q) > 11(J) > 10 > 9 > 8 > 7 > 6 > 5 > 4 > 3
- 例: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