Перейти к содержимому

Какие игры можно сделать на pygame

  • автор:

20 игр на Python своими руками с полным исходным кодом

20 проектов по созданию игр на Python с.полным кодом.

Делаем Марио. Создаем днопользовательскую игру, где игрок (Марио) должен уворачиваться от огненных шаров, вылетающих из дракона.

Это клон адаптация игры с динозавриком на google chrome под названием «T-Rex Dino Run».

Игра ведется в простом интерфейсе, в котором используются только кнопки и текст.

Человек может начать викторину, нажав на кнопку «Старт». Также можно выбрать тип слов, которые необходимо исправить в викторине.

Игра «Камень, бумага, ножницы» на Python разработана с использованием Tkinter и графического интерфейса пользователя (GUI).

Эта игра «Прыгающий мяч» использует Canvas для прорисовки объектов.

Игра «Виселица» не требует никаких специальных модулей, кроме random и time.

Игра «Змейка» — это классическая аркадная игра.

Военная игра «Самолеты» на Python на pygame

Это игра между компьютером и пользователем. Простая танковая игра Python.

Игра с хорощей графикой и удобным управлением.

Создаем свой тетрис на питоне.

Три крутые игры на Python с исходниками

Уверен, что вы хоть раз играли в эту интересную, но простую игру.

Цель этой игры, отбивать мяч от платформы и не упустить его.

При создании игры используются такие библиотеки как:

  • tkinter, эта библиотека предустановленна на большинстве версиях Python и используется для создания самого оконного приложения.
  • time, в нашем случае будет использоваться, что бы задать скорость мячу и платформе. Для установки зайдите в командную строку от имени администратора и напишите: pip install time проверьте что pip у вас установлен.
  • random, в нашем случае будет использоваться , что бы мяч отскакивал в разных направлениях. Эта библиотека так же предустановленна на всех версиях Python.
  • pygame, используется для создания графического интерфейса нашей игры. Эту библиотеку нужно скачать через командную строку, прописав: pip install pygame

from tkinter import * import time import random import pygame class Ball(): def __init__(self, canvas, platform, color): self.canvas = canvas self.platform = platform self.oval = canvas.create_oval(200, 200, 215, 215, fill=color) self.dir = [-3, -2, -1, 1, 2, 3] self.x = random.choice(self.dir) self.y = -1 self.touch_bottom = False def touch_platform(self, ball_pos): platform_pos = self.canvas.coords(self.platform.rect) if ball_pos[2] >= platform_pos[0] and ball_pos[0] <= platform_pos[2]: if ball_pos[3] >= platform_pos[1] and ball_pos[3] <= platform_pos[3]: return True return False def draw(self): self.canvas.move(self.oval, self.x, self.y) pos = self.canvas.coords(self.oval) if pos[1] <= 0: self.y = 3 if pos[3] >= 400: self.touch_bottom = True if self.touch_platform(pos) == True: self.y = -3 if pos[0] <= 0: self.x = 3 if pos[2] >= 500: self.x = -3 class Platform(): def __init__(self, canvas, color): self.canvas = canvas self.rect = canvas.create_rectangle(230, 300, 330, 310, fill=color) self.x = 0 self.canvas.bind_all(», self.left) self.canvas.bind_all(», self.right) def left(self, event): self.x = -2 def right(self, event): self.x = 2 def draw(self): self.canvas.move(self.rect, self.x, 0) pos=self.canvas.coords(self.rect) if pos[0] <= 0: self.x = 0 if pos[2] >= 500: self.x = 0 window = Tk() window.title(«Аркада») window.resizable(0, 0) window.wm_attributes(«-topmost», 1) canvas = Canvas(window, width=500, height=400) canvas.pack() platform = Platform(canvas, ‘green’) ball = Ball(canvas, platform, ‘red’) while True: if ball.touch_bottom == False: ball.draw() platform.draw() else: break window.update() time.sleep(0.01) window.mainloop()

Вот и весь код для этой интересной, простой и увлекательной игры. Вы так же можете модернизировать игру, добавив в неё например количество балов за отбитые мячи, или второй мяч.

Игра №2. Тетрис.

Эту игру знают все! Главная задача игрока не дать разным, геометрическим фигурам достигнуть «ФИНИША».

import sys, random from PyQt5.QtWidgets import QMainWindow, QFrame, QDesktopWidget, QApplication from PyQt5.QtCore import Qt, QBasicTimer, pyqtSignal from PyQt5.QtGui import QPainter, QColor

