1

小さくてシンプルなゲームを作ろうとしています。でも今まで色々と悩んでいました。(私はpygameにかなり慣れていません)

この問題は、次のコードから発生します。

    #The blocks' code
    for block in blocklist:
        #Blocks Collide
        if any(block.rect.colliderect(x.rect) for x in blocklist if x is not block):
            x=(int(mse[0]) / 32)*32
            y=(int(mse[1]) / 32)*32
            blockpairs = itertools.combinations(blocklist,2) #2 for pairs
            remlist = frozenset(b2 for b1,b2 in blockpairs if b1.rect.colliderect(b2.rect))
            blocklist = [block for block in blocklist if block not in remlist]
            for block in remlist:
                print 'killed it'
                blocklist.remove(block)

次のエラーが表示されます。

Traceback (most recent call last):
  File "C:\Users\samis_000\Desktop\blockgame.pyw", line 43, in <module>
    blocklist.remove(block)
ValueError: list.remove(x): x not in list

私は何がうまくいかないのか理解していません!

全体としてのコードは次のとおりです。

#Import required modules
import pygame
from pygame.locals import *
import itertools
pygame.init()
screen=pygame.display.set_mode((640,480),0)

#Define class for the blocks
class Block(object):

    sprite = pygame.image.load("dirt.png").convert_alpha()

    def __init__(self, x, y):
        self.rect = self.sprite.get_rect(top=y, left=x)

#Create the list for the blocks
blocklist = []

#Main Loop
while True:
    #Test for events
    for event in pygame.event.get():
        #Left mouse released event
        if event.type == pygame.MOUSEBUTTONUP:
            mse=pygame.mouse.get_pos()
            x=(int(mse[0]) / 32)*32
            y=(int(mse[1]) / 32)*32
            blocklist.append(Block(x,y))
        #Close button event
        if event.type == QUIT:
            exit()
    #The blocks' code
    for block in blocklist:
        #Blocks Collide
        if any(block.rect.colliderect(x.rect) for x in blocklist if x is not block):
            x=(int(mse[0]) / 32)*32
            y=(int(mse[1]) / 32)*32
            blockpairs = itertools.combinations(blocklist,2) #2 for pairs
            remlist = frozenset(b2 for b1,b2 in blockpairs if b1.rect.colliderect(b2.rect))
            blocklist = [block for block in blocklist if block not in remlist]
            for block in remlist:
                print 'killed it'
                blocklist.remove(block)
        #Display blocks
        screen.blit(block.sprite, block.rect)
    #Update the screen
    pygame.display.update()

また、ブロックをクリックして削除できるように、これを実装できるようにする必要もあります。

これが質問するには多すぎる場合は申し訳ありません:/

4

2 に答える 2

1

あなたがここで何をしようとしているのか分かりません:

if any(block.rect.colliderect(x.rect) for x in blocklist if x is not block):
            x=(int(mse[0]) / 32)*32
            y=(int(mse[1]) / 32)*32
            blockpairs = itertools.combinations(blocklist,2) #2 for pairs
            remlist = frozenset(b2 for b1,b2 in blockpairs if b1.rect.colliderect(b2.rect))
            blocklist = [block for block in blocklist if block not in remlist]
            for block in remlist:
                print 'killed it'
                blocklist.remove(block)

マウスでクリックしてブロックを作成および削除する場合は、次の例をご覧ください (非常に簡単に理解できるはずです)。

import pygame
from pygame.locals import *

pygame.init()
screen=pygame.display.set_mode((640,480))

class Block(object):
    sprite = pygame.image.load("dirt.png").convert_alpha()
    def __init__(self, x, y):
        # since x and y will be the mouse position,
        # let x and y be the center of the block
        self.rect = self.sprite.get_rect(centery=y, centerx=x)

blocklist = []

while True:
    # don't forget to clear the screen
    screen.fill((0, 0, 0))
    mouse_pos = pygame.mouse.get_pos()

    for event in pygame.event.get():
        if event.type == QUIT: exit()
        if event.type == pygame.MOUSEBUTTONUP: 
            # get all blocks that "collide" with the current mouse position
            to_remove = [b for b in blocklist if b.rect.collidepoint(mouse_pos)]
            for b in to_remove:
                blocklist.remove(b)

            # if we didn't remove a block, we create a new one
            if not to_remove:
                blocklist.append(Block(*mouse_pos))

    for b in blocklist:
        screen.blit(b.sprite, b.rect)

    pygame.display.update()
于 2013-09-23T14:03:15.017 に答える
0

あなたがやる

blocklist = [block for block in blocklist if block not in remlist]

からのすべてのブロックremlistはもうありませんblocklist...

for block in remlist:
    print 'killed it'

...だから、それらを削除することはできません...

    blocklist.remove(block)

そのため、エラーがスローされます。その最後の行を削除するだけで、エラーが停止するはずです。

于 2013-09-23T14:04:34.723 に答える