Игра на ловкость "Змейка"
Постановка задачи.
Цель: Создать законченный вариант игры на ловкость Змейка
Законченный вариант игры змейка должен содержать:
1) Змейку, которая может двигаться в ограниченной плоскости. Маневрами Змейки должен правлять играющий. Змейка должна величиваться в размерах при столкновении с яблоком и погибать при столкновении с бомбой, при пересечении самой себя и при выходе за границы плоскости заданной программистом.
2) Яблоко или другой объект, при столкновении с которым Змейка Усъедает его(увеличивается в длину в зависимости от словий заданных программистом.
3) Бомба или иной объект при столкновении с которым змейка погибает.
P.S. Необязательным словием(по желанию учащегося), змейка может правляться мышкой(с помощью клавиш на форме), игра может иметь счетчик набранных очков, таблицу лучших игроков, которая может сохранятся и считываться из файла, а также другие элементы которые величивают играбельность игры.
лгоритм
1) Описываются переменные и константы(Dim, Const)
2) Выбор начальных координат случайным образом(Rnd()).
3) Прорисовка начального положения.(Pset(x,y))
4) Генерация на поле яблок и бомб случайным образом(Rnd()).
5) Проверка: не появилось ли яблоко или бомба на черве, также друг на друге.
6) правление Змейкой с клавиатуры и мышкой.
7) Проверка: не кусила ли Узмейка сама себя, если кусила выводится информационное окно (Инфоформационнаяформа), в противном случае переходим к следующему пункту.
8) Проверка: не съела ли Узмейка яблоко если съела, то наращиваем ей хвост и переходим к пункту 3), в противном случае см. Следующий пункт.
9) Проверка: не съела ли Узмейка бомбу, если съела, то выводится информационное окно (Инфоформационнаяформа), в противном случае переходим к следующему пункту.
10) Перерисовка Змейки
P.S. За движение Змейки появление яблок и бомб отвечают три разных таймера. Это было использовано для того, чтобы скорость движения змейки была постоянной, также чтобы яблоко и бомба появлялись на поле в разное время с разным периодом появления.
Не исключено, что в последующем в данную программу будут добавлены другие объекты, также возможность создания таблицы лучших игроков, с возможностью хранения этой таблицы в файле, который может быть считан и записан, так же перезаписан.
Код программы:
Форма_Змейка
'-------Описание переменных-------
Option Explicit
Dim Змейка() As Змея
Dim LastPos As Змея
Dim Apple As Змея
Dim Bomba As Змея
Dim i, j, Длина As Integer
Dim XDir, YDir As Integer
Dim FirstXPos, FirstYPos As Integer
Dim Проверочная1 As Byte
Dim Проверочная2 As Single
Dim НЛ As String
'-------Начальные присвоения--------
Const TIC = 1 'Период таймера
Const BackCollor = &H8F 'Цвет заднего плана
Const WormCollor = &H80& 'Цвет Змейки
Const AppleCollor = &HFF00& 'Цвет яблока
Const BombaCollor = &H812 'Цвет бомбы
Const Толщина = 10 'Толщина червяка
Const НачДлина = 5 'Начальная длина Змейки
Const ПриращениеДлины = 3 'Приращение длины Змейки
-------------------------------------------------------------------------------------------------
Public Sub Form_Load()
Поле.BackColor = BackCollor
Поле.DrawWidth = Толщина
Длина = НачДлина
ReDim Preserve Змейка(1 To НачДлина)
'------Начальное положение------
FirstXPos = 5 + Int(Rnd() * 41)
FirstYPos = 5 + Int(Rnd() * 41)
For i = 1 To 5
Змейка(i).XPos = FirstXPos
Змейка(i).YPos = FirstYPos + i
Next i
НачПоложение
'------Направление движения------
XDir = 0
YDir = -1 'Вверх
'------Генерация Яблок и Бомб----
AppleGen
BombaGen
Taimer.Interval = TIC
End Sub
'---Прорисовка начального положения---
Private Sub НачПоложение()
Поле.ForeColor = WormCollor
СчетИгры.Caption = Длина
For i = 1 To Длина
Поле.PSet (Змейка(i).XPos * 100, Змейка(i).YPos * 100)
Next i
End Sub
-------------------------------------------------------------------------------------------------
Private Sub Taimer_Timer()
Движение
Перерисовка
End Sub
-------------------------------------------------------------------------------------------------
Private Sub Движение()
НЛ = Chr(10) & Chr(13)а 'Перевод строки
Поле.AutoRedraw = True
Поле.DrawWidth = Толщина
LastPos = Змейка(Длина)
For i = Длина To 2 Step -1
Змейка(i) = Змейка(i - 1)
Next i
Змейка(1).XPos = Змейка(1).XPos + XDir
Змейка(1).YPos = Змейка(1).YPos + YDir
'------Не вышел ли за пределы поля------
On Error GoTo ВышеПределы
Проверочная1 = Змейка(1).XPos - 1
Проверочная1 = Змейка(1).YPos - 1
Проверочная1 = Змейка(1).XPos + 206
Проверочная1 = Змейка(1).YPos + 206
'------Не кусил ли самого себя------
УкусиСамогоСебя:
For i = 2 To Длина
If Змейка(1).XPos = Змейка(i).XPos And Змейка(1).YPos = Змейка(i).YPos
Then Taimer.Interval = 0
Информационнаяорма.ИнфоПоле.Caption = НЛ & _
"ВАША ЗМЕЙКА" & НЛ & _
"САМА СЕБЯ УКУСИЛА" & НЛ & НЛ & _
"Длина змейки " & Длина
Информационнаяорма.Show
Форма_Змейка.Enabled = False
End If
Next i
'-----Не наткнулся ли на яблоко-----
On Error GoTo Наткнулась1
Проверочная2 = 1 / (Abs((Змейка(1).XPos - Apple.XPos)) + Abs((Змейка(1).YPos - Apple.YPos)))
'-----Не наткнулась ли на бомбу------
On Error GoTo Наткнулась2
Проверочная2 = 1 / (Abs((Змейка(1).XPos - Bomba.XPos)) + Abs((Змейка(1).YPos - Bomba.YPos)))
Exit Sub
'----------------Обравотка столкновений---------------
ВышеПределы:
Taimer.Interval = 0
Информационнаяорма.ИнфоПоле.Caption = НЛ & _
"ВАША ЗМЕЙКА" & НЛ & _
"ВЫШЛА ЗА ПРЕДЕЛЫ ПОЛЯ" & НЛ & НЛ & _
"Длина змейки " & Длина
Информационнаяорма.Show
Форма_Змейка.Enabled = False
Exit Sub
Наткнулась1:
Длина = Длина + ПриращениеДлины
ReDim Preserve Змейка(1 To Длина)
'-------Перемещаем хвост в конец-------
For i = Длина To ПриращениеДлины + 1 Step -1
Змейка(i) = Змейка(i - ПриращениеДлины)
Next i
'Добавляем в голову по направлению движения
For i = ПриращениеДлины To 1 Step -1
Змейка(i).XPos = Змейка(i + 1).XPos + XDir
Змейка(i).YPos = Змейка(i + 1).YPos + YDir
Next i
AppleGen
НачПоложение
Exit Sub
Наткнулась2:
Taimer.Interval = 0
Информационнаяорма.ИнфоПоле.Caption = НЛ & _
"ВАША ЗМЕЙКА" & НЛ & _
"СЪЕЛА БОМБУ" & НЛ & НЛ & _
"Длина змейки " & Длина
Информационнаяорма.Show
Форма_Змейка.Enabled = False
Exit Sub
End Sub
-------------------------------------------------------------------------------------------------
Private Sub Перерисовка()
'------Рисуем змейку-------
Поле.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)
End Sub
-------------------------------------------------------------------------------------------------
Private Sub TaimerApple_Timer()
TaimerApple.Interval = (5 + Int(Rnd() * 11)) * 1
Поле.ForeColor = BackCollor
Поле.PSet (Apple.XPos * 100, Apple.YPos * 100)
AppleGen
End Sub
-------------------------------------------------------------------------------------------------
Private Sub TaimerBomba_Timer()
TaimerBomba.Interval = (5 + Int(Rnd() * 11)) * 1
Поле.ForeColor = BackCollor
Поле.PSet (Bomba.XPos * 100, Bomba.YPos * 100)
BombaGen
End Sub
-------------------------------------------------------------------------------------------------
Private Sub AppleGen()
Метка1:
Apple.XPos = 1 + Int(Rnd() * 49)
Apple.YPos = 1 + Int(Rnd() * 49)
i = 1
Do While i <= Длина
If Apple.XPos = Змейка(i).XPos And Apple.YPos = Змейка(i).YPos Then
GoTo Метка1
Exit Do
End If
i = i + 1
Loop
End Sub
-------------------------------------------------------------------------------------------------
Private Sub BombaGen()
Метка2:
Bomba.XPos = 1 + Int(Rnd() * 49)
Bomba.YPos = 1 + Int(Rnd() * 49)
i = 1
Do While 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
End Sub
-------------------------------------------------------------------------------------------------
'-----Обработка клавиш правления------
Private Sub поле_KeyDown(KeyCode As Integer, Shift As Integer)
Select Case 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
End Sub
-------------------------------------------------------------------------------------------------
Обработка нажатий кнопок
Private Sub Up_Click()
XDir = 0
YDir = -1
End Sub
Private Sub Down_Click()
XDir = 0
YDir = 1
End Sub
Private Sub Left_Click()
XDir = -1
YDir = 0
End Sub
Private Sub Right_Click()
XDir = 1
YDir = 0
End Sub
Private Sub Command1_Click()
End
End Sub
Private Sub Command2_Click()
Форма_Змейка.Enabled = True
Форма_Змейка.Form_Load
Информационнаяорма.Hide
End Sub
Информационнаяорма
Dim НЛ As String
-------------------------------------------------------------------------------------------------
Private Sub Avtor_Click()
НЛ = Chr(10) & Chr(13)
AboutAvtor.Label4.Caption = "Все права защищены," & НЛ & _
"использование в комерческих целях преследуется по закону"
Информационнаяорма.Enabled = False
AboutAvtor.Show
End Sub
-------------------------------------------------------------------------------------------------
Обработка нажатий кнопок
Private Sub Exit_Click()
КнопкВыход_Click
End Sub
Private Sub NewGame_Click()
КнопкПовторить_Click
End Sub
Private Sub КнопкВыход_Click()
Unload Форма_Змейка
Unload Me
End Sub
Private Sub КнопкПовторить_Click()
Форма_Змейка.Enabled = True
Форма_Змейка.Form_Load
Информационнаяорма.Hide
End Sub
AboutAvtor
Закрытие формы щелчко кнопки мышы по фотографии
Private Sub Image1_Click()
Информационнаяорма.Enabled = True
Unload Me
End Sub
Module1
Option Explicit
Создаем новый тип переменной
Public Type Змея
XPos As Integer
YPos As Integer
End Type