【问题标题】:Change variable to be used inside loop (Python)更改要在循环内使用的变量(Python)
【发布时间】:2014-02-24 15:00:29
【问题描述】:

所以我正在编写一个跳棋游戏,我遇到的问题是在一个循环中创建多个棋子。我有代码的类创建部分,我不会在这里发布,其余的,我要发布,但我不知道如何更改循环将要使用的变量。如果您能帮我解决这个问题,我将不胜感激。

很抱歉将我的代码发布为图片,我是这个网站(和编程)的新手,无法格式化以便网站接受我的帖子。我真的希望你们能帮助我!

感谢您的帮助!

进一步说明:每次循环运行时,我都需要使用不同的“片段”创建。这意味着第一个循环必须创建piece1,然后是piece2,然后是piece3......等等

编辑:发布整个代码。我知道格式不对,没办法。所以,希望有人能解决它。

class Piece:
    def __init__(self, kind, yposition, xposition):
        self.color = kind
        self.ypos = xposition
        self.xpos = yposition

    def getColor(self):
        return self.getColor

    def adjustY(self, change):
        self.ypos = self.ypos + change

    def adjustX(self, change):
        self.xpos = self.xpos + change

    def getY(self):
        return self.ypos

    def getX(self):
        return self.xpos

    def mover(self, direction):
        self.direc = direction
        if self.direc == "right" and self.color == "white":
            for n in alist:
                if n.getY == (self.getY - 1) and n.getX == (self.getX + 1):
                    pass
                    # NOT YET IMPLEMENTED

                else:
                    self.adjustY(-1)
                    self.adjustX(+1)

        elif self.direc == "left" and self.color == "white":
            for n in alist:
                if n.getY == (self.getY - 1) and n.getX == (self.getX - 1):
                    pass
                    # NOT YET IMPLEMENTED

                else:
                    self.adjustY(-1)
                    self.adjustX(-1)
        elif self.direc == "right" and self.color == "black":
            for n in alist:
                if n.getY == (self.getY + 1) and n.getX == (self.getX + 1):
                    pass
                    # NOT YET IMPLEMENTED

                else:
                    self.adjustY(+1)
                    self.adjustX(+1)

        else:
            for n in alist:
                if n.getY == (self.getY + 1) and n.getX == (self.getX - 1):
                    pass
                    # NOT YET IMPLEMENTED

                else:
                    self.adjustY(+1)
                    self.adjustX(-1)


piece1 = 0
piece2 = 0
piece3 = 0
piece4 = 0
piece5 = 0
piece6 = 0
piece7 = 0
piece8 = 0
piece9 = 0
piece10 = 0
piece11 = 0
piece12 = 0

alistb1 = [piece1,piece2,piece3,piece4,piece5,piece6,piece7,piece8,piece9,piece10,piece11,piece12]

k = 2

for i in range(0,11):
    if i >= 0 and i <5:
        j = 8
        m = 0

    elif i >= 5 and i < 9:
        j = 7
        m = 1

    else:
        j = 6
        m = 0
    alistb1[i] = Piece("white",j,(m + 1 + i * k))
    print(alistb1[i].getY())

# print(piece7.getY()) test reasons

PS: def mover 还没准备好。

【问题讨论】:

  • 你能修复你的帖子吗?将代码缩进 4 个空格,它将呈现为代码块。另外,发布你所有的代码。
  • 如有疑问,点击橙色问号即可查看markdown编辑帮助工具栏。或者,阅读this help page
  • 我想我已经完全修复了你的代码。还有一件事:don't use tabs for indentation.
  • 谢谢,希望有人能回答我:D
  • @farmerjoe 请回滚您的编辑,它在语法上不正确。

标签: python arrays variables python-3.x


【解决方案1】:

您不需要为每个部分分配一个变量。您已经在为您的作品使用列表。不用写piece1,你可以写pieces[0]。 (您确实需要注意列表从索引 0 开始。)

