python算法:常胜将军

一,题目

有火柴21根,两人依次取,
每次每人只可取走1~4根,
不能多取,也不能不取,
谁取到最后一根火柴谁输。

请编写一个人机对弈程序,
要求人先取,计算机后取;
计算机为“常胜将军”。

二,解析

要想让计算机是“常胜将军”,就需要让人取到最后一根火柴。这个怎么实现?就是在倒数第二轮时计算机只剩下1根火柴给人,因为此时人至少取1根火柴。这样就可保证计算机常胜了

为了计算机能够取到倒数第二根火柴,就要保证倒数第二轮开始前剩下5+1=6棵火柴。因为只有这样才能保证无论人怎样取火柴,计算机都能将1根之外的火柴全部取走。

以此类推
21根火柴,在人先取计算机后取、每次取1~4根的前提下,只要保证每一轮的抽取(人先取一次,计算机再取一次)时人抽到的火柴数与计算机抽到的火柴数之和为5,就可以实现计算机的常胜不败
因为这样可以保证到人取火柴剩余数量为1

三,代码实现

total = 21   # 火柴总数为21根
print("开始游戏: ")
while 1:
    print(f"--------当前还剩火柴{total}根--------")
    people = int(input("人取火柴:")) # 人取火柴
    if people < 1 or people > 4 or people > total:
        print("取火柴数量有问题!")
        continue
    total = total-people  # 人取后,剩余的火柴数
    # 人取后,剩余的火柴数为0,则计算机获胜,跳出循环
    if total == 0:
        print("计算机获胜,游戏结束!")
        break
    # 计算机取火柴
    computer = 5 - people
    total = total - computer
    print(f"计算机取火柴:{computer}")
    # 计算机取后,剩余的火柴数为0,则人获胜,跳出循环
    if total == 0:
        print("人获胜,游戏结束!")
        break

运行结果:

开始游戏: 
--------当前还剩火柴21根--------
人取火柴:3
计算机取火柴:2
--------当前还剩火柴16根--------
人取火柴:4
计算机取火柴:1
--------当前还剩火柴11根--------
人取火柴:2
计算机取火柴:3
--------当前还剩火柴6根--------
人取火柴:1
计算机取火柴:4
--------当前还剩火柴1根--------
人取火柴:1
计算机获胜,游戏结束!

说明:刘宏缔的架构森林—专注it技术的博客,
网址:https://imgtouch.com
本文: https://blog.imgtouch.com/index.php/2024/03/30/python-suan-fa-chang-sheng-jiang-jun/
代码: https://github.com/liuhongdi/https://gitee.com/liuhongdi
说明:作者:刘宏缔 邮箱: 371125307@qq.com

QR:python算法:常胜将军

发表回复