Python 尼姆遊戲 人機對戰

2022-09-11 10:45:17 字數 3907 閱讀 5250

實驗目的

實驗內容 n

目的數運算元x

n目的數

運算元x11

失敗17152

21118

1533*

ran19154

43120

15553

221156

63322

1577*

ran23158

87124

15997

2251510107

3261511117

4271512127

5281513137

6291514147

730151515*

ran31

*ran

1615132

311

'''模擬聰明版尼姆遊戲

一人進行「聰明操作」

另一人隨機生成數'''

import math

import random

defsmart

(n):

logn =

int(math.log(n,2)

)if n == math.

pow(

2, logn +1)

-1:return random.randint(1,

int(n/2)

)return n -

int(math.

pow(

2, logn))+

1def

playn

(n):

if n <=3:

return

1else

:return random.randint(1,

int(n/2)

)sumnum =

int(

input

("請輸入總和:"))

while sumnum >0:

tmp = sumnum

player_smart = smart(sumnum)

sumnum = sumnum - player_smart

tmp2 = sumnum

ifnot sumnum:

print

("player_smart失敗"

) player_random = playn(sumnum)

sumnum = sumnum - player_random

ifnot sumnum:

print

("player_random失敗"

)print

("原本總和,聰明玩家出數,聰明玩家出數後,隨機玩家出數,當前剩餘"

.format

(sumnum, player_smart, player_random,tmp,tmp2)

)

一方採取聰明演算法時,獲勝概率遠遠大於隨機出數
請輸入總和:123

原本總和123,聰明玩家出數60,聰明玩家出數後63,隨機玩家出數7,當前剩餘56

原本總和56,聰明玩家出數25,聰明玩家出數後31,隨機玩家出數8,當前剩餘23

原本總和23,聰明玩家出數8,聰明玩家出數後15,隨機玩家出數1,當前剩餘14

原本總和14,聰明玩家出數7,聰明玩家出數後7,隨機玩家出數3,當前剩餘4

原本總和4,聰明玩家出數1,聰明玩家出數後3,隨機玩家出數1,當前剩餘2

player_random失敗

原本總和2,聰明玩家出數1,聰明玩家出數後1,隨機玩家出數1,當前剩餘0

請輸入總和:263

原本總和263,聰明玩家出數8,聰明玩家出數後255,隨機玩家出數94,當前剩餘161

原本總和161,聰明玩家出數34,聰明玩家出數後127,隨機玩家出數21,當前剩餘106

原本總和106,聰明玩家出數43,聰明玩家出數後63,隨機玩家出數26,當前剩餘37

原本總和37,聰明玩家出數6,聰明玩家出數後31,隨機玩家出數10,當前剩餘21

原本總和21,聰明玩家出數6,聰明玩家出數後15,隨機玩家出數7,當前剩餘8

原本總和8,聰明玩家出數1,聰明玩家出數後7,隨機玩家出數3,當前剩餘4

原本總和4,聰明玩家出數1,聰明玩家出數後3,隨機玩家出數1,當前剩餘2

player_random失敗

原本總和2,聰明玩家出數1,聰明玩家出數後1,隨機玩家出數1,當前剩餘0

請輸入總和:1025

原本總和1025,聰明玩家出數2,聰明玩家出數後1023,隨機玩家出數122,當前剩餘901

原本總和901,聰明玩家出數390,聰明玩家出數後511,隨機玩家出數216,當前剩餘295

原本總和295,聰明玩家出數40,聰明玩家出數後255,隨機玩家出數29,當前剩餘226

原本總和226,聰明玩家出數99,聰明玩家出數後127,隨機玩家出數32,當前剩餘95

原本總和95,聰明玩家出數32,聰明玩家出數後63,隨機玩家出數27,當前剩餘36

原本總和36,聰明玩家出數5,聰明玩家出數後31,隨機玩家出數2,當前剩餘29

原本總和29,聰明玩家出數14,聰明玩家出數後15,隨機玩家出數2,當前剩餘13

原本總和13,聰明玩家出數6,聰明玩家出數後7,隨機玩家出數2,當前剩餘5

原本總和5,聰明玩家出數2,聰明玩家出數後3,隨機玩家出數1,當前剩餘2

player_random失敗

原本總和2,聰明玩家出數1,聰明玩家出數後1,隨機玩家出數1,當前剩餘0

'''常規方法'''

import random

defplayn

(n):

if n <=3:

return

1else

:return random.randint(1,

int(n/2)

)sumnum =

int(

input

("請輸入總和"))

while sumnum >0:

tmp = sumnum

player1 = playn(sumnum)

sumnum = sumnum - player1

ifnot sumnum:

print

("player1失敗"

) player2 = playn(sumnum)

sumnum = sumnum - player2

ifnot sumnum:

print

("player2失敗"

)print

("原本總和當前剩餘,玩家1出數,玩家2出數"

.format

(sumnum, player1, player2,tmp)

)

雙方都隨機出數時,獲勝概率是相等的
請輸入總和123

原本總和123當前剩餘51,玩家1出數34,玩家2出數38

原本總和51當前剩餘29,玩家1出數13,玩家2出數9

原本總和29當前剩餘20,玩家1出數6,玩家2出數3

原本總和20當前剩餘8,玩家1出數4,玩家2出數8

原本總和8當前剩餘5,玩家1出數1,玩家2出數2

原本總和5當前剩餘2,玩家1出數2,玩家2出數1

player2失敗

原本總和2當前剩餘0,玩家1出數1,玩家2出數1

請輸入總和100

原本總和100當前剩餘56,玩家1出數14,玩家2出數30

原本總和56當前剩餘28,玩家1出數18,玩家2出數10

原本總和28當前剩餘22,玩家1出數5,玩家2出數1

原本總和22當前剩餘9,玩家1出數11,玩家2出數2

原本總和9當前剩餘3,玩家1出數3,玩家2出數3

原本總和3當前剩餘1,玩家1出數1,玩家2出數1

player1失敗

原本總和1當前剩餘-1,玩家1出數1,玩家2出數1

python實現尼姆遊戲

尼姆遊戲,這是乙個著名的遊戲,有很多變種玩法。兩個玩家輪流從一堆物品中拿走一部分。在每一步中,玩家可以自由選擇拿走多少物品,但是必須拿走一部並且最多只能拿走一半物品,然後輪到下乙個玩家。拿走最後乙個物品的玩家輸掉遊戲。先手隨機。sur bin nve python coding utf 8 impo...

python 聰明的尼姆遊戲

兩個玩家輪流從一堆物品中拿走一部分,在每一步中,玩家可以自由選擇拿走多少物品,但是必須至少拿走乙個並且最多只能拿走一半物品,然後輪到下乙個玩家。拿走最後乙個物品的玩家輸掉遊戲。在聰明模式中,計算機每次拿走足夠多的物品使得堆的大小是2 的冪次方減1 也就是3,7,15,31 或63。除了堆的大小已經是...

取石子遊戲之尼姆博弈

尼姆博弈 有三堆各若干個物品,兩個人輪流從某一堆取任意多的物品,規定每次至少取乙個,多者不限,最後取光者得勝 這種情況與二進位制有著很大的關係,我們用 a,b,c 來表示某種局勢,那麼 0,0,0 必然為奇異局勢,最後乙個面對這個局勢的必敗。0,n,n 也是種奇異局勢。因為如果對手在其中一堆取m個石...