Вы видите библиотеки, которые будут использоваться при создании данной игры, всех их нужно загрузить через командную строку вашего компьютера.

После того как установили нужные нам библиотеки, создаём класс с нашими переменными. класс назовём Tetris и будем использовать свойства отцовского класса, чтобы каждый раз не прописывать все переменные заново для каждого последующего класса.

class Tetris(QMainWindow): def __init__(self): super().__init__() self.initUI() def initUI(self): self.tboard = Board(self) self.setCentralWidget(self.tboard) self.statusbar = self.statusBar() self.tboard.msg2Statusbar[str].connect(self.statusbar.showMessage) self.tboard.start() self.resize(180, 380) self.center() self.setWindowTitle(‘Tetris’) self.show() def center(self): screen = QDesktopWidget().screenGeometry() size = self.geometry() self.move((screen.width()-size.width())/2, (screen.height()-size.height())/2)

После создания отцовского класса Tetris, создаём все остальные классы и переменные для уже других функций.

class Board(QFrame): msg2Statusbar = pyqtSignal(str) BoardWidth = 10 BoardHeight = 22 Speed = 300 def __init__(self, parent): super().__init__(parent) self.initBoard() def initBoard(self): self.timer = QBasicTimer() self.isWaitingAfterLine = False self.curX = 0 self.curY = 0 self.numLinesRemoved = 0 self.board = [] self.setFocusPolicy(Qt.StrongFocus) self.isStarted = False self.isPaused = False self.clearBoard() def shapeAt(self, x, y): return self.board[(y * Board.BoardWidth) + x] def setShapeAt(self, x, y, shape): self.board[(y * Board.BoardWidth) + x] = shape def squareWidth(self): return self.contentsRect().width() // Board.BoardWidth def squareHeight(self): return self.contentsRect().height() // Board.BoardHeight def start(self): if self.isPaused: return self.isStarted = True self.isWaitingAfterLine = False self.numLinesRemoved = 0 self.clearBoard() self.msg2Statusbar.emit(str(self.numLinesRemoved)) self.newPiece() self.timer.start(Board.Speed, self) def pause(self): if not self.isStarted: return self.isPaused = not self.isPaused if self.isPaused: self.timer.stop() self.msg2Statusbar.emit(«paused») else: self.timer.start(Board.Speed, self) self.msg2Statusbar.emit(str(self.numLinesRemoved)) self.update()

def paintEvent(self, event): painter = QPainter(self) rect = self.contentsRect() boardTop = rect.bottom() — Board.BoardHeight * self.squareHeight() for i in range(Board.BoardHeight): for j in range(Board.BoardWidth): shape = self.shapeAt(j, Board.BoardHeight — i — 1) if shape != Tetrominoe.NoShape: self.drawSquare(painter, rect.left() + j * self.squareWidth(), boardTop + i * self.squareHeight(), shape) if self.curPiece.shape() != Tetrominoe.NoShape: for i in range(4): x = self.curX + self.curPiece.x(i) y = self.curY — self.curPiece.y(i) self.drawSquare(painter, rect.left() + x * self.squareWidth(), boardTop + (Board.BoardHeight — y — 1) * self.squareHeight(), self.curPiece.shape()) def keyPressEvent(self, event): if not self.isStarted or self.curPiece.shape() == Tetrominoe.NoShape: super(Board, self).keyPressEvent(event) return key = event.key() if key == Qt.Key_P: self.pause() return if self.isPaused: return elif key == Qt.Key_Left: self.tryMove(self.curPiece, self.curX — 1, self.curY) elif key == Qt.Key_Right: self.tryMove(self.curPiece, self.curX + 1, self.curY) elif key == Qt.Key_Down: self.tryMove(self.curPiece.rotateRight(), self.curX, self.curY) elif key == Qt.Key_Up: self.tryMove(self.curPiece.rotateLeft(), self.curX, self.curY) elif key == Qt.Key_Space: self.dropDown() elif key == Qt.Key_D: self.oneLineDown() else: super(Board, self).keyPressEvent(event) def timerEvent(self, event): if event.timerId() == self.timer.timerId(): if self.isWaitingAfterLine: self.isWaitingAfterLine = False self.newPiece() else: self.oneLineDown() else: super(Board, self).timerEvent(event) def clearBoard(self): for i in range(Board.BoardHeight * Board.BoardWidth): self.board.append(Tetrominoe.NoShape) def dropDown(self): newY = self.curY while newY > 0: if not self.tryMove(self.curPiece, self.curX, newY — 1): break newY -= 1 self.pieceDropped() def oneLineDown(self): if not self.tryMove(self.curPiece, self.curX, self.curY — 1): self.pieceDropped() def pieceDropped(self): for i in range(4): x = self.curX + self.curPiece.x(i) y = self.curY — self.curPiece.y(i) self.setShapeAt(x, y, self.curPiece.shape()) self.removeFullLines() if not self.isWaitingAfterLine: self.newPiece()

