R
R
roman012018-10-12 12:07:06
Python
roman01, 2018-10-12 12:07:06

Python + PyGame question (why not drawing)?

Good afternoon!
Dear Python experts, help!
I am mastering this wonderful language, I decided to write a toy for myself (Tetris), which, so far, has not been completed.
I specifically use the minimum of the pygame library - so far only drawing squares.
Here is the code:

# программа (игра) тетрис
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()

The trouble and misunderstanding in the reDrawMatrix (self) method:
In general, there is a moving object (it has an index of 2 in my matrix)
Static objects have an index of 1.
Static objects should be blue, dynamic (which falls) - red
Question: why are static objects in def reDrawMatrix(self): not drawn?
Thank you!
I apologize for the inaccuracy.
Question: why static objects are not drawn in blue?

Answer the question

In order to leave comments, you need to log in

[[+comments_count]] answer(s)
R
roman01, 2018-10-12
@roman01

Thanks to Alexshev92 (ru.stackoverflow.com) the issue was resolved.
You need to swap the methods, so that it would be like this:

# сместить вниз
self.down()                
# проверить на столкновение
self.isCollision()
# проверить на достижение дна
self.isBottom()

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question