谁能赢得最后的糖块?
第一步:如果现在有10块糖,两人轮流拿,每人只能拿1到2块糖,谁拿到了最后的糖块,谁胜出。请设计一个程序进行人机游戏,保证机器每次都赢。
第二步:继续完善上面的案例,要求1) 可以通过屏幕输入设置糖块的个数;2) 对人为输入的糖块进行合理性判断,如果不是1块或者2块,要求重新输入。根据输入糖块的总数判断机器先拿还是人先拿,总之最终保证经过多轮游戏之后,机器胜出。
思路历程: 程序最终运行结果:保证机器每次都赢 分析程序结束条件:当机器人拿到最后一份糖块(1块或2块),即当机器人拿完糖块之后,剩余糖块为0,则机器人获胜
程序模拟:
首先以10个糖为模板进行推导:
当机器进行拿糖前,如果剩余糖为1或2,则机器必然会赢得比赛
往前回溯
人拿到1或2个糖之后,剩余1或2个糖,即人拿糖之前,剩余3个糖
继续往前回溯
机器拿到1或2个糖后给人剩余3个糖,那么机器拿糖之前,有5个糖或4个糖
有5个糖时,机器拿走2个,有4个糖时,机器拿走1个,则人必然会输掉比赛
再往前回溯
当机器拿糖前有7个糖,或者8个糖,7个时,机器拿走1个,人拿走1个或两个,则给机器剩余4个或5个糖,机器必然会赢得比赛
8个时,机器拿走两个,人拿走一个或两个,则给机器剩余4个或5个糖,机器必然赢得比赛
综上,出现表格:
| 机器拿糖前剩余糖数 | 机器拿糖数 |
| 4 | 1 |
| 5 | 2 |
| 7 | 1 |
| 8 | 2 |
那么思考是否会出现
| 机器拿糖前剩余糖数 | 机器拿糖数 |
| 10 | 1 |
| 11 | 2 |
| 13 | 1 |
| 14 | 2 |
经简单验证,证得无误,经观察可得出,机器拿糖之前的数目与机器拿糖数有如下关系
| 机器那糖前剩余糖数 | 机器拿糖数 |
| 4+3*n | 1 |
| 4+3*n+1 | 2 |
接下来进行实现(这里因为思路全部导通,就不再进行赘述,直接放代码了 ^_^)
import random
def judge_int():#限定输入int类型的糖块,并且需要限制糖块数量大于2
while True:
try:
n = eval(input("请输入糖块个数:"))
if type(n) == int:
if n <= 0:
print("输入糖块个数不是正整数!")
elif n <= 2:
print("这样太欺负人了!换个数字吧*-*")
else:
return n
else :
print("输入不是整数!")
except :
print("输入不是整数!")
def judge_clint():#限定客户输入为1或2
while True:
try:
n = eval(input("请输入你要拿的糖块数:"))
if n > 2:
print("你拿的太多啦!")
pass
elif n < 1:
print("你拿糖块了吗??咱这么热情,你不给面子?")
pass
elif type(n) == int:
return n
else:
print("我可没办法给你切{:}块糖".format(n))
except:
print("请不要胡乱输入!")
def judge_rbt(a):#判断机器人应该拿糖的数量
if a == 1 or a == 2:
return a
elif (a-4)%3 == 0:
return 1
elif (a-5)%3 == 0:
return 2
else:return random.randint(1,2)
def major_process(op):
global a
while True:
if op == 1:
c = judge_rbt(a)#这里判断出机器人应该拿的数量
print("机器人拿走了{}块糖 *>-<*".format(c))
a-=c
print("现在一共有{}块糖".format(a))
if a <= 0 :
print("机器人赢啦!n------------------------------------------")
break
b = judge_clint()
a-=b
print("现在一共有{}块糖".format(a))
else:
b = judge_clint()
a-=b
print("现在一共有{}块糖".format(a))
c = judge_rbt(a)#这里判断出机器人应该拿的数量
print("机器人拿走了{}块糖 *>-<*".format(c))
a-=c
print("现在一共有{}块糖".format(a))
if a <= 0 :
print("机器人赢啦!n------------------------------------------")
break
while True:
a = judge_int()
print("现在一共有{}块糖".format(a))
print("1.让机器人先拿n2.我先来n0.退出游戏")
try:
op = eval(input("请输入你的选择:"))
if type(op) == int:
if op == 1 or op == 2:
major_process(op)#这里进入主程序
pass
elif op == 0:
break
else:
print("请输入正确的选项!")
else:
print("请输入正确选项!")
except:
print("请输入正确选项!")



