Индивидуальные проекты и исследовательские работы

Помогаем учителям и учащимся в обучении, создании и грамотном оформлении исследовательской работы и проекта.

Проект по информатике "Dinosaur Game"

Рейтинг: 1

Dinosaur Game
Тематика: 
Информатика
Автор работы: 
Рыбаков Григорий Русланович
Руководитель проекта: 
Ольга Сергеевна Тихомирова
Учреждение: 
МБОУ "Гимназия имени Подольских курсантов"
Класс: 
9

В процессе проведения работы над исследовательским проектом по информатике на тему «Dinosaur Game» обучающийся 9 класса выявил, возможно ли создание программного кода Dinosaur Game в домашних условиях основываясь на школьных знаниях в области математики и программирования, а также создал рабочую программу Dinosaur Game на языке программирования Python.

Подробнее о работе:


В готовом исследовательском проекте по информатике на тему «Dinosaur Game» автор показал, что написание кода очень интересный, увлекательный и познавательный процесс. Над созданием больших игр трудятся программисты, но каждый школьник при желании способен создать свою собственную игру. Автор определил, что навыки, приобретенные при создании игры, пригодятся ему в дальнейшем и в учебе, и в работе.

Оглавление

Введение

  1. Техническая часть
  2. Разработка кода
  3. Сложности, преодолённые при создании проекта
  4. Планы по дальнейшему улучшению

Заключение
Список использованных источников 

Введение

Dinosaur Game, также известная как T-Rex Game или Dino Runner, носившая первоначальное кодовое название Project Bolan — встроенная браузерная игра в браузере Google Chrome.

Игра была создана Себастьяном Габриэлем в 2014 году. Чтобы получить к ней доступ нужно нажать на клавишу пробел на клавиатуре в автономном режиме Google Chrome или ввести в URL строку: chrome://dino или chrome://network-error/-106.

Когда пользователь находится в автономном режиме, то сообщение уведомляет пользователя о том, что он не подключён к интернету. Вверху изображён «Одинокий Тираннозавр», созданный Себастьяном Габриэлем. Нажатие на динозавра (на Android или iOS) или нажатие на клавиши пробел или ↑ запускает игру.


Игрок управляет бегущим динозавром касаясь экрана (на Android или iOS) или нажимая на ↑ и ↓, избегая препятствий, кактусов и птеродактилей. При нажатии ↑ динозавр прыгает, что позволяет избежать кактусов, а при нажатии ↓ динозавр пригибается, что позволяет избежать высоко летящих птеродактилей. Игра заканчивается после 17 миллионов лет игрового времени.

В правом верхнем углу экрана есть счётчик очков, количество которых растёт в ходе игры. Чем дольше игрок играет, тем быстрее и сложнее становится игра. Если в браузере выбрана светлая тема, то при достижении 700 очков игра переключается с белой графики (дня) на чёрную (ночь), и наоборот, если установлена тёмная тема. При достижении 900 очков игра снова переключается и так далее.

При столкновении с кактусом или птеродактилем игра заканчивается и экран останавливается, в середине экрана появляется монохромный логотип Google Chrome, превращающийся в кнопку для перезапуска игры. При этом у динозавра выпучены глаза.

Во время разработки игры она носила кодовое название «Project Bolan», которое дали в честь солиста группы 1970-х годов T. Rex Марка Болана. Игра была выпущена в сентябре 2014 года, но не работала на старых устройствах. Код игры был переписан и переиздан в декабре 2014 года. В 2018 году игра отметила свой четвёртый день рождения с тематическим оформлением.

К 10-летию Google Chrome в игру было добавлено пасхальное яйцо. В течение сентября 2018 года в пустыне (по которой бежит динозавр) мог появиться именинный торт. Когда динозавр его съедал, на его голове появлялась праздничная шляпа. В ноябре 2018 года Google представила функцию сохранения результатов игроков. Код игры доступен на сайте Chromium.

Dinosaur Game получила широкое признание. Создатели сообщили, что ежемесячно в игру играют 270 миллионов игроков.

Цель: выявить, возможно ли создание программного кода Dinosaur Game в домашних условиях основываясь на школьных знаниях в области математики и программирования.

Задачи:

  • Создать рабочую программу Dinosaur Game на языке программирования Python.


Для разработки кода Dinosaur Game я буду использовать язык программирования Python, потому что:

  1. Python имеет большую стандартную библиотеку.
  2. В Интернете доступно множество полезных ресурсов для изучения Python.
  3. Python можно переносить на различные операционные системы: Windows, macOS и Linux.

План работы:

  1. Изучить язык программирования Python.
  2. Написать свою первую версию Dinosaur Game.

Ход реализации проекта:

  1. Анализ ресурсов сети Интернет.
  2. Анализ литературы по языку Python.
  3. Написание кода.

Разработка кода


Входе моей работы на Python у меня получился вот такой рабочий код:

import pygame
import os
import random
pygame.init()

