Московский институт электроники и математики

(технический университет)

кафедра ИКТ

Курсовая работа по программирование

на тему «игра НЛО»

Выполнил:

Бокарёв Иван с-14

Проверил:

Москва 2010


План:

1)Сведения об игре «Что есть что».Задача.

2)Средства для создания игры.

3)Проблемы возникшие в ходе разработки и их решение, почему так.

1.Правильное падение снаряда.

2.Почему списки и события.

3.Почему не классы и функции.

4)Принцип работы первого и второго уровней.

1.Введение.

2.Первый уровень.

3.Второй уровень.

5)Итоги.

6)Что мы имеем и что сможем сделать.

Сведения об игре,«Что есть что».Задача.

Игра «НЛО» представляет из себя игровой процесс в течении которого «НЛО» бомбит населенный пункт, на первом уровне, и сражается с ездящей платформой которая стреляет по НЛО снарядами и повторяет движения НЛО(передвижение вправо и влево), на втором.

НЛО двигается в верхней части экрана строго по горизонтали, снаряды падают строго перпендикулярно (вверх и вниз соответственно).Снаряды от НЛО отцепляются только после нажатия пробел, снаряды с платформы двигаются автоматически, после ухода за пределы игрового окна, со снарядом от НЛО происходят аналогичные события. Количество снарядов не ограничено.

При уничтожении сооружений на первом уровне игрок перекидывается на второй автоматически. При столкновении двух снарядов они уничтожаются, и появляются на новых позициях. Управление НЛО и сброс снарядов происходит под управлением пользователя (левой и правой стрелками для передвижения и пробелом для сброса снарядов). Единственным условием при постановке домов служит их нее не пересечение друг с другом.

НЕ нашли? Не то? Что вы ищете?

Техническое задание можно увидеть на: http://wiki. *****/Участник:Ivan. Bokarev/НЛО

Средства для создания игры.

Графический редактор Gimp, Python, библиотека PyGame.

Проблемы возникшие в ходе разработки и их решение, почему так.

1.  1. Так как игра основана на «падениях и взлетах», а в программном варианте это смена координат, то требовалось найти способ что бы объекты двигались по определенным правилам а не так как им хочется. Первая проблема которая возникла в ходе создания игры стал неправильный полёт и движение снаряда, который отцепляется от НЛО, а именно после нажатия на пробел начинал двигаться и после выхода за экран не останавливался а продолжал двигаться дальше по кругу и при нажатии на пробел начинал двигаться быстрее и при всем этом двигался вправо и влево, аналогично НЛО. Данную проблему я решил с помощью списков. Получилось это так: теперь после нажатия на пробел отслеживается событие и изменение координат снаряда и снаряд становиться независимым от НЛО, после ухода за пределы экрана он возвращается под НЛО и у них получаются единое движение влево и вправо.

2.  В использовании списков и событий я нашел удобство для себя в процессе написания программного кода, простоту в использовании (что и требует данная задача).

3.  Я считаю что данная задача не требует наличия классов и функций, слишком мало «потребностей игры» на данном этапе. Да классы с функциями удобней своей простотой в изменении и применении.

Принципы работы первого и второго уровней.

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

2.Первый уровень. Задача на уровне уничтожить все дома которые находятся в нижней части экрана. В дальнейшем после уничтожения появляется рамка с надписью « Warten, jetzt alle Bootнем.-подождите, сейчас все загрузиться ».

3.Второй уровень. Задача, которая стоит перед пользователем, это уничтожение всех объектов. Оказание сопротивления снарядам с платформы и уничтожение самой платформы. НЛО и платформа двигаются параллельно друг другу, управление осуществляется кнопками. Если снаряд запущенный с платформы попадает в снаряд запущенный с НЛО то снаряды уничтожаются. Если снаряд с платформы попадает в НЛО то высвечивается рамка с надписью «Du verlierst, Abschied нем.-вы проиграли, прощайте», что означает что игра кончена. Если НЛО уничтожает платформу и дома, то высвечивается рамка «Sie haben gewonnen, herzlichen Gluckwunsch нем.-Вы выиграли, поздравляем » и на этом игра игра заканчивается. Игровое окно будет висеть 15 секунд, потом оно автоматически закроется.

