python - 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)
解决方案
推荐阅读
- azure - 使用 Azure Function V2 Durable 函数时,ILogger 不记录到 Application Insights
- node.js - 有效负载到达工作人员时变得未定义
- excel - 为什么无法通过 VBA 保存使用 Internet Explorer 打开的文件?
- c++ - 无法截断文件以压缩它c ++
- sql - 如何将映射中的键/值提取到 spark sql 中的单独列中
- java - MRSW寄存器类的write方法有什么问题?
- python - 在 Azure 应用服务中使用 xgboost 时使用部署出错
- javascript - 同一网页上的两个 jQuery 对话框有问题
- c - 如何按字母顺序对句子中的每个单词进行排序?
- node.js - RxJS:我如何将 bindNodeCallback() 视为可以将运算符链接到它的 Observable?