首页 > 解决方案 > pygame俄罗斯方块堆叠块问题

问题描述

我是一个试图用pygame构建俄罗斯方块的新手。

我仍处于开始阶段,我被困在堆叠块上。

我可以堆叠一些块,但在某一时刻,它不会生成任何新块。

对于 handle_movement 函数,我做了一个逻辑,使它不会先通过 for 循环,但不知何故它卡在那里。

如果你看到,我该如何解决这个问题,请告诉我。我被困在这几天了,我真的很想让这个工作:)

我有两个 python 文件,一个是 main.py,另一个是 game_config.py 我将分享这两个代码。

提前致谢!

--------------main.py--------------

from numpy.core.defchararray import index
import game_config as g
from game_config import shape
import pygame
import numpy as np
import random


WIN = pygame.display.set_mode((g.WIDTH,g.HEIGHT))
pygame.display.set_caption("My First Game, Tetris")
block_img = pygame.image.load('IMG_1598.png')
block_img =  pygame.transform.scale(block_img, (g.grid_width,g.grid_height))

def draw2(shape_list):
    WIN.fill(g.WHITE)
    for shape in shape_list:
        for unit in shape.main:
            WIN.blit(block_img, (unit.x, unit.y))
    pygame.display.update()


def main():
    clock = pygame.time.Clock()
    status = np.zeros((g.grid_num_y,g.grid_num_x))
    shape = g.shape(random.choice(g.BLOCKS),0,status)
    shape_list = [shape]
    run = True
    j = 0
    while run:
        j += 1
        clock.tick(g.FPS)
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                run = False
        # if j % g.FPS == 0:        
        #     shape_list[-1].handle_movement(shape_list,keys_pressed,status,1)
        keys_pressed = pygame.key.get_pressed()
        shape_list[-1].handle_movement(shape_list,keys_pressed)
        draw2(shape_list)

    pygame.quit()


if __name__ == "__main__":
    main()

--------game_config.py----

# 20 * 10 square grid, each grid will have 30 pixels
import pygame
import numpy as np
import random
import time
grid_width = 35
grid_height = 35
grid_num_x = 10
grid_num_y = 20
VEL = 35
FPS = 15
WIDTH = grid_width * (grid_num_x)
HEIGHT = grid_height * (grid_num_y)

# Color
WHITE = (255,255,255)

# what do i need to define?

i = [pygame.Rect(0,0, grid_width,grid_height),
    pygame.Rect(0, grid_width,  grid_width, grid_height),
    pygame.Rect(0, grid_width*2,  grid_width, grid_height),
    pygame.Rect(0, grid_width*3,  grid_width, grid_height)]

j = [pygame.Rect(0,0, grid_width,grid_height),
    pygame.Rect(0, grid_width,  grid_width, grid_height),
    pygame.Rect(grid_width, grid_width,  grid_width, grid_height),
    pygame.Rect(grid_width*2, grid_width,  grid_width, grid_height)]

l = [pygame.Rect(0,grid_width, grid_width,grid_height),
    pygame.Rect(grid_width, grid_width,  grid_width, grid_height),
    pygame.Rect(grid_width*2, grid_width,  grid_width, grid_height),
    pygame.Rect(grid_width*2, 0,  grid_width, grid_height)]

o = [pygame.Rect(0,0, grid_width,grid_height),
    pygame.Rect(0, grid_width,  grid_width, grid_height),
    pygame.Rect(grid_width, grid_width,  grid_width, grid_height),
    pygame.Rect(grid_width, 0,  grid_width, grid_height)]

s = [pygame.Rect(0,grid_width, grid_width,grid_height),
    pygame.Rect(grid_width, grid_width,  grid_width, grid_height),
    pygame.Rect(grid_width, 0,  grid_width, grid_height),
    pygame.Rect(grid_width*2, 0,  grid_width, grid_height)]

t = [pygame.Rect(0,grid_width, grid_width,grid_height),
    pygame.Rect(grid_width, grid_width,  grid_width, grid_height),
    pygame.Rect(grid_width*2, grid_width,  grid_width, grid_height),
    pygame.Rect(grid_width, 0,  grid_width, grid_height)]

z = [pygame.Rect(0,0, grid_width,grid_height),
    pygame.Rect(grid_width, grid_width,  grid_width, grid_height),
    pygame.Rect(grid_width*2, grid_width,  grid_width, grid_height),
    pygame.Rect(grid_width, 0,  grid_width, grid_height)]

BLOCKS = [i,j,l,o,s,t,z]

class shape:

    def __init__(self,type,index,status):
        self.main = type  # block type
        self.index = index
        self.status = status
        
    def stacked(self,status):
        for unit in self.main:
            if unit.y == 19:
                print("-----<<<")
                print(self.index)
                print("----->>>>")
        result = False
        for unit in self.main:
            if (status[unit.y // grid_height + 1][unit.x // grid_width] == 1):
                return True
        return result
        
    def get_coor(self):
        coor = np.zeros((4,2))
        i = 0
        j = 0
        for unit in self.main:
            coor[i][j] = unit.x
            coor[i][j+1] = unit.y
            i += 1
        return coor

    def check_move(self):
        result = False
        for unit in self.main:
            if self.status[unit.y  // grid_height + 1][unit.x // grid_width] == 1: # if every block can move down
                result = True
        return result



    def stack(self,shape_list):
        for unit in self.main:
            self.status[unit.y // grid_height][unit.x // grid_width] = 1
        shape_list.append(shape(random.choice(BLOCKS),len(shape_list),self.status))
        
    
    

    def handle_movement(self,shape_list,keys_pressed):

        result = True
        
        for i in self.get_coor()[:,1]:
            if (i // grid_height) >= 19:
                result = False

        
        if keys_pressed[pygame.K_DOWN] and result:

            for unit in self.main:
                unit.y += grid_height
            if 19 * grid_height in self.get_coor()[:,1]: # if one of the unit is on the ground
                self.stack(shape_list)
                # I see that the previous block gets pushed
            elif self.check_move(): # if one of the unit is on top of existing unit, stack
                self.stack(shape_list)

标签: pythonpygametetris

解决方案


推荐阅读