# Global Constants
SCREEN_HEIGHT = 600
SCREEN_WIDTH = 1100
SCREEN = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))

RUNNING = [pygame.image.load(os.path.join("Assets/Dino", "DinoRun1.png")),
pygame.image.load(os.path.join("Assets/Dino", "DinoRun2.png"))]
JUMPING = pygame.image.load(os.path.join("Assets/Dino", "DinoJump.png"))
DUCKING = [pygame.image.load(os.path.join("Assets/Dino", "DinoDuck1.png")),
pygame.image.load(os.path.join("Assets/Dino", "DinoDuck2.png"))]

SMALL_CACTUS = [pygame.image.load(os.path.join("Assets/Cactus", "SmallCactus1.png")),
pygame.image.load(os.path.join("Assets/Cactus", "SmallCactus2.png")),
pygame.image.load(os.path.join("Assets/Cactus", "SmallCactus3.png"))]
LARGE_CACTUS = [pygame.image.load(os.path.join("Assets/Cactus", "LargeCactus1.png")),
pygame.image.load(os.path.join("Assets/Cactus", "LargeCactus2.png")),
pygame.image.load(os.path.join("Assets/Cactus", "LargeCactus3.png"))]

BIRD = [pygame.image.load(os.path.join("Assets/Bird", "Bird1.png")),
pygame.image.load(os.path.join("Assets/Bird", "Bird2.png"))]

CLOUD = pygame.image.load(os.path.join("Assets/Other", "Cloud.png"))

BG = pygame.image.load(os.path.join("Assets/Other", "Track.png"))

class Dinosaur:
X_POS = 80
Y_POS = 310
Y_POS_DUCK = 340
JUMP_VEL = 8.5

def __init__(self):
self.duck_img = DUCKING
self.run_img = RUNNING
self.jump_img = JUMPING

self.dino_duck = False
self.dino_run = True
self.dino_jump = False

self.step_index = 0
self.jump_vel = self.JUMP_VEL
self.image = self.run_img[0]
self.dino_rect = self.image.get_rect()
self.dino_rect.x = self.X_POS
self.dino_rect.y = self.Y_POS

def update(self, userInput):
if self.dino_duck:
self.duck()
if self.dino_run:
self.run()
if self.dino_jump:
self.jump()

if self.step_index >= 10:
self.step_index = 0

if userInput[pygame.K_UP] and not self.dino_jump:
self.dino_duck = False
self.dino_run = False
self.dino_jump = True
elif userInput[pygame.K_DOWN] and not self.dino_jump:
self.dino_duck = True
self.dino_run = False
self.dino_jump = False
elif not (self.dino_jump or userInput[pygame.K_DOWN]):
self.dino_duck = False
self.dino_run = True
self.dino_jump = False

