python演算法:常勝將軍

刘宏缔的架构森林發表於2024-05-16

一,題目

有火柴21根,兩人依次取,
每次每人只可取走1~4根,
不能多取,也不能不取,
誰取到最後一根火柴誰輸。

請編寫一個人機對弈程式,
要求人先取,計算機後取;
計算機為“常勝將軍”。

二,解析

要想讓計算機是“常勝將軍”,就需要讓人取到最後一根火柴。這個怎麼實現?就是在倒數第二輪時計算機只剩下1根火柴給人,因為此時人至少取1根火柴。這樣就可保證計算機常勝了

為了計算機能夠取到倒數第二根火柴,就要保證倒數第二輪開始前剩下5+1=6棵火柴。因為只有這樣才能保證無論人怎樣取火柴,計算機都能將1根之外的火柴全部取走。

python演算法:常勝將軍

以此類推
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
說明:作者:劉宏締 郵箱: 371125307@qq.com

相關文章