我是高中的学生,在俄罗斯方块进行总结性项目。最近我遇到了这个问题,对于某些位置,当我的块与屏幕右侧发生碰撞时,它会发生一些“闪烁”。我似乎无法找到它为什么会这样做的原因,而且我不知道这个形状是否已经走出网格然后进入并再次被吸引,我不确定很困惑。
到目前为止,我已经能够在第一个撞击地面后产生随机块,我已经能够正确地与左侧碰撞所有块,一些堆叠和旋转工作同样。我已经包含了我如何编写代码的主要思想,因为很多内容都重复了,所以我包含了两个例子。 (2种不同的旋转,2种方式显示我如何绘制块等)
我真的陷入困境,如果有人可以提供帮助那就太棒了,谢谢你。
import pygame
import colors
import random
class Shape:
def __init__ (self, x, y, shape1, shape2, shape3, shape4, shapeType):
self.shape1 = shape1
self.shape2 = shape2
self.shape3 = shape3
self.shape4 = shape4
self.x = x
self.y = y
self.lasty = 0
self.direction = 0
self.collided = False
self.fc = 0
self.shapeType = shapeType
def draw (self, screen):
self.lasty = self.y
self.fc += 1
if pygame.key.get_pressed()[pygame.K_DOWN] and self.fc >= 5:
self.fc = 0
self.y += 39
elif self.fc >= 90:
self.fc = 0
self.y += 39
if pygame.key.get_pressed()[pygame.K_RIGHT] and self.fc >= 5:
self.fc = 0
self.x += 39
elif self.fc >= 90:
self.fc = 0
self.x += 39
## When the block collides with the bottom of the grid
if self.y >= 778:
self.y = 0
## I USE 'DIRECTION' TO REPRESENT THE DIFFERENT ROTATED POSITIONS -- ONLY 1 IS SHOWN BELOW BUT I HAVE (0-3 DIRECTIONS) = 4 DIFFERENT ROTATIONS
if self.direction == 0: # if the shape is in the first position
for y in range(len(self.shape1)): # RUNS A LOOP THAT GETS THE LENGTH OF THE SHAPE IN THE FIRST POSITION
for x in range(len(self.shape1[y])):
if self.shape1[y][x] == 1 and not self.collided:
if (self.y + 39*y) + 39 > 780: # CHECKS THAT THE SHAPE IS NOT GOING PASSED THE RIGHT SIDE OF THE GRID
self.collided = True
if (self.x + (39*x)) >= 739:
self.x = 740-(39*x)-39
for blok in blocks: ## stacking the blocks and checking if the block collides with the other blocks
if self.x + (39*x) == blok.x and self.y + (39*y) == blok.y:
self.collided = True
pygame.draw.rect(screen, colors.lightBlue,(self.x + (39*x), self.y + (39*y), 39,39))
elif self.direction == 1: # WHEN THE SHAPE IS IN THE SECOND ROTATION
for y in range(len(self.shape2)):
for x in range(len(self.shape2[y])):
if self.shape2[y][x] == 1 and not self.collided:
if(self.y + 39*y) + 39 > 780:
self.collided = True
if (self.x + (39*x)) >= 739:
self.x = 740-(39*x)-39
for blok in blocks:
if self.x + (39*x) == blok.x and self.y + (39*y) == blok.y:
self.collided = True
pygame.draw.rect(screen, colors.lightBlue,(self.x + (39*x), self.y + (39*y), 39,39))
if self.collided == True:
self.y = self.lasty
if self.direction == 0:
for y in range(len(self.shape1)):
for x in range(len(self.shape1[y])):
if self.shape1[y][x] == 1:
blocks.append(Block(self.x + (39 * x), self.y + (39 * y)))
elif self.direction == 1:
for y in range(len(self.shape2)):
for x in range(len(self.shape2[y])):
if self.shape2[y][x] == 1:
blocks.append(Block(self.x + (39 * x), self.y + (39 * y)))
class Block:
def __init__(self, x, y):
self.x = x
self.y = y
def draw(self, screen):
pygame.draw.rect(screen, colors.lightBlue, (self.x, self.y, 39, 39))
blocks = []
## EXAMPLE OF HOW EACH SHAPE IS DRAWN
## L SHAPE
b = Shape(350,0, [[1,1],[0,1],[0,1]], [[0,0,1],[1,1,1]], [[1,0,],[1,0], [1,1]], [[1,1,1],[1,0,0]],"L SHAPE")
## Z SHAPE
##b = Shape(300,300, [[0,1],[1,1],[1,0]], [[1,1],[0,1,1]], [[0,1],[1,1],[1,0]], [[1,1],[0,1,1]])
# FUNCTION FOR THE GRID
def drawGrid(_x, _y, screen,width,height, columns,rows ):
for y in range(0, rows+1):
for x in range(0, columns+1):
screen.fill(colors.grey, [(x*(width/columns))+_x, _y, 1, height])
screen.fill(colors.grey, [_x, (y*(height/rows))+_y, width, 1])
def drawGame(screen, scene): # UPDATING DRAW FUNCTION
global b
for evn in pygame.event.get():
if evn.type == pygame.QUIT:
quit()
return scene, True
elif evn.type == pygame.KEYDOWN:
if evn.key == pygame.K_UP: # IF THE UP ARROW KEY IS PRESSED, CHANGE THE ROTATION OF THE SHAPE
b.direction += 1
if b.direction == 4: # IF THE DIRECTION EQUALS 4 RESET TO THE FIRST POSITION
b.direction = 0
screen.fill(colors.black)
## ACCELERATES THE BLOCK DOWNWARDS
drawGrid(350, 0, screen, 390, 780, 10, 20)
if not b.collided:
b.draw(screen)
else: # CHECKS WHICH VALUE OUT OF (0-6) IS RECEIVED TO CHOOSE THE RANDOM SHAPE
i = random.randint(0,6)
if i == 0:
## L shape
b = Shape(350,0, [[1,1],[0,1],[0,1]], [[0,0,1],[1,1,1]], [[1,0,],[1,0], [1,1]], [[1,1,1],[1,0,0]],"L SHAPE")
elif i == 5:
## Z Shape
b = Shape(350, 0, [[0, 1], [1, 1], [1, 0]], [[1, 1], [0, 1, 1]], [[0, 1], [1, 1], [1, 0]],
[[1, 1], [0, 1, 1]],"Z SHAPE")
for i in blocks: # RUNS THE LOOP TO DRAW THE SHAPE
i.draw(screen) # DRAWS THE VALUE OF 'i' ONTO THE SCREEN
pygame.display.flip()
return scene, False
答案 0 :(得分:0)
事实证明,我正在绘制一些绘制循环中的矩形,然后检查其中一些是否与墙壁发生碰撞。