Автор оригинала: Pankaj Kumar.
Учебник Pygame: Графическая игра Hi-Lo в Python
Pygame – это 2D библиотека развития игр в Python. Он содержит определенные функции и классы, необходимые для программиста для создания простой или сложной игры с нуля.
В этом руководстве мы будем создавать нашу собственную игру Hi-Lo, используя библиотеку Pygame. Hi-Lo – очень простая игра в казино, где игрок должен догадаться, что следующая карта в колоде выше или ниже текущей карты.
Предложил : Если это первый раз, когда вы создаете игру, попробуйте Реализация командной строки игры Hi-Lo в Python Отказ Легче и получит вам лучшее представление о игровой механике. Однако, если вы уже хорошо разбираетесь с Python, продолжайте читать вперед!
Система ранжирования для карт начинается на ACE, самая низкая ранговая карта и заканчивается в короле, самая высокая ранговая карта.
Ги высокая низкая игра в Python
Импорт pygame.
Перед использованием любых модулей Pygame нам нужно импортировать библиотеку.
import pygame
Все функции Pygame могут быть доступны с использованием Pygame
затем '.'
и имя функции.
Объявляя константы игры
Каждый дизайн игры требует некоторых постоянных, которые используются для указания ключевых функций игры.
# Margins MARGIN_LEFT = 230 MARGIN_TOP = 150 # WINDOW SIZE WIDTH = 800 HEIGHT = 600 # COLORS BLACK = (0, 0, 0) WHITE = (255, 255, 255) GRAY = (110, 110, 110) GREEN = (0, 255, 0) LIGHT_GREEN = (0, 120, 0) RED = (255, 0, 0) LIGHT_RED = (120, 0, 0)
Типы и значения констант варьируются для программистов. Это просто хорошая привычка, чтобы заранее определить такие константы, так что в случае изменения ценностей мы не должны корректировать их повсюду.
Инициализация игровых модулей
Чтобы использовать модули Pygame, нам сначала необходимо инициализировать их:
# Initializing PyGame pygame.init()
Каждая игра играется в определенном игровом окне, которое может быть изменено в соответствии с потребностями программиста. В этом игровом окне нужны параметры размера.
# WINDOW SIZE WIDTH = 800 HEIGHT = 600 # Setting up the screen and background screen = pygame.display.set_mode((WIDTH, HEIGHT)) screen.fill(GRAY)
Используя встроенные set_mode ()
Функция, мы определяем размер окна. Одно следует помнить, работая с PyGame, это то, что параметры размера передаются как кортеж из двух значений: ширина и высота.
После настройки окна мы устанавливаем цвет фона с помощью заполнить ()
команда.
Настройка подписи и значка
Наша игра нуждается в названии, а также значок, чтобы представлять себя.
# Setting up caption pygame.display.set_caption("Hi-Lo Game") # Loading image for the icon icon = pygame.image.load('icon.jpeg') # Setting the game icon pygame.display.set_icon(icon)
set_caption ()
Функция принимает строку в качестве аргумента и помещает ее как заголовок. Для того, чтобы установить значок, нам сначала нужно загрузить изображение, используя нагрузка ()
Функция, которая принимает во имя файла изображения.
set_icon ()
Функция устанавливает изображение как значок игры.
Примечание: Если файл изображения отсутствует в том же каталоге, что и файл игры Python, то нам нужно добавить относительный путь вместе с именем изображения.
Определение игровых шрифтов
Перед рендерингом текста на экране нам нужно определить определенные шрифты.
# Types of fonts to be used small_font = pygame.font.Font(None, 32) large_font = pygame.font.Font(None, 50)
Шрифт ()
Функция принимает два аргумента: тип шрифта ( None
для шрифта по умолчанию) и размер шрифта.
Настройте текст для игровых кнопок
В нашей игре есть две кнопки: высокая и низкая. Установка текста для кнопки требует нескольких шагов:
- Оказать шрифт к тексту
- Получить прямоугольное покрытие текста
- Поместите прямоугольник на экране
# Hign and Low Game Buttons high_button = large_font.render("HIGH", True, WHITE) # Gets_rectangular covering of text high_button_rect = high_button.get_rect() # Places the text high_button_rect.center = (280, 400) low_button = large_font.render("LOW", True, WHITE) low_button_rect = low_button.get_rect() low_button_rect.center = (520, 400)
Render ()
Функция принимает следующие параметры:
- Текст – «Высокий»
- Примените антисеменование для гладких ребер для текста? – Правда
- Цвет текста – белый
get_rect ()
Функция возвращает прямоугольное покрытие прилагаемого текста.
Следующая строка указывает положение центра прямоугольного покрытия, тем самым размещаю текст.
Определите нашу колоду карт
Чтобы определить нашу колоду карт, мы сначала должны определить отдельную карту. Мы возьмем помощь классов Python для этой задачи.
# Card class definition class Card: def __init__(self, suit_type, value): self.suit_type = suit_type self.value = value
Любая карта имеет две характеристики: тип костюма и его значение лица. Переход к определениям карты мы используем три определяющих структуры данных:
# The type of suit suits = ["Spades", "Hearts", "Clubs", "Diamonds"] # The type of card cards = ["A", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K"] # The card value cards_values = {"A": 1, "2":2, "3":3, "4":4, "5":5, "6":6, "7":7, "8":8, "9":9, "10":10, "J":11, "Q":12, "K":13}
Хранение этих карт осуществляется в списке объектов Python.
# The deck of cards - List of Objects deck = [] # Loop for every type of suit for suit in suits: # Loop for every type of card in a suit for card in cards: # Adding the card to the deck deck.append(Card(suit, card))
Настройка изображений карты
Подобно изображению значка, нам сначала нужно загрузить изображения карты, прежде чем рендерировать их на поверхность игры. Для этого нам нужно изображение для каждой карты в колоде. К счастью, его можно легко получить из Интернета.
Вот что похоже карты:
Как мы можем видеть, что Конвенция именования является необходимостью, поскольку карты должны быть загружены, когда сценарий Python выбирает его с колоды. Конвенция именования проста: Значение карты, за которым следует первая буква костюма.
# Load the card image prev_card = pygame.image.load(r'./cards/card_cover.png') # Scale the loaded image prev_card = pygame.transform.scale(prev_card , (100,160)) # Choose the starting card from the deck current_card = random.choice(deck) # Keep choosing until it is not the highest or lowest while current_card.value == "A" or current_card.value == "K": current_card = random.choice(deck) # Load the card image cur_card = pygame.image.load(r'./cards/' + current_card.value + current_card.suit_type[0] + '.png') # Scale the loaded card image cur_card = pygame.transform.scale(cur_card , (100,160)) # Remove the card from the deck deck.remove(current_card) # Loading the card image next_card = pygame.image.load(r'./cards/card_cover.png') # Scaling the loaded image next_card = pygame.transform.scale(next_card , (100,160))
Размещение файла изображения RAW может охватывать весь экран, поэтому нам нужно масштабировать изображение в соответствии с шириной и высотой экрана. В PyGame это делается по масштаб ()
Функция, которая принимает входное изображение и целевой размер для преобразования.
Согласно правилам игры Hi-Lo, начальная карта не может быть самой высокой или самой низкой картой, которая является ACE или царем соответственно. Мы запускаем петлю, пока карта не выберет из колоды, не является ни одной из них.
После того, как карта избрана, нам нужно загрузить это конкретное изображение карты для отображения на экране. Это делается по нагрузка ()
Функция, которая берет на относительный путь, за которым следует имя изображения.
Объявление игрок переменных
Есть несколько переменных игр, которые необходимы для игры:
# Number of chances left chances = 3 # The current score score = 0 # User's choice initialized choice = -1 # Used to stop game functioning, if True over = False
Основное внимание в вышеупомянутых переменных является над
Переменная, которая используется для остановки функционирования игры, например, кнопки щелчка.
Игровая петля
Игра COLOOP – это вечно работает часть кода, которая заботится о поддержании игрового окна, его компонентов и игровой логики.
# The GAME LOOP while True: # Tracking the mouse movements mouse = pygame.mouse.get_pos()
Первая повестка дня игрной петли отслеживает движения мыши. Это пригодится для распознавания положения мыши, щелчков и других вещей.
get_pos ()
Функция возвращает кортеж Python позиции мыши на экране как (ось X, ось Y).
Обработка событий Pygame
Самая важная часть разработки Pygame обрабатывает события, которые возникают внутри игрового окна.
Pygame регистрирует каждое события, возникающие в список объектов событий. Мы пройдем через каждый объект события, чтобы обработать его.
# Loop events occuring inside the game window for event in pygame.event.get(): # Qutting event if event.type == pygame.QUIT: pygame.quit() quit() # Left-mouse clicked event if not over and event.type == pygame.MOUSEBUTTONDOWN: # Clicked on the High Button if 220 <= mouse[0] <= 220+125 and 370 <= mouse[1] <= 370+60: choice = 1 # Clicked on the Low Button if 460 <= mouse[0] <= 460+120 and 370 <= mouse[1] <= 370+60: choice = 0
Мы проверяем тип событий и выполняем необходимую задачу. Следует отметить, что, прежде чем выйти из кода Python, мы вышли из модулей PYGAME.
Игра Логика
Игра Логика включает в себя:
- Поместите текущую карту на место предыдущей карты.
- Выберите новую карту из колоды.
- Удалите выбранную карту из колоды.
- Проверьте, стоит ли новая карта выше или ниже.
- Если нижняя карта, затем уменьшите шансы осталось.
- Если более высокая карта, потом увеличивайте счет.
- Сбросить выбор игрока
# If a valid choice, the game logic if choice != -1: # Change current card to previous previous_card = current_card prev_card = pygame.image.load(r'./cards/' + previous_card.value + previous_card.suit_type[0] + '.png') prev_card = pygame.transform.scale(prev_card , (100,160)) # Set up the current card current_card = random.choice(deck) deck.remove(current_card) cur_card = pygame.image.load(r'./cards/' + current_card.value + current_card.suit_type[0] + '.png') cur_card = pygame.transform.scale(cur_card , (100,160)) # Check the result, that is, High or Low if cards_values[current_card.value] > cards_values[previous_card.value]: result = 1 elif cards_values[current_card.value] < cards_values[previous_card.value]: result = 0 else: result = -1 # Manage the game variables if result == -1: continue elif result == choice: score = score + 1 else: chances = chances - 1 # End the game if chances are finished if chances == 0: over = True # Reset the choice choice = -1
Кнопка анимация
Используя движущиеся движения для гусеничных мышей, мы можем создать анимацию кнопки всякий раз, когда мышь охватывает на кнопку.
# Manage the button hovering animation if 220 <= mouse[0] <= 220+125 and 370 <= mouse[1] <= 370+60: pygame.draw.rect(screen,LIGHT_GREEN,[220,370,125,60]) else: pygame.draw.rect(screen,GREEN,[220,370,125,60]) if 460 <= mouse[0] <= 460+120 and 370 <= mouse[1] <= 370+60: pygame.draw.rect(screen,LIGHT_RED,[460,370,120,60]) else: pygame.draw.rect(screen,RED,[460,370,120,60])
В этом фрагменте кода мы сначала проверяем, находится ли положение мыши внутри кнопки. Если это делает, то мы нарисуем прямоугольник на экране с более легким цветом, чем оригинальный цвет кнопки, в противном случае оригинальный цвет кнопки.
pygame.draw.rect ()
Функция здесь занимает три параметра, поверхность дисплея (нашего игрового окна), цвет прямоугольника, размеры коробки [Запуск X-координат, начало Y-координата, ширина, высота].
Отобразить табло
Нам нужно отобразить табло с текущим баллом, и количество шансов осталось.
# Displaying scoreboard pygame.draw.rect(screen, WHITE, [270, 40, 255, 90]) score_text = small_font.render("Score = "+str(score), True, BLACK) score_text_rect = score_text.get_rect() score_text_rect.center = (WIDTH//2, 70) chances_text = small_font.render("Chances = "+str(chances), True, BLACK) chances_text_rect = chances_text.get_rect() chances_text_rect.center = (WIDTH//2, 100)
Мы используем аналогичный рендеринг текста, поскольку мы сделали для текста кнопки.
Настройте весь дисплей
После инициализации всех компонентов дисплея мы можем наконец-то разместить их в нашем окне игры, используя Blit ()
функция.
# Setting up all the buttons, images and texts on the screen screen.blit(high_button, high_button_rect) screen.blit(low_button, low_button_rect) screen.blit(score_text, score_text_rect) screen.blit(chances_text, chances_text_rect) screen.blit(prev_card, (MARGIN_LEFT,MARGIN_TOP)) screen.blit(cur_card, (MARGIN_LEFT+120, MARGIN_TOP)) screen.blit(next_card, (MARGIN_LEFT+240, MARGIN_TOP))
Blit ()
Функция принимает в игровое объект, например, изображение или текст, а также положение его размещения.
Управлять конечной игрой
В игре логика, когда шансы закончены, над
Переменная изменяется на Правда
Отказ Его эффект отображается здесь.
# If the game is finished, display the final score if over == True: pygame.draw.rect(screen, WHITE, [270, 40, 255, 90]) score_text = small_font.render("Final Score = "+str(score), True, BLACK) score_text_rect = score_text.get_rect() score_text_rect.center = (WIDTH//2, 85) screen.blit(score_text, score_text_rect)
После завершения игры мы отображаем окончательный счет в табло.
Обновление дисплея игры
Конечная вещь, которая должна быть сделана, обновляет поиск игры в конце игрового петли.
# Update the display after each game loop pygame.display.update()
Полный код
import pygame import random # Card class definition class Card: def __init__(self, suit_type, value): self.suit_type = suit_type self.value = value if __name__ == '__main__': # Margins MARGIN_LEFT = 230 MARGIN_TOP = 150 # WINDOW SIZE WIDTH = 800 HEIGHT = 600 # COLORS BLACK = (0, 0, 0) WHITE = (255, 255, 255) GRAY = (110, 110, 110) GREEN = (0, 255, 0) LIGHT_GREEN = (0, 120, 0) RED = (255, 0, 0) LIGHT_RED = (120, 0, 0) # The type of suit suits = ["Spades", "Hearts", "Clubs", "Diamonds"] # The type of card cards = ["A", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K"] # The card value cards_values = {"A": 1, "2":2, "3":3, "4":4, "5":5, "6":6, "7":7, "8":8, "9":9, "10":10, "J":11, "Q":12, "K":13} # The deck of cards - List of Objects deck = [] # Loop for every type of suit for suit in suits: # Loop for every type of card in a suit for card in cards: # Adding the card to the deck deck.append(Card(suit, card)) # Initializing PyGame pygame.init() # Setting up the screen and background screen = pygame.display.set_mode((WIDTH, HEIGHT)) screen.fill(GRAY) # Setting up caption pygame.display.set_caption("Hi-Lo Game") # Loading image for the icon icon = pygame.image.load('icon.jpeg') # Setting the game icon pygame.display.set_icon(icon) # Types of fonts to be used small_font = pygame.font.Font(None, 32) large_font = pygame.font.Font(None, 50) # Hign and Low Game Buttons high_button = large_font.render("HIGH", True, WHITE) # Gets_rectangular covering of text high_button_rect = high_button.get_rect() # Places the text high_button_rect.center = (280, 400) low_button = large_font.render("LOW", True, WHITE) low_button_rect = low_button.get_rect() low_button_rect.center = (520, 400) # Load the card image prev_card = pygame.image.load(r'./cards/card_cover.png') # Scale the loaded image prev_card = pygame.transform.scale(prev_card , (100,160)) # Choose the starting card from the deck current_card = random.choice(deck) # Keep choosing until it is not the highest or lowest while current_card.value == "A" or current_card.value == "K": current_card = random.choice(deck) # Load the card image cur_card = pygame.image.load(r'./cards/' + current_card.value + current_card.suit_type[0] + '.png') # Scale the loaded card image cur_card = pygame.transform.scale(cur_card , (100,160)) # Remove the card from the deck deck.remove(current_card) # Loading the card image next_card = pygame.image.load(r'./cards/card_cover.png') # Scaling the loaded image next_card = pygame.transform.scale(next_card , (100,160)) # Number of chances left chances = 3 # The current score score = 0 # User's choice initialized choice = -1 # Used to stop game functioning, if True over = False # The GAME LOOP while True: # Tracking the mouse movements mouse = pygame.mouse.get_pos() # Loop events occuring inside the game window for event in pygame.event.get(): # Qutting event if event.type == pygame.QUIT: pygame.quit() quit() # Left-mouse clicked event if not over and event.type == pygame.MOUSEBUTTONDOWN: # Clicked on the High Button if 220 <= mouse[0] <= 220+125 and 370 <= mouse[1] <= 370+60: choice = 1 # Clicked on the Low Button if 460 <= mouse[0] <= 460+120 and 370 <= mouse[1] <= 370+60: choice = 0 # Finish the game if the deck is finished if len(deck) == 1: over = True # If a valid choice, the game logic if choice != -1: # Change current card to previous previous_card = current_card prev_card = pygame.image.load(r'./cards/' + previous_card.value + previous_card.suit_type[0] + '.png') prev_card = pygame.transform.scale(prev_card , (100,160)) # Set up the current card current_card = random.choice(deck) deck.remove(current_card) cur_card = pygame.image.load(r'./cards/' + current_card.value + current_card.suit_type[0] + '.png') cur_card = pygame.transform.scale(cur_card , (100,160)) # Check the result, that is, High or Low if cards_values[current_card.value] > cards_values[previous_card.value]: result = 1 elif cards_values[current_card.value] < cards_values[previous_card.value]: result = 0 else: result = -1 # Manage the game variables if result == -1: continue elif result == choice: score = score + 1 else: chances = chances - 1 # End the game if chances are finished if chances == 0: over = True # Reset the choice choice = -1 # Manage the button hovering animation if 220 <= mouse[0] <= 220+125 and 370 <= mouse[1] <= 370+60: pygame.draw.rect(screen,LIGHT_GREEN,[220,370,125,60]) else: pygame.draw.rect(screen,GREEN,[220,370,125,60]) if 460 <= mouse[0] <= 460+120 and 370 <= mouse[1] <= 370+60: pygame.draw.rect(screen,LIGHT_RED,[460,370,120,60]) else: pygame.draw.rect(screen,RED,[460,370,120,60]) # Displaying scoreboard pygame.draw.rect(screen, WHITE, [270, 40, 255, 90]) score_text = small_font.render("Score = "+str(score), True, BLACK) score_text_rect = score_text.get_rect() score_text_rect.center = (WIDTH//2, 70) chances_text = small_font.render("Chances = "+str(chances), True, BLACK) chances_text_rect = chances_text.get_rect() chances_text_rect.center = (WIDTH//2, 100) # Setting up all the buttons, images and texts on the screen screen.blit(high_button, high_button_rect) screen.blit(low_button, low_button_rect) screen.blit(score_text, score_text_rect) screen.blit(chances_text, chances_text_rect) screen.blit(prev_card, (MARGIN_LEFT,MARGIN_TOP)) screen.blit(cur_card, (MARGIN_LEFT+120, MARGIN_TOP)) screen.blit(next_card, (MARGIN_LEFT+240, MARGIN_TOP)) # If the game is finished, display the final score if over == True: pygame.draw.rect(screen, WHITE, [270, 40, 255, 90]) score_text = small_font.render("Final Score = "+str(score), True, BLACK) score_text_rect = score_text.get_rect() score_text_rect.center = (WIDTH//2, 85) screen.blit(score_text, score_text_rect) # Update the display after each game loop pygame.display.update()
Заключение
Создание нашей собственной игры Hi-Lo с помощью Pygame кажется легкой задачей. Мы надеемся, что это учебное пособие образует основу будущих исследовательских испытаний и приключений читателя.
Спасибо за чтение. Не стесняйтесь комментировать ниже для запросов или предложений.