def duck(self):
self.image = self.duck_img[self.step_index // 5]
self.dino_rect = self.image.get_rect()
self.dino_rect.x = self.X_POS
self.dino_rect.y = self.Y_POS_DUCK
self.step_index += 1

def run(self):
self.image = self.run_img[self.step_index // 5]
self.dino_rect = self.image.get_rect()
self.dino_rect.x = self.X_POS
self.dino_rect.y = self.Y_POS
self.step_index += 1

def jump(self):
self.image = self.jump_img
if self.dino_jump:
self.dino_rect.y -= self.jump_vel * 4
self.jump_vel -= 0.8
if self.jump_vel < - self.JUMP_VEL:
self.dino_jump = False
self.jump_vel = self.JUMP_VEL

def draw(self, SCREEN):
SCREEN.blit(self.image, (self.dino_rect.x, self.dino_rect.y))

class Cloud:
def __init__(self):
self.x = SCREEN_WIDTH + random.randint(800, 1000)
self.y = random.randint(50, 100)
self.image = CLOUD
self.width = self.image.get_width()

def update(self):
self.x -= game_speed
if self.x < -self.width:
self.x = SCREEN_WIDTH + random.randint(2500, 3000)
self.y = random.randint(50, 100)

def draw(self, SCREEN):
SCREEN.blit(self.image, (self.x, self.y))

class Obstacle:
def __init__(self, image, type):
self.image = image
self.type = type
self.rect = self.image[self.type].get_rect()
self.rect.x = SCREEN_WIDTH

def update(self):
self.rect.x -= game_speed
if self.rect.x < -self.rect.width:
obstacles.pop()

def draw(self, SCREEN):
SCREEN.blit(self.image[self.type], self.rect)

class SmallCactus(Obstacle):
def __init__(self, image):
self.type = random.randint(0, 2)
super().__init__(image, self.type)
self.rect.y = 325

class LargeCactus(Obstacle):
def __init__(self, image):
self.type = random.randint(0, 2)
super().__init__(image, self.type)
self.rect.y = 300

class Bird(Obstacle):
def __init__(self, image):
self.type = 0
super().__init__(image, self.type)
self.rect.y = 250
self.index = 0

def draw(self, SCREEN):
if self.index >= 9:
self.index = 0
SCREEN.blit(self.image[self.index//5], self.rect)
self.index += 1

def main():
global game_speed, x_pos_bg, y_pos_bg, points, obstacles
run = True
clock = pygame.time.Clock()
player = Dinosaur()
cloud = Cloud()
game_speed = 20
x_pos_bg = 0
y_pos_bg = 380
points = 0
font = pygame.font.Font('freesansbold.ttf', 20)
obstacles = []
death_count = 0

def score():
global points, game_speed
points += 1
if points % 100 == 0:
game_speed += 1

text = font.render("Points: " + str(points), True, (0, 0, 0))
textRect = text.get_rect()
textRect.center = (1000, 40)
SCREEN.blit(text, textRect)

def background():
global x_pos_bg, y_pos_bg
image_width = BG.get_width()
SCREEN.blit(BG, (x_pos_bg, y_pos_bg))
SCREEN.blit(BG, (image_width + x_pos_bg, y_pos_bg))
if x_pos_bg <= -image_width:
SCREEN.blit(BG, (image_width + x_pos_bg, y_pos_bg))
x_pos_bg = 0
x_pos_bg -= game_speed

while run:
for event in pygame.event.get():
if event.type == pygame.QUIT:
run = False

SCREEN.fill((255, 255, 255))
userInput = pygame.key.get_pressed()

player.draw(SCREEN)
player.update(userInput)

if len(obstacles) == 0:
if random.randint(0, 2) == 0:
obstacles.append(SmallCactus(SMALL_CACTUS))
elif random.randint(0, 2) == 1:
obstacles.append(LargeCactus(LARGE_CACTUS))
elif random.randint(0, 2) == 2:
obstacles.append(Bird(BIRD))

for obstacle in obstacles:
obstacle.draw(SCREEN)
obstacle.update()
if player.dino_rect.colliderect(obstacle.rect):
pygame.time.delay(2000)
death_count += 1
menu(death_count)

background()

cloud.draw(SCREEN)
cloud.update()

score()

clock.tick(30)
pygame.display.update()

def menu(death_count):
global points
run = True
while run:
SCREEN.fill((255, 255, 255))
font = pygame.font.Font('freesansbold.ttf', 30)

if death_count == 0:
text = font.render("Press any Key to Start", True, (0, 0, 0))
elif death_count > 0:
text = font.render("Press any Key to Restart", True, (0, 0, 0))
score = font.render("Your Score: " + str(points), True, (0, 0, 0))
scoreRect = score.get_rect()
scoreRect.center = (SCREEN_WIDTH // 2, SCREEN_HEIGHT // 2 + 50)
SCREEN.blit(score, scoreRect)
textRect = text.get_rect()
textRect.center = (SCREEN_WIDTH // 2, SCREEN_HEIGHT // 2)
SCREEN.blit(text, textRect)
SCREEN.blit(RUNNING[0], (SCREEN_WIDTH // 2 - 20, SCREEN_HEIGHT // 2 - 140))
pygame.display.update()
for event in pygame.event.get():
if event.type == pygame.QUIT:
run = False
if event.type == pygame.KEYDOWN:
main()

menu(death_count=0)

Сложности, преодолённые при создании проекта:

  1. Изучение циклов с условием.
  2. Изучение функций.
  3. Изучение всевозможных модулей (pillow, pyautogui, time и др).

Планы по дальнейшему улучшению

В следующей версии Dinosaur Game я планирую добавить фрукт при получении которого динозавр на 10 секунд становился неуязвимым к любым преградам.

Заключение

  1. В ходе моих исследований, я хотел показать, что написание кода очень интересный, увлекательный и познавательный процесс.
  2. Над созданием больших игр трудятся программисты, но каждый школьник при желании способен создать свою собственную игру.
  3. Я хочу, чтобы мое увлечение стало моей профессией, но если я не стану программистом, я знаю, что навыки, приобретенные при создании игры, пригодятся мне в дальнейшем и в учебе, и в работе.

Список литературы

  1. Dinosaur Game — Википедия
  2. Что такое Python? — Облачное руководство для начинающих по Python — AWS
  3. Самоучитель Python | Python 3 для начинающих и чайников
  4. Python для детей (Ханс-Георг Шуман)
  5. Свейгарт Э. - Учим Python, делая крутые игры 4-е издание (Мировой компьютерный бестселлер)


Если страница Вам понравилась, поделитесь в социальных сетях:

Наши баннеры
Сайт Обучонок содержит исследовательские работы и индивидуальные проекты учащихся, темы проектов по предметам и правила их оформления, обучающие программы для детей.

Будем благодарны, если установите наш баннер!

Код баннера:

<a href="https://obuchonok.ru" target="_blank" title="Обучонок - исследовательские работы и проекты учащихся"> <img src= "https://obuchonok.ru/banners/ban200x67-6.png" width="200" height="67" border="0" alt="Обучонок"></a>

Другие наши баннеры...