27 - 必赢的游戏
本帖最后由 鱼C-小师妹 于 2022-4-8 20:10 编辑在线讲解:
https://www.bilibili.com/video/BV1HT4y1K7DY?p=30
玩游戏不如创建游戏,这次我们编写一个程序实现,让“计算机”每次必胜!
假设我们有 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 循环少不了:
while True:
每一轮都需要判断当前还有多少张牌:
print(f"---此时还有{card}张牌---")
然后需要提示人来拿牌,并将值保存到 hunman 变量中:
human = int(input("人要取几张牌:"))
因为题目有要求只能取 1~4 张,所以要判断 human 是否符合要求,不符合就提示违规,然后继续:
if human < 1 or human > 4:
print(f"违规咯!不能取{human}张!!")
continue
接着就要统计剩余牌数:
card = card - human
如果此时 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 了?
**** Hidden Message *****
我们需要修改上面的 if 判断为:
if human < 1 or human > 4 or human > card:
执行:
没问题了,不管怎么取,最终胜利的都是计算机啦~
源码: 回复回复 啄眷鸟 发表于 2022-1-14 17:36
回复回复
第一,回复的稍微有一点点早{:10_254:} 呃 震惊!小师妹竟然指使电脑作弊!{:10_256:}{:10_256:} 先帮小师妹写好代码:@鱼C-小师妹
a = int(input("欢迎来到石头剪刀布游戏,输入(1:石头 2:剪刀 3:布):"))
if a==1:
print("计算机出的是布!你输了!")
elif a == 2:
print("计算机出的是石头!你输了!")
elif a == 3:
print("计算机出的是剪刀!你输了!")
else:
print("你没有输入值!你输了!")
是做游戏修改器嘛? {:5_95:} {:10_254:} 回复 肥复
回复
1 1 1 xiaosi4081 发表于 2022-1-14 20:15
先帮小师妹写好代码:@鱼C-小师妹
哈哈哈哈哈哈,不错不错~
课程里是另一种更“骚”操作 来看看。。。。 回复一下 回复回复 回复
页:
[1]
2