一,题目
有火柴21根,两人依次取,
每次每人只可取走1~4根,
不能多取,也不能不取,
谁取到最后一根火柴谁输。
请编写一个人机对弈程序,
要求人先取,计算机后取;
计算机为“常胜将军”。
二,解析
要想让计算机是“常胜将军”,就需要让人取到最后一根火柴。这个怎么实现?就是在倒数第二轮时计算机只剩下1根火柴给人,因为此时人至少取1根火柴。这样就可保证计算机常胜了
为了计算机能够取到倒数第二根火柴,就要保证倒数第二轮开始前剩下5+1=6棵火柴。因为只有这样才能保证无论人怎样取火柴,计算机都能将1根之外的火柴全部取走。
以此类推
21根火柴,在人先取计算机后取、每次取1~4根的前提下,只要保证每一轮的抽取(人先取一次,计算机再取一次)时人抽到的火柴数与计算机抽到的火柴数之和为5,就可以实现计算机的常胜不败
因为这样可以保证到人取火柴剩余数量为1
三,代码实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
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
说明:作者:刘宏缔 邮箱: [email protected]