一,題目
有火柴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
說明:作者:劉宏締 郵箱: 371125307@qq.com