Valhalla Legends Forums Archive | General Programming | [Python] Tetris

AuthorMessageTime
Noodlez
I'm trying to write a Tetris game in Python. I decided I'd use a matrix to represent the board 10x12 board. If theres a 1 draw a square, otherwise ignore it. I find this to be the most optimal way to detect when lines have been connected as well.

Anyway, the problem is python programmers got lazy.

The following code should generate a matrix:
[code]
def __init__( self, shape ):
if (p_shapes[shape]==1): #The middle finger piece
self.shapematrix = [[1]*3]*2]
self.rotate=0
[/code]

At first glance, it worked fine. Then I tried to make it my middle finger piece.

[code]
self.shapematrix[0][0] = 0
self.shapematrix[0][1] = 0
[/code]

The result? (This isn't from the exact same instance, but it demonstrates the problem.)

[code]
>>> test[0][0] = 0
>>> test[0][2] = 0
>>> test
[[0, 1, 0], [0, 1, 0]]
[/code]

As you can obviously deduce, the Python programmers decided that when someone wants to make a list *2, it's obviously gonna be the exact same list, so hey, why not make it a pointer?

I found a workaround, using a for loop to generate the matrix. This, however, is CPU hogging in the long run and I don't like it. If anyone out there can help, I'd appreciate it. Thanks.
July 1, 2004, 2:52 PM
St0rm.iD
It's not a bug...__mul__ is defined to make a shallow copy of the list. You'll want to do something like this:

[code]
import copy

class CopyList(list):
def __init__(self, *args):
list.__init__(self, list(args))
def __pow__(self, n):
newlist = CopyList()
for i in range(0, n):
newlist.extend(copy.deepcopy(self))
return newlist

#shapematrix = [[1]*3]*2]
shapematrix = CopyList(CopyList(1) ** 3) ** 2
print shapematrix
shapematrix[0][0] = 0
print shapematrix
[/code]

I wrote it to use the pow (**) operator instead of *, so it wouldn't break compatibility. You can pass varargs to the constructor to create a list. I just realize I didn't create a constructor that takes a list, so you might want to do that.

Look into the Psyco VM.
July 1, 2004, 3:22 PM

Search