@roman01

Вопрос Python + PyGame (почему не рисует)?

Добрый день!
Уважаемые знатоки Питона, помогите!
Осваиваю этот замечательный язык, решил написать для себя игрушку (Тетрис), которая, пока, не доделана.
Специально использую минимум библиотеки 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): не прорисовываются?

Спасибо!

Прошу прощения за неточность.
Вопрос: почему статичные объекты не прорисовываются синим цветом?
  • Вопрос задан
  • 369 просмотров
Пригласить эксперта
Ответы на вопрос 1
@roman01 Автор вопроса
Благодаря Alexshev92 (ru.stackoverflow.com) вопрос решился.
Необходимо поменять местами методы, что бы было так:
# сместить вниз
self.down()                
# проверить на столкновение
self.isCollision()
# проверить на достижение дна
self.isBottom()
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы