Beispiel #1
0
class Arkanoid(QWidget):
    # ширина поля
    W = 800
    # высота поля
    H = 600

    # конструктор
    def __init__(self):
        # вызов конструктора базового класса
        super().__init__()
        # инициализация поля
        self.initUI()

    # подготовка поля
    def initUI(self):
        # перемещение
        self.move(300, 300)
        # фиксируем ширину и высоту поля
        self.setFixedSize(Arkanoid.W, Arkanoid.H)
        # задаём имя программы
        self.setWindowTitle('Арканоид')

        # загружаем фоновое изображение
        self.background = QImage('background.jpg')

        # создаём кубики
        self.cubes = Cubes()
        # созаём ракетку
        self.racket = Racket(Arkanoid.W / 2 - Racket.W / 2)
        # создаём шарик
        self.ball = Ball(Arkanoid.W / 2, Racket.Y - Ball.R, 60)
        # создаём надпись
        self.label = Label(150, Arkanoid.H // 2, Arkanoid.W - 300, 60)
        # создаем очки
        self.scores = Scores(0, 9, Arkanoid.W, 30)

        # создаём таймер
        self.timer = QtCore.QTimer()
        # заканчиваем время
        self.timer.timeout.connect(self.tick)
        # задаём начало счётчика
        self.timer.start(2)

        # включаем отслеживание мыши
        self.setMouseTracking(1)

        # переходим в состояние запуска
        self.restart()

    # запуск или перезапуск арканоида
    def restart(self):
        # заполняем кубики
        self.cubes.initCubes()
        # сбрасываем позицию и угол шарика
        self.ball.cx = Arkanoid.W / 2
        self.ball.cy = Racket.Y - Ball.R
        self.ball.angle = random.randint(60, 120)
        # переходим в состояние запуска
        self.state = STATE_START

    # перекрытие функции рисования на окне
    def paintEvent(self, e):
        # обработка ошибок
        try:
            # создаём рисовальщик
            qp = QPainter()
            # начало рисования
            qp.begin(self)
            # рисуем фоновую картинку
            qp.drawImage(0, 0, self.background)
            # рисуем кубики
            self.cubes.draw(qp)
            # рисуем ракетку
            self.racket.draw(qp)
            # рисуем шарик
            self.ball.draw(qp)
            # рисуем надпись
            self.drawState(qp)
            # рисуем очки
            self.scores.draw(qp)
            # завершение рисования
            qp.end()
        except Exception as e:
            # печать ошибок
            print(str(e))

    # взависимости от текущего состояния
    # выводим на экран ту или иную запись
    def drawState(self, qp: QPainter):
        if self.state == STATE_START:
            self.label.draw(qp, "Добро пожаловать в Арканоид!")
        elif self.state == STATE_PAUSE:
            self.label.draw(qp, "Пауза")
        elif self.state == STATE_WIN_LEVEL:
            self.label.draw(
                qp, "Вы перешли на уровень " + str(self.cubes.level) +
                ". Поздравляю!")
        elif self.state == STATE_WIN_GAME:
            self.label.draw(qp, "Вы прошли игру! Поздравляю!")
        elif self.state == STATE_LOSE:
            self.label.draw(qp, "Вы проиграли")

    # обработка клавиатуры
    def keyPressEvent(self, event):
        if self.state == STATE_GAME:
            # если во время игры нажали Влево
            if event.key() == KEY_LEFT:
                # то смещаем рокетку Влево
                self.moveRocketTo(self.racket.x - Racket.DX)
            # если во время игры нажали Вправо
            elif event.key() == KEY_RIGHT:
                #  то смещаем ракетку Вправо
                self.moveRacketTo(self.racket.x + Racket.DX)
            # если во время игры нажали Пробел
            if event.key() == KEY_SPACE:
                #  то переходим в сотояние паузы
                self.state = STATE_PAUSE
                # обновляем окно
                self.update()
        else:
            # если нажат Пробел
            if event.key() == KEY_SPACE:
                # если выиграли игру или проиграли
                if self.state == STATE_WIN_GAME or self.state == STATE_LOSE:
                    # сбрасываем уровень
                    self.cubes.level = 1
                    # сбрасываем очки
                    self.scores.count = 0
                # если не на паузе
                if self.state != STATE_PAUSE:
                    # то перезапуск
                    self.restart()
                # переходим в состояние игры
                self.state = STATE_GAME
                # обновляем окно
                self.update()

    # обработка перемещения мыши
    def mouseMoveEvent(self, event):
        # если во время игры перемещаем мышь
        if self.state == STATE_GAME:
            # то перемещаем ракетку
            self.moveRacketTo(event.pos().x() - Racket.W / 2)

    # перемещение ракетки
    def moveRacketTo(self, x: int):
        # ракетку нельзя выводить за левый край экрана
        if x < 1:
            x = 1

        # ракетку нельзя выводить за правый край экрана
        if x + Racket.W >= Arkanoid.W - 2:
            x = Arkanoid.W - 2 - Racket.W

        # если позиция ракетки изменилась
        if self.racket.x != x:
            # то перемещаем ракетку
            self.racket.x = x
            # обновляем экран
            self.update()

    # обработчик таймера
    def tick(self):
        try:
            # если не в состоянии игры, то таймер игнорируем
            if self.state != STATE_GAME:
                return

            # перемещение шарика
            self.ball.move()

            # обработка касания шариком ракетки
            if self.ball.touched(self.racket.x, Racket.Y,
                                 self.racket.x + Racket.W, Racket.Y):
                # в зависимости от того, куда шарик попал по ракетке
                # устанавливаем разный угол
                # если в левый край - то 160 градусов
                # ecли в правый - то 30 градусов
                # если по центру - то 90 градусов
                dx = self.racket.x + Racket.W - self.ball.cx
                self.ball.angle = dx / Racket.W * (160 - 30) + 30

            # обработка касания шариком краев экрана
            self.ball.touchedRect(0, 0, Arkanoid.W, Arkanoid.H)

            # обработка касания шариком кубиков
            for cube in self.cubes:
                # если мяч коснулся куба
                if self.ball.touchedRect(cube.x, cube.y, cube.x + Cube.W,
                                         cube.y + Cube.H):
                    # изменение номера цвета куба
                    cube.collor_number += 1
                    self.scores.count += 1
                    # если цвет куба больше количества цветов
                    if cube.collor_number >= len(Cube.RAINBOW):
                        # убираем кубик
                        self.cubes.remove(cube)

            # если мяч ниже рокетки
            if self.ball.cy > Racket.Y + Racket.H + 20:
                # переходим в состояние пройгрыша
                self.state = STATE_LOSE

            # если кубики закончились
            if len(self.cubes) == 0:
                # переходим в состояние выйгрыша
                self.state = STATE_WIN_LEVEL
                # поднимаем уровень
                self.cubes.level += 1
                # если прошли все цвета радуги
                if self.cubes.level > len(Cube.RAINBOW):
                    # то считаем, что прошли игру
                    self.state = STATE_WIN_GAME

            # обновляем экран
            self.update()

        except Exception as e:
            # печать ошибок
            print(e)
Beispiel #2
0
                bullet.start(x1, y1, x2, y2)
        # если на экране надпись и нажали пробел, то убираем надпись
        if label.visible and event.type == pygame.KEYDOWN and event.key == pygame.K_SPACE:
            label.visible = False
        # ESC - заходим в меню
        if not menu.visible and not label.visible and event.type == pygame.KEYDOWN and event.key == pygame.K_ESCAPE:
            menu.visible = True
        # перемещение мышки в меню - раскрашиваем кнопки
        if event.type == pygame.MOUSEMOTION:
            menu.set_mouse(event.pos[0], event.pos[1])
            human.set_mouse(event.pos[0], event.pos[1])

    # рисуем надпись на экране
    if label.visible:
        screen.fill(pygame.Color('black'))
        label.draw(screen)
        pygame.display.flip()
        clock.tick(fps)
        continue

    # рисуем меню
    if menu.visible:
        screen.fill(pygame.Color('black'))
        menu.draw(screen)
        pygame.display.flip()
        clock.tick(fps)
        continue

    # запоминаем где был человек
    x = human.rect.x
Beispiel #3
0
 def draw(self, surface):
     Label.draw(self, surface)
     self.draw_check(surface)