def removeFullLines(self): numFullLines = 0 rowsToRemove = [] for i in range(Board.BoardHeight): n = 0 for j in range(Board.BoardWidth): if not self.shapeAt(j, i) == Tetrominoe.NoShape: n = n + 1 if n == 10: rowsToRemove.append(i) rowsToRemove.reverse() for m in rowsToRemove: for k in range(m, Board.BoardHeight): for l in range(Board.BoardWidth): self.setShapeAt(l, k, self.shapeAt(l, k + 1)) numFullLines = numFullLines + len(rowsToRemove) if numFullLines > 0: self.numLinesRemoved = self.numLinesRemoved + numFullLines self.msg2Statusbar.emit(str(self.numLinesRemoved)) self.isWaitingAfterLine = True self.curPiece.setShape(Tetrominoe.NoShape) self.update() def newPiece(self): self.curPiece = Shape() self.curPiece.setRandomShape() self.curX = Board.BoardWidth // 2 + 1 self.curY = Board.BoardHeight — 1 + self.curPiece.minY() if not self.tryMove(self.curPiece, self.curX, self.curY): self.curPiece.setShape(Tetrominoe.NoShape) self.timer.stop() self.isStarted = False self.msg2Statusbar.emit(«Game over») def tryMove(self, newPiece, newX, newY): for i in range(4): x = newX + newPiece.x(i) y = newY — newPiece.y(i) if x < 0 or x >= Board.BoardWidth or y < 0 or y >= Board.BoardHeight: return False if self.shapeAt(x, y) != Tetrominoe.NoShape: return False self.curPiece = newPiece self.curX = newX self.curY = newY self.update() return True def drawSquare(self, painter, x, y, shape): colorTable = [0x000000, 0xCC6666, 0x66CC66, 0x6666CC, 0xCCCC66, 0xCC66CC, 0x66CCCC, 0xDAAA00] color = QColor(colorTable[shape]) painter.fillRect(x + 1, y + 1, self.squareWidth() — 2, self.squareHeight() — 2, color) painter.setPen(color.lighter()) painter.drawLine(x, y + self.squareHeight() — 1, x, y) painter.drawLine(x, y, x + self.squareWidth() — 1, y) painter.setPen(color.darker()) painter.drawLine(x + 1, y + self.squareHeight() — 1, x + self.squareWidth() — 1, y + self.squareHeight() — 1) painter.drawLine(x + self.squareWidth() — 1, y + self.squareHeight() — 1, x + self.squareWidth() — 1, y + 1)

После создаём класс уже для самих объектов( фигур), назовём его Tetrominoe.

class Tetrominoe(object): NoShape = 0 ZShape = 1 SShape = 2 LineShape = 3 TShape = 4 SquareShape = 5 LShape = 6 MirroredLShape = 7

И ещё один класс, но уже будем задавать координаты фигурам.

class Shape(object): coordsTable = ( ((0, 0), (0, 0), (0, 0), (0, 0)), ((0, -1), (0, 0), (-1, 0), (-1, 1)), ((0, -1), (0, 0), (1, 0), (1, 1)), ((0, -1), (0, 0), (0, 1), (0, 2)), ((-1, 0), (0, 0), (1, 0), (0, 1)), ((0, 0), (1, 0), (0, 1), (1, 1)), ((-1, -1), (0, -1), (0, 0), (0, 1)), ((1, -1), (0, -1), (0, 0), (0, 1)) ) def __init__(self): self.coords = [[0,0] for i in range(4)] self.pieceShape = Tetrominoe.NoShape self.setShape(Tetrominoe.NoShape) def shape(self): return self.pieceShape def setShape(self, shape): table = Shape.coordsTable[shape] for i in range(4): for j in range(2): self.coords[i][j] = table[i][j] self.pieceShape = shape def setRandomShape(self): self.setShape(random.randint(1, 7)) def x(self, index): return self.coords[index][0] def y(self, index): return self.coords[index][1] def setX(self, index, x): self.coords[index][0] = x def setY(self, index, y): self.coords[index][1] = y def minX(self): m = self.coords[0][0] for i in range(4): m = min(m, self.coords[i][0]) return m

