鱼C论坛

 找回密码
 立即注册
查看: 143|回复: 23

[技术交流] 27 - 必赢的游戏

[复制链接]
发表于 2022-1-14 17:29:11 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
本帖最后由 鱼C-小师妹 于 2022-1-17 22:13 编辑

玩游戏不如创建游戏,这次我们编写一个程序实现,让“计算机”每次必胜!

假设我们有 21 张牌,每次每人只可取走 1~4 张,不能多拿,也不能不拿,谁拿到最后一张牌谁谁就输了。

现在我们编写一段人机对战程序,实现:

人先拿,计算机后拿,最终让计算机必赢。

既然最终胜者是计算机,就意味着让人拿到最后一张牌。

咱们接着往下推理下去。

那上一轮就是让计算机只剩下一张牌给人,因为此时人至少取 1 张牌。

别的情况都不能保证计算机常胜。

现在问题就转换为:

有 20 张牌,两人轮流取,每人每次可以取走 1~4 张,不可多拿,也不能少拿,要求人先取,计算机后取,谁取到最后一张牌谁赢。

为了计算机能够取到最后一张牌,就要保证最后一轮拿(人先取一次,计算机再取一次)之前剩下 5 张牌。

因为只有这样才能保证无论人怎样拿牌,计算机都能将其余的牌全部取走。

问题又转换为:

15 张牌,两人轮流取,每人每次可以取走 1~4 张,不能多拿,也不能不拿,要求人先取,计算机后取,保证计算机取到最后一根火柴。

同样道理,为了让计算机取到最后一根火柴,就要保证最后一轮的抽取之前剩下 5 张牌。

于是问题又转化为 10 张牌的问题,依次递推...

这样倒推就发现规律了吧。21 张牌,在人先取计算机后取、每次取 1~4 张的大前提下。

只要保证每一轮的抽取(人先取一次,计算机再取一次)时人抽到的牌数与计算机抽到的数之和为 5,就可以实现后取计算机总能赢。

既然是游戏,一些用来表示游戏进度的提示文字必不可少:

  1. if __name__ == "__main__":
  2.     card = 21
  3.     print("===你休想战胜我,我是无敌计算机!不信就试试阿===")
  4.     print("好戏开始了!")
复制代码

提示信息设计好,就是函数主体,因为需要一直执行,while 循环少不了:

  1.     while True:
复制代码

每一轮都需要判断当前还有多少张牌:

  1.         print(f"---此时还有{card}张牌---")
复制代码

然后需要提示人来拿牌,并将值保存到 hunman 变量中:

  1. human = int(input("人要取几张牌:"))
复制代码

因为题目有要求只能取 1~4 张,所以要判断 human 是否符合要求,不符合就提示违规,然后继续:

  1. if human < 1 or human > 4:
  2.             print(f"违规咯!不能取{human}张!!")
  3.             continue
复制代码

接着就要统计剩余牌数:

  1.         card = card - human
复制代码

如果此时 card 为 0,就说明人拿走了最后一张牌,说明计算机赢了,那就游戏结束:

  1. if card == 0:
  2.             print("计算机赢咯,游戏结束")
  3.             break
复制代码

如果不为 0,就说明游戏继续,该计算机拿牌了,计算机只要拿 5 - human 张就好:

  1. computer = 5 - human
  2.         card = card - computer
  3.         print(f"计算机取{computer}张牌")
复制代码

此时如果 card 为 0,就说明人赢了,但是,根本不可能发生对吧。

我们也写上:

  1.         if card == 0:
  2.             print("人永远不可能获胜,这句无法执行!")
  3.             break
复制代码

好啦,执行一下:

2022-01-17_22-05-32.jpg

前面都没问题,怎么出现 -4 了?

游客,如果您要查看本帖隐藏内容请回复


我们需要修改上面的 if 判断为:

  1.         if human < 1 or human > 4 or human > card:
复制代码

执行:

2022-01-17_22-11-18.jpg

没问题了,不管怎么取,最终胜利的都是计算机啦~

源码: py27.py.zip (879 Bytes, 下载次数: 1, 售价: 8 鱼币)

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2022-1-14 17:36:33 | 显示全部楼层
回复回复
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2022-1-14 17:40:24 | 显示全部楼层

第一,回复的稍微有一点点早
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2022-1-14 18:49:45 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2022-1-14 20:11:40 | 显示全部楼层
震惊!小师妹竟然指使电脑作弊!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2022-1-14 20:15:46 | 显示全部楼层
先帮小师妹写好代码:@鱼C-小师妹
  1. a = int(input("欢迎来到石头剪刀布游戏,输入(1:石头 2:剪刀 3:布):"))
  2. if a==1:
  3.     print("计算机出的是布!你输了!")
  4. elif a == 2:
  5.     print("计算机出的是石头!你输了!")
  6. elif a == 3:
  7.     print("计算机出的是剪刀!你输了!")
  8. else:
  9.     print("你没有输入值!你输了!")

复制代码

评分

参与人数 1荣誉 +1 收起 理由
1molHF + 1 鱼C有你更精彩^_^

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2022-1-15 09:34:35 | 显示全部楼层
是做游戏修改器嘛?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2022-1-15 09:46:43 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2022-1-15 10:10:52 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2022-1-15 21:30:09 | 显示全部楼层
回复
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2022-1-16 10:12:23 | 显示全部楼层
肥复
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2022-1-16 10:25:20 | 显示全部楼层
回复
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2022-1-16 12:32:09 | 显示全部楼层
1
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2022-1-16 13:35:37 | 显示全部楼层
1
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2022-1-16 14:04:21 From FishC Mobile | 显示全部楼层
1
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2022-1-16 18:49:31 | 显示全部楼层
xiaosi4081 发表于 2022-1-14 20:15
先帮小师妹写好代码:@鱼C-小师妹

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

课程里是另一种更“骚”操作
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2022-1-17 10:17:44 From FishC Mobile | 显示全部楼层
来看看。。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2022-1-17 15:29:59 | 显示全部楼层
回复一下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2022-1-17 16:30:55 | 显示全部楼层
回复回复
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 昨天 11:09 From FishC Mobile | 显示全部楼层
回复
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1

GMT+8, 2022-1-26 04:40

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表