Рубрики
Без рубрики

Учебник Pygame: Графическая игра Hi-Lo в Python

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

Автор оригинала: 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 для шрифта по умолчанию) и размер шрифта.

Настройте текст для игровых кнопок

В нашей игре есть две кнопки: высокая и низкая. Установка текста для кнопки требует нескольких шагов:

  1. Оказать шрифт к тексту
  2. Получить прямоугольное покрытие текста
  3. Поместите прямоугольник на экране
# 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))

Настройка изображений карты

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

Вот что похоже карты:

Привет lo pygame карты

Как мы можем видеть, что Конвенция именования является необходимостью, поскольку карты должны быть загружены, когда сценарий 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 кажется легкой задачей. Мы надеемся, что это учебное пособие образует основу будущих исследовательских испытаний и приключений читателя.

Спасибо за чтение. Не стесняйтесь комментировать ниже для запросов или предложений.