Три крутые игры на 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
В этой статье мы расскажем о том, как с помощью специального модуля Pygame даже ребенок сможет создать «Тетрис» на Python.
Онлайн-школа программирования для детей Pixel
Тетрис — популярная аркадная игра, которая была разработана и выпущена русским программистом Алексеем Пажитновым в 1984 году. Она быстро стала мировым хитом и получила огромную популярность по всему миру.
Суть игры довольно проста, но именно это позволяет ей вызывать интерес у людей и по сей день. К тому же ее можно создать самому, используя возможности языка программирования Python («Питон»).
Если программирование для школьников вам не знакомо — не беда. Мы пошагово расскажем о том, что нужно делать для создания игры. Главное — повторять все со 100% точностью. Если вам удобнее воспринимать урок в формате видео, то под статьей мы прикрепили ролик, где преподаватель школы Pixel подробно объясняет, что необходимо установить, запустить и нажать, чтобы ваш проект заработал.
Python для школьников: создаем свой «Тетрис» с нуля
Напоминаем, что для начала кодинга игр на «Пайтоне» нам понадобится модуль Pygame. Для его установки следует запустить Windows PowerShell (приложение доступно по поиску при нажатии кнопки «Пуск») и прописать без кавычек «Pip install pygame», после этого нажать Enter.
Начинаем «Тетрис» на Python с импорта необходимых библиотек: pygame, random, copy. Особенно нам важна библиотека copy, так как она позже поможет нам в создании последних штрихов игры.
После этого запускаем Visual Studio Code, paygame и задаем два параметра: I_max и J_max.
Для первого параметра указываем число 11, а для второго — 21. В итоге у нас появляется 11 и 20 ячеек.
Создание «Тетрис» на Python для детей: добавляем переменные
Следующий шаг для того, чтобы ребенку сделать игру самому — создание переменных. Мы должны добавить их с параметрами экрана 300 на 600.
Затем приступим к формированию экрана, где указываем переменные и описываем класс Clock (), который будет отвечать за управление временем, а в нашем случае — за частоту его обновления. Также установим название экрана.
Кроме того, чтобы самому сделать игру «Тетрис» нужно вычислить ширину и высоту каждой ячейки нашей сетки. Делим параметр screen на I_max — 1 и J_max — 1. Это объясняется тем, что каждая точка в области соответствует одной ячейке, и количество точек на единицу меньше количества ячеек. Для определения частоты обновления кадров мы создаем переменную, равную 60.
Если вы читаете текст здесь и у вас что-то не получается, то внизу страницы будет указан полный код для запуска проекта. Проверьте все данные или скопируйте часть параметров для самопроверки.
Продолжаем онлайн-урок на Python для детей: запускаем цикл
Теперь предстоит создать список, в котором будут храниться настройки сетки (именно она и будет отображаться на экране).
Также с помощью цикла мы проверим все схемы сетки, включив их во все списки. Внутрь него достаточно установить только единицу, после чего мы укажем остальные параметры для каждой ячейки.
В следующем цикле заполняем существующие списки сущностями прямоугольников — rect, и указываем цвет для каждого. В итоге у вас получится большой список для каждой ячейки. Также требуется прописать координаты прямоугольников с указанием их местоположения — применяем умножение номера точки на шаг.
По завершении запускаем бесконечный цикл.
Создание игры на Python с нуля: заливка экрана
После запуска бесконечного цикла нам предстоит заняться заливкой холста с его покадровым обновлением, а также создать сетку.
Необходимо пройтись по всем прописанным строчками и создать рисунок каждого квадрата.
Здесь двойка — это цвет, единица — сущность уже существующего четырехугольника, а ноль — это тип заполнения. В заполнении цифра 1 создаст границу, а 0 сделает заливку сплошной. После этого добавляем обновление.
«Тетрис» для детей на Python: детали
В верхнем правом углу нажимаем на треугольник (Play), который отобразит написанный код через консоль. Должна быть видна белая сетка на черном фоне. Если это так — вы на правильном пути.
Для более правильной работы кода добавим событие «нажатие на крестик». Это прописывается ниже строки game=True.
Чтобы вспомнить о том, какие фигуры (детали) используются в игре, с ними можно ознакомиться в интернете, например, в «Википедии». Всего в «Тетрисе» используются 7 элементов, каждый из которых состоит из 4 кубов.
Рисовать детали мы будем интересным способом: запишем координаты шагов относительно центра, то есть точки 00, и далее будем исходить из того, что 3-й элемент — это 00.
Следующий шаг — сделать список с сущностями деталей. С этой целью мы создаем список det.
Каждую фигуру необходимо наполнить сущностями четырех квадратов. При этом координаты мы будем брать из ранее созданного списка. Умножаем их на шаг и ставим в центр экрана сверху.
Теперь можно вывести список в консоль для проверки. В итоге внизу экрана можно будет увидеть информацию о наличии 7 деталей, в каждой из которых будет по 4 квадратика.
Сделаем случайный выбор детали из нашего списка и настроим отрисовку детали в программе. Напишем условие, чтобы на каждый кадр запускался цикл по четырем прямоугольникам внутри случайно выбранной детали. То есть в каждый кадр будет прорисовано 4 прямоугольника из списка случайно выбранной детали. Запускаем консоль для проверки — должна появиться деталь вверху экрана. При каждом новом запуске консоли будет появляться случайная фигура — так и должно быть.
Настройка движения детали в игре на языке Python для детей
Для настройки движения детали, перед ее отрисовкой мы должны снова написать последовательность, которая будет проходиться по четырем элементам. Движение будет происходить очень просто: нужно взять det_choice и поменять координаты у всех четырех квадратов на шаг dx и dy.
Можно, например, прописать строчку 1*dx. Если после этого запустить консоль (напоминаем о кнопке со значком треугольника в верхнем правом углу), то фигура будет двигаться очень быстро вправо, едва заметно. Если поменять значение на минус один, произойдет быстрое смещение влево.
Далее следует создать еще один event, который сработает при нажатии кнопки. Сейчас, нажав на кнопку (которая должна сдвигать фигуру влево), мы меняем значение delta_x на -1. Для правой стрелки делаем аналогично, только со значением +1. Проверяем. Фигуры должны передвигаться более плавно.
Следующий пункт — настройка границ, запрет выхода из них. Добавьте условие, что если фигура «пробралась» за грань рабочей области, delta_x будет обнулено и движение не произойдет.
Теперь необходимо настроить аналогичное перемещение по оси Y. Если до этого момента вы все сделали правильно, то фигура после запуска консоли должна быстро переместиться сверху вниз. Чтобы это исправить, важно включить перемещение только на каждые 30 обновлений. Теперь после запуска консоли фигура будет достаточно медленно передвигаться сверху вниз.
Добавление ускорения и границ по оси Y
В уроке от онлайн-школы Pixel мы решили рассказать о том, как добавить ускорение падения фигуры, чтобы это еще больше напоминало оригинальный «Тетрис». Чтобы клавишу можно было зажать, требуется запустить get_pressed(). Если нажатая кнопка совпадает с pygame. K_DOWN (кнопка, назначенная на движение вниз), то число обновлений должно быть равно 31.
Если сейчас проверить функцию и нажать стрелку вниз, фигура «улетит» за нижнюю границу консоли. Чтобы этого не происходило, обозначим границы экрана по оси Y. После настройки фигура остановится на нижней границе. Проверить это легко: запускаем консоль и дожидаемся падения фигуры.
После остановки движения важно, чтобы вверху консоли появилась новая фигура. Для этого необходимо закрасить клетки сетки (где осталась деталь) белым цветом. То есть вы должны задать значение заливки и сделать его равным нулю, а цвет поменять с серого на белый. После чего необходимо настроить новый выбор случайного элемента.
Чтобы закрасить клетки, необходимо определиться с индексами клеток. Следует записать две переменные X и Y — и уже в этих переменных менять заданные параметры. После чего прописываем условие для выбора случайной детали. Проверьте написанный код через консоль — детали должны падать сверху вниз, как в «Тетрисе».
В итоге становится заметна одна проблема — во время игры выпадают исключительно семь фигур, а новые не появляются.
Это стало итогом того, как именно происходит сохранение информации при использовании языка программирования «Питон». Когда менялись данные о местоположении, менялся и список. Чтобы исключить проблему, важно сделать копию фигур из списка и изменить данные местоположения копии, а не оригинальной детали. Именно поэтому потребуются возможности библиотеки copy, о которой мы писали в самом начале.
После этого снова потребуется запуск консоли для проверки. Если все выполнено верно, новые фигуры появляются в количестве более 7 штук. Но возникает новая проблема — они не ставятся друг на друга!
Так как в онлайн-школе Pixel преподают программирование для детей, то мы знаем способ, с помощью которого любой ребенок сможет справиться с этой ситуацией. Добавляем еще одно условие нижней грани — если нижняя ячейка имеет цвет, то мы останавливаем движение. В результате фигура остается на месте.
На этом этапе основные игровые механики уже реализованы, но требуется добавить некоторые функции и особенности, которые есть в оригинальной игре. Самые важные моменты, которые должны быть реализованы — поворот фигур и «сжигание» заполненного ряда.
Добавляем возможность поворота в будущую игру
Вы уже находитесь на финишной прямой создания игры для детей на Python. Сейчас мы расскажем, как добавить 2 важные игровые механики, после чего можно будет поиграть в свой собственный «Тетрис».
Начнем с поворота — сделаем его по стандартной математической формуле поворота на 90 градусов в декартовой системе координат. То есть относительно центра в (0,0). Центр у вас должен быть записан в третьей ячейке, поэтому прописываем как центр второй индекс det_choice [2]. При этом поворот мы привязываем к нажатию стрелки вверх.
Также необходимо создать еще одну проверку на нажатие клавиши стрелки вверх — при ее нажатии переменная rotate становится равной True. Таким образом выполняется условие и мы проходимся по всем элементам наших деталей и смещаем их относительно центра вращения, после чего переписываем rotate на False. Проверяем. Если все выполнено верно, фигуры должны поворачиваться и заполнять пустые места «на дне». Но если фигуры сложились в один ряд, этот ряд не исчезнет. Чтобы он исчезал, пропишем еще несколько условий.
Для этого запустим цикл, который будет проверять насколько у нас заполнен каждый ряд. Будем идти снизу вверх и слева направо, и считать число заполненных ячеек. Они будут заполнены, когда параметр заполнения равен нулю. Но если хотя бы одна ячейка не будет равна нулю, это значит, что вся полоска уже точно не заполнена, и можно завершить цикл на этом ряду и проверять следующий.
Теперь добавляем условие — если число заполненных ячеек равно числу ячеек в целом, то мы запускаем еще два цикла. Сначала все ячейки верхнего ряда делаем незакрашенными, а после, в следующем цикле, все ячейки рядов смещаем на один ряд вниз, начиная с того ряда, где мы нашли заполненность.
Запускаем финальную проверку. Если все сделано верно, то вы сможете поиграть в игру, которую написали сами!
Теперь вы знаете, как именно проходит обучение детей IT в школе программирования Pixel. Мы даем задания, которые интересно и полезно выполнять будущим программистам. Больше уроков вы можете на нашем Youtube-канале.
Если вы хотите, чтобы ваш ребенок изучал востребованные навыки и в будущем смог стать IT-специалистом, отправляйте его на курсы обучения в нашу IT онлайн-школу. Здесь он сможет изучить Python, Roblox, Scratch и многое другое. Курсы проходят как в онлайн, так и в офлайн-формате, в группах или индивидуально. Подходящий вариант найдется для каждого.
Полностью сегодняшний и многие другие уроки в видео-формате можно посмотреть тут.
Полный код игры «Тетрис» на Python:
import pygame import random import copy pygame.init() I_max = 11 J_max = 21 screen_x = 300 screen_y = 600 screen = pygame.display.set_mode((screen_x, screen_y)) clock = pygame.time.Clock() pygame.display.set_caption(«Tetris Pixel Game») dx = screen_x/(I_max — 1) dy = screen_y/(J_max — 1) fps = 60 grid = [] for i in range(0, I_max): grid.append([]) for j in range(0, J_max): grid[i].append([1]) for i in range(0, I_max): for j in range(0, J_max): grid[i][j].append(pygame.Rect(i*dx, j*dy, dx, dy)) grid[i][j].append(pygame.Color(«Gray»)) details = [ [[-2, 0], [-1, 0], [0, 0], [1, 0]], [[-1, 1], [-1, 0], [0, 0], [1, 0]], [[1, 1], [-1, 0], [0, 0], [1, 0]], [[-1, 1], [0, 1], [0, 0], [-1, 0]], [[1, 0], [1, 1], [0, 0], [-1, 0]], [[0, 1], [-1, 0], [0, 0], [1, 0]], [[-1, 1], [0, 1], [0, 0], [1, 0]], ] det = [[],[],[],[],[],[],[]] for i in range(0, len(details)): for j in range(0, 4): det[i].append(pygame.Rect(details[i][j][0]*dx + dx*(I_max//2), details[i][j][1]*dy, dx, dy)) detail = pygame.Rect(0, 0, dx, dy) det_choice = copy.deepcopy(random.choice(det)) count = 0 game = True rotate = False while game: delta_x = 0 delta_y = 1 for event in pygame.event.get(): if event.type == pygame.QUIT: exit() if event.type == pygame.KEYDOWN: if event.key == pygame.K_LEFT: delta_x = -1 elif event.key == pygame.K_RIGHT: delta_x = 1 elif event.key == pygame.K_UP: rotate = True key = pygame.key.get_pressed() if key[pygame.K_DOWN]: count = 31 * fps screen.fill(pygame.Color(«Black»)) for i in range(0, I_max): for j in range(0, J_max): pygame.draw.rect(screen, grid[i][j][2], grid[i][j][1], grid[i][j][0]) #границы for i in range(4): if ((det_choice[i].x + delta_x * dx < 0) or (det_choice[i].x + delta_x * dx >= screen_x)): delta_x = 0 if ((det_choice[i].y + dy >= screen_y) or (grid[int(det_choice[i].x//dx)][int(det_choice[i].y//dy) + 1][0] == 0)): delta_y = 0 for i in range(4): x = int(det_choice[i].x // dx) y = int(det_choice[i].y // dy) grid[x][y][0] = 0 #закрашиваем квадратик grid[x][y][2] = pygame.Color(«White») detail.x = 0 detail.y = 0 det_choice = copy.deepcopy(random.choice(det)) #передвижение по x for i in range(4): det_choice[i].x += delta_x*dx count += fps #передвижение по y if count > 30 * fps: for i in range(4): det_choice[i].y += delta_y*dy count = 0 for i in range(4): detail.x = det_choice[i].x detail.y = det_choice[i].y pygame.draw.rect(screen, pygame.Color(«White»), detail) C = det_choice[2] #центр СК if rotate == True: for i in range(4): x = det_choice[i].y — C.y y = det_choice[i].x — C.x det_choice[i].x = C.x — x det_choice[i].y = C.y + y rotate = False for j in range(J_max — 1, -1, -1): #цикл по рядам снизу вверх count_cells = 0 for i in range(0, I_max): #цикл по столбцам справа налево if grid[i][j][0] == 0: count_cells += 1 elif grid[i][j][0] == 1: break if count_cells == (I_max — 1): for l in range(0, I_max): grid[l][0][0] = 1 #все ячейки первого ряда for k in range(j, -1, -1): for l in range(0, I_max): grid[l][k][0] = grid[l][k-1][0] pygame.display.flip() clock.tick(fps)
Создать игру-тетрис

Создать игру тетрис
Правила игры: В прямоугольный стакан сверху падают различные (6 штук) геометрические фигуры.
Создать игру Тетрис
Создать игру Тетрис
На встроенном ассемблере создать игру простой тетрис
Помогите пожалуйста с задачей, используя объектно-орентированное программирование.
Делаю игру Тетрис
Доброго времени суток. Как я писал ранее, люблю всяческие программные головоломки. Но.
Написать игру Тетрис на языке C
Ребята, прошу, помогите начинающему программисту написать свой код для игры тетрис.
6 развлекательных проектов на Python: от шаверма-бота до игры в слова

Все, кто кодят на Python, знают, что это далеко не скучный и серьезный язык. При определенной доле фантазии на нем можно написать логику работы любого приложения, даже совершенно гиковского. И есть немало примеров, когда такие пет-проекты становились не только полем развития навыков разработчика, но и коммерческой идеей. Под катом собрали шесть подобных задач от Selectel — для вдохновения и прокачки навыков. Сохраняйте статью в закладки: пригодится всем, кто разрабатывает на Python.
Выберите интересующий вас проект:
Shawarma as a service
Суть проекта
Полтора года назад в Selectel появилась традиция есть шаверму по четвергам. Акция, названная Шавадеем, быстро обрела популярность. Но с увеличением количества участников ее организационные моменты — в частности, сбор и отправка заказов — становились все сложнее. Чтобы решить эту проблему, наш разработчик Вова написал Telegram-бота, который автоматизирует организацию события.
Для создания TG-бота автор использовал фреймворк Python Telegram Bot 20.0, а для веб-интерфейса — FastAPI. На тот момент как раз вышло обновление WebApp. С его помощью Вова заменил меню DurgerKing’а на директивы для шаблонизатора Jinja2 и добавил страницу с описанием каждой позиции.

Что вы узнаете из текста
- Откуда пошла традиция есть шаверму по четвергам.
- С каким проблемами в разработке столкнулся наш разработчик и как с ними боролся.
- Сколько людей остались без еды за все время работы бота.
«Minecraft» на Python
Суть проекта
Если вам надоело просто играть в Minecraft, предлагаем создать собственный мир из кубов с помощью библиотеки Ursina Engine. В статье автор показывает, как работать с объектами Entity, настроить взаимодействие с предметами и добавить элементы «атмосферы» в игровой процесс. Отдельное внимание он уделил генерации Minecraft-подобного мира. Для этого воспользовался матрицей из шумов Перлина, которая «отрисовывает» ландшафт игры.
Сама разработка довольно простая, поскольку движок консолидирует всю рутинную работу. Разработчику остается только импортировать необходимые объекты и проработать логику игры.

Что вы узнаете из текста
- Как написать простой GUI игры на базе Ursina Engine.
- Как сгенерировать «бесконечный» ландшафт, не понизив FPS.
- Как добавить наблюдателя с помощью встроенного объекта FirstPersonController.
Мод для Cyberpunk 2077
Суть проекта
Наши коллеги решили сделать амбициозный проект — VR-жилет, который «проецирует» ощущения урона персонажа на тело игрока. Чтобы осуществить эту идею, им нужен был мод, который отправляет данные из Cyberpunk 2077 на сам жилет. Однако информации по созданию моддинга мало, не говоря уже о готовых решениях. Поэтому решили самостоятельно разработать мод с помощью отправки данных по сети и UDP-датаграмм.
Для создания мода нашему разработчику пришлось прошерстить исходники игры, Lua, C++ и Python. А также выбрать подходящий редактор кода, среди которых — WolvenKit, RED4ext, REDmod, Cyber Engine Tweaks и другие. Две последние он использовал для разработки мода, а RED4ext — для отправки данных в формате JSON.

Консоль Cyber Engine Tweaks.
Что вы узнаете из текста
- Как узнать скрипт игровой логики с помощью Lua.
- Как научить Lua выполнять код при совершении событий в игре.
- Какая архитектура подойдет для работы со сложными структурами.
Динозаврик Google на тачбаре
Суть проекта
С 2016 года у некоторых моделей MacBook Pro есть сенсорная OLED-панель — тачбар. Она не только заменяет привычные функциональные клавиши, но и позволяет разрабатывать собственные. Наш технический писатель Влад решил воспользоваться этой функцией и создать мини-игру с бегущим динозавриков от Google.
В статье автор показал, как с помощью Python и открытой библиотеки PyTouchBar спроектировать свою небольшую игру. И все это без погружения в драйверы и разработку на Swift.

Представление игровой сцены.
Что вы узнаете из текста
- Как настроить игровую сцену с помощью числовых чанков.
- Как научить динозаврика прыгать через кактус.
- Как добавить подсчет набранных очков после окончания игры.

Рускоязычная игра в слова с ИИ
Суть проекта
На первый взгляд игра contexto кажется простой: нужно угадать загаданное слово. Однако нашему коллеге потребовалось 33 попытки и одна подсказка, чтобы найти верное. Осложнялось все тем, что игра доступна только на португальском и английском языках. Поэтому автор решил сделать свою версию — «Русо контексто».
Чтобы локализовать игру на русский, автор использовал модель от RusVectores, обученную на Национальном Корпусе Русского Языка. А для очистки модели от неподходящих слов — эмбеддинг Navec. Для статистики: только 36 269 токенов из 248 978 прошли «сито» эмбеддинга.

Что вы узнаете из текста
- Зачем к словам добавлять теги _NOUN или _VERB.
- Как получить начальную форму слова с помощью pymystem3.
- Как настроить бэкенд, чтобы играть без интернета.
Тетрис в QR-коде
Суть проекта
Разработчик Вова вдохновился гифкой и сделал настоящий тетрис в QR-коде. А также рассказал, как устроена его топология. К слову, код полностью рабочий — наведите на него камеру и убедитесь сами.
Для реализации задумки автор использовал Python, а для генерации QR-кодов — библиотеку qrcode. Она позволяет получить доступ к QR-коду как к двумерному массиву булевых значений, где каждый элемент соответствует пикселю. Однако qrcode умеет создавать только статические изображения, поэтому для анимированных он использовал библиотеку imageio.
Что вы узнаете из текста
- Как настроить размер QR-кода с помощью функции y=ax^2+bx+c.
- Как использовать numpy для решения систем уравнений в Python.
- Как создать свою последовательность действий из одной фигуры.