如何优化Nim游戏中多分支if语句的代码实现?
如何简化Nim游戏中电脑取火柴的多if语句?
我写了一段Nim游戏的C语言代码,用来处理电脑取火柴的逻辑:
if (gepakteLucifers == 1) { printf("De computer pakt 3 lucifers\n"); printf("%d - %d = %d\n\n", lucifers, 3, lucifers - 3); lucifers = lucifers - 3; } if (gepakteLucifers == 2) { printf("De computer pakt 2 lucifers\n"); printf("%d - %d = %d\n\n", lucifers, 2, lucifers - 2); lucifers = lucifers - 2; } if (gepakteLucifers == 3) { printf("De computer pakt 1 lucifer\n"); printf("%d - %d = %d\n\n", lucifers, 1, lucifers - 1); lucifers = lucifers - 1; }
这段代码的逻辑是:玩家拿1根,电脑拿3根;玩家拿2根,电脑拿2根;玩家拿3根,电脑拿1根。但现在用了三个独立的if语句,感觉冗余太多,想简化这段代码。
你可以利用规则里的固定总和来简化:玩家和电脑每次拿的火柴总数是4(1+3=4,2+2=4,3+1=4),所以可以直接计算电脑需要拿的数量,把三个分支合并成一个逻辑:
int computer_takes = 4 - gepakteLucifers; // 处理输出文本的单复数 printf("De computer pakt %d %s\n", computer_takes, computer_takes == 1 ? "lucifer" : "lucifers"); printf("%d - %d = %d\n\n", lucifers, computer_takes, lucifers - computer_takes); lucifers -= computer_takes;
这样做的好处:
- 去掉了重复的判断、输出和变量更新逻辑,代码更简洁易维护
- 如果后续规则调整(比如总和改成5),只需要修改一个数字即可,不用改动多个分支
- 自动处理了输出文本的单复数问题,和原代码的表述保持一致
另外补充一点:原代码里的三个if是独立判断,即使第一个条件满足,后面的if还是会执行判断,改成if-else if结构也能减少不必要的判断,但显然利用数学规律的简化方式效果最优。
内容的提问来源于stack exchange,提问作者quiana
相关产品推荐
相关产品推荐

