Три крутые игры на 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»
Но если вы запустите нашу игру, ничего не произойдёт. Нужно прописать команду, которой танки будут стрелять друг по другу.
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»
Вы можете менять количество выстрелов и т.п.
Если хотите больше крутых кодов на Python, поддержите копеечкой 🙂 вот если что, номер карты: 2202 2067 9305 7600
Пишем игру на Python
Прежде чем мы начнём программировать что-то полезное на Python, давайте закодим что-нибудь интересное. Например, свою игру, где нужно не дать шарику упасть, типа Арканоида. Вы, скорее всего, играли в детстве во что-то подобное, поэтому освоиться будет просто.
Логика игры
Есть игровое поле — простой прямоугольник с твёрдыми границами. Когда шарик касается стенки или потолка, он отскакивает в другую сторону. Если он упадёт на пол — вы проиграли. Чтобы этого не случилось, внизу вдоль пола летает платформа, а вы ей управляете с помощью стрелок. Ваша задача — подставлять платформу под шарик как можно дольше. За каждое удачное спасение шарика вы получаете одно очко.
Алгоритм
Чтобы реализовать такую логику игры, нужно предусмотреть такие сценарии поведения:
- игра начинается;
- шарик начинает двигаться;
- если нажаты стрелки влево или вправо — двигаем платформу;
- если шарик коснулся стенок, потолка или платформы — делаем отскок;
- если шарик коснулся платформы — увеличиваем счёт на единицу;
- если шарик упал на пол — выводим сообщение и заканчиваем игру.
Хитрость в том, что всё это происходит параллельно и независимо друг от друга. То есть пока шарик летает, мы вполне можем двигать платформу, а можем и оставить её на месте. И когда шарик отскакивает от стен, это тоже не мешает другим объектам двигаться и взаимодействовать между собой.
Получается, что нам нужно определить три класса — платформу, сам шарик и счёт, и определить, как они реагируют на действия друг друга. Поле нам самим определять не нужно — для этого есть уже готовая библиотека. А потом в этих классах мы пропишем методы — они как раз и будут отвечать за поведение наших объектов.
Весь кайф в том, что мы всё это задаём один раз, а потом объекты сами разбираются, как им реагировать друг на друга и что делать в разных ситуациях. Мы не прописываем жёстко весь алгоритм, а задаём правила игры — а для этого классы подходят просто идеально.
По коням, пишем на Python
Для этого проекта вам потребуется установить и запустить среду Python. Как это сделать — читайте в нашей статье.
Начало программы
Чтобы у нас появилась графика в игре, используем библиотеку Tkinter. Она входит в набор стандартных библиотек Python и позволяет рисовать простейшие объекты — линии, прямоугольники, круги и красить их в разные цвета. Такой простой Paint, только для Python.
Чтобы создать окно, где будет видна графика, используют класс Tk(). Он просто делает окно, но без содержимого. Чтобы появилось содержимое, создают холст — видимую часть окна. Именно на нём мы будем рисовать нашу игру. За холст отвечает класс Canvas(), поэтому нам нужно будет создать свой объект из этого класса и дальше уже работать с этим объектом.
Если мы принудительно не ограничим скорость платформы, то она будет перемещаться мгновенно, ведь компьютер считает очень быстро и моментально передвинет её к другому краю. Поэтому мы будем искусственно ограничивать время движения, а для этого нам понадобится модуль Time — он тоже стандартный.
Последнее, что нам глобально нужно, — задавать случайным образом начальное положение шарика и платформы, чтобы было интереснее играть. За это отвечает модуль Random — он помогает генерировать случайные числа и перемешивать данные.
Запишем всё это в виде кода на Python:
# подключаем графическую библиотеку from tkinter import * # подключаем модули, которые отвечают за время и случайные числа import time import random # создаём новый объект — окно с игровым полем. В нашем случае переменная окна называется tk, и мы его сделали из класса Tk() — он есть в графической библиотеке tk = Tk() # делаем заголовок окна — Games с помощью свойства объекта title tk.title('Game') # запрещаем менять размеры окна, для этого используем свойство resizable tk.resizable(0, 0) # помещаем наше игровое окно выше остальных окон на компьютере, чтобы другие окна не могли его заслонить tk.wm_attributes('-topmost', 1) # создаём новый холст — 400 на 500 пикселей, где и будем рисовать игру canvas = Canvas(tk, width=500, height=400, highlightthickness=0) # говорим холсту, что у каждого видимого элемента будут свои отдельные координаты canvas.pack() # обновляем окно с холстом tk.update()
Мы подключили все нужные библиотеки, сделали и настроили игровое поле. Теперь займёмся классами.
Любишь Python? Зарабатывай на нём!