Итоги:

Мне не удалось сделать задуманное ранние автоматическую смену уровней. Но мне удалось подключить рандомную постановку домиков и таблички с текстом, в зависимости от события. Так же стал больше понимать в списках.

Что мы имеем и что можно сделать.

На данной стадии разработки мы имеем игру в которой, при должном подходе, может стать многопользовательской. Так же нужно добавить анимацию, и написать её с использованием классов.

Код.

Уровень 1:

# -*- coding: utf-8 -*-

import random, pygame, time

width=600

height=400

pygame. init()

pygame. font. init()

screen = pygame. display. set_mode((width, height))

font = pygame. font. SysFont("Courier", 20);font. set_bold(True)

vniz=False

pobeda=False

dom=pygame. image. load("dom. png")

verx=pygame. image. load("verx. png")

houses=[]

for i in range(10):

Kf=width//dom. get_width()-1

houses. append([dom, dom. get_width()*random. randint(0,Kf),height-dom. get_height(),True])

nlo=[pygame. image. load("nlo. png"),290,30,0]

mina=[pygame. image. load("mina. png"),300,60,0]

while True:

for event in pygame. event. get():

if event. type == pygame. QUIT:

quit()

elif event. type == pygame. KEYDOWN:

if event. key == pygame. K_SPACE and vniz==False:

vniz=True

mina[3]=10

elif event. key == pygame. K_LEFT:

nlo[3]-=5

elif event. key == pygame. K_RIGHT:

nlo[3]+= 5

elif event. type == pygame. KEYUP:

if event. key == pygame. K_LEFT:

nlo[3]+=5

elif event. key == pygame. K_RIGHT:

nlo[3]-=5

if nlo[1]>560:nlo[1]=560

if nlo[1]<5:nlo[1]=5

if mina[1]>570:mina[1]=570

if mina[1]<20:mina[1]=20

if not pobeda:

screen. fill((50,50,50))

mina[2]+=mina[3]

nlo[1]+=nlo[3]

if vniz==False:mina[1]+=nlo[3]

if mina[2]>height:

vniz=False

mina[2]=60

mina[1]=nlo[1]+10

mina[3]=0

for i in houses:

if i[1]<=mina[1]<i[1]+dom. get_width() and mina[2]>=i[2]:

i[0]=pygame. image. load("domout. png")

i[3]=False

Stop=True

for i in houses:

if i[3]==True: Stop=False;

if Stop: pobeda=True

for i in houses:

screen. blit(i[0], (i[1],i[2]))

screen. blit(nlo[0],(nlo[1],nlo[2]))

screen. blit(mina[0],(mina[1],mina[2]))

screen. blit(verx,(0,0))

pygame. display. flip()

time. sleep(0.05)

if pobeda:

string="Warten, jetzt starten Ebene"

text = font. render(string, 1, (255, 255, 255))

textpos = text. get_rect()

textpos. centerx = width//2

textpos. centery=height//2

screen. fill((0,0,0),textpos)

screen. blit(text, textpos)

pygame. display. update()

time. sleep(5)

break

Уровень 2

# -*- coding: utf-8 -*-

import random, pygame, time

width=600

height=400

pygame. init()

pygame. font. init()

screen = pygame. display. set_mode((width, height))

font = pygame. font. SysFont("Courier", 20);font. set_bold(True)

am=False

vniz=False

D=False

pobeda=False

dom=pygame. image. load("dom. png")

verx=pygame. image. load("verx. png")

houses=[]

for i in range(1):

Kf=width//dom. get_width()-1

houses. append([dom, dom. get_width()*random. randint(0,Kf),height-dom. get_height(),True])