И завершаем наш код

def maxX(self): m = self.coords[0][0] for i in range(4): m = max(m, self.coords[i][0]) return m def minY(self): m = self.coords[0][1] for i in range(4): m = min(m, self.coords[i][1]) return m def maxY(self): m = self.coords[0][1] for i in range(4): m = max(m, self.coords[i][1]) return m def rotateLeft(self): if self.pieceShape == Tetrominoe.SquareShape: return self result = Shape() result.pieceShape = self.pieceShape for i in range(4): result.setX(i, self.y(i)) result.setY(i, -self.x(i)) return result def rotateRight(self): if self.pieceShape == Tetrominoe.SquareShape: return self result = Shape() result.pieceShape = self.pieceShape for i in range(4): result.setX(i, -self.y(i)) result.setY(i, self.x(i)) return result if __name__ == ‘__main__’: app = QApplication([]) tetris = Tetris() sys.exit(app.exec_())

Прикрепил код по кусочкам, код длинный единым кодом его не прикрепить.

Это немного не то, о чём вы подумали, это танки «на бумаге» они работают без графического интерфейса, выводя информацию на экран.

Для создания данной игры нам потребуется всего ода библиотека, random.

Создадим два обычных танка, которые будут иметь рандомный домаг, и один супер танк, у которого будет много xp и урона. У всех танков будет определённое количество xp, урона и брони, а так же свой экипаж.

import random class Tank: «»»Template of tanks»»» def __init__(self, model, armor, min_damage, max_damage, health): self.model = model self.armor = armor self.damage = random.randint(min_damage, max_damage) self.health = health def print_info(self): print(f» имеет лобовую броню мм при ед. здоровья и урон в единиц») def health_down(self, enemy_damage): self.health -= enemy_damage print(f»\n:») print(f»Командир, по экипажу попали, у нас осталось очков здоровья») def shot(self, enemy): if enemy.health = self.health: self.health = 0 print(f»Экипаж танка уничтожен») else: enemy.health_down(enemy.damage) print(f»\n:») print(f»Точно в цель, у противника осталось единиц здоровья») class SuperTank(Tank): «»»Template of superTanks»»» def __init__(self, model, armor, min_damage, max_damage, health): super().__init__(model, armor, min_damage, max_damage, health) self.forceArmor = True def health_down(self, enemy_damage): super().health_down(enemy_damage / 2)

Но если вы запустите нашу игру, ничего не произойдёт. Нужно прописать команду, которой танки будут стрелять друг по другу.

tank1 = Tank(«T-34», 90, 20, 30, 100) tank2 = Tank(«Tiger», 120, 10, 50, 120) tank1.print_info() tank2.print_info() tank1.shot(tank2) tank1.shot(tank2) tank1.shot(tank2) tank1.shot(tank2) tank1.shot(tank2) tank1.shot(tank2) tank1.shot(tank2)

Вот полный код программы:

import random class Tank: «»»Template of tanks»»» def __init__(self, model, armor, min_damage, max_damage, health): self.model = model self.armor = armor self.damage = random.randint(min_damage, max_damage) self.health = health def print_info(self): print(f» имеет лобовую броню мм при ед. здоровья и урон в единиц») def health_down(self, enemy_damage): self.health -= enemy_damage print(f»\n:») print(f»Командир, по экипажу попали, у нас осталось очков здоровья») def shot(self, enemy): if enemy.health = self.health: self.health = 0 print(f»Экипаж танка уничтожен») else: enemy.health_down(enemy.damage) print(f»\n:») print(f»Точно в цель, у противника осталось единиц здоровья») class SuperTank(Tank): «»»Template of superTanks»»» def __init__(self, model, armor, min_damage, max_damage, health): super().__init__(model, armor, min_damage, max_damage, health) self.forceArmor = True def health_down(self, enemy_damage): super().health_down(enemy_damage / 2) tank1 = Tank(«T-34», 90, 20, 30, 100) tank2 = Tank(«Tiger», 120, 10, 50, 120) tank1.print_info() tank2.print_info() tank1.shot(tank2) tank1.shot(tank2) tank1.shot(tank2) tank1.shot(tank2) tank1.shot(tank2) tank1.shot(tank2) tank1.shot(tank2)

Вы можете менять количество выстрелов и т.п.

Если хотите больше крутых кодов на Python, поддержите копеечкой 🙂 вот если что, номер карты: 2202 2067 9305 7600

Pygame