Шарик
Сначала проговорим словами, что нам нужно от шарика. Он должен уметь:
- задавать своё начальное положение и направление движение;
- понимать, когда он коснулся платформы;
- рисовать сам себя и понимать, когда нужно отрисовать себя в новом положении (например, после отскока от стены).
Этого достаточно, чтобы шарик жил своей жизнью и умел взаимодействовать с окружающей средой. При этом нужно не забыть о том, что каждый класс должен содержать конструктор — код, который отвечает за создание нового объекта. Без этого сделать шарик не получится. Запишем это на Python:
# Описываем класс Ball, который будет отвечать за шарик class Ball: # конструктор — он вызывается в момент создания нового объекта на основе этого класса def __init__(self, canvas, paddle, score, color): # задаём параметры объекта, которые нам передают в скобках в момент создания self.canvas = canvas self.paddle = paddle self.score = score # цвет нужен был для того, чтобы мы им закрасили весь шарик # здесь появляется новое свойство id, в котором хранится внутреннее название шарика # а ещё командой create_oval мы создаём круг радиусом 15 пикселей и закрашиваем нужным цветом self.id = canvas.create_oval(10,10, 25, 25, fill=color) # помещаем шарик в точку с координатами 245,100 self.canvas.move(self.id, 245, 100) # задаём список возможных направлений для старта starts = [-2, -1, 1, 2] # перемешиваем его random.shuffle(starts) # выбираем первый из перемешанного — это будет вектор движения шарика self.x = starts[0] # в самом начале он всегда падает вниз, поэтому уменьшаем значение по оси y self.y = -2 # шарик узнаёт свою высоту и ширину self.canvas_height = self.canvas.winfo_height() self.canvas_width = self.canvas.winfo_width() # свойство, которое отвечает за то, достиг шарик дна или нет. Пока не достиг, значение будет False self.hit_bottom = False # обрабатываем касание платформы, для этого получаем 4 координаты шарика в переменной pos (левая верхняя и правая нижняя точки) def hit_paddle(self, pos): # получаем кординаты платформы через объект paddle (платформа) paddle_pos = self.canvas.coords(self.paddle.id) # если координаты касания совпадают с координатами платформы if pos[2] >= paddle_pos[0] and pos[0] = paddle_pos[1] and pos[3] = self.canvas_height: # помечаем это в отдельной переменной self.hit_bottom = True # выводим сообщение и количество очков canvas.create_text(250, 120, text='Вы проиграли', font=('Courier', 30), fill='red') # если было касание платформы if self.hit_paddle(pos) == True: # отправляем шарик наверх self.y = -2 # если коснулись левой стенки if pos[0] = self.canvas_width: # движемся влево self.x = -2
Платформа
Сделаем то же самое для платформы — сначала опишем её поведение словами, а потом переведём в код. Итак, вот что должна уметь платформа:
- двигаться влево или вправо в зависимости от нажатой стрелки;
- понимать, когда игра началась и можно двигаться.
А вот как это будет в виде кода:
# Описываем класс Paddle, который отвечает за платформы class Paddle: # конструктор def __init__(self, canvas, color): # canvas означает, что платформа будет нарисована на нашем изначальном холсте self.canvas = canvas # создаём прямоугольную платформу 10 на 100 пикселей, закрашиваем выбранным цветом и получаем её внутреннее имя self.id = canvas.create_rectangle(0, 0, 100, 10, fill=color) # задаём список возможных стартовых положений платформы start_1 = [40, 60, 90, 120, 150, 180, 200] # перемешиваем их random.shuffle(start_1) # выбираем первое из перемешанных self.starting_point_x = start_1[0] # перемещаем платформу в стартовое положение self.canvas.move(self.id, self.starting_point_x, 300) # пока платформа никуда не движется, поэтому изменений по оси х нет self.x = 0 # платформа узнаёт свою ширину self.canvas_width = self.canvas.winfo_width() # задаём обработчик нажатий # если нажата стрелка вправо — выполняется метод turn_right() self.canvas.bind_all('', self.turn_right) # если стрелка влево — turn_left() self.canvas.bind_all('', self.turn_left) # пока игра не началась, поэтому ждём self.started = False # как только игрок нажмёт Enter — всё стартует self.canvas.bind_all('', self.start_game) # движемся вправо def turn_right(self, event): # будем смещаться правее на 2 пикселя по оси х self.x = 2 # движемся влево def turn_left(self, event): # будем смещаться левее на 2 пикселя по оси х self.x = -2 # игра начинается def start_game(self, event): # меняем значение переменной, которая отвечает за старт self.started = True # метод, который отвечает за движение платформы def draw(self): # сдвигаем нашу платформу на заданное количество пикселей self.canvas.move(self.id, self.x, 0) # получаем координаты холста pos = self.canvas.coords(self.id) # если мы упёрлись в левую границу if pos[0] = self.canvas_width: # останавливаемся self.x = 0
Счёт
Можно было не выделять счёт в отдельный класс и каждый раз обрабатывать вручную. Но здесь реально проще сделать класс, задать нужные методы, чтобы они сами потом разобрались, что и когда делать.
От счёта нам нужно только одно (кроме конструктора) — чтобы он правильно реагировал на касание платформы, увеличивал число очков и выводил их на экран:
# Описываем класс Score, который отвечает за отображение счетов class Score: # конструктор def __init__(self, canvas, color): # в самом начале счёт равен нулю self.score = 0 # будем использовать наш холст self.canvas = canvas # создаём надпись, которая показывает текущий счёт, делаем его нужно цвета и запоминаем внутреннее имя этой надписи self.id = canvas.create_text(450, 10, text=self.score, font=('Courier', 15), fill=color) # обрабатываем касание платформы def hit(self): # увеличиваем счёт на единицу self.score += 1 # пишем новое значение счёта self.canvas.itemconfig(self.id, text=self.score)
Игра
У нас всё готово для того, чтобы написать саму игру. Мы уже провели необходимую подготовку всех элементов, и нам остаётся только создать конкретные объекты шарика, платформы и счёта и сказать им, в каком порядке мы будем что делать.
Смысл игры в том, чтобы не уронить шарик. Пока этого не произошло — всё движется, но как только шарик упал — нужно показать сообщение о конце игры и остановить программу.
Посмотрите, как лаконично выглядит код непосредственно самой игры:
# создаём объект — зелёный счёт score = Score(canvas, 'green') # создаём объект — белую платформу paddle = Paddle(canvas, 'White') # создаём объект — красный шарик ball = Ball(canvas, paddle, score, 'red') # пока шарик не коснулся дна while not ball.hit_bottom: # если игра началась и платформа может двигаться if paddle.started == True: # двигаем шарик ball.draw() # двигаем платформу paddle.draw() # обновляем наше игровое поле, чтобы всё, что нужно, закончило рисоваться tk.update_idletasks() # обновляем игровое поле, и смотрим за тем, чтобы всё, что должно было быть сделано — было сделано tk.update() # замираем на одну сотую секунды, чтобы движение элементов выглядело плавно time.sleep(0.01) # если программа дошла досюда, значит, шарик коснулся дна. Ждём 3 секунды, пока игрок прочитает финальную надпись, и завершаем игру time.sleep(3)
ПОЛНЫЙ КОД ПРОГРАММЫ
# подключаем графическую библиотеку from tkinter import * # подключаем модули, которые отвечают за время и случайные числа import time import random # создаём новый объект — окно с игровым полем. В нашем случае переменная окна называется tk, и мы его сделали из класса Tk() — он есть в графической библиотеке tk = Tk() # делаем заголовок окна — Games с помощью свойства объекта title tk.title('Game') # запрещаем менять размеры окна, для этого используем свойство resizable tk.resizable(0, 0) # помещаем наше игровое окно выше остальных окон на компьютере, чтобы другие окна не могли его заслонить. Попробуйте :) tk.wm_attributes('-topmost', 1) # создаём новый холст — 400 на 500 пикселей, где и будем рисовать игру canvas = Canvas(tk, width=500, height=400, highlightthickness=0) # говорим холсту, что у каждого видимого элемента будут свои отдельные координаты canvas.pack() # обновляем окно с холстом tk.update() # Описываем класс Ball, который будет отвечать за шарик class Ball: # конструктор — он вызывается в момент создания нового объекта на основе этого класса def __init__(self, canvas, paddle, score, color): # задаём параметры объекта, которые нам передают в скобках в момент создания self.canvas = canvas self.paddle = paddle self.score = score # цвет нужен был для того, чтобы мы им закрасили весь шарик # здесь появляется новое свойство id, в котором хранится внутреннее название шарика # а ещё командой create_oval мы создаём круг радиусом 15 пикселей и закрашиваем нужным цветом self.id = canvas.create_oval(10,10, 25, 25, fill=color) # помещаем шарик в точку с координатами 245,100 self.canvas.move(self.id, 245, 100) # задаём список возможных направлений для старта starts = [-2, -1, 1, 2] # перемешиваем его random.shuffle(starts) # выбираем первый из перемешанного — это будет вектор движения шарика self.x = starts[0] # в самом начале он всегда падает вниз, поэтому уменьшаем значение по оси y self.y = -2 # шарик узнаёт свою высоту и ширину self.canvas_height = self.canvas.winfo_height() self.canvas_width = self.canvas.winfo_width() # свойство, которое отвечает за то, достиг шарик дна или нет. Пока не достиг, значение будет False self.hit_bottom = False # обрабатываем касание платформы, для этого получаем 4 координаты шарика в переменной pos (левая верхняя и правая нижняя точки) def hit_paddle(self, pos): # получаем кординаты платформы через объект paddle (платформа) paddle_pos = self.canvas.coords(self.paddle.id) # если координаты касания совпадают с координатами платформы if pos[2] >= paddle_pos[0] and pos[0] = paddle_pos[1] and pos[3] = self.canvas_height: # помечаем это в отдельной переменной self.hit_bottom = True # выводим сообщение и количество очков canvas.create_text(250, 120, text='Вы проиграли', font=('Courier', 30), fill='red') # если было касание платформы if self.hit_paddle(pos) == True: # отправляем шарик наверх self.y = -2 # если коснулись левой стенки if pos[0] = self.canvas_width: # движемся влево self.x = -2 # Описываем класс Paddle, который отвечает за платформы class Paddle: # конструктор def __init__(self, canvas, color): # canvas означает, что платформа будет нарисована на нашем изначальном холсте self.canvas = canvas # создаём прямоугольную платформу 10 на 100 пикселей, закрашиваем выбранным цветом и получаем её внутреннее имя self.id = canvas.create_rectangle(0, 0, 100, 10, fill=color) # задаём список возможных стартовых положений платформы start_1 = [40, 60, 90, 120, 150, 180, 200] # перемешиваем их random.shuffle(start_1) # выбираем первое из перемешанных self.starting_point_x = start_1[0] # перемещаем платформу в стартовое положение self.canvas.move(self.id, self.starting_point_x, 300) # пока платформа никуда не движется, поэтому изменений по оси х нет self.x = 0 # платформа узнаёт свою ширину self.canvas_width = self.canvas.winfo_width() # задаём обработчик нажатий # если нажата стрелка вправо — выполняется метод turn_right() self.canvas.bind_all('', self.turn_right) # если стрелка влево — turn_left() self.canvas.bind_all('', self.turn_left) # пока платформа не двигается, поэтому ждём self.started = False # как только игрок нажмёт Enter — всё стартует self.canvas.bind_all('', self.start_game) # движемся вправо def turn_right(self, event): # будем смещаться правее на 2 пикселя по оси х self.x = 2 # движемся влево def turn_left(self, event): # будем смещаться левее на 2 пикселя по оси х self.x = -2 # игра начинается def start_game(self, event): # меняем значение переменной, которая отвечает за старт движения платформы self.started = True # метод, который отвечает за движение платформы def draw(self): # сдвигаем нашу платформу на заданное количество пикселей self.canvas.move(self.id, self.x, 0) # получаем координаты холста pos = self.canvas.coords(self.id) # если мы упёрлись в левую границу if pos[0] = self.canvas_width: # останавливаемся self.x = 0 # Описываем класс Score, который отвечает за отображение счетов class Score: # конструктор def __init__(self, canvas, color): # в самом начале счёт равен нулю self.score = 0 # будем использовать наш холст self.canvas = canvas # создаём надпись, которая показывает текущий счёт, делаем его нужно цвета и запоминаем внутреннее имя этой надписи self.id = canvas.create_text(450, 10, text=self.score, font=('Courier', 15), fill=color) # обрабатываем касание платформы def hit(self): # увеличиваем счёт на единицу self.score += 1 # пишем новое значение счёта self.canvas.itemconfig(self.id, text=self.score) # создаём объект — зелёный счёт score = Score(canvas, 'green') # создаём объект — белую платформу paddle = Paddle(canvas, 'White') # создаём объект — красный шарик ball = Ball(canvas, paddle, score, 'red') # пока шарик не коснулся дна while not ball.hit_bottom: # если игра началась и платформа может двигаться if paddle.started == True: # двигаем шарик ball.draw() # двигаем платформу paddle.draw() # обновляем наше игровое поле, чтобы всё, что нужно, закончило рисоваться tk.update_idletasks() # обновляем игровое поле и смотрим за тем, чтобы всё, что должно было быть сделано — было сделано tk.update() # замираем на одну сотую секунды, чтобы движение элементов выглядело плавно time.sleep(0.01) # если программа дошла досюда, значит, шарик коснулся дна. Ждём 3 секунды, пока игрок прочитает финальную надпись, и завершаем игру time.sleep(3)
Что дальше
На основе этого кода вы можете сделать свою модификацию игры:
- добавить второй шарик;
- раскрасить элементы в другой цвет;
- поменять размеры шарика; поменять скорость платформы;
- сделать всё это сразу;
- поменять логику программы на свою.
Игры и приложения для изучения программирования

