Три крутые игры на 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 — Tkinter
Всем привет. Если вы новичок в Python и пришли программировать игры, то я могу научить вас делать простую игру с графическим интерфейсом. После выбора IDE, вы можете начать писать код. В этом посте вы узнаете:
- О правилах игры в «Палочки»
- О создании GUI интерфейса на Tkinter с нуля
- О механике игры в «скрытой» части кода
Суть игры такова — на столе есть 20 палочек. Играют два игрока. Первый игрок берет 1, 2, или 3 палочки. Второй игрок также берет 1, 2, или 3 палочки. И так по очереди. Тот, кто возьмет последнюю палочку — проиграет.
Пишем код
Для начала импортируем библиотеки tkinter и random. Они встроенные, и ничего не надо устанавливать дополнительно. Мы импортируем из них *, то есть всё, а значит, теперь вместо random.randint мы можем писать просто randint.
from tkinter import * from random import *
Далее нам нужно разобраться с самим интерфейсом. Сама механика — позже.
left = 20 #Устанавливаем кол-во палочек root = Tk() #Присваиваем класс Ткинтера переменной root root.geometry("550x200") #Устанавливаем размер окна 550 на 200. Вы можете поставить другой, но тогда вам придется настраивать расположение и размер GUI-элементов вручную root.resizable(0, 0) #Делаем так, чтобы размер нашего окна не мог меняться по осям х и у root.title("Sticks") #Устанавливаем название окна root.mainloop() #Запускаем окно
Если мы запустим данный код сейчас, то получим вот такое окошко:

Оно имеет размер 550 на 200, название «Sticks», а также мы не можем менять его размер. Но окошко пустое, надо заполнить его. У нас будут располагаться:
- Текст «Сколько палочек будем брать»
- Кнопки для взятия палочек
- Палочки
- Кнопка хода компьютера
Начинаем работать МЕЖДУ переменными root.geometry и root.resizable
text1 = Label(root, text="Сколько палочек будем брать?") #Задаем окно расположения текста и сам текст text1.pack() #Пакуем текст butt1 = Button(root, text="1") #Настраиваем кнопку butt1.place(x=210, y=30) #Распологаем кнопку по указанным координатам butt2 = Button(root, text="2") butt2.place(x=265, y=30) butt3 = Button(root, text="3") butt3.place(x=320, y=30) sticks = Label(root, text = left * "| ") #Выводим палочки sticks.config(font = ("Arial", 30, 'bold')) #Устанавливаем шрифт Arial, размер текста 30 и делаем его жирным sticks.place(x=50, y=70) pc_butt = Button(root, text = "Ход компьютера", widht = 30) #Создаем кнопку хода компьютера с шириной в 30 пикселей pc_butt.place(x=170, y=150)

