Python算法--豆堆问题

堆里有 16 颗豆子,有两个玩家(假设一个玩家是电脑) 。每个玩家都可以从堆中的 16 颗豆子中取出 1 颗, 2 颗或者 3 颗豆子。每个玩家在每回合中必须从堆中取出一定数目的豆子。玩家轮流取出豆子,取到最后 一颗豆子的玩家是输家。 思路: 写一个人取豆子的函数 ; 帮电脑设计一个算法,实现取豆子的函数 ; 在主程序中进行输流调用,谁 最后拿到 1 粒豆子谁就输。
算法设计:

  • 取出的豆子设为变量beans

  • 电脑取出记为bean1

  • 玩家取出记为bean2

  • 每次完成取豆,beans+,并且返回beans结果,传递给下一个玩家

  • 当beans为16时,游戏结束

    (一)玩家开挂,简单模式

  • 电脑先取,玩家后取

  • 电脑完全随机,玩家手动输入

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import random
# beans为取出的豆子数
beans = 0
def computer(beans):
bean1 = random.randint(1,3)
print("电脑取出",bean1)
beans += bean1
print("现在已经取出",beans)
return beans

def play(beans):
bean2 = int(input("请玩家取豆,只能取1,2,3"))
print("玩家取出",bean2)
beans += bean2
print("现在已经取出", beans)
return beans
while(int(beans) < 16):
beans = computer(beans)
if(int(beans) >= 16):
print("电脑输了")
break
beans = play(beans)
if(int(beans) >= 16):
print("玩家输了")

(二)电脑开挂,困难模式

  • 玩家先来,电脑后取
  • 电脑在beans<12时随机,否则使beans逼近15
    代码:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    import random
    # beans为取出的豆子数
    beans = 0
    def computer(beans):
    #bea1 = (16-beans)%4
    #将取出的豆子数逼近15
    if(beans < 12):
    bean1 = random.randint(1, 3)
    if(beans == 12):
    bean1 = 3
    if(beans == 13):
    bean1 = 2
    if(beans >= 14):
    bean1 = 1
    print("电脑取出",bean1)
    beans += bean1
    print("现在已经取出",beans)
    return beans
    def play(beans):
    bean2 = int(input("请玩家取豆,只能取1,2,3"))
    print("玩家取出",bean2)
    beans += bean2
    print("现在已经取出", beans)
    return beans
    while(int(beans) < 16):
    # 要想电脑赢,电脑应该后取
    beans = play(beans)
    if(int(beans) >= 16):
    print("玩家输了")
    break
    beans = computer(beans)
    if (int(beans) >= 16):
    print("电脑输了")
    但是如果取出的豆子为11,遇上聪明玩家电脑必输
    取出11 电脑 1 玩家 3 电脑 1—–》电脑输了
    取出11 电脑 2 玩家 2 电脑 1—–》电脑输了
    取出11 电脑 3 玩家 1 电脑 1—–》电脑输了