fcz1116 发表于 2023-3-17 14:52

Python:谁能赢得最后的糖块?

​第一步:
如果现在有10块糖,两人轮流拿,每人只能拿1到2块糖,谁拿到了最后的糖块,谁胜出。请设计一个程序进行人机游戏,保证机器每次都赢。
第二步:
继续完善上面的案例,要求1)可以通过屏幕输入设置糖块的个数;2)对人为输入的糖块进行合理性判断,如果不是1块或者2块,要求重新输入。根据输入糖块的总数判断机
器先拿还是人先拿,总之最终保证经过多轮游戏之后,机器胜出。
问题分析:
决定赢取决于最后,最后机器拿即可,因此,最后拿1或2,所以过程就是补全3的过程,即1+2,因此,人拿2,机器拿1,人拿1,机器拿2,开始的时候如果是3的倍数,人先拿,这样最后就是机器拿,不是3的倍数就机器先拿,使其成为3的倍数,这样无论如何都可以使机器获胜。
为了防止人的输入错误,因此列出如下代码:


choice=eval(input("请输入是否选择输入糖果数量(1-输入 0-默认10)"))
if(choice):
    n=eval(input("请输入糖果数量,一个大于0的整数"))
    while(n<=0 or not isinstance(n, int)):
      n=eval(input("格式错误,请重新输入糖果数量,一个大于0的整数"))
else:
    n=10
t=int(n%3)
if(t):
    print("机器先拿糖,拿走%d块"%t)
else:
   t=eval(input("你先拿糖,请拿走糖果数量(1或2):"))
n-=t
print("剩余%d块"%n)
t=n%3
if(t):
    print("机器拿糖,拿走%d块"%t)
    n-=t
    print("剩余%d块"%n)
while(n):
   t=eval(input("请输入拿走糖果数量(1或2):"))
   while(t!=1 and t!=2):
       t=eval(input("输入错误,请重新输入拿走糖果数量(1或2):"))
   n-=t;
   print("剩余%d块"%n)
   t=3-t
   print("机器拿糖,拿走%d块"%t)
   n-=t
   print("剩余%d块"%n)
print("机器获胜")


内师大
20计科汉一
指导老师:希闰高娃

dleo 发表于 2023-3-17 18:14

这个难道不是一个奥数题? 海盗金币

hc1jy 发表于 2023-3-19 00:17

本帖最后由 hc1jy 于 2023-3-19 00:20 编辑

eval这个函数还是建议不要让用户可以控制输入,因为这个函数可以进行命令执行,有些安全隐患
你可以试试在你的第一个输入里输入__import__(“os”).system(“dir”)

fcz1116 发表于 2023-3-20 17:10

hc1jy 发表于 2023-3-19 00:17
eval这个函数还是建议不要让用户可以控制输入,因为这个函数可以进行命令执行,有些安全隐患
你可以试试 ...

感谢提醒
页: [1]
查看完整版本: Python:谁能赢得最后的糖块?