nlo=[pygame. image. load("nlo. png"),290,30,0]

mina=[pygame. image. load("mina. png"),300,60,0]

plat=[pygame. image. load("platforma. png"),280,height-30,True]

zmina=[pygame. image. load("zmina. png"),300,height-40,-4]

plat[0]=plat[0].convert()

while True:

for event in pygame. event. get():

if event. type == pygame. QUIT:

quit()

elif event. type == pygame. KEYDOWN:

if event. key == pygame. K_SPACE and vniz==False:

vniz=True

mina[3]=10

elif event. key == pygame. K_LEFT:

nlo[3]-=5

elif event. key == pygame. K_RIGHT:

nlo[3]+= 5

elif event. type == pygame. KEYUP:

if event. key == pygame. K_LEFT:

nlo[3]+=5

elif event. key == pygame. K_RIGHT:

nlo[3]-=5

if nlo[1]>560:nlo[1]=560

if nlo[1]<5:nlo[1]=5

if mina[1]>570:mina[1]=570

if mina[1]<20:mina[1]=20

if plat[1]>560:plat[1]=560

if plat[1]<0:plat[1]=0

if not pobeda:

screen. fill((50,50,50))

mina[2]+=mina[3]

zmina[2]+=zmina[3]

nlo[1]+=nlo[3]

if vniz==False:mina[1]+=nlo[3]

if not D:plat[1]+=nlo[3]

if mina[2]>height:

vniz=False

mina[2]=60

mina[1]=nlo[1]+10

mina[3]=0

if zmina[2]<30:

zmina[2]=height-40

zmina[1]=plat[1]+20

if D: zmina[3]=0

if mina[1] in range(zmina[1]-mina[0].get_width()//2,zmina[1]+zmina[0].get_width()) and zmina[2]<=mina[2]+mina[0].get_height() and not D:

zmina[2]=height-40

zmina[1]=plat[1]+20

if D: zmina[3]=0

vniz=False

mina[2]=60

mina[1]=nlo[1]+10

mina[3]=0

for i in houses:

if i[1]<=mina[1]<i[1]+dom. get_width() and mina[2]>=i[2]:

i[0]=pygame. image. load("domout. png")

i[3]=False

if plat[1]<=mina[1]<=plat[1]+plat[0].get_width() and mina[2]>=plat[2]:

plat[0]=pygame. image. load("platformaout. png")

plat[0]=plat[0].convert()

plat[0].set_colorkey((50,50,50))

plat[3]=False

D=True

if zmina[1] in range(nlo[1]-zmina[0].get_width()+2,nlo[1]+nlo[0].get_width()) and zmina[2]<=nlo[2]+nlo[0].get_height()-10:

am=True

Stop=True

for i in houses:

if i[3]==True: Stop=False;

if plat[3]==True:Stop=False

if Stop: pobeda=True

for i in houses:

screen. blit(i[0], (i[1],i[2]))

screen. blit(nlo[0],(nlo[1],nlo[2]))

screen. blit(mina[0],(mina[1],mina[2]))

screen. blit(verx,(0,0))

screen. blit(plat[0],(plat[1],plat[2]))

screen. blit(zmina[0],(zmina[1],zmina[2]))

pygame. display. flip()

time. sleep(0.05)

if am:

string="Du verlierst, Abschied"

text = font. render(string, 1, (255, 255, 255))

textpos = text. get_rect()

textpos. centerx = width//2

textpos. centery=height//2

screen. fill((0,0,0),textpos)

screen. blit(text, textpos)

pygame. display. update()

time. sleep(5)

break

if pobeda:

string="Sie haben gewonnen, herzlichen Gluckwunsch"

text = font. render(string, 1, (255, 255, 255))

textpos = text. get_rect()

textpos. centerx = width//2

textpos. centery=height//2

screen. fill((0,0,0),textpos)

screen. blit(text, textpos)

pygame. display. update()

time. sleep(10)

break