Уже похоже на игру, верно? Так вот, мы закончили делать интерфейс, пора переходить к самому главному механизму.
Если вы запустили код, то увидели, что кнопки ничего не делают. Все потому что мы не задали им команду которую нужно выполнять. Это можно сделать с помощью аргумента command, который должен располагаться в настройках кнопки. Для этого нужно сделать примерно так:
def hello(): print("Hello, world!") button = Button(root, text="Вывод", command = hello) button.pack()
Теперь при нажатии кнопки в консоль будет выводится надпись «Hello, world!». То есть указывая название функции (без скобок в конце) мы будем делать то, что в ней написано. Давайте настроим кнопки.
#Напишу вкратце, ибо будет долго заново писать все расположения и все остальное #pass говорит о том, что данный кусок кода будет заполнен позже. Это своего рода затычка def s1(): pass def s2(): pass def s3(): pass def pc(): pass butt1 = Button(root, text="1", command = s1) butt2 = Button(root, text="2", command = s2) butt3 = Button(root, text="3", command = s3) pc_butt = Button(root, text="Ход компьютера", command = pc)
Теперь наша графическая часть точно готова. Давайте приступим к написанию функций
def s1(): global left #Получаем глобальный доступ к переменной left u = 1 #Указываем что мы берем одну палочку left = left - u #Вычитаем от кол-ва палочек одну if left
Функции s2 и s3 заполняем похоже, меняя лишь переменную u
def s2(): global left u = 2 left = left - u if left
Игра почти готова. Уже сейчас в нее можно играть. Однако одному играть неинтересно, поэтому добавим компьютер
def pc(): global left a = randint(1, 3) #Загадываем число от 1 до 3 left = left - int(a) if left
Игра уже готова. Но компьютер без интеллекта, он просто вычитывает палочки, не задумываясь о возможности проиграть или выиграть. Давайте добавим его хоть немного интеллекта.
def pc(): global left a = randint(1, 3) if left == 4: #Если осталось 4 палочки a = 3 #Компьютер убирает 3 elif left == 3: #Если осталось 3 палочки a = 2 #Компьютер убирает 2 elif left == 2: #Если осталось 2 палочки a = 1 #Компьютер убирает 1 left = left - a if left
Ну вот, теперь на финальных стадиях игры компьютер имеет шансы выиграть, поэтому теперь мы не сможем выиграть, забирая любое кол-во палочек.
Готовый код без комментариев
Перед копированием кода, хочу предупредить, что здесь Tab содержит 2 пробела, а не 4, из-за чего вам придется либо писать код вручную либо переделывать Tab'ы
#Версия Python - 3.8.6 from tkinter import * from random import * left = 20 def s1(): global left u = 1 left = left - int(u) if left
Пишем игру Ним на Python
Вчера мы рассказали, как теория игр работает на практике и помогает победить. Вот кратко основное:
- теория игр — это не только про игры, а про любые ситуации, в которых может что-то происходить, меняться и зависеть от разных факторов;
- игрок — это тот, кто находится в этой ситуации и принимает решения;
- смысл теории игр в том, чтобы понять, как нужно действовать игрокам в разных ситуациях, чтобы получить нужный результат. Но не интуитивно, а с точки зрения законов математики.
В прошлой статье мы разобрали игру Ним с точки зрения логики и математики. Сегодня мы реализуем её на Python.
Классические правила игры Ним звучат так:
Есть несколько кучек, в каждой из которых лежит сколько-то камней. За один ход игрок может взять из любой одной кучки любое ненулевое число камней. Игроки берут камни по очереди. Побеждает тот, кто забирает последние камни.
Что делаем
Пишем игру Ним с двумя кучками — количество камней в кучках будет больше одного, за раз можно брать сколько угодно камней.
Играть будем против компьютера — он случайным образом будет выбирать кучку и количество камней, которые будет забирать. Кто заберёт последние камни, тот и победил.
Для этого нам понадобится Python — с ним получится быстро написать код и сразу проверить его в деле.
Логика проекта
Сегодня сделаем простую версию игры, которая будет работать так:
- есть две кучки камней, случайным образом выбираем, где сколько лежит;
- игрок и компьютер ходят по очереди;
- текущий участник выбирает номер кучки и количество камней, которые нужно оттуда забрать;
- алгоритм проверяет, остались ли после этого камни в кучках: если не осталось — игра заканчивается;
- ход переходит к другому участнику, и всё повторяется заново.
Компьютер будет выбирать кучку и количество камней не по сложной логике, а просто случайным выбором. Мы не будем пока добавлять логику проверки выигрышности хода, а сосредоточимся на механике игры, а проверку прикрутим в следующий раз.
Подготавливаем переменные
Для игры нам нужен модуль случайных чисел и переменные для кучек. Ещё добавим название текущего игрока — это поможет при проверках в дальнейшем. Начинать будет игрок, поэтому сразу пропишем его в переменной:
# подключаем модуль для работы со случайными числами import random # формируем кучки с камнями stack_1 = random.randint(2,10) stack_2 = random.randint(2,10) # выбранная кучка select = 0 # сколько камней взяли из кучки taken = 0 # кто делает текущий ход current_player = 'Игрок'
Забираем камни из кучки
Чтобы взять камни из кучки, нам нужно знать две вещи: из какой кучки забирать и сколько камней брать. Сделаем отдельную функцию, в которой на вход подаётся кучка и её номер; а внутри будет выбор, что делать для каждого игрока.
Если ходит человек, то он сам выбирает количество камней, которые нужно забрать, и мы это значение возьмём из переменной taken. А если ходит компьютер, мы случайным образом выберем для него кучку, в которой есть камни, и количество камней для отбора.
После этого нам остаётся вывести состояние текущего хода и уменьшить кучку на выбранное число камней. Результат работы функции — новое количество камней в выбранной кучке:
# забираем камни из кучки def take(stack, num): # будем менять глобальную переменную внутри функции global taken # если ход делает компьютер if current_player == 'Компьютер': # случайным образом выбираем количество камней, которые заберём из кучки taken = random.randint(1,stack) # выводим состояние текущего хода print(current_player + ' взял ' + str(taken) + ' камней из ' + str(num) + ' кучки') # уменьшаем кучку на выбранное количество камней stack = stack - taken # возвращаем количество камней в кучке return(stack)
Выводим текущее количество камней
На старте игры и после каждого хода нам важно знать, сколько камней лежит в каждой кучке. Для этого напишем простую функцию — она сообщит нам о состоянии кучек и заодно проверит, не выиграл ли кто-то после своего хода. Если выиграл — выводится сообщение и игра останавливается.
# выводим текущее состояние кучек def result(): # сообщаем, сколько камней в каждой кучке print('Камней в 1 кучке: ' + str(stack_1)) print('Камней в 2 кучке: ' + str(stack_2)) # если в кучках не осталось камней — текущий игрок победил if stack_1 == 0 and stack_2 == 0: print('Игра окончена, победил ' + current_player) # выходим из программы exit()
Программируем ход компьютера
Для начала компьютеру нужно проверить, в каких кучках есть камни: если в одной кучке нет камней, значит, берём из другой. Если камни есть в обеих кучках — случайным способом выбираем номер кучки и количество камней, которые надо забрать. Так как мы не проверяем выигрышность, ходы компьютера могут быть совсем не оптимальными:
# ход компьютера def take_computer(): # будем работать с глобальными переменными global stack_1, stack_2, current_player # если в первой кучке нет камней if stack_1 == 0: # берём камни из второй stack_2 = take(stack_2, 2) # то же самое для второй кучки elif stack_2 == 0: stack_1 = take(stack_1, 1) # если камни в кучках есть else: # выбираем случайным образом номер кучки choice = random.randint(1,2) # если выбрана первая кучка — берём камни оттуда if choice == 1: stack_1 = take(stack_1, 1) # то же самое для второй кучки else: stack_2 = take(stack_2, 2)
Запускаем игру
Последнее, что нам осталось сделать, — это запустить саму игру. Для этого на старте выводим начальное состояние кучек и запускаем бесконечный цикл. Бесконечный — для того, чтобы он работал всё время, пока в кучках есть камни. Как только они закончатся, функция result() выведет сообщение о победе и остановит игру.
Ещё на каждом ходу мы меняем в конце текущего игрока: если был компьютер, ставим игрока, и наоборот. С игроком действуем чуть иначе, чем с компьютером, — нам нужно узнать у игрока номер кучки и количество камней, а потом отправить эти данные в функцию отбора камней.
# выводим на старте состояние кучек result() # запускаем бесконечный цикл while True: # если ходит компьютер if current_player == 'Компьютер': # он делает свой ход take_computer() # выводим состояние кучек result() # меняем текущего игрока current_player = 'Игрок' # если ходит игрок else: # спрашиваем у него номер кучки и количество камней select = int(input('Выберите кучку: ')) taken = int(input('Сколько камней забрать: ')) # если игрок выбрал первую кучку — берём оттуда if select == 1: stack_1 = take(stack_1, 1) # а если вторую — то оттуда else: stack_2 = take(stack_2, 2) # выводим состояние кучек result() # меняем текущего игрока current_player = 'Компьютер'