Развитие автоматизации и диджитализации во всем мире значительно повышает интерес к ИТ-специальностям. Особенно привлекает программирование, обещающее достойную оплату и интересное развитие. Потому даже востребованные в других областях специалисты решаются на смену направления и хотят переквалифицироваться в программистов. Но на пути к освоению новой профессии программиста у многих новичков может возникнуть стереотип, что выучить язык программирования сложно и скучно. Особенно, если заниматься самообучением на бесплатных ресурсах.
Начиная самостоятельное обучение практически все сталкиваются с такими трудностями, как нехватка времени и необходимость прилагать усилия. В легкой и доступной форме справится с этими трудностями поможет большое количество интересных приложений и игр.
Приложения для программирования
Именно благодаря таким доступным ресурсам, как мобильные приложения, получить базовые знания по программированию стало легче и проще. С помощью приложений можно каждый день уделять время для знакомства с азами популярных языков программирования, так как мобильный телефон всегда с собой.
Предлагаем несколько интересных и доступных всем приложений.
Solo Learn
Изучаемые языки: Python, Java, JavaScript, C #, C ++, HTML, PHP, CSS, SQL, Swift, jQuery, Ruby
Одно из самых популярных и объемных по изучаемым материалам приложение. В нем собраны курсы широко используемых языков программирования и фреймворков, которые разделены на уровни от новичка до профессионала.
Интерфейс удобен и понятен. Для каждого выбранного курса имеется несколько вкладок:
- «Учиться» — содержит полную базу уроков по кодированию на выбранном языке программирования;
- «Играть» — позволяет принять участие в сетевых сражениях на проверку знания языка;
- «Код» — открывает интегрированную среду разработки, в которой можно попрактиковать пройденный материал;
- «Обсудить» — открытый форум для пользователей приложением, в котором можно задавать и обсуждать различные вопросы по курсу.
Обучение – русский язык.
Доступ к ресурсам – бесплатный.
Start Android
Изучаемые языки: Java
Отличная образовательная программа с базовым курсом, который поможет начать обучение языку Java. Для изучения доступны различные уроки с наглядными примерами и фрагментами кода. Такие примеры помогают быстрее усвоить механику программирования. Прохождение курса разработано с постепенным повышением сложности, что делает обучение эффективным и интересным.
В приложении есть возможность менять шрифты и визуальное оформление на свой вкус, а также отмечать пройденные уроки и оставлять закладки. В последнюю версию приложения разработчики добавили офлайн-режим, что удобно в случае отключения мобильного устройства от интернета.
Обучение – русский язык.
Доступ к ресурсам – бесплатный.
Grasshopper: learn to code
Изучаемые языки: JavaScript
Отличный вариант для новичков в программировании. Приложение входит в число лучших обучающих ресурсов. Обучение JavaScript в Grasshopper представлено в игровой форме, доступной для быстрого освоения.
Уроки небольшие по объему, не утомительны и интересны. Обучение основано на простом, удобном в использовании конструкторе.
Обучение — английский язык.
Доступ к ресурсам – бесплатный.
Programming Hero
Изучаемые языки: Python, HTML, CSS, JavaScript
С помощью этого приложения можно научиться программированию интересно и весело. Игровая платформа включает в себя обучение языку программирования Python, основам JavaScript, HTML и CSS. Обучающая платформа позволяет создать собственную игру, научится кодировать, проходя викторины, быстрее усваивать информацию благодаря визуальным эффектам и забавным иллюстрациям.
Кроме обучения программированию в приложении заложены материалы по базам данных, алгоритмам, веб-разработке.
Обучение — английский язык.
Доступ к ресурсам – условно-бесплатный, полный доступ по подписке.
Обучение с помощью мобильных приложений проходит легко и удобно. Уделить внимание интересному занятию можно по дороге домой или на работу. Еще интересней и веселее учить язык программирования, проходя обучающие игры, которых сегодня огромное количество.
Игры для программирования
Предлагаем ознакомиться с самыми популярными и наиболее эффективными играми, с помощью которых выучить азы языков программирования станет забавной и несложной задачей.
Code Combat
Изучаемые языки: JavaScript, Java, Python
Красочная анимационная игра с увлекающим сюжетом. Находится в свободном доступе для игроков всего мира и имеет открытый код. Просматривая исходный код и внося свои исправления в него, сотни игроков помогли стать Code Combat лучше.
В игре для своего персонажа нужно писать команды на изучаемом языке программирования. Цель игры – провести своего героя до финиша, собирая по пути кристаллы.
Обучение – английский и русский языки.
Доступ к ресурсам – платный.
Code Monkey
Изучаемые языки: CoffeScript, Python
Игровая онлайн-платформа с забавной анимацией. Игра простая и доступная даже детям. Процесс обучения разбит на небольшие уровни по несколько минут. Остановить игру можно в любой момент, прогресс сохраняется в аккаунте. Помогает быстро освоить основы программирования.
Обучение – английский и русский языки.
Доступ к ресурсам – платный, есть бесплатный пробный период.
Cyber DoJo
Изучаемые языки: PHP, Python, Java, JavaScript, Ruby
Игровое пространство DoJo – это место встречи начинающих программистов, которые хотят прокачать свои знания на практике. Собравшись с разных уголков мира, группы разработчиков соревнуются в решении заданий с использованием определенных языков программирования или вместе обсуждают возможные варианты решения.
Отлично подходит для тех, кто уже освоил азы и хочет потренироваться в написании кода на реальных задачах. Помогает ускорить обучение PHP программированию и таким популярным языкам, как Python, Java, JavaScript.
Обучение – английский язык.
Доступ к ресурсам – бесплатный.
Code Hunt
Изучаемые языки: Java, C#
Легкая в освоении игра как для начинающих кодеров, так и для более продвинутых программистов. Прохождение уровней заключается в выполнении разной сложности заданий, в которых нужно менять код по указанным входящим данным. Правильность и чистоту кода определяет компилятор, выставляя оценку по трёхбалльной шкале.
Играть можно на онлайн-ресурсе или скачать на свой ПК.
Обучение – английский язык.
Доступ к ресурсам – платный.
Самостоятельное обучение программированию с помощью игр и приложений является эффективным способом для начинающих разработчиков. Особенно, когда желание научится писать код сталкивается со страхом сложности освоения этого навыка. Попробовав свои силы в легкой и доступной форме, можно побороть эти страхи и приобрести уверенность в своих возможностях.
Обучающие игры и приложения подходят для тех, кто только начал свой путь к освоению программирования. Для более глубокого изучения любого языка программирования необходимо пройти профессиональные курсы.
Только на курсах опытные тренеры ответят на все вопросы в процессе обучения, помогут быстрее освоить получаемые знания, проследят за регулярностью прохождения занятий.
Академия «Сетевые Технологии» предлагает курсы программирования на языках Java, JavaScript, PHP, Python. Подобрать подходящий курс можно связавшись с нашим менеджером, который ответит на все вопросы.
Создание консольной игры Супер Ним на Python
Приветствую всех хабровчан! Я являюсь студенткой Финансового Университета при Правительстве РФ и обучаюсь на направлении Прикладная математика и информатика. Сегодня мне хотелось бы поделиться своим туториалом для изучающих Python с нуля. Идея для создания этой статьи появилась на паре практикума по программированию, где данная задача была проектом для сдачи. Если этот туториал зайдет, то будут следующие выпуски.
В этом уроке мы напишем несложную консольную игру Супер Ним по следующим правилам:
На шахматной доске в некоторых клетках случайно разбросаны фишки или пуговицы. Игроки ходят по очереди. За один ход можно снять все фишки с какой-либо горизонтали или вертикали, на которой они есть. Выигрывает тот, кто заберет последние фишки.
В нашем случае примем за фишки/пуговицы единицы, а пустые клетки станут нулями. Создадим шахматную доску при помощи списков и random:
from random import randint print(' '+'a',' '+'b',' '+'c',' '+'d',' '+'e',' '+'f',' '+'g',' '+'h') list_board = [[],[],[],[],[],[],[],[]] for el in list_board: for i in range(8): el.append(randint(0,1))
В данном коде мы создаем доску с рандомно заданными нулями и единицами, а также выводим верхние координаты от a до h.
Теперь создадим координаты для горизонталей(от 1 до 8) и свяжем все буквы и числа с нашими полями:
for idx,i in enumerate(list_board): print((chr(ord('1')+idx))+str(i)) x= y=
Попробуем написать логику ввода координат обоими игроками:
arr=[] def play(): a="" while a!="Игрок 1 победил" and a!="Игрок 2 победил": if 1 in list_board[0] or 1 in list_board[1] or 1 in list_board[2] or 1 in list_board[3] or 1 in list_board[4] or 1 in list_board[5] or 1 in list_board[6] or 1 in list_board[7]: print("\nИгрок 1 вводит координаты") letter=input() f(letter) arr.append(1) if 1 in list_board[0] or 1 in list_board[1] or 1 in list_board[2] or 1 in list_board[3] or 1 in list_board[4] or 1 in list_board[5] or 1 in list_board[6] or 1 in list_board[7]: print("\nИгрок 2 вводит координаты") letter=input() f(letter) arr.append(2) else: if arr[-1]==1: a="Игрок 1 победил" else: a="Игрок 2 победил" print(a)
Здесь функция будет проверять, остались ли еще единицы на поле и выводить победителя в случае их отсутствия. Если же они остались, то функция реализует чередование ввода координат игроками. Кроме того, мы создадим некую «базу данных» в виде списка, который хранит в себе номер игрока, который ввел координаты. Именно проверяя последний элемент данного списка, можно определить победителя. Как мы видим, в функции play вызывается функция f, которая принимает за аргумент букву, которую ввел игрок. Давайте ее напишем:
def f(letter): string_1 = "abcdefgh" string_2="12345678" if letter in string_1: for i in list_board: i[x[letter]]= 0 if letter in string_2: list_board[y[letter]]=[0]*8 print(' '+'a',' '+'b',' '+'c',' '+'d',' '+'e',' '+'f',' '+'g',' '+'h') for idx,i in enumerate(list_board): print((chr(ord('1')+idx))+str(i))
Функция f убирает все единицы, находящиеся на выбранной горизонтали или вертикали, а затем снова выводить поле с координатами после обновления значений.
После всего написанного кода мы можем запустить функцию play() и играть. Спасибо за прочтение, надеюсь, данный урок будет полезен новичкам!
Для тех, кто хочет прокачать свои навыки использования python, предлагаю сделать следующее:
- принять за второго игрока саму программу, которая будет делать рандомный ход
- попробовать вывести верхние координаты циклом for(как цифры сбоку)
- сократить код посредством избавления от большого количества if/else