Pygame — это библиотека для создания игр на языке программирования Python. В библиотеке собран набор программных средств, помогающих разрабатывать двумерные игры.

Еще Pygame называют фреймворком. С точки зрения программирования игр на Python это немного разные понятия, но Pygame имеет черты и того, и другого. Кроме того, его можно считать игровым движком: так называют комплексы программного обеспечения для разработки игр. Правда, как движок Pygame намного проще, чем более комплексные решения вроде Unity или Unreal Engine.

Pygame основан на бесплатной библиотеке SDL, которая предназначена для создания мультимедийных приложений. Кроме официальной версии, существует ответвление Pygame Community Edition, которое развивают и улучшают энтузиасты. Хотя Pygame в целом развивается сообществом еще с 2005 года.

С помощью фреймворка можно писать игры для ПК, а также под Android — во втором случае понадобится специальный набор инструментов под названием pgs4a.

Освойте профессию «Разработчик игр на Unity»

Разработчик игр на Unity

Все главные навыки разработчика игр на одном курсе. Вы освоите все этапы геймдизайна, научитесь программировать на С# и создадите 7 игр во время курса.

картинка (95)

Профессия / 18 месяцев
Разработчик игр на Unity

Создавайте виртуальные миры

Group 1321314346 (3)

Для чего нужен Pygame

Основное назначение фреймворка — разработка двумерных игр. Обычно это довольно простые игры: пиксельные, платформеры и так далее. Трехмерную графику Pygame поддерживает плохо, и создать с его помощью сложный ААА-шутер не получится.

С помощью Pygame можно разрабатывать и другие мультимедийные приложения со сложным графическим интерфейсом — например, с анимациями. Но чаще его все же используют для игр:

  • для создания небольших инди-проектов, в том числе пиксельных игр;
  • для прототипирования более крупных игр — прототип пишут на Pygame, а для усложненных версий используют другой инструмент.

Это довольно простая в освоении библиотека, поэтому ее часто выбирают начинающие для обучения. Кроме того, с Pygame могут работать и состоявшиеся игровые разработчики, а также геймдизайнеры и другие специалисты, занятые в геймдеве.

Какие игры создают с помощью Pygame

В отличие от ряда других инди-движков, Pygame не может похвастаться примерами громких и известных игр. Но на нем написано довольно много проектов. Вот несколько примеров.

Super Potato Bruh — платформер про картофельного человечка, который преодолевает препятствия и побеждает врагов, чтобы спасти принцессу Латук от Мистера Черпака. Несмотря на забавное описание, игра довольно сложная, с необычной физикой и bullet hell — поджанром, в котором на героя во время игры постоянно летят разные снаряды от противника.

игра Super Potato Bruh сделана с помощью библиотеки Pygame

Drawn Down Abyss — еще один платформер, на этот раз карточный. Главный герой постепенно спускается все ниже в Бездну и пытается достигнуть ее дна, а по пути сталкивается с разными врагами. Способности героя представлены как карты, которые можно разыгрывать, чтобы защищаться или атаковать. Эту игру создал тот же разработчик, что и Super Potato Bruh: его никнейм — DaFluffyPotato. Он же разработал еще несколько красивых пиксельных игр на Pygame, в основном платформеров.

Игра Drawn Down Abyss разработана с Pygame

Frets on Fire — музыкальная игра, похожая на Guitar Hero. Игрок нажимает на кнопки клавиатуры, чтобы персонаж играл на гитаре. Нужно попадать в ноты и так или иначе исполнять любимые песни.

Frets on Fire написана на Pygame

На сайте itch.io, куда разработчики выкладывают свои инди-игры, есть целая подборка проектов, написанных с использованием Pygame. Можно заметить: большинство этих игр — пиксельные, хотя движок поддерживает и другие виды графики. А самый популярный жанр, на котором пишут Pygame-игры, — платформер.

Разработчик игр на Unity – одна
из самых творческих профессий в IT. Создайте виртуальные миры уже через полгода обучения

Особенности создания игр на Pygame

Видеоигра — событийно-ориентированная программа. Это значит, что программа реагирует на события: нажатие кнопки, движение мыши, истечение какого-то времени. Когда событие случается, запускается определенный код: функция или простое действие. Так игры становятся интерактивными.

Событийно-ориентированными считаются любые мультимедийные приложения, реагирующие на кнопки или нажатия мыши. Но в случае с играми возможных событий больше — например, столкновение двух объектов. Поэтому работу игры можно условно поделить на три части:

  • отслеживание событий;
  • изменение обстановки в игре в соответствии с событиями;
  • рендеринг, то есть перерисовка экрана с учетом новой обстановки.