range 具有排他性权利约束。这意味着它不包括在内,您的范围以比该值小一结束。你想使用range(0,12)

在 python 中,您可以动态添加到列表中。您不需要分配足够的空间来容纳您的作品。您可以使用列表的.append() 方法。

现在编写代码的一种方法是:

pieces = []
for i in range(0, 12):      # 0-11
    if i < 5:
        pieces.append(Piece("white", 8, 1 + i*2))
    elif i < 9:
        pieces.append(Piece("white", 7, 2 + i*2))
    else:
        pieces.append(Piece("white", 6, 1 + i*2))

我冒昧地简化了您的条件语句(i 将始终为 &gt;= 0,如果 i &lt; 5 为假,则相反的 i &gt;= 5 为真,因此您无需重述它在您的 elif) 中删除 jkm,它们是不必要的变量,可以用文字替换以节省内存。

还有一件事:getColor 的实现将返回函数对象本身。我想你想做:

def getColor():
    return self.color

【讨论】:

  • 谢谢!这终于适用于大多数的作品。只有一件事。如果我使用 print(pieces[0].getY()) 它将返回一个空行(但是适用于 pieces[1] 和转发)。你知道为什么吗? @2rs2ts
  • @user3258512 编辑您的原始帖子以显示您现在使用的代码,以便我查看您是否复制了错误。
  • 它现在可以工作了,我发誓它只是神奇地发生了。感谢大家的帮助!
  • @user3258512 在您继续实现mover 时提供更多建议:确保您正在调用您的方法(使用括号),因为您只是在条件块中反复引用方法本身。我还建议您将alist 添加为mover 的参数。您可以将pieces 作为此参数传入。
【解决方案2】:

使用dictionaryloop

pieces = {}
# I'm assuming you want 12 pieces since your list has 12 pieces      
for i in range(1,13):  # range starts at m so, range(m,n) iterates from m up to n-1
    # I would suggest using more descriptive variable names if you can, row or column for example
    if i >= 0 and i <5:
        j = 8
        m = 0

    elif i >= 5 and i < 9:
       j = 7
       m = 1

    else:
       j = 6
       m = 0
    pieces['piece{}'.format(i)] = Piece("white",j,(m + 1 + i * k))

除非我误解了你,否则这应该做你想做的事。这也不是 C++,你不需要那些 get 方法,你可以简单地Piece.color 来获取一块的颜色属性。

