Добрый день!
Уважаемые знатоки Питона, помогите!
Осваиваю этот замечательный язык, решил написать для себя игрушку (Тетрис), которая, пока, не доделана.
Специально использую минимум библиотеки pygame - пока только рисование квадратиков.
Вот код:
# программа (игра) тетрис
import pygame
import random
class PyTetris():
X,Y=0,0 # координаты перемещаемого объекта
TYPE = 0 # тип перемещаемого объекта
run = True # ключ запуска/остановки игры
win = None # окно в котором рисуем
keys = None # хранит все кнопки на которые нажимаем
newObjectKey = True # пока True - можно рисовать новый объект
matrix = [[],[]] # матрица объектов
# инициализация, выполняется при запуске программы
def __init__(self):
pygame.init() # инициализация библиотеки pygame
self.win = pygame.display.set_mode((300,500)) # создать окно
pygame.display.set_caption("Игра тетрис на Python+PyGame") # заголовок
self.run = True # переключатель в положение включено
# разрешено создавать новый объект
self.newObjectKey = True
# создать пустую матрицу
self.matrix = [[0 for x in range(30)] for y in range(50)]
# запуск игры
def start(self):
# основной цикл программы
while (self.run):
pygame.time.delay(200) # задержка в 0.1 сек.
# отслеживаем нажатые кнопки
for event in pygame.event.get():
# выход из игры
if event.type == pygame.QUIT:
self.run = False
# реализация игры
self.game()
# перерисовать полотно
self.reDrawMatrix()
# обновить полотно
pygame.display.update()
# выход
pygame.quit()
# перерисовка матрицы
def reDrawMatrix(self):
self.win.fill((0, 0, 0)) # закрасить все
for i in range(len(self.matrix)):
for j in range(len(self.matrix[i])):
# прорисовка фигур
x, y = i * 20, j * 20
if (self.matrix[i][j] == 1):
pygame.draw.rect(self.win, (0, 0, 255), (x, y, 20, 20)) # ВОТ ЭТО НЕ РАБОТАЕТ, ПОЧЕМУ?
if(self.matrix[i][j] == 2):
pygame.draw.rect(self.win, (150, 60, 55), (x, y, 20, 20))
# создать новый объект
def createNewObjectType(self,x,object_type):
# квадрат
if (object_type == 1):
self.matrix[x][0]=2
self.matrix[x+1][0] = 2
self.matrix[x][1] = 2
self.matrix[x+1][1] = 2
# запомнить положение нового объекта и его тип
self.X = x
self.Y = 0
self.TYPE = 1
# сдвинуть вниз объект
def down(self):
# если квадрат
if (self.TYPE==1):
# удалить на старом месте
self.matrix[self.X][self.Y] = 0
self.matrix[self.X + 1][self.Y + 1] = 0
self.matrix[self.X][self.Y + 1] = 0
self.matrix[self.X + 1][self.Y] = 0
# нарисовать на новом месте
self.matrix[self.X][self.Y+1] = 2
self.matrix[self.X + 1][self.Y+1] = 2
self.matrix[self.X][self.Y + 2] = 2
self.matrix[self.X + 1][self.Y + 2] = 2
# сохранить новые координаты
self.Y += 1
# смещение фигуры влево
def left(self):
# если квадрат
if (self.TYPE==1):
# удалить на старом месте
self.matrix[self.X][self.Y] = 0
self.matrix[self.X + 1][self.Y + 1] = 0
self.matrix[self.X][self.Y + 1] = 0
self.matrix[self.X + 1][self.Y] = 0
# нарисовать на новом месте
self.matrix[self.X-1][self.Y] = 2
self.matrix[self.X-1][self.Y+1] = 2
self.matrix[self.X][self.Y] = 2
self.matrix[self.X][self.Y+1] = 2
# сохранить новые координаты
self.X -= 1
# смещение фигуры вправо
def right(self):
# если квадрат
if (self.TYPE==1):
# удалить на старом месте
self.matrix[self.X][self.Y] = 0
self.matrix[self.X + 1][self.Y + 1] = 0
self.matrix[self.X][self.Y + 1] = 0
self.matrix[self.X + 1][self.Y] = 0
# нарисовать на новом месте
self.matrix[self.X+1][self.Y] = 2
self.matrix[self.X+1][self.Y + 1] = 2
self.matrix[self.X+2][self.Y] = 2
self.matrix[self.X+2][self.Y + 1] = 2
# сохранить новые координаты
self.X += 1
# проверить на достижение дна
def isBottom(self):
# проверяем, если квадрат
if (self.TYPE==1):
if (self.Y == 22):
# сменить тип фигуры в матрице на 1 (статичная)
self.matrix[self.X][self.Y] = 1
self.matrix[self.X + 1][self.Y] = 1
self.matrix[self.X][self.Y + 1] = 1
self.matrix[self.X + 1][self.Y + 1] = 1
self.newObjectKey = True
self.reDrawMatrix()
# проверить на столкновение со статичными объектами
def isCollision(self):
# если имеем дело с квадратом
if (self.TYPE==1):
# проверим, если внизу есть статичный объект
if (self.matrix[self.X][self.Y+3]) or (self.matrix[self.X+1][self.Y+3]):
# остановить объект и сделать его статичным
self.matrix[self.X][self.Y] = 1
self.matrix[self.X + 1][self.Y] = 1
self.matrix[self.X][self.Y + 1] = 1
self.matrix[self.X + 1][self.Y + 1] = 1
self.newObjectKey = True
# основной метод - реализация игры
def game(self):
# создать новый объект
if (self.newObjectKey == True):
# выбрать тип новой фигуры
objectType = random.randint(1,1)
# случайное положение по X
x = random.randint(0, 13)
# создать новую фигуру
self.createNewObjectType(x, objectType)
# не создавать новые объекты
self.newObjectKey = False
# если есть новый объект, то перемещать его вниз
if (self.newObjectKey == False):
# перехват нажатых кнопок
keys = pygame.key.get_pressed() # какие кнопки нажимаем
# проверить на смещение влево
if (keys[pygame.K_LEFT]) and (self.X > 0):
self.left()
# проверить на смещение вправо
if (keys[pygame.K_RIGHT]) and (self.X < 13):
self.right()
# проверить на столкновение
self.isCollision()
# проверить на достижение дна
self.isBottom()
# сместить вниз
self.down()
# запуск игры
pytetris = PyTetris()
pytetris.start()
Беда и непонимание в методе reDrawMatrix(self):
Вообщем, есть движущийся объект (он в матрице у меня имеет индекс 2)
Статичные объекты имеют индекс 1.
Статичные объекты должны быть синими, динамический (который падает) - красным
Вопрос: почему статичные объекты в def reDrawMatrix(self): не прорисовываются?
Спасибо!
Прошу прощения за неточность.
Вопрос: почему статичные объекты не прорисовываются синим цветом?