Готовый код
# подключаем модуль для работы со случайными числами import random # формируем кучки с камнями stack_1 = random.randint(2,10) stack_2 = random.randint(2,10) # выбранная кучка select = 0 # сколько камней взяли из кучки taken = 0 # кто делает текущий ход current_player = 'Игрок' # забираем камни из кучки def take(stack, num): # будем менять глобальную переменную внутри функции global taken # если ход делает компьютер if current_player == 'Компьютер': # случайным образом выбираем количество камней, которые заберём из кучки taken = random.randint(1,stack) # выводим состояние текущего хода print(current_player + ' взял ' + str(taken) + ' камней из ' + str(num) + ' кучки') # уменьшаем кучку на выбранное количество камней stack = stack - taken # возвращаем количество камней в кучке return(stack) # выводим текущее состояние кучек def result(): # сообщаем, сколько камней в каждой кучке print('Камней в 1 кучке: ' + str(stack_1)) print('Камней в 2 кучке: ' + str(stack_2)) # если в кучках не осталось камней — текущий игрок победил if stack_1 == 0 and stack_2 == 0: print('Игра окончена, победил ' + current_player) # выходим из программы exit() # ход компьютера def take_computer(): # будем работать с глобальными переменными global stack_1, stack_2, current_player # если в первой кучке нет камней if stack_1 == 0: # берём камни из второй stack_2 = take(stack_2, 2) # то же самое для второй кучки elif stack_2 == 0: stack_1 = take(stack_1, 1) # если камни в кучках есть else: # выбираем случайным образом номер кучки choice = random.randint(1,2) # если выбрана первая кучка — берём камни оттуда if choice == 1: stack_1 = take(stack_1, 1) # то же самое для второй кучки else: stack_2 = take(stack_2, 2) # выводим на старте состояние кучек result() # запускаем бесконечный цикл while True: # если ходит компьютер if current_player == 'Компьютер': # он делает свой ход take_computer() # выводим состояние кучек result() # меняем текущего игрока current_player = 'Игрок' # если ходит игрок else: # спрашиваем у него номер кучки и количество камней select = int(input('Выберите кучку: ')) taken = int(input('Сколько камней забрать: ')) # если игрок выбрал первую кучку — берём оттуда if select == 1: stack_1 = take(stack_1, 1) # а если вторую — то оттуда else: stack_2 = take(stack_2, 2) # выводим состояние кучек result() # меняем текущего игрока current_player = 'Компьютер'
Что дальше
Кажется, что программа получилась большой, но на самом деле в ней хватает недочётов:
- Нет проверки на номер кучки: игрок может ввести число 3, и программа остановится с ошибкой.
- То же самое — с количеством камней, которые берёт игрок. При этом у компьютера с этим всё в порядке, он не может взять больше, чем там есть.
- Нет проверки на выигрышность хода — и это самое главное.
Исправим всё это в следующий раз и сразу добавим режим работы с двумя игроками. Подпишитесь, чтобы не пропустить продолжение проекта.
Вообще за Python платят
На Python можно писать не только текстовые игры, но и полноценные веб-приложения с мощным бэкендом. Это полноценная востребованная профессия. Билет туть:
Компиляция игры на Python
Здравствуйте. Допустим, есть игра, написанная на Python 3. Она использует pygame и импортируемые модули из подкаталогов. Что нужно сделать с этой игрой, чтобы в результате вместо файлов .py получить бинарники для разных операционных систем ( .exe с иконкой под Windows, исполняемый файл Linux и т.п.) и установочный файл, который бы устанавливал зависимости в виде Python 3 и pygame, создавал ярлыки? Модули из подкаталогов должны быть .pyc . В общем, надо чтобы исходный код был недоступен для изменения и обычный пользователь мог парой кликов без проблем установить игру и начать играть. Как это можно сделать? В данный момент игра запускается только через терминал, что не есть хорошо для такого проекта.
Отслеживать
задан 15 фев 2017 в 14:17
Александр Лоев merge me Александр Лоев merge me
359 1 1 серебряный знак 5 5 бронзовых знаков
Исходный код в любом случае останется доступен для изменения
15 фев 2017 в 18:53
Посмотрите на py2exe, cx_Freeze и другие подобные проекты.
16 фев 2017 в 3:12
1 ответ 1
Сортировка: Сброс на вариант по умолчанию
По-моему, самый лучший вариант, распространять пакет игры вместе с virtualenv. В каталоге проекта сделайте файл main.py, из которого соберете exe файл для пользователя, который в свою очередь скачает и становит необходимые зависимости.
Отслеживать
ответ дан 15 фев 2017 в 17:51
Антон Иванов Антон Иванов
36 2 2 бронзовых знака
- python
- linux
- windows
- python-3.x
-
Важное на Мете
Похожие
Подписаться на ленту
Лента вопроса
Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.
Дизайн сайта / логотип © 2024 Stack Exchange Inc; пользовательские материалы лицензированы в соответствии с CC BY-SA . rev 2024.1.17.3574