使用字典访问片段,pieces['piece1'].whatever()。但是,为简洁起见,您不需要pieces['piece{}.format(i)],您只需pieces[i] 即可访问该作品pieces[1].whatever()

更多关于字典的信息http://docs.python.org/3.3/tutorial/datastructures.html#dictionaries

我所拥有的并且它可以正常工作:

class Piece:
    def __init__(self, kind, yposition, xposition):
        self.color = kind
        self.ypos = xposition
        self.xpos = yposition

    def getColor(self):
        return self.getColor

    def adjustY(self, change):
        self.ypos = self.ypos + change

    def adjustX(self, change):
        self.xpos = self.xpos + change

    def getY(self):
        return self.ypos

    def getX(self):
        return self.xpos

    def mover(self, direction):
        self.direc = direction
        if self.direc == "right" and self.color == "white":
            for n in alist:
                if n.getY == (self.getY - 1) and n.getX == (self.getX + 1):
                    pass
                    # NOT YET IMPLEMENTED

                else:
                    self.adjustY(-1)
                    self.adjustX(+1)

        elif self.direc == "left" and self.color == "white":
            for n in alist:
                if n.getY == (self.getY - 1) and n.getX == (self.getX - 1):
                    pass
                    # NOT YET IMPLEMENTED

                else:
                    self.adjustY(-1)
                    self.adjustX(-1)
        elif self.direc == "right" and self.color == "black":
            for n in alist:
                if n.getY == (self.getY + 1) and n.getX == (self.getX + 1):
                    pass
                    # NOT YET IMPLEMENTED

                else:
                    self.adjustY(+1)
                    self.adjustX(+1)

        else:
            for n in alist:
                if n.getY == (self.getY + 1) and n.getX == (self.getX - 1):
                    pass
                    # NOT YET IMPLEMENTED

                else:
                    self.adjustY(+1)
                    self.adjustX(-1)

k=2
pieces = {}
# I'm assuming you want 12 pieces since your list has 12 pieces      
for i in range(1,13):  # range starts at m so, range(m,n) iterates from m up to n-1
    # I would suggest using more descriptive variable names if you can, row or column for example
    if i >= 0 and i <5:
        j = 8
        m = 0

    elif i >= 5 and i < 9:
       j = 7
       m = 1

    else:
       j = 6
       m = 0
    pieces['piece{}'.format(i)] = Piece("white",j,(m + 1 + i * k))

输出:

>>> pieces['piece1'].color
'white'
>>> pieces['piece3'].color
'white'
>>> pieces['piece3'].xpos
8
>>> for key in pieces:
    print(key, pieces[key])


piece8 <__main__.Piece object at 0x000000000329A4E0>
piece9 <__main__.Piece object at 0x000000000329A550>
piece6 <__main__.Piece object at 0x000000000329A400>
piece7 <__main__.Piece object at 0x000000000329A470>
piece4 <__main__.Piece object at 0x000000000329A320>
piece5 <__main__.Piece object at 0x000000000329A390>
piece2 <__main__.Piece object at 0x0000000003287DA0>
piece3 <__main__.Piece object at 0x000000000329A2B0>
piece1 <__main__.Piece object at 0x00000000031D9CF8>
piece10 <__main__.Piece object at 0x000000000329A5C0>
piece11 <__main__.Piece object at 0x000000000329A630>
piece12 <__main__.Piece object at 0x000000000329A6A0>
>>> pieces['piece3'].mover('right')
Traceback (most recent call last):
  File "<pyshell#13>", line 1, in <module>
    pieces['piece3'].mover('right')
  File "C:/Users/Hannah/Documents/thing.py", line 25, in mover
    for n in alist:
NameError: global name 'alist' is not defined
>>> pieces['piece3'].xpos
8
>>> pieces['piece3'].adjustX(1)
>>> pieces['piece3'].xpos
9

请记住,字典是无序的,因此它们的打印顺序是任意的。

由于我的代码版本中没有alist,因此预计会在移动器上进行回溯。您需要修改 mover() 才能使用字典。使用 dicts 的一些有用方法:

>>> for n in pieces.values():  # iterates over the values in a dict
        n.color


'white'
'white'
'white'
'white'
'white'
'white'
'white'
'white'
'white'
'white'
'white'
'white'

>>> for n in pieces.keys():  # iterates over the keys
        print(n)


piece8
piece9
piece6
piece7
piece4
piece5
piece2
piece3
piece1
piece10
piece11
piece12

【讨论】:

  • 您的方法没有给我任何错误,但是,我无法访问我创建的任何作品。例如。 print(piece4.getY()) 不起作用。我该怎么办?另外:如果可能的话,你能解释一下你刚刚做了什么吗?只是这样我就不需要再问了:D顺便说一句,谢谢你的帮助!
  • 我确信 OP 正在为一个班级这样做,他们总是会告诉你使用 getter 和 setter。
  • @2rs2ts 其实我是为自己做的,还是个高中生:/
  • @user3258512 你好!
  • @2rs2ts 不知道是不是讽刺,也不是粗鲁,我非常感谢你们俩的帮助。
猜你喜欢
  • 2016-06-02
  • 2018-01-12
  • 1970-01-01
  • 2011-02-19
  • 1970-01-01
  • 2021-06-29
  • 2013-09-13
  • 1970-01-01
  • 2012-03-18
相关资源
最近更新 更多