В Pygame есть наборы инструментов и функций для реализации всех трех частей. Например, в нем много встроенных событий, которые не нужно писать с нуля. Еще он сохраняет события, даже если они произошли во время перерисовки кадра, — они остаются в специальном списке, и разработчик может прописать на них какую-то реакцию.

При всем этом Pygame довольно низкоуровневый. В контексте разработки игр это значит, что многие возможности разработчик должен реализовать вручную. Например, готовых функций для физики игры нет — нужно прописывать реализацию самостоятельно, то есть переносить в код формулы из учебника. Как пример, где это может пригодиться, — ускорение персонажа, падение предмета по сложной траектории, баллистика и так далее.

Игровой цикл и его реализация в Pygame

Игра реализована как бесконечный цикл. В этом цикле программа проверяет события, реагирует на них и перерисовывает экран — те самые три компонента, описанные выше. Все это продолжается, пока пользователь не нажмет на «Выход». Вот как реализовать этот цикл в Pygame.

Шаблон. Сначала разработчик делает шаблон игры: описывает длину и ширину окна, указывает нужные FPS — количество кадров в секунду. Чем выше FPS, тем быстрее игровой процесс. Еще в «костяке» игры нужно инициализировать Pygame, то есть заставить его включиться. Здесь же можно создать стартовый экран, вывести на него буквы, подключить возможность добавлять звуки и включить таймер. Таймер — еще одна функция Pygame, которая позволяет считать время. А еще в этой части создается сам цикл.

FPS. Для контроля FPS есть отдельная команда. В самом начале, при создании костяка игры, можно прописать таймер — он отвечает за время, которое должно пройти до смены кадра. Желаемые FPS лучше указывать в отдельной числовой переменной:

timer = pygame.time.Clock() # создаем таймер FPS = 30 # указываем нужный FPS, тут он равен 30 кадрам в секунду

Создать таймер нужно вне бесконечного цикла, а вот отсчитывать время — уже внутри него. Для этого в самом начале цикла нужно прописать команду:

timer.tick(FPS) # объясняем Pygame, как часто обновлять экран

События. Pygame фиксирует все события в специальном списке — для доступа к нему есть команда pygame.event.get() . Чтобы обработать событие, нужно перебрать этот список, найти там нужное и прописать реакцию на него. Например, первым делом стоит реализовать реакцию на событие pygame.QUIT , то есть нажатие на кнопку «Выход». Нужно пройти по списку и если тип какого-то события будет равен pygame.QUIT , отдать команду выйти из бесконечного цикла. Без этого игру нельзя будет закрыть.

Работа с отрисовкой. В Pygame есть команды, которые заливают экран цветом, рисуют на нем персонажей и делают другие вещи. Но отрисовка — медленный процесс: команда для каждого пикселя должна дойти до видеокарты. Поэтому существует двойная буферизация: пока на экране один кадр, «под капотом» из всех произошедших действий формируется другой. А когда проходит нужное количество времени для смены кадра — он меняется и показывает все произошедшие изменения. То есть экран перерисовывается не после каждого действия: за один кадр может произойти несколько изменений. В Pygame двойная буферизация автоматическая, а для смены кадра есть специальная команда pygame.flip() . Ее нужно помещать в конце бесконечного цикла: все, что будет после нее, не отрисуется.

Какие еще инструменты есть в Pygame

Вот несколько примеров возможностей Pygame, которые можно использовать при создании игр и мультимедийных приложений.

  • Модуль pygame.draw позволяет рисовать в окне игры геометрические фигуры. В нем есть набор функций для разных фигур: линий, треугольников, прямоугольников и так далее.
  • Модуль pygame.image отвечает за работу с картинками, например за загрузку спрайтов персонажей. Модуль pygame.transform может по-разному видоизменять картинки, а pygame.font позволяет работать со шрифтами.
  • Модули pygame.mixer и pygame.mixer.music отвечают за звуки: первый нужен для работы со звуковыми эффектами, второй работает с фоновой музыкой.
  • Класс pygame.Surface дает возможность создавать поверхности — «слои» для отрисовки, как в графическом редакторе. Например, на «основной» поверхности фона можно создать «слои» с фигурками персонажей и рисовать их поверх фона.

Это не все: инструментов куда больше, они помогают работать со спрайтами, поверхностями, событиями и многим другим. Можно проверить самостоятельно — скачать Pygame или почитать ее документацию.

