Реферат: Игра на ловкость "Змейка"
Постановказадачи.
Цель:Создать законченный вариант игры на ловкость “Змейка”
Законченный вариант игры змейка должен содержать:
1) <span Times New Roman"">
“Змейку”, которая может двигаться вограниченной плоскости. Маневрами “Змейки” должен управлять играющий. “Змейка” должна увеличиваться в размерах пристолкновении с “яблоком” и погибать пристолкновении с “бомбой”, припересечении самой себя и при выходе за границы плоскости заданнойпрограммистом.2) <span Times New Roman"">
“Яблоко”или другой объект, при столкновении с которым “Змейка”“съедает” его(увеличивается в длину в зависимости от условий заданныхпрограммистом.3) <span Times New Roman"">
“Бомба” или иной объект при столкновении с которым змейка погибает.P.S.Необязательным условием(пожеланию учащегося), “змейка” может управлятьсямышкой(с помощью клавиш на форме), игра может иметь счетчик набранных очков,таблицу лучших игроков, которая может сохранятся и считываться из файла, атакже другие элементы которые увеличивают играбельность игры.
Алгоритм
1) <span Times New Roman"">
Описываются переменные иконстанты(Dim,Const)2) <span Times New Roman"">
Выбор начальных координатслучайным образом(Rnd()).3) <span Times New Roman"">
Прорисовка начальногоположения.(Pset(x,y))4) <span Times New Roman"">
Генерация на поле яблок ибомб случайным образом(Rnd()).5) <span Times New Roman"">
Проверка: не появилось лияблоко или бомба на черве, а также друг на друге.6) <span Times New Roman"">
Управление “Змейкой” склавиатуры и мышкой.7) <span Times New Roman"">
Проверка: “не укусила” ли“змейка сама себя”, если укусила выводится информационное окно(Инфоформационнаяформа), в противном случае переходим к следующему пункту.8) <span Times New Roman"">
Проверка: “не съела” ли“змейка” “яблоко” если съела, то наращиваем ей хвост и переходим к пункту 3), впротивном случае см. Следующий пункт.9) <span Times New Roman"">
Проверка: “не съела” ли“змейка” “бомбу”, если съела, то выводится информационное окно(Инфоформационнаяформа), в противном случае переходим к следующему пункту.10) Перерисовка “Змейки”
P.S. За движение “Змейки” появление “яблок” и “бомб” отвечают три разныхтаймера. Это было использовано для того, чтобы скорость движения “змейки” былапостоянной, а также чтобы “яблоко” и “бомба” появлялись на поле в разное времяс разным периодом появления.
Не исключено, что в последующем в данную программубудут добавлены другие объекты, а также возможность создания таблицы лучшихигроков, с возможностью хранения этой таблицы в файле, который может бытьсчитан и записан, а так же перезаписан.
Код программы:
Форма_Змейка
'-------Описание переменных-------
Option Explicit
Dim Змейка() As Змея
DimLastPos As Змея
DimApple As Змея
DimBomba As Змея
Dimi, j, Длина As Integer
DimXDir, YDir As Integer
DimFirstXPos, FirstYPos As Integer
DimПроверочная1 As Byte
DimПроверочная2 As Single
DimНЛ As String
'-------Начальные присвоения--------
ConstTIC = 1 'Период таймера
ConstBackCollor = &H8000000F 'Цвет заднего плана
ConstWormCollor = &H80& 'Цвет Змейки
ConstAppleCollor = &HFF00& 'Цвет яблока
ConstBombaCollor = &H80000012 'Цветбомбы
ConstТолщина = 10 'Толщина червяка
ConstНачДлина = 5 'Начальная длина Змейки
ConstПриращениеДлины = 3 'Приращение длины Змейки
-------------------------------------------------------------------------------------------------
PublicSub Form_Load()
Поле.BackColor= BackCollor
Поле.DrawWidth= Толщина
Длина= НачДлина
ReDimPreserve Змейка(1 To НачДлина)
'------Начальное положение------
FirstXPos= 5 + Int(Rnd() * 41)
FirstYPos= 5 + Int(Rnd() * 41)
Fori = 1 To 5
Змейка(i).XPos = FirstXPos
Змейка(i).YPos = FirstYPos + i
Nexti
НачПоложение
'------Направление движения------
XDir= 0
YDir= -1 'Вверх
'------Генерация Яблок и Бомб----
AppleGen
BombaGen
Taimer.Interval= TIC
EndSub
'---Прорисовка начального положения---
PrivateSub НачПоложение()
Поле.ForeColor= WormCollor
СчетИгры.Caption= Длина
Fori = 1 To Длина
Поле.PSet (Змейка(i).XPos * 100, Змейка(i).YPos *100)
Nexti
EndSub
-------------------------------------------------------------------------------------------------
PrivateSub Taimer_Timer()
Движение
Перерисовка
EndSub
-------------------------------------------------------------------------------------------------
PrivateSub Движение()
НЛ= Chr(10) & Chr(13) 'Перевод строки
Поле.AutoRedraw= True
Поле.DrawWidth= Толщина
LastPos= Змейка(Длина)
Fori = Длина To 2 Step -1
Змейка(i) = Змейка(i — 1)
Nexti
Змейка(1).XPos= Змейка(1).XPos + XDir
Змейка(1).YPos= Змейка(1).YPos + YDir
'------Не вышел ли за пределы поля------
OnError GoTo ВышелЗаПределы
Проверочная1= Змейка(1).XPos — 1
Проверочная1= Змейка(1).YPos — 1
Проверочная1= Змейка(1).XPos + 206
Проверочная1= Змейка(1).YPos + 206
'------Не укусил ли самого себя------
УкусилСамогоСебя:
Fori = 2 To Длина
If Змейка(1).XPos = Змейка(i).XPos AndЗмейка(1).YPos = Змейка(i).YPos
Then Taimer.Interval = 0
ИнформационнаяФорма.ИнфоПоле.Caption= НЛ & _
«ВАША ЗМЕЙКА»& НЛ & _
«САМА СЕБЯУКУСИЛА» & НЛ & НЛ & _
«Длина змейки „& Длина
ИнформационнаяФорма.Show
Форма_Змейка.Enabled = False
End If
Nexti
'-----Не наткнулся ли на яблоко-----
OnError GoTo Наткнулась1
Проверочная2= 1 / (Abs((Змейка(1).XPos — Apple.XPos)) + Abs((Змейка(1).YPos — Apple.YPos)))
'-----Не наткнулась ли на бомбу------
OnError GoTo Наткнулась2
Проверочная2= 1 / (Abs((Змейка(1).XPos — Bomba.XPos)) + Abs((Змейка(1).YPos — Bomba.YPos)))
ExitSub
'----------------Обравотка столкновений---------------
ВышелЗаПределы:
Taimer.Interval= 0
ИнформационнаяФорма.ИнфоПоле.Caption = НЛ & _
“ВАША ЗМЕЙКА»& НЛ & _
«ВЫШЛА ЗА ПРЕДЕЛЫПОЛЯ» & НЛ & НЛ & _
«Длина змейки „& Длина
ИнформационнаяФорма.Show
Форма_Змейка.Enabled = False
ExitSub
Наткнулась1:
Длина= Длина + ПриращениеДлины
ReDimPreserve Змейка(1 To Длина)
'-------Перемещаемхвост в конец-------
Fori = Длина To ПриращениеДлины + 1 Step -1
Змейка(i) = Змейка(i — ПриращениеДлины)
Nexti
'Добавляем в голову по направлению движения
Fori = ПриращениеДлины To 1 Step -1
Змейка(i).XPos = Змейка(i + 1).XPos + XDir
Змейка(i).YPos = Змейка(i + 1).YPos + YDir
Nexti
AppleGen
НачПоложение
ExitSub
Наткнулась2:
Taimer.Interval= 0
ИнформационнаяФорма.ИнфоПоле.Caption = НЛ & _
“ВАША ЗМЕЙКА»& НЛ & _
«СЪЕЛА БОМБУ»& НЛ & НЛ & _
«Длина змейки „& Длина
ИнформационнаяФорма.Show
Форма_Змейка.Enabled = False
ExitSub
EndSub
-------------------------------------------------------------------------------------------------
PrivateSub Перерисовка()
'------Рисуем змейку-------
Поле.ForeColor= BackCollor
Поле.PSet(LastPos.XPos * 100, LastPos.YPos * 100)
Поле.ForeColor= WormCollor
Поле.PSet(Змейка(1).XPos * 100, Змейка(1).YPos * 100)
Поле.PSet(Змейка(Длина).XPos * 100, Змейка(Длина).YPos * 100)
'------Рисуем Яблоко-------
Поле.ForeColor= AppleCollor
Поле.PSet(Apple.XPos * 100, Apple.YPos * 100)
'------Рисуем бомбу--------
Поле.ForeColor= BombaCollor
Поле.PSet(Bomba.XPos * 100, Bomba.YPos * 100)
EndSub
-------------------------------------------------------------------------------------------------
PrivateSub TaimerApple_Timer()
TaimerApple.Interval= (5 + Int(Rnd() * 11)) * 1000
Поле.ForeColor= BackCollor
Поле.PSet(Apple.XPos * 100, Apple.YPos * 100)
AppleGen
EndSub
-------------------------------------------------------------------------------------------------
PrivateSub TaimerBomba_Timer()
TaimerBomba.Interval= (5 + Int(Rnd() * 11)) * 1000
Поле.ForeColor= BackCollor
Поле.PSet(Bomba.XPos * 100, Bomba.YPos * 100)
BombaGen
EndSub
-------------------------------------------------------------------------------------------------
PrivateSub AppleGen()
Метка1:
Apple.XPos= 1 + Int(Rnd() * 49)
Apple.YPos= 1 + Int(Rnd() * 49)
i =1
DoWhile i <= Длина
If Apple.XPos = Змейка(i).XPos And Apple.YPos =Змейка(i).YPos Then
GoTo Метка1
Exit Do
End If
i = i + 1
Loop
EndSub
-------------------------------------------------------------------------------------------------
PrivateSub BombaGen()
Метка2:
Bomba.XPos= 1 + Int(Rnd() * 49)
Bomba.YPos= 1 + Int(Rnd() * 49)
i =1
DoWhile i <= Длина
If Bomba.XPos = Змейка(i).XPos And Bomba.YPos =Змейка(i).YPos Or Bomba.XPos = Apple.XPos And Bomba.YPos = Apple.YPos Then
GoTo Метка2
Exit Do
End If
i = i + 1
Loop
EndSub
-------------------------------------------------------------------------------------------------
<span Times New Roman“,»serif"; mso-fareast-font-family:«Times New Roman»;mso-ansi-language:RU;mso-fareast-language: KO;mso-bidi-language:AR-SA">'-----Обработка клавиш управления------
PrivateSub поле_KeyDown(KeyCode As Integer, Shift As Integer)
SelectCase KeyCode
Case 38 'вверх
XDir = 0
YDir = -1
Case 40 'вниз
XDir = 0
YDir = 1
Case 37 'влево
XDir = -1
YDir = 0
Case 39 'вправо
XDir = 1
YDir = 0
Case 27 'ESC
End
Case 113 'F2-игра
Форма_Змейка.Enabled = True
Форма_Змейка.Form_Load
ИнформационнаяФорма.Hide
End Select
EndSub
-------------------------------------------------------------------------------------------------
‘Обработканажатий кнопок
PrivateSub Up_Click()
XDir = 0
YDir = -1
EndSub
PrivateSub Down_Click()
XDir = 0
YDir = 1
EndSub
PrivateSub Left_Click()
XDir = -1
YDir = 0
EndSub
PrivateSub Right_Click()
XDir = 1
YDir = 0
EndSub
PrivateSub Command1_Click()
End
EndSub
PrivateSub Command2_Click()
Форма_Змейка.Enabled = True
Форма_Змейка.Form_Load
ИнформационнаяФорма.Hide
EndSub
ИнформационнаяФорма
Dim НЛ As String
-------------------------------------------------------------------------------------------------
PrivateSub Avtor_Click()
НЛ= Chr(10) & Chr(13)
AboutAvtor.Label4.Caption= «Все права защищены,» & НЛ & _
«использование в комерческих целях преследуетсяпо закону»
ИнформационнаяФорма.Enabled = False
AboutAvtor.Show
EndSub
-------------------------------------------------------------------------------------------------
‘Обработканажатий кнопок
PrivateSub Exit_Click()
КнопкаВыход_Click
EndSub
PrivateSub NewGame_Click()
КнопкаПовторить_Click
EndSub
PrivateSub КнопкаВыход_Click()
UnloadФорма_Змейка
UnloadMe
EndSub
Private Sub КнопкаПовторить_Click()
Форма_Змейка.Enabled = True
Форма_Змейка.Form_Load
ИнформационнаяФорма.Hide
EndSub
AboutAvtor
‘Закрытие формы щелчко кнопкимышы по фотографии
Private Sub Image1_Click()
ИнформационнаяФорма.Enabled= True
UnloadMe
End Sub
Module1
Option Explicit
‘Создаем новый тип переменной
PublicTypeЗмея
XPosAs Integer
YPosAs Integer
End Type