Алгоритм
Описываютсяпеременныеи константы(Dim,Const)
Выбор начальныхкоординатслучайнымобразом(Rnd()).
Прорисовканачальногоположения.(Pset(x,y))
Генерацияна поле яблоки бомб случайнымобразом(Rnd()).
Проверка:не появилосьли яблоко илибомба на черве,а также другна друге.
Управление“Змейкой” склавиатурыи мышкой.
Проверка:“не укусила”ли “змейкасама себя”,если укусилавыводитсяинформационноеокно (Инфоформационнаяформа),в противномслучае переходимк следующемупункту.
Проверка:“не съела” ли“змейка” “яблоко”если съела, тонаращиваемей хвост и переходимк пункту 3), впротивномслучае см. Следующийпункт.
Проверка:“не съела” ли“змейка” “бомбу”,если съела, товыводитсяинформационноеокно (Инфоформационнаяформа),в противномслучае переходимк следующемупункту.
Перерисовка“Змейки”
P.S. За движение“Змейки” появление“яблок” и “бомб”отвечают триразных таймера.Это было использованодля того, чтобыскорость движения“змейки” былапостоянной,а также чтобы“яблоко” и“бомба” появлялисьна поле в разноевремя с разнымпериодом появления.
Не исключено,что в последующемв данную программубудут добавленыдругие объекты,а также возможностьсоздания таблицылучших игроков,с возможностьюхранения этойтаблицы в файле,который можетбыть считани записан, атак же перезаписан.
ВладивостокскийГосударственныйУниверситетЭкономики иСервиса
Кафедра
УТВЕРЖДАЮ
Заведующийкафедрой
________ Н. Н.
___”_______1998 г.
Отчет
По лабораторнойработе
Руководитель _______________ ГлытинаК. У
Исполнитель
студентИС-97 _______________ ГавриленкоА. С.
Находка1998 г.
Кодпрограммы:
Форма_Змейка
'-------Описаниепеременных-------
OptionExplicit
DimЗмейка() As Змея
DimLastPos As Змея
DimApple As Змея
DimBomba As Змея
Dimi, j, Длина As Integer
DimXDir, YDir As Integer
DimFirstXPos, FirstYPos As Integer
DimПроверочная1As Byte
DimПроверочная2As 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).XPosAnd Apple.YPos = Змейка(i).YPosThen
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).XPosAnd Bomba.YPos = Змейка(i).YPosOr Bomba.XPos = Apple.XPos And Bomba.YPos = Apple.YPos Then
GoTo Метка2
Exit Do
End If
i = i + 1
Loop
EndSub
-------------------------------------------------------------------------------------------------
'-----Обработкаклавиш управления------
PrivateSub поле_KeyDown(KeyCode As Integer, Shift AsInteger)
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
PrivateSub КнопкаПовторить_Click()
Форма_Змейка.Enabled= True
Форма_Змейка.Form_Load
ИнформационнаяФорма.Hide
EndSub
AboutAvtor
‘Закрытиеформы щелчкокнопки мышыпо фотографии
PrivateSub Image1_Click()
ИнформационнаяФорма.Enabled= True
Unload Me
EndSub
Module1
OptionExplicit
‘Создаемновый тип переменной
PublicType Змея
XPosAs Integer
YPosAs Integer
EndType
Постановказадачи.
Цель: Создатьзаконченныйвариант игрына ловкость“Змейка”
Законченныйвариант игрызмейка долженсодержать:
“Змейку”,которая можетдвигаться вограниченнойплоскости.Маневрами“Змейки”должен управлятьиграющий. “Змейка”должна увеличиватьсяв размерах пристолкновениис “яблоком”и погибать пристолкновениис “бомбой”,при пересечениисамой себя ипри выходе заграницы плоскостизаданнойпрограммистом.
“Яблоко”или другойобъект, пристолкновениис которым “Змейка”“съедает”его(увеличиваетсяв длину в зависимостиот условийзаданныхпрограммистом.
“Бомба”или иной объектпри столкновениис которым змейкапогибает.
P.S.Необязательнымусловием(пожеланию учащегося),“змейка”может управлятьсямышкой(с помощьюклавиш на форме),игра можетиметь счетчикнабранныхочков, таблицулучших игроков,которая можетсохранятсяи считыватьсяиз файла, а такжедругие элементыкоторые увеличиваютиграбельностьигры.