Преимущества Pygame

  • Простота в освоении — поэтому библиотеку часто используют начинающие геймдевы для тренировочных проектов.
  • Быстрый процесс разработки — инди-разработчик DaFluffyPotato писал, что на создание некоторых игр у него ушло меньше 48 часов.
  • Удобное прототипирование — можно быстро создать простой прототип игры на Pygame, а потом реализовать более сложную версию с другими технологиями.

Недостатки Pygame

  • Малая функциональность — сложную игру создать не получится.
  • Относительно небольшое сообщество, меньше, чем у других движков для инди-игр.
  • Ресурсоемкость — игры на Python отнимают довольно много ресурсов компьютера.

Как установить библиотеку Pygame

Библиотеки нет в стандартном наборе инструментов Python. Ее понадобится скачивать отдельно: быстрее всего это сделать с помощью менеджера пакетов pip, который предназначен для Python. Понадобится ввести в консоли команду:

python3 -m pip install -U pygame --user (для Linux)
py -m pip install -U pygame --user (для Windows)

После этого pip автоматически найдет в публичных репозиториях и подгрузит библиотеку. Она установится, и ей можно будет пользоваться — достаточно написать в начале Python-файла игры команду import pygame .

Если pip не установлен, сначала его понадобится скачать.

Чтобы узнать больше о разработке игр, запишитесь на курсы — практикуйтесь с первых дней и получайте опыт в геймдеве.

Статьи по теме:

Создаём «Змейку» — первую игру на Python и Pygame

Учимся программировать через разработку игр. Сегодня напишем знакомую всем «Змейку» — вспомним правила игры и реализуем их на Python.

Иллюстрация: Оля Ежак для Skillbox Media

Антон Яценко

Антон Яценко
Изучает Python, его библиотеки и занимается анализом данных. Любит путешествовать в горах.

Pygame — популярная библиотека для создания игр под различные устройства на Windows, macOS, Linux или Android. Она помогает разработчику не только описать геймплей, но и работать с клавиатурой, мышью, акселерометром, звуком и видео.

Первая версия Pygame была представлена Питом Шиннерсом в октябре 2000 года. За 22 года вокруг библиотеки сложилось большое комьюнити, а о работе с ней написано несколько десятков книг. Последняя стабильная версия на июль 2022 года — 2.1.2.

Давайте разберёмся в том, как устроена Pygame, и напишем свою первую игру — классическую «Змейку» на Python, которую студенты часто берут для курсовой работы по программированию.

Устанавливаем Pygame и разбираемся

Pygame — не самостоятельная библиотека. На самом деле это обёртка для библиотеки SDL, Simple DirectMedia Layer. Именно SDL позволяет задействовать любые внешние устройства — например, мышь или клавиатуру. А Pygame делает работу с ними удобной для Python-разработчика.

Установить Pygame просто. Для этого воспользуемся терминалом или командной строкой и командой pip:

Теперь игровое окно не закрывается само по себе. Однако и закрыть его мы тоже не сможем — если нажать на кнопку «Выход», ничего не произойдёт. Исправляем это с помощью кода: добавляем событие QUIT, закрывающее окно.

Всё получилось. Ближе к центру экрана появился синий квадрат, который и будет нашей змейкой.

Шаг 3

Описываем движения змейки

Управлять перемещением змейки можно с помощью специального класса Pygame KEYDOWN. Класс позволяет использовать четыре стандартных события, получая их с клавиавтуры: K_UP, K_DOWN, K_LEFT и K_RIGHT — они соответствуют движениям змейки вверх, вниз, влево и вправо. Срабатывание любого события из класса KEYDOWN приводит к изменению положения змейки. Зададим шаг этого движения в 10 пикселей.

Кроме того, мы должны создать две переменные для хранения значений координат первой клетки нашей змейки по осям x и y. Назовём их x1_change и y1_change.

Шаг 4

Учитываем препятствия — границы игрового поля

Если змейка попадает на границу экрана, то игрок терпит поражение, а игра заканчивается. Чтобы закодить это правило, можно воспользоваться оператором if, который определяет координаты x и y для змейки и анализирует, выходят ли они за границы игрового поля. Добавим необходимый код.

Шаг 5

Добавляем еду для змейки

Теперь добавим «еду». Используем библиотеку random, чтобы она появлялась в случайном месте на игровом поле. Когда наша змейка будет проходить через еду, то её длина будет увеличиваться. Это мы добавим на следующем шаге. Кроме того, дадим возможность игроку выйти из игры или начать игру заново после проигрыша.

