鱼C-小师妹 发表于 2022-1-14 17:29:11

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:33

回复回复

鱼C-小师妹 发表于 2022-1-14 17:40:24

啄眷鸟 发表于 2022-1-14 17:36
回复回复

第一,回复的稍微有一点点早{:10_254:}

嘉岳呀 发表于 2022-1-14 18:49:45

xiaosi4081 发表于 2022-1-14 20:11:40

震惊!小师妹竟然指使电脑作弊!{:10_256:}{:10_256:}

xiaosi4081 发表于 2022-1-14 20:15:46

先帮小师妹写好代码:@鱼C-小师妹
a = int(input("欢迎来到石头剪刀布游戏,输入(1:石头 2:剪刀 3:布):"))
if a==1:
    print("计算机出的是布!你输了!")
elif a == 2:
    print("计算机出的是石头!你输了!")
elif a == 3:
    print("计算机出的是剪刀!你输了!")
else:
    print("你没有输入值!你输了!")

知识改变眼界 发表于 2022-1-15 09:34:35

是做游戏修改器嘛?

hornwong 发表于 2022-1-15 09:46:43

{:5_95:}

1molHF 发表于 2022-1-15 10:10:52

{:10_254:}

奋起的扑克牌 发表于 2022-1-15 21:30:09

回复

虚空小石 发表于 2022-1-16 10:12:23

肥复

tracekyo 发表于 2022-1-16 10:25:20

回复

guyuhan20 发表于 2022-1-16 12:32:09

1

fxj2002 发表于 2022-1-16 13:35:37

1

2454696816 发表于 2022-1-16 14:04:21

1

鱼C-小师妹 发表于 2022-1-16 18:49:31

xiaosi4081 发表于 2022-1-14 20:15
先帮小师妹写好代码:@鱼C-小师妹

哈哈哈哈哈哈,不错不错~

课程里是另一种更“骚”操作

quark 发表于 2022-1-17 10:17:44

来看看。。。。

坏坏的坏坏 发表于 2022-1-17 15:29:59

回复一下

北冽鲸涛 发表于 2022-1-17 16:30:55

回复回复

weian 发表于 2022-1-25 11:09:39

回复
页: [1] 2
查看完整版本: 27 - 必赢的游戏