【发布时间】:2022-01-22 19:18:13
【问题描述】:
说明
所以我决定使用 PyGame 在 Python 中制作一个蛇游戏。为了好玩,我决定使用链表来表示蛇。最初我认为要移动蛇,我必须将每个值移向头节点的新目标位置,然后用它的新目标更新头节点。我很快意识到这种方法过于复杂且不必要。然而,在我尝试通过将链表中的所有值移向头部并随后用它的新值更新头部来实现它时,我最终破坏了我的链表。这是在我运行代码以移动值并更新磁头后发生的情况。 头部是表格的第一行。
链表中数据的原始打印输出
| x | y |
|---|---|
| 100 | 50 |
| 90 | 50 |
| 80 | 50 |
| 70 | 50 |
移位后的数据打印输出
| x | y |
|---|---|
| 100 | 50 |
| 100 | 50 |
| 90 | 50 |
| 80 | 50 |
这就是我们想要的。每一行都已正确移动。所有需要做的就是更新头部。在这种情况下,蛇正在上升,间隔为 10,因此我们将头部中的 y 更新 10。完成后会发生这种情况。
| x | y |
|---|---|
| 100 | 60 |
| 100 | 60 |
| 90 | 50 |
| 80 | 50 |
当更新头部中的数据时,下一个节点现在也同时更新。如果我在移动数据后尝试以相同的方式更新第二个节点,也会发生同样的事情。如果我在改变值之前尝试这样做,一切正常,所以当我改变值时似乎发生了一些事情。我通过 print(node) 检查了每个节点的内存地址,它们都是不同的。
另外,如果我更新第 3 或第 4 个节点的数据属性,它可以正常工作,而其他节点则保持不变。所以这只是移位后第一个和第二个节点的特征。
这是我为移动列表中的值而编写的代码
def Move(self, direction):
if(direction == 'UP'):
oldvalue = self.linkedlist.head.data
tempnode = self.linkedlist.head
tempv = None
while(tempnode.nextnode is not None):
tempnode = tempnode.nextnode
tempv = tempnode.data
tempnode.data = oldvalue
oldvalue = tempv
self.linkedlist.printList()
self.linkedlist.head.data[1] += 10
如果这很难理解,我只需使用 2 个临时变量来存储当前节点中的数据和前一个节点中的数据。用之前的节点数据更新下一个节点,然后将当前节点的数据再次存储在 tempv 中。
以防万一我将在下面提供我的链表实现的代码。
from Node import Node
class LinkedList:
def __init__(self):
self.head = None
def printList(self):
printnode = self.head
while(printnode is not None):
print(f'{printnode.data}')
printnode = printnode.nextnode
print('')
class Node:
def __init__(self, data = None):
self.data = data
self.nextnode = None
感谢您的帮助,如果解决方案很简单,我深表歉意。我盯着看了几个小时,也试图找到类似的帖子,但无济于事。
【问题讨论】: