马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 鱼C-小师妹 于 2022-4-8 20:10 编辑
在线讲解:
玩游戏不如创建游戏,这次我们编写一个程序实现,让“计算机”每次必胜!
假设我们有 21 张牌,每次每人只可取走 1~4 张,不能多拿,也不能不拿,谁拿到最后一张牌谁谁就输了。
现在我们编写一段人机对战程序,实现:
既然最终胜者是计算机,就意味着让人拿到最后一张牌。
咱们接着往下推理下去。
那上一轮就是让计算机只剩下一张牌给人,因为此时人至少取 1 张牌。
别的情况都不能保证计算机常胜。
现在问题就转换为:
有 20 张牌,两人轮流取,每人每次可以取走 1~4 张,不可多拿,也不能少拿,要求人先取,计算机后取,谁取到最后一张牌谁赢。
为了计算机能够取到最后一张牌,就要保证最后一轮拿(人先取一次,计算机再取一次)之前剩下 5 张牌。
因为只有这样才能保证无论人怎样拿牌,计算机都能将其余的牌全部取走。
问题又转换为:
15 张牌,两人轮流取,每人每次可以取走 1~4 张,不能多拿,也不能不拿,要求人先取,计算机后取,保证计算机取最后一张牌。
同样道理,为了让计算机取到最后一张牌,就要保证最后一轮的抽取之前剩下 5 张牌。
于是问题又转化为 10 张牌的问题,依次递推...
这样倒推就发现规律了吧。21 张牌,在人先取计算机后取、每次取 1~4 张的大前提下。
只要保证每一轮的抽取(人先取一次,计算机再取一次)时人抽到的牌数与计算机抽到的数之和为 5,就可以实现后取计算机总能赢。
既然是游戏,一些用来表示游戏进度的提示文字必不可少:
if __name__ == "__main__":
card = 21
print("===你休想战胜我,我是无敌计算机!不信就试试阿===")
print("好戏开始了!")
提示信息设计好,就是函数主体,因为需要一直执行,while 循环少不了:
每一轮都需要判断当前还有多少张牌:
print(f"---此时还有{card}张牌---")
然后需要提示人来拿牌,并将值保存到 hunman 变量中:
human = int(input("人要取几张牌:"))
因为题目有要求只能取 1~4 张,所以要判断 human 是否符合要求,不符合就提示违规,然后继续:
if human < 1 or human > 4:
print(f"违规咯!不能取{human}张!!")
continue
接着就要统计剩余牌数:
如果此时 card 为 0,就说明人拿走了最后一张牌,说明计算机赢了,那就游戏结束:
if card == 0:
print("计算机赢咯,游戏结束")
break
如果不为 0,就说明游戏继续,该计算机拿牌了,计算机只要拿 5 - human 张就好:
computer = 5 - human
card = card - computer
print(f"计算机取{computer}张牌")
此时如果 card 为 0,就说明人赢了,但是,根本不可能发生对吧。
我们也写上:
if card == 0:
print("人永远不可能获胜,这句无法执行!")
break
好啦,执行一下:
前面都没问题,怎么出现 -4 了?
我们需要修改上面的 if 判断为:
if human < 1 or human > 4 or human > card:
执行:
没问题了,不管怎么取,最终胜利的都是计算机啦~
源码:
py27.py.zip
(879 Bytes, 下载次数: 9, 售价: 8 鱼币)
|