拾取棒/智能AI / Python

时间:2014-10-31 21:56:26

标签: python

背景信息,如果您只是想用下面的代码查看问题,请不要阅读

我希望每个人都熟悉棍棒或“尼姆”游戏。如果没有,你设置一个起始量的棍子(10到50之间)和绘制(1-3支),直到没有任何棍子留下,宣告那个将最后一根棍子拉到输家的人。在我的编程课中,我们还包括了与AI对战的选项。但是,人工智能不再是随机选择数字1-3的假人。现在他从他的每个回合中学习。

实施

  • AI为剩下的每根木棒都有一个水桶。有一个桶用于1棒 左,2支,3支等

  • 在游戏开始时,每个桶中都有3个球。每个都标有选择 这些代表了AI选择1,2或3根棍子的选择。

  • 在AI轮到期间,从铲斗中取出一个随机球,代表数量 坚持离开。它读取球并从堆中移除那些数量的棍棒。然后呢 将球放在水桶前面。
  • 如果AI赢了比赛,那么它会经历所有的选择并将两个球放回去 所选择的每个选择的数字。增加选择球的机会 下一次它面临选择给定数量的棍棒。
  • 如果AI输了,那么它就会把球扔到水桶旁边。但是,如果选择了 球是最后的选择然后它把它放回桶里。桶必须包含at 每个号码中至少有一个。因此,如果用户选择了一个有多个棍棒的球 从一个水桶中挑选,这是该选择的最后一个球,然后如果AI输了,它必须放 那回球。它永远不会从桶中完全删除任何选择。
  • 随着更多比赛的进行,人工智能将通过额外的球赢得更好的选择 棍棒捡起来。“

这是我正在使用的代码。

choice=random.randint(1,maxchoice) #computer picks a random number
bucketnum=sticks #bucket to take ball from
pullnum=choice #ball to take 
for i in bucket:
    for bucket[bucketnum] in i:
        bucketnum.pop(pullnum)
    print(bucket[bucketnum])

我要拿出球的铲斗基本上就是剩下的杆数,我只是在铲斗列表中找到一个特定的铲斗然后取出球。现在我收到一条错误消息,说dbnum.pop(pullnum) - 'int'对象没有'pop'的属性?这是存储桶代码(列表中的列表):

bucket=[]
for j in range(51):
    bucket.append([1,2,3])

我可能会感到困惑,但如果有人有任何建议甚至是澄清问题,请回复。谢谢大家。

修改 这里有一些代码,对不起,我愚蠢的是不要添加变量的定义等。

            if option==2:
            sticks=""
            while True:
                    try:
                        sticks=int(input("Enter the number of sticks to begin with: "))
                        if sticks>=10 and sticks<=50:
                            print("Alright, there are",sticks,"sticks in the pile.")
                            break
                        else:
                            print("You mut enter an integer. (10-50)")
                    except ValueError:
                        print("You must enter an integer.")
            player1=True
            while sticks>0:
                maxchoice=min(3,sticks)
                choice=-1
                countbucket=0
                if player1:
                    while choice<1 or choice>maxchoice:                           
                        try:
                            choice=int(input("Player 1, how many sticks would you like to take? (1-3): "))
                            if choice>=1 and choice<=3:
                                sticks-=choice
                                print("There are",sticks,"sticks remaining.")
                            else:
                                print("You must enter an integer from 1-3.")
                        except ValueError:
                            print("You must enter an integer.")
                    player1=not player1
                else:
                    choice=random.randint(1,maxchoice)
                    bucketnum=sticks
                    pullnum=choice
                    for i in bucket:
                        for bucket[bucketnum] in i:
                            bucketnum.pop(pullnum)
                        print(bucket[bucketnum])
                    sticks-=1
                    print("Computer drew",choice,"stick(s). There are",sticks,"sticks remaining.")
                    player1=not player1
            if player1==False:
                print("Player 1 took the last stick.\nComputer wins!")
            else:
                print("Player 1 wins!")

这是我程序中的选项2,因为选项1是Player 1 vs. Player 2.显然我对AI智能的实现并没有太远,这有点棘手。

- - - - &GT;弗雷德S.,我刚刚开始,并有问题让心轮旋转。摘录的不是所有代码。我不是在问这个问题如何完成任务,虽然有关执行这个新的智能AI代码的提示会有所帮助,但在这种情况下,它更侧重于计算列表索引。

1 个答案:

答案 0 :(得分:2)

看起来你正在将内部for循环中的变量分配给'bucket [bucketnum]'。让我感到惊讶的是,这不是语法错误,但我认为这不是你想要实际做的事情。

如果您正在处理嵌套列表,并且列表中的位置对应于剩余的数量,那么您希望按位置索引该列表以获取该存储桶,而不是迭代该列表找到它。

如果您这样想:

buckets = [[1,2,3], ..., ..., ...]

然后,bucketnum是桶列表中存储桶的位置。因此,在您的情况下,如果您想抓住“26”支桶,您可以通过使用该数字索引存储桶来访问它。

buckets[25] # 25 since you're counting from 0+

此时,你有问题的存储桶,可以从中弹出选择。

bucket = buckets[25]
bucket.pop(pullnum)