Зверніть увагу, при копіюванні коду можливі помилки.
Рекомендуємо вводити код вручну.
Подання коду гри з коментуванням основних позицій гри для майбутніх змін.
Створюємо ігрове поле
Щоб створити вікно з грою за допомогою Pygame, необхідно використовувати функцію display.set_mode() і передати бажаний розмір вікна в пікселях. Також необхідно використовувати методи init() та quit() для ініціалізації бібліотеки на початку коду та її деініціалізації наприкінці коду.
Update () використовується для оновлення вмісту екрана. Існує ще метод flip() , який працює аналогічно update() . Різниця в тому, що метод update() оновлює лише внесені зміни, а метод flip() перемальовує екран повністю. Але якщо метод update() не передавати ніякі параметри, то також оновиться весь екран.
import pygame
pygame.init()
dis=pygame.display.set_mode((800,600)) #Вказуємо розмір вікна гри
pygame.display.update()
pygame.quit()
quit()
Якщо зараз запустити цей код, екран гри відразу ж закриється. Це пов'язано з тим, що код відразу переходить до наступного рядка pygame.quit() , що відключає бібліотеку та наше ігрове поле. Щоб уникнути цього, необхідно скористатися циклом while - він не дозволить ігровому екрану закритися.
Крім цього, ми додамо до коду ще дві позиції: назву гри та функцію для відстеження ігрових подій. Щоб у вікна з грою з'явилася назва ми використовуємо pygame.display.set_caption('') (назву пишемо в лапках). А функція event.get() повертає до терміналу всі події, що відбуваються з грою.
import pygame
pygame.init()
dis=pygame.display.set_mode((800,600))
pygame.display.update()
pygame.display.set_caption('Змійка') #Назва гри
game_over=False #Змінна для гри, Гра завершена Так? Ні? За замовчуванням False
while not game_over:
for event in pygame.event.get():
print(event) #Вивід в терміналі подій
pygame.quit()
quit()
Тепер ігрове вікно не закривається саме собою. Однак і закрити його ми теж не зможемо - якщо натиснути на кнопку "Вихід", нічого не станеться. Виправляємо це за допомогою коду: додаємо подію QUIT , що закриває вікно.
import pygame
pygame.init()
dis=pygame.display.set_mode((800, 600))
pygame.display.update()
pygame.display.set_caption('Змійка')
game_over=False
while not game_over:
for event in pygame.event.get():
if event.type==pygame.QUIT:
game_over=True
pygame.quit()
quit()
Створюємо змійку
Для початку ініціалізуємо змінні, які задають колір. Ми будемо використовувати їх, щоб привласнити колір екрану, самої змійки та їжі. У Pygame використовується стандартна RGB-схема, тобто будь-який колір є комбінацією червоного, зеленого та синього кольорів, інтенсивність яких ми можемо змінювати.
Наша змійка є прямокутником, тому ми скористаємося функцією створення прямокутників draw.rect() . Вона дозволяє встановити розмір і колір прямокутника.
import pygame
pygame.init()
white = (255, 255, 255)
black = (0, 0, 0)
red = (255, 0, 0)
dis=pygame.display.set_mode((800, 600))
pygame.display.update() #Переноситься в кінець
pygame.display.set_caption('Змійка')
game_over=False
x1 = 300 #Початкові координати по х.
y1 = 300 #Початкові координати по y.
x1_change = 0 #Змінна для циклу while зміна х.
y1_change = 0 #Змінна для циклу while зміна y.
clock = pygame.time.Clock()
while not game_over:
for event in pygame.event.get():
if event.type==pygame.QUIT:
game_over=True
if event.type == pygame.KEYDOWN: #Керування з клавіатури.
if event.key == pygame.K_LEFT:
x1_change = -10 #Крок руху в піксилях.
y1_change = 0
elif event.key == pygame.K_RIGHT:
x1_change = 10
y1_change = 0
elif event.key == pygame.K_UP:
y1_change = -10
x1_change = 0
elif event.key == pygame.K_DOWN:
y1_change = 10
x1_change = 0
x1 += x1_change #Нові значення координат по х.
y1 += y1_change #Нові значення координат по y.
dis.fill(white)
pygame.draw.rect(dis, black, [x1, y1, 10, 10])
pygame.display.update() #Перенесено з 7 лінії
clock.tick(30)
pygame.quit()
quit()
Враховуємо перешкоди – межі ігрового поля
Якщо змійка потрапляє на межу екрана, то гравець зазнає поразки, а гра закінчується. Щоб закодувати це правило, можна скористатися оператором if, який визначає координати x та y для змійки та аналізує, чи виходять вони за межі ігрового поля. Додамо необхідний код.
Тепер, якщо змійка досягне краю екрана, гра закінчиться, а на дисплеї з'явиться повідомлення про програш.
import pygame
import time
pygame.init()
white = (255, 255, 255)
black = (0, 0, 0)
red = (255, 0, 0)
dis_width = 800 #Задаємо розмір вікна за допомогою змінних
dis_height = 600
dis = pygame.display.set_mode((800 dis_width, 600 dis_width))
pygame.display.set_caption('Змійка')
lock = pygame.time.Clock()
snake_block = 10 #Крок змійки
snake_speed = 15 #Швидкість змійки
font_style = pygame.font.SysFont(None, 30)
game_over=False
x1 = 300 dis_width/2 #Положення змійки по координатах розраховується відповідно до змінних розміру вікна
y1 = 300 dis_height/2
x1_change = 0
y1_change = 0
while not game_over:
clock.tick(30 snake_block)
message("Ви програли :(",red) #Повідомлення при програші
pygame.display.update()
time.sleep(2)
for event in pygame.event.get():
if event.type==pygame.QUIT:
game_over=True
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_LEFT:
x1_change = -10 snake_block
y1_change = 0
elif event.key == pygame.K_RIGHT:
x1_change = 10 snake_block
y1_change = 0
elif event.key == pygame.K_UP:
y1_change = -10 snake_block
x1_change = 0
elif event.key == pygame.K_DOWN:
y1_change = 10 snake_block
x1_change = 0
if x1 >= dis_width or x1 < 0 or y1 >= dis_height or y1 < 0:
game_over = True #При виході за межі вікна гра завершується
x1 += x1_change
y1 += y1_change
dis.fill(white)
pygame.draw.rect(dis, black, [x1, y1, 10 snake_block, 10 snake_block])
pygame.display.update()
pygame.quit()
quit()
Додаємо їжу для змійки
Тепер додамо "їжу". Використовуємо бібліотеку random , щоб вона з'являлася у випадковому місці на ігровому полі. Коли наша змійка проходитиме через їжу, то її довжина збільшуватиметься. Це ми додамо на наступному кроці. Крім того, дамо можливість гравцеві вийти з гри або розпочати гру наново після програшу.
import pygame
import time
import random
pygame.init()
white = (255, 255, 255)
black = (0, 0, 0)
red = (255, 0, 0)
blue = (0, 0, 255)
dis_width = 800
dis_height = 600
dis = pygame.display.set_mode((dis_width, dis_width))
pygame.display.set_caption('Змійка')
clock = pygame.time.Clock()
snake_block = 10
snake_speed = 15
font_style = pygame.font.SysFont(None, 30)
def message(msg, color):
mesg = font_style.render(msg, True, color)
dis.blit(mesg, [dis_width/10, dis_height/3])
def gameLoop(): #Опис логіки гри однією функцією
game_over=False
game_close = False
x1 = dis_width/2
y1 = dis_height/2
snake_block=10
x1_change = 0
y1_change = 0
foodx = round(random.randrange(0, dis_width - snake_block) / 10.0) * 10.0
#Змінна для координат їжі по х.
foody = round(random.randrange(0, dis_width - snake_block) / 10.0) * 10.0
#Змінна для координат їжі по y.
while not game_over:
while game_close == True:
dis.fill(white)
message("Ви програли! Натисніть Q для завершення
або C - Нова гра", red)
pygame.display.update()
for event in pygame.event.get():
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_q:
game_over = True
game_close = False
if event.key == pygame.K_c:
gameLoop()
for event in pygame.event.get():
if event.type==pygame.QUIT:
game_over=True
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_LEFT:
x1_change = -snake_block
y1_change = 0
elif event.key == pygame.K_RIGHT:
x1_change = snake_block
y1_change = 0
elif event.key == pygame.K_UP:
y1_change = -snake_block
x1_change = 0
elif event.key == pygame.K_DOWN:
y1_change = snake_block
x1_change = 0
if x1 >= dis_width or x1 < 0 or y1 >= dis_height or y1 < 0:
game_over = True
x1 += x1_change
y1 += y1_change
dis.fill(white)
pygame.draw.rect(dis, blue, [foodx, foody, snake_block, snake_block])
pygame.draw.rect(dis, black, [x1, y1, snake_block, snake_block])
pygame.display.update()
pygame.quit()
quit()
gameLoop()
Збільшуємо довжину змійки
Доповнимо наш код, щоб довжина змійки збільшувалася при поглинанні їжі. Для цього нам знадобиться список, в якому зберігатиметься поточна довжина змійки. Врахуємо ще важливий момент із правил: при зіткненні голови змійки з її тілом гра завершується. Додатково ми змінили колір ігрового поля та змійки, збільшивши їх контрастність.
import pygame
import time
import random
pygame.init()
white = (255, 255, 255)
black = (0, 0, 0)
red = (255, 0, 0)
blue = (0, 0, 255)
dis_width = 800
dis_height = 600
dis = pygame.display.set_mode((dis_width, dis_width))
pygame.display.set_caption('Змійка')
clock = pygame.time.Clock()
snake_block = 10
snake_speed = 15
font_style = pygame.font.SysFont(None, 25)
def message(msg, color):
mesg = font_style.render(msg, True, color)
dis.blit(mesg, [dis_width/10, dis_height/3])
def gameLoop(): #Опис логіки гри однією функцією
game_over=False
game_close = False
x1 = dis_width/2
y1 = dis_height/2
snake_block=10
x1_change = 0
y1_change = 0
foodx = round(random.randrange(0, dis_width - snake_block) / 10.0) * 10.0
#Змінна для координат їжі по х.
foody = round(random.randrange(0, dis_width - snake_block) / 10.0) * 10.0
#Змінна для координат їжі по y.
while not game_over:
while game_close == True:
dis.fill(white)
message("Ви програли! Натисніть Q для завершення
або C - Нова гра", red)
pygame.display.update()
for event in pygame.event.get():
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_q:
game_over = True
game_close = False
if event.key == pygame.K_c:
gameLoop()
for event in pygame.event.get():
if event.type==pygame.QUIT:
game_over=True
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_LEFT:
x1_change = -snake_block
y1_change = 0
elif event.key == pygame.K_RIGHT:
x1_change = snake_block
y1_change = 0
elif event.key == pygame.K_UP:
y1_change = -snake_block
x1_change = 0
elif event.key == pygame.K_DOWN:
y1_change = snake_block
x1_change = 0
if x1 >= dis_width or x1 < 0 or y1 >= dis_height or y1 < 0:
game_over = True
x1 += x1_change
y1 += y1_change
dis.fill(white)
pygame.draw.rect(dis, blue, [foodx, foody, snake_block, snake_block])
pygame.draw.rect(dis, black, [x1, y1, snake_block, snake_block])
pygame.display.update()
pygame.quit()
quit()
gameLoop()
Додаємо відображення рахунку
Додамо відображення рахунку поточної гри. Для цього створимо функцію Your_score . Вона відображатиме довжину змійки, віднімаючи з неї 1 (адже 1 - це початковий розмір змійки, і це не є досягненням гравця). І окремо пропишемо правило визначення довжини змійки, віднімаючи з поточної довжини змійки одиницю.
Чудового Проводження часу.
P.S. Рекомендована швидкість змійки на початку 10
import pygame
import time
import random
pygame.init()
white = (255, 255, 255)
yellow = (255, 255, 102)
black = (0, 0, 0)
red = (213, 50, 80)
green = (0, 255, 0)
blue = (50, 153, 213)
dis_width = 800
dis_height = 600
dis = pygame.display.set_mode((dis_width, dis_height))
pygame.display.set_caption('Змійка')
clock = pygame.time.Clock()
snake_block = 10
snake_speed = 15
font_style = pygame.font.SysFont("bahnschrift", 25)
score_font = pygame.font.SysFont("comicsansms", 35)
def Your_score(score):
value = score_font.render("Рахунок: " + str(score), True, yellow)
dis.blit(value, [0, 0])
def our_snake(snake_block, snake_list):
for x in snake_list:
pygame.draw.rect(dis, black, [x[0], x[1], snake_block, snake_block])
def message(msg, color):
mesg = font_style.render(msg, True, color)
dis.blit(mesg, [dis_width / 6, dis_height / 3])
def gameLoop():
game_over = False
game_close = False
x1 = dis_width / 2
y1 = dis_height / 2
x1_change = 0
y1_change = 0
snake_List = []
Length_of_snake = 1
foodx = round(random.randrange(0, dis_width - snake_block) / 10.0) * 10.0 #Змінна для координат їжі по х.
foody = round(random.randrange(0, dis_height - snake_block) / 10.0) * 10.0 #Змінна для координат їжі по y.
while not game_over:
while game_close == True:
dis.fill(blue)
message("Ви програли! Натисніть Q для завершення або C - Нова гра", red)
Your_score(Length_of_snake - 1)
pygame.display.update()
for event in pygame.event.get():
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_q:
game_over = True
game_close = False
if event.key == pygame.K_c:
gameLoop()
for event in pygame.event.get():
if event.type == pygame.QUIT:
game_over = True
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_LEFT:
x1_change = -snake_block
y1_change = 0
elif event.key == pygame.K_RIGHT:
x1_change = snake_block
y1_change = 0
elif event.key == pygame.K_UP:
y1_change = -snake_block
x1_change = 0
elif event.key == pygame.K_DOWN:
y1_change = snake_block
x1_change = 0
if x1 >= dis_width or x1 < 0 or y1 >= dis_height or y1 < 0:
game_close = True
x1 += x1_change
y1 += y1_change
dis.fill(blue)
pygame.draw.rect(dis, green, [foodx, foody, snake_block, snake_block])
snake_Head = []
snake_Head.append(x1)
snake_Head.append(y1)
snake_List.append(snake_Head)
if len(snake_List) > Length_of_snake:
del snake_List[0]
for x in snake_List[:-1]:
if x == snake_Head:
game_close = True
our_snake(snake_block, snake_List)
Your_score(Length_of_snake - 1)
pygame.display.update()
if x1 == foodx and y1 == foody:
foodx = round(random.randrange(0, dis_width - snake_block) / 10.0) * 10.0
foody = round(random.randrange(0, dis_height - snake_block) / 10.0) * 10.0
Length_of_snake += 1
clock.tick(snake_speed)
pygame.quit()
quit()
gameLoop()
Навчаємося в грі.