А если выполнить условие для завершения игры, то появится сообщение с предложением выйти из игры или начать её заново:

Шаг 6

Увеличиваем длину змейки

Дополним наш код, чтобы длина змейки увеличивалась при поглощении еды. Для этого нам понадобится список, в котором будет храниться текущая длина змейки. Учтём ещё важный момент из правил: при столкновении головы змейки с её телом игра завершается.

Шаг 7

Добавляем отображение счёта

Добавим отображение счёта текущей игры. Для этого создадим функцию Your_score. Она будет отображать длину змейки, вычитая из неё 1 (ведь 1 — это начальный размер змейки, и это не является достижением игрока).

Можно считать, что наша работа над «Змейкой» закончена. Мы полностью реализовали геймплей, который запланировали на старте работы.

Итоговый код

Наш код полностью и без комментариев:

import pygame import time import random pygame.init() white = (255, 255, 255) yellow = (255, 255, 102) black = (0, 0, 0) red = (213, 50, 80) green = (0, 255, 0) blue = (50, 153, 213) dis_width = 800 dis_height = 600 dis = pygame.display.set_mode((dis_width, dis_height)) pygame.display.set_caption('Змейка от Skillbox') clock = pygame.time.Clock() snake_block = 10 snake_speed = 15 font_style = pygame.font.SysFont("bahnschrift", 25) score_font = pygame.font.SysFont("comicsansms", 35) def Your_score(score): value = score_font.render("Ваш счёт: " + str(score), True, yellow) dis.blit(value, [0, 0]) def our_snake(snake_block, snake_list): for x in snake_list: pygame.draw.rect(dis, black, [x[0], x[1], snake_block, snake_block]) def message(msg, color): mesg = font_style.render(msg, True, color) dis.blit(mesg, [dis_width / 6, dis_height / 3]) def gameLoop(): game_over = False game_close = False x1 = dis_width / 2 y1 = dis_height / 2 x1_change = 0 y1_change = 0 snake_List = [] Length_of_snake = 1 foodx = round(random.randrange(0, dis_width - snake_block) / 10.0) * 10.0 foody = round(random.randrange(0, dis_height - snake_block) / 10.0) * 10.0 while not game_over: while game_close == True: dis.fill(blue) message("Вы проиграли! Нажмите Q для выхода или C для повторной игры", red) Your_score(Length_of_snake - 1) pygame.display.update() for event in pygame.event.get(): if event.type == pygame.KEYDOWN: if event.key == pygame.K_q: game_over = True game_close = False if event.key == pygame.K_c: gameLoop() for event in pygame.event.get(): if event.type == pygame.QUIT: game_over = True if event.type == pygame.KEYDOWN: if event.key == pygame.K_LEFT: x1_change = -snake_block y1_change = 0 elif event.key == pygame.K_RIGHT: x1_change = snake_block y1_change = 0 elif event.key == pygame.K_UP: y1_change = -snake_block x1_change = 0 elif event.key == pygame.K_DOWN: y1_change = snake_block x1_change = 0 if x1 >= dis_width or x1 < 0 or y1 >= dis_height or y1 < 0: game_close = True x1 += x1_change y1 += y1_change dis.fill(blue) pygame.draw.rect(dis, green, [foodx, foody, snake_block, snake_block]) snake_Head = [] snake_Head.append(x1) snake_Head.append(y1) snake_List.append(snake_Head) if len(snake_List) > Length_of_snake: del snake_List[0] for x in snake_List[:-1]: if x == snake_Head: game_close = True our_snake(snake_block, snake_List) Your_score(Length_of_snake - 1) pygame.display.update() if x1 == foodx and y1 == foody: foodx = round(random.randrange(0, dis_width - snake_block) / 10.0) * 10.0 foody = round(random.randrange(0, dis_height - snake_block) / 10.0) * 10.0 Length_of_snake += 1 clock.tick(snake_speed) pygame.quit() quit() gameLoop()

Что дальше?

Узнать об особенностях работы с Pygame и возможностях библиотеки можно в официальной документации. Углубиться в разработку и попробовать другие игры можно благодаря специализированным книгам:

  • «Учим Python, делая крутые игры» Эла Свейгарта;
  • «Beginning Game Development with Python and Pygame: From Novice to Professional» Уилла Макгугана;
  • «Program Arcade Games: With Python and Pygame» Пола Винсента Крэйвена.

Больше интересного про код в нашем телеграм-канале. Подписывайтесь!

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *