每日总结

做斗地主辅助器,今天轮到顺子:5 张以上、点数连续、不重复、不含 2 和王。九个用例跑通之后,又揪出三个错,全都不报错。
第一个是没排序。我测的时候手牌按顺序输,3 4 5 6 7,一切正常。可真实打牌时顺序是乱的,7 5 3 6 4 进来,相邻差变成 [-2,-2,3,-2],顺子被判成不是顺子。加一句 values.sort() 才对。输入的顺序永远是别人给的,不能假设它有序。
第二个更阴。我写过一句 values = values.sort(),看着挺自然。但 sort() 是原地排序,不返回东西,values 直接变成 None,报错落在后面 max() 那一行。报错的位置不是出错的位置。
第三个是边界。J Q K A 2 换成数字是 [8,9,10,11,12],差全是 1,排序也救不了,它真的连续,只是越过了 A。顺子的天花板是 A,得单独加一条 max(values) > 11。这条最难想到,因为大部分含 2 的输入排序完就自己散了,只有 "2 紧跟在 A 后面" 这一种排法才会挤成一条直线。
三个错都是靠故意造 "结果会翻转" 的用例才露出来的:乱序的顺子、J Q K A 2、超过天花板的那一档。用正常输入测一百遍,一个也测不出来。
函数对了之后接进 judge,加了第五档 elif is_straight(cards),放在炸弹之后、else 之前。顺子是 "张数多、点数散",前面几条都是 "张数少、同点数",只能排最后。顺手把文件顶部四十行旧注释和散落的测试 print 都清了。
然后在主程序里实跑:9 2 出 5 组,4 4 出 0 组,3 5 被张数校验拦住。这一拦是对的,也拦出了问题 —— 出牌格式是 "点数 + 张数",天生只能表达同点数的牌。顺子能认了,却输不进去。这是下一篇的事。
回头看,三个错教的东西其实是一件事:判断 "连续" 之前必须先排序;原地修改的方法(sort、append、clear)不返回东西,赋值会拿到 None;规则里的每一条都得写成代码,"不含 2 和王" 不是常识,是一行 max(values) > 11。

posted @ 2026-11-07 22:54  lagranSun  阅读(3)  评论(0)    收藏  举报