Какие игры написаны на питоне
Перейти к содержимому

Какие игры написаны на питоне

  • автор:

Три крутые игры на 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

Игры, в которых использовался Python

Обложка поста Игры, в которых использовался Python

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

Игры, в которых использовался Python 1

Вот некоторые из самых известныx игр, в которых был в той или иной мере использован Python:

Battlefield

(2005 / Digital Illusions CE (DICE) / Стокгольм)

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

EVE Online

(2003 / CCP Games / Исландия)

Это многопользовательская онлайн ролевая игра (MMORPG), действие которой разворачивается в антураже научно-фантастического пространства. Пользовательская база насчитывает более 500 000 игроков. EVE Online полностью написана на StacklessPython, что делает ее одной из крупнейших игр, использующих Python для своих нужд.

Mount Blade

(2008 / Tale Worlds / Турция)

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

Sims 4

(2014 / Е.А. Maxis Sims Studio / США)

По праву является самой известной игрой в жанре симуляции жизни. Sims 4 — первая компьютерная игра, которая занимала лидирующие позиции на всевозможных игровых чартах на протяжении двух лет, и продалась в объеме 408,150 экземпляров по всему миру в течение первых четырех дней. На сегодняшний день продано более 1.1 миллиона копий по всему миру, что делает Sims 4 одной из самых продаваемых игр, которые использует Python — для обеспечения внутриигрового моддинга, открывающего пользователям огромные возможности по изменению параметров игры.

Civilization IV

(2005 / Firaxis Games / США)

Это компьютерная игра в жанре пошаговой стратегии. Цель игрока — подчинить себе весь мир путем дипломатических переговоров или кровожадной войны. Большая часть игры написана на Python, и Boost Python, что дает возможность пользователям собственноручно создавать модификации для игры.

Frets On Fire (FoF)

(2006 / Unreal Voodoo / Финляндия)

Музыкальная игра с открытым и свободным исходным кодом, которая сама по себе имитирует коммерческую игру Guitar Hero. Игра полностью написана на Python с использованием библиотеки Pygame. Благодаря открытости и простоте кода, игра представляется как хорошая площадка для изучения и практики программирования.

Игры, в которых использовался Python 2

Спасибо CheckiO за интересную статью.

Топ-7 онлайн-игр, которые помогут освоить программирование на Python

Изучение Python в виде игры не менее эффективно, чем сухое заучивание теории из учебников. Играя, желающие всех уровней и возрастов могут подтянуть свои знания в программировании, написании кода и даже найти друзей на онлайн-турнирах. В этой статье tutortop собрал самые популярные игры для изучения Python на русском и английском языке.

Также не забывайте про изучение теории. Сделать это можно на онлайн-курсах — «Python-разработчик» от Bang Bang Education или «Разработчик на Python с гарантией трудоустройства» от Skypro.

Code Monkey

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

Code Monkey рассчитана на прохождение детьми, но подтянуть свои знания могут и взрослые. Игра учит программировать чат-боты на языке Python.

Язык интерфейса: английский, русский

Цена: 14 дней бесплатно, далее — от 6 до 20$ в месяц

Изучить этот язык программирования можно также на онлайн-курсах:

  • «Профессия: Python-разработчик с гарантией трудоустройства» от ProductStar
  • «Python-разработчик с гарантией трудоустройства» от Eduson Academy

Tynker

Игра учит программированию с нуля: от блочного кодирования до написания программ на Python. Проходит в формате тренажёра. Сначала игра предоставляет теорию, а потом предлагает закрепить её на практике — в викторинах и головоломках.

С помощью Tynker можно создать функциональные приложения, игры и анимации. Игра предназначена для детей и взрослых, которые только начинают свой путь в программировании.

Язык интерфейса: английский, доступен русский перевод

Цена: бесплатно или от 8,75$ в месяц

Empire of Code

Это браузерная игра, суть которой — в битвах с противниками, улучшении своей армии и добыче игрового золота. Военной базой можно управлять с помощью кода. В начале Empire of Code предлагает игрокам выбрать лагерь — JavaScript или Python, в зависимости от языка, который они хотят изучать.

В игре есть теория и подсказки. Подойдёт для начинающих всех возрастов.

Язык интерфейса: английский

Цена: бесплатно

CheckiO

В этой браузерной игре нужно решать задачи с помощью кода. На старте игрокам предлагают выбрать язык программирования — TypeScript или Python. А после открываются разноуровневые задачи, от лёгких до сложных.

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

Язык интерфейса: английский

Цена: бесплатно

Codewars

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

Так же, как и в CheckiO, после прохождения уровней можно узнать для сравнения, какой код написали другие пользователи. Игра подходит для разработчиков всех уровней за счёт разнообразия задач.

Язык интерфейса: английский

Цена: бесплатно

CodeCombat

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

В игре 80 бесплатных уровней, на которых предлагают решать задания и с помощью написанного кода бороться с орками, бежать из заключения, руководить солдатами. Также в CodeCombat есть учебные курсы с акцентами на веб-разработке и геймдеве на Python, Java и других языках. Игра подойдёт как начинающим, так и продолжающим изучение программирования.

Язык интерфейса: русский, английский

Цена: бесплатно или от 39,60$ в год

Codingame

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

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

Язык интерфейса: английский

Цена: бесплатно

Хочу научиться кодить на Python!

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

Можно Ли Делать Игры На Python?

Python нашёл себе место почти во всех сферах IT. Разработка веб-сайтов, управление станками ЧПУ, desktop, мобильные приложения, а уж про искусственный интеллект, машинное обучение и анализ данных я вообще молчу. Сейчас Python лучший друг хоть школьнику, хоть сотруднику научно-исследовательской лаборатории. А что на счёт игр? Компьютерные игры — это огромная доля IT рынка, которая уже набрала и продолжает набирать обороты. Игры то делать можно на питоне? Сегодня мы расставим все точки над i. Меня зовут Макс, я один из авторов YouTube канала PyLounge, а вы читаете статью в которой я расскажу можно ли создавать игры на Python и какую нишу занял Python в сфере gamedev.

Для удобства разделим все игры на несколько категорий:

  • AAA-проекты по типу Assassin’s Creed и Call of Duty, которые разрабатывают е крупные студии;
  • любительские инди-игры;
  • мобильные игры.

В таком порядке и будем разбираться.

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

Движки довольно требовательны к производительности, а Python сам по себе медленный, поэтому непосредственно ядро игры на Python не пишут. Движки, как правило, создаются на компилируемых языках, таких как С/С++ или С#.

Крупные компании зачастую используют Unity, Unreal Engine 4, CryEngine, Source или пишут собственные движки (Anvil, Fox, REDengine) обычно на С++. Хотя и существуют специальные игровые движки, написанные на Python, но о них чуть дальше.

Перемещение по меню, переходы между локациями, управление персонажем, движение камеры, смена музыки, диалоги, система квестов, ИИ — всё это и многое другое приходится программировать на каком-то языке, который поддерживает тот или иной движок.

Unreal Engine 4 используют С++, Blueprint и некоторое подобие JavaScript, основой для Unity является C# (была попытка ввести язык Boo, это по сути типизованный Python, но идея провалилась). Из более менее крупных, ходовых движков Python как основу использует пожалуй только Godot (точнее он использует GDScript, по сути видоизменённый Python с небольшими фишками).

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

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

https://github.com/wrye-bash/wrye-bash

В первую очередь скриптовый язык Python позволяет отделить игровую логику, от всего остального (графики, физики, ввода/вывода, сетевого взаимодействия). Скрипты на Python могут применяться для написания взаимодействия персонажей, запуска сцен, диалогов, взаимодействие NPC с триггерами (например, ходьба где-то, остановка, чтобы поговорить с другим NPC, а затем продолжить бежать куда-то), статистика противника (здоровье, скорость, точность), а также обработки различных событий.

Игровая логика обычно не содержит сложных вычислений и скорость языка отходит на второй план. Это и ляжет на плечи Python. Действительно сложные или требующие высокой производительности части (какой-нибудь условный поиск пути) можно унести в движок.

Получается, что скриптовые языки такие как Python или Lua вызывают какие-либо методы движка и оперируют ими для создания игровой логики и наоборот: движок может вызывать заранее оговоренные функции в скрипте, где разработчик уже как-то обрабатывает вызов. То есть скрипты позволяют разделить слои логики игры и логики игрового движка. Вы можете изменять игровую логику, настройку игры и прочие параметры без необходимости перекомпиляции всего кода.

Скрипты Python можно использовать, даже если игра написана на другом языке. Python использовался в Battlefiled, Sims, Civilization, World of Tanks, Vampire: The Masquerade: Bloodlines и ещё много где.

Кроме того, Python часто используют для написания тестов, что тоже важно. Получается, что Python не такой уж редкий гость в крупном геймдеве, однако используется он далеко не как основной язык и конкуренцию ему составляет(-ли,-вят) Lua\JS\TypeScript (возможно) и т.д. С крупными многобюджетными играми на этом всё.

Когда же речь идёт о чём-то более простом, о создании не навороченных 2D и 3D игр Python выступает во всей красе. Для создания хобби-проектов, инди и мобильные игр под Android Питон предоставляет несколько хороших и относительно популярных инструментов.

Pygame – это библиотека модулей для языка Python, созданная для разработки 2D игр. Также Pygame можно называть своего рода фреймворком для создания игр. Он имеет хорошее сообщество, открытый исходный код, кроссплатформенность, качественную документацию, множеством примеров игр, а ещё он довольно простотой для изучения.

PyGame хорошее начало, чтобы познакомиться с особенностями разработки игр. Более опытными программистами Pygame может использоваться для быстрого создания прототипа игры, чтобы посмотреть, как все будет работать. После этого игра переписывается на другом языке. Другими словами, преимущество Pygame в легком обучении и быстрой разработке. С помощью него вполне можно создать отличную игру, но скорее всего казуалку. Pygame-приложения могут работать под Android на телефонах и планшетах с использованием подмножества Pygame для Android.

Panda3D — игровой движок, включающий графику, звук, ввод-вывод, обнаружение столкновений и другие функции, относящиеся к созданию 3D игр. Основным языком программирования, предназначенном для работы с SDK Panda3D, является Python, однако ядро движка написано на C++. Panda3D использовался даже для крупных коммерческих игр (Toontown Online, Pirates of the Caribbean Online). Он также включает работу с графикой, звуком, сетью, устройствами ввода (мышь, клавиатура, джойстик и т.п.), физикой на базе ODE и многими другими вещами, требующимися при разработке игры. Основным графическим API для «панды» является OpenGL, так же возможно использование и DirectX. Движок достаточно простой в изучении и при должной сноровке, с помощью него вполне реально сделать что-то простое, но интересное.

https://pirates.fandom.com/wiki/Pirates_of_the_Caribbean_Online

Отдельно стоит отметить движок RenPy . Это именно то, на что действительно стоит обратить своё внимание.

RenPy — это бесплатный, написанный на Python, свободный игровой движок для создания визуальных новелл (графических квестов с диалоговой системой) в 2D-графике. Поддерживает платформы Windows, Linux, Android, iOS. Именно на этом движке созданы такие известные игры как Бесконечное Лето и Корона из Листьев.

Everlasting Summer

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

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

По данным из Wiki cвыше 1200 игр используют движок RenPy. И это действительно тот инструмент, который поможет вам реально и без особых проблем воплотить ваши игровые идеи в жизнь, пусть и в формате визуальной новеллы. Достаточно только наличие базовых знаний Python, идеи и хорошего художника. Дерзайте, возможно именно ваша игра покорит интернет, как это было в случае БЛ.

Из всего этого следуют, что Python вполне применим для создания игр, зачастую более простых, но и в крупных проектах встретить его вполне реально, хоть и происходит это редко. Некоторые игры на Python имеют огромную популярность, тоже Бесконечное лето, о котором говорилось ранее. Однако, очевидно, что язык не совсем про разработку игр. Он гораздо более применим совсем в других сферах.

P.S. Также есть видеоверсия данной статьи на YouTube.

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

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