Разработка компьютерной игры 'Морской бой'
Содержание проекта
Введение. Теоретическая часть
Игры и искусственный интеллект.
Разработка приложения
Общая блок-схема программы
Описание программы
Внешний вид рабочей программы
Необходимые переменные, процедуры и
функции
Описание объектов, используемых в
приложении
Листинг программного кода
Заключение
Введение
Описание правил игры «Морской бой».
На игровой площадке размером 10 на 10 клеток
Игрок расставляет один корабль размером четыре клетки, два корабля размером три
клетки, три корабля размером две клетки и четыре корабля размером в одну клетку
(для облегчения корабли расставляются автоматически). При этом корабль
представляет собой последовательность соседних клеток, стоящих на одной
вертикали или на одной горизонтали. Соседние корабли не должны иметь общих
точек. Противником Игрока является Комп (Компьютер), который автоматически
расставляет корабли на своем поле по указанным выше правилам.
После расстановки начинается бой. Он
представляет собой поочередные выстрелы Игрока и Компа. При попадании в корабль
противника участник боя получает возможность проведения внеочередного выстрела.
Игра заканчивается при уничтожении одним из участников всех кораблей
противника.
Постановка задачи.
В данном проекте необходимо реализовать
известную игру «Морской бой». Наиболее важные алгоритмы этой игры: алгоритмы
расстановки кораблей по полю, выбора направления удара Компа в поле Игрока и
непосредственно нанесение удара им.
I.
Теоретическая часть
Игры и искусственный интеллект
Человек наделен интеллектом. А компьютер? Сейчас
много говорят о так называемом искусственном интеллекте. У компьютера это,
прежде всего память. Его оперативная память (предназначенная для быстрого
использования) позволяет записывать слова и получать информацию за
микросекунды.
Компьютер обладает большими возможностями по
логической обработке информации, его логический инструментарий весьма обширен и
непрерывно совершенствуется. В программы компьютера могут быть заложены
эвристические приемы, выработанные людьми при различных видах деятельности.
Например, при построении программ для игры в шахматы используется опыт лучших
шахматистов мира.
Конечно, люди имеют неоспоримые интеллектуальные
преимущества перед компьютерами, но ведь компьютеры - это порождение
высокоразвитого человеческого интеллекта, следовательно, взаимодействуя с ними,
человек сталкивается по существу с модифицированным человеческим интеллектом.
И все же самое слабое место компьютера - его
интеллект. Сейчас происходит необычно быстрое расширение сфер применения
машинного интеллекта, но движение вглубь, в направлении совершенствования его
механизмов идет медленно.
Следует отметить еще одну особенность
современных компьютеров - возможность их связи между собой и создание на этой
основе вычислительных систем и сетей. С помощью локальных сетей объединяют
компьютеры одного здания или предприятия. Телефонные сети и спутники позволяют
создать глобальные вычислительные сети.
Большое применение находят оптические волоконные
каналы связи. Через каналы связи компьютеры обмениваются программами и данными,
происходит информационное объединение ресурсов. Таким образом, компьютер
становится терминалом вычислительной системы, и когда человек имеет с ним дело,
то он сталкивается с распределенным в пространстве и во времени машинным
интеллектом.
Человек использует компьютер либо в качестве
партнера в игре, либо в качестве посредника при играх с другими людьми. А можно
ли компьютер рассматривать как партнера? Ведь он не обладает эмоциями,
чувствами, у него нет души и сердца. Конечно, разница между человеком и
компьютером громадная, но человек передал компьютеру часть своего интеллекта,
опыта, знаний, навыков с соответствующей эмоциональной окраской. Недаром
говорят о дружественном программном обеспечении. А вместе с интеллектом человек
передал компьютеру и часть своего тепла, свое умение любить и ненавидеть, свое
отношение к окружающему миру и другим людям.
Компьютерные игры появились вместе с первыми
компьютерами. По мере совершенствования машин совершенствовались и игры.
Компьютерные игры заняли важное место в программном обеспечении ЭВМ. В
производственной сфере они используются для обучения, психологической разгрузки
персонала.
Компьютерные игры реального времени на
персональной ЭВМ для одного играющего без применения специального оборудования
(«мышек», «джойстиков» и др.) можно рассматривать как определенную задачу - в
ней имеются условия, цель и средства ее достижения. Решение задачи - процесс,
управляемый играющим в реальном времени по определенным правилам. Течение
процесса оценивается по установленному критерию.
В компьютерной игре можно выделить три
компонента: игровую среду, взаимодействие с играющим и оценку игровой ситуации.
Игровая среда
- совокупность объектов, связей в игре и правил их изменения. Так, в шахматах
игровая среда представляет совокупность доски, двух наборов фигур, правил
перемещения фигур по доске и правил их взятия или превращения.
Взаимодействие с играющим
- совокупность средств, предоставляемых играющему для изменения игровой среды.
Чаще всего это клавиатура персонального компьютера. При имитации автомобильных
гонок водитель изменяет направление и скорость движения по трассе, при этом
большое значение имеет быстрота реакции на перемену декораций, изменение
трассы, появление препятствий (на трассе могут быть повороты разной крутизны,
камни, стекла, лужи, машину может занести, она может потерпеть аварию).
Оценка игровой ситуации
- соотношения и условия, которые определяют цель поведения играющего. Сюда
включается система очков и штрафов за игровые действия, описание начальной и конечной
ситуации.
После разработки сюжета, описания игровой среды,
выбора способов взаимодействия с играющим и системы критериев оценки поведения
играющего начинается этап создания компьютерной программы. Игровая программа
чаще всего состоит из двух частей: первая реализует внутреннюю, логическую
структуру компьютерной игры, т. е. отображает игру в системе машинных данных и
алгоритмов, вторая - отображает процесс игры на терминале (эта часть связана с
эстетическими и эргономическими аспектами, поэтому ей придается особое
значение, ведь игра должна приносить играющему удовольствие). В компьютерных
играх используется небольшое количество сюжетов, чаще всего это модификации
обычных, традиционных игр и жизненных ситуаций, но формы их реализации огромны.
Программирование изобразительной стороны игры
более трудоемко, чем логической. Основу игровой программы составляет ее
логическая структура, в которой выделяют три иерархических уровня (плана) -
оперативный, тактический и стратегический.
Оперативный план
- совокупность действий внутри программы между двумя возможными действиями
играющего.
Тактический план
- совокупность игровых действий, ведущих к достижению какой-либо локальной
цели.
Стратегический план
- план всей игры, которая должна строиться так, чтобы достичь цели и добиться
выигрыша (при автомобильных гонках не потерпеть аварии, быстро прийти к финишу,
уменьшить затраты на восстановительный ремонт машины). Достижение
стратегических целей - дело не простое. Лишь многократное участие в игре,
постижение всех ее особенностей, быстрота реакции, предвидение позволяют
добиваться хороших результатов.
II.
Разработка приложения
Общая блок-схема программы
P1Left
и P2Left
- количество неубитых палуб кораблей полей 1 и 2 соответственно.
Блок-схемы алгоритмов.
Описание программы
Программа «Морской бой» состоит из трех форм и
одного модуля, в котором находятся все основные процедуры. На основной форме
расположены объекты, при помощи которых выполняются различные события. Так с
помощью управляющих кнопок можно:
1. начать
игру (тут же автоматически расставить корабли)
2. изменить
сложность игры;
3. получить
информацию о правилах игры;
4. получить
справку об авторе.
Внешний вид рабочей программы
Необходимые переменные, процедуры и
функции
игра морской бой компьютер
Visual
Basic, как и большинство
языков программирования, использует для хранения значений переменные.
Переменная характеризуется именем - словом, используемым для ссылки на
значение, которое содержит переменная, и типом, определяющим вид данных,
который можно хранить в переменной.
В приложении использованы следующие
переменные:
S1 (9, 9) as
Byte
S2 (9, 9) as
Byte - поля 1 и 2,
содержат полную информацию о расставленных на них кораблях, прострелянных и
непрострелянных местах. Каждая клетка может содержать 4 значения: 0 - пусто и
непростреляно, 1 - неподбитая часть корабля, 2 - пусто, но простреляно, 3 -
подбитая часть корабля.
V1 (9,9) as
Byte
V2 (9,9) as
Byte - аналогично S1
(9,9) и S2 (9,9), только
содержат информацию лишь об открытых игроком либо компьютером местах.
Num - номер
текущего поля. Может быть либо 1, либо 2.
Slozhnost
- уровень Компа. Может быть от 1 до 9.
StrX, StrY
- координаты, выбранные компьютером для "удара". Могут быть от 0 до
9.
P1Left,
P2Left
- содержат количество "неубитых" сегментов кораблей для полей 1 и 2
соответственно.
ShotResult
- содержит результат последнего выстрела: «Ранен», «Убит», «Мимо», «Повторная
стрельба (было попадание) - ход засчитан» и «Повторная стрельба (мимо) - ход
засчитан». Тип переменной - String.
ShipL - содержит
длину последнего «убитого» корабля (от 1 до 4).
Moves -
количество проделанных ходов Компа.- количество проделанных ходов Игрока.
Err - индикатор
ошибки. Может быть True,
если ошибка была, либо False,
если её не было.
ErrName
- описание ошибки, если она была. Тип переменной - String.
Можно упростить программирование, разбивая
задачу на небольшие логические компоненты. В Visual
Basic используется несколько
видов процедур:
2. Процедуры
Function (возвращают
значения)
3. Процедуры
Property (могут возвращать
и присваивать значения), а также устанавливать ссылки.
В приложении использованы следующие
процедуры:
DrawSea (Num) - отображает всё поле номер Num
ViewSea (Num) - отображает открытые места поля
номер Num(Num) - скрывает поле номер Num- отключает запись об ошибке: делает
Err = False, а ErrName = ""(Num) - расставляет корабли на поле Num
случайным образом(Num) - выбирает ячейку на поле Num для "огня" по
ней. Алгоритм эффективен в зависимости от уровня игры компьютера (Slozhnost).
На выходе выдаёт переменные StrX и StrY, которые
используются в качестве X и Y для "выстрела" (Fire (Num, StrX,
StrY)), а также увеличивает переменную Moves на 1 за каждый раз.(Num, X, Y) -
производит "огонь" по ячейке с координатами X, Y на поле Num.
На выходе выдаёт переменные ShotResult и
ShipL(Num) - полностью открывает неизвестную игроку территорию поля Num(Num) -
полностью стирает данные об «открытых» местах на поле Num.- подсчитывает,
сколько "неубитых" сегментов кораблей есть на поле 1 и поле 2, и
выдаёт на выходе соответствующие переменные: P1Left и P2Left.
Описание объектов, используемых в
приложении
В приложении использованы объекты Microsoft
Visual Basic,
которые расположены на формах проекта для выполнения определенных событий,
позволяющих пользователю визуально оценить процесс работы с данными.
В данной работе расположены
следующие объекты:
· Label
(Метка)
· Picture
box
(Графическое окно)
· Image
(Изображение)
· Command
button
(Кнопка управления)
· Frame
(Рамка)
· Timer
(Таймер)
Описание используемых объектов:
Label
(Метка) - служит для размещения в форме статического текста, который не может
редактироваться пользователем.
Command
button
(Кнопка управления) - выполняет команду или действие, выбранные пользователем
Image
(Изображение) - отображает побитовые изображения, значки или метафайлы Windows,
файлы JPEG или GIF;
при нажатии ведёт себя как кнопка управления
Picture
box
(Графическое окно) - отображает побитовые изображения, значки или метафайлы Windows,
файлы JPEG или GIF.
Он также отображает текст и является визуальным контейнером для других
элементов управления
Timer
(Таймер)
- выполняет события через определённые интервалы времени
Frame
(Кадр) - используется для создания идентифицируемых групп других элементов
управления, т.е. как контейнер.
Листинг программного кода
_boi. Form
Dim Moixody As ByteSub
CmdNewgame_Click().Caption = "0".Caption = "0".Caption =
"20".Caption = "20"= 0= 0(1)(2)(1)(2)(1)(2)(1).Visible =
FalseSubSub cmdFor_autor_Click().ShowSubSub cmdExit_Click()SubSub
cmdPravila_Click()_igry.ShowSubSub CmdComp_Proff_Click()SubSub
Form_Load()SubSub P2_Click(Index As Integer)= Moixody + 1.Caption = Str(Moixody)=
Int(Index / 10)= Index - (X * 10)2, X, Y= ShotResult.Caption =
ShotResult.Caption = ShipL(2).Caption = Str(Moves)res = "Ранен"
Or res = "Убит"
Then GoTo 2
: Pl2.Enabled = False(1)0.51, StrX,
StrY= ShotResult(1).Caption = Str(Moves)res = "Ранен"
Or res = "Убит"
Then GoTo 1.Enabled = True
: CalcShipsLeft.Caption =
Str(P1Left) + " ".Caption = Str(P2Left) + " "P1Left = 0
Then If P1Left = P2Left Then MsgBox "Ничья!"
+
vbCrLf + "В следующий раз обязательно повезет!!!",, "Исход игры:
Ничья": Exit SubP2Left = 0 Then MsgBox "Игрок победил на " +
Str(Moixody) + "-м ходу!!!",, "Исход игры: Поздравления":
Exit SubP1Left = 0 Then MsgBox "Комп победил на " + Str(Moves) +
"-м ходу!!!",, "Исход игры: Поражение": Exit Sub
End SubMain()_boi.Show(1)(2)(1)(2)i
= 0 To 99
Morskoi_boi.P1(i).BorderStyle =
1_boi.P2(i).BorderStyle = 1
Next ilv As String
Do= InputBox("Задайте сложность игры
(1-9):", "Добро пожаловать!!!")
Slozhnost = Val(lv)While Slozhnost
< 1 Or Slozhnost > 9_Proff.Caption = "Уровень
Компа:
" + Str(Slozhnost)SubSub Wait(seconds) 'Замедляющая
процедура
- пауза
на
(n) секунд.Enabled
= True_boi.Timer1.Interval = 1000 * secondsMe.Timer1.Interval > 0.Enabled =
FalseSubSub Timer1_Timer().Interval = 0Sub
Procedurs_Modul. bas
Public S1(9, 9) As Byte, S2(9, 9) As
Byte, V1(9, 9) As Byte, V2(9, 9) As ByteP1Left As Integer, P2Left As IntegerErr
As Boolean, Moves As Integer, ErrName As String, ShotResult As StringShipL As
Byte, Slozhnost As Byte, StrX As Byte, StrY As ByteDrawSea(Num As Byte) ' -
отображает всё поле номер Num
'Если поле №1, то:
If
Num = 1 Then
For i = 0 To 9j = 0 To 9_boi.P1(j *
10 + i).Picture = Morskoi_boi.Sprite(S1(j, i))jiSub
If
'Если поле №2, то:
If Num = 2 Theni = 0 To 9j = 0 To
9_boi.P2(j * 10 + i).Picture = Morskoi_boi.Sprite(S2(j, i))jiSubIfSub
ViewSea(Num
As Byte)
'- отображает открытые места поля номер Num
'Если поле №1, то:
If
Num = 1 Then
For i = 0 To 9j = 0 To 9_boi.P1(j *
10 + i).Picture = Morskoi_boi.Sprite(V1(j, i))jiSubIf
'Если
поле
№2, то:Num
= 2 Theni = 0 To 9j = 0 To 9_boi.P2(j * 10 + i).Picture =
Morskoi_boi.Sprite(V2(j, i))jiSubIfSubHideSea(Num As Byte) ' - скрывает поле
номер Num
'Если поле №1, то:
If
Num = 1 Then
For i = 0 To 9j = 0 To 9_boi.P1(j *
10 + i).Picture = Morskoi_boi.Sprite(0)jiSubIf
'Если поле №2, то:
If
Num = 2 Then
For i = 0 To 9j = 0 To 9_boi.P2(j *
10 + i).Picture = Morskoi_boi.Sprite(0)jiSubIf
Sub
Sub
SetShips(Num
As Byte)
' - расставляет корабли на поле Num
случайным образом
Dim S0(9, 9) As ByteSX(3) As Byte,
SY(3) As Byte
10 'Начало расстановки
For
i = 0 To
9
For j = 0 To 9(j, 1) = 0j
i
'Четверные
L = 4 'длина
GoSub 100
'Тройныеm = 1 To 2= 3 'длина100m
'Двойныеm = 1 To 3
= 2 'длина
GoSub 100
Next
m
'Одинарные
For m = 1 To 4= 1 'длина100
m
GoTo 99
Exit
Sub
'Расстановка кораблей
Err = False= 100
= tries - 1tries < 0 Then Err =
True: GoTo 10= Int(Rnd * 10)= Int(Rnd * 10)X = 10 Or Y = 10 Then GoTo 100=
Int(Rnd * 2000)= Int(v / 1000)i = 1 To L(i - 1) = X(i - 1) = Yv = 0 Then X = X
+ 1 Else Y = Y + 1ii = 1 To L= SX(i - 1)= SY(i - 1)X > 9 Or Y > 9 Then
GoTo 101j = -1 To 1k = -1 To 1= X + jX1 > 9 Or X1 < 0 Then GoTo 102= Y +
kY1 > 9 Or Y1 < 0 Then GoTo 102S0(X1, Y1) <> 0 Then GoTo 101
Next kjii = 1 To L= SX(i - 1)= SY(i
- 1)(X, Y) = 1i
X = XPos
Y = YPos
'Тест
поля
1Num = 1 ThenS1(X, Y) = 0 Then S1(X, Y) = 2: V1(X, Y) = 2: ShotResult =
"Мимо": Exit SubS1(X, Y) = 1 Then S1(X, Y) = 3: V1(X, Y) = 3: GoSub
100: Exit SubS1(X, Y) = 2 Then ShotResult = "Повторная стрельба (мимо) -
ход засчитан": Exit Sub S1(X,
Y) = 3 Then
ShotResult = "Повторная
стрельба (было попадание) - ход засчитан": Exit
Sub
End IfS2(X, Y) = 0 Then S2(X, Y) =
2: V2(X, Y) = 2: ShotResult = "Мимо": Exit SubS2(X, Y) = 1 Then S2(X,
Y) = 3: V2(X, Y) = 3: GoSub 100: Exit SubS2(X, Y) = 2 Then ShotResult =
"Повторная стрельба (мимо) - ход засчитан": Exit Sub
S2(X,
Y) = 3 Then
ShotResult = "Повторная
стрельба (было попадание) - ход засчитан": Exit
Sub
Exit
Sub
'Тест: ранен или убит
c = 0CX(16) As Byte, CY(16) As Byte
'Внизi = X To X + 3i > 9 Then
GoTo 101Num = 1 ThenS1(i, Y) = 1 Then GoTo 110S1(i, Y) = 0 Or S1(i, Y) = 2 Then
GoTo 101S1(i, Y) = 3 Then CX(c) = i: CY(c) = Y: c = c + 1IfNum = 2 ThenS2(i, Y)
= 1 Then GoTo 110S2(i, Y) = 0 Or S2(i, Y) = 2 Then GoTo 101S2(i, Y) = 3 Then
CX(c) = i: CY(c) = Y: c = c + 1Ifi
'Вверхi = X To X - 3 Step -1i < 0
Then GoTo 102Num = 1 ThenS1(i, Y) = 1 Then GoTo 110S1(i, Y) = 0 Or S1(i, Y) = 2
Then GoTo 102S1(i, Y) = 3 Then CX(c) = i: CY(c) = Y: c = c + 1IfNum = 2
ThenS2(i, Y) = 1 Then GoTo 110S2(i, Y) = 0 Or S2(i, Y) = 2 Then GoTo 102S2(i,
Y) = 3 Then CX(c) = i: CY(c) = Y: c = c + 1Ifi
'Влевоi = Y To Y - 3 Step -1i < 0
Then GoTo 103Num = 1 ThenS1(X, i) = 1 Then GoTo 110S1(X, i) = 0 Or S1(X, i) = 2
Then GoTo 103S1(X, i) = 3 Then CX(c) = X: CY(c) = i: c = c + 1IfNum = 2
ThenS2(X, i) = 1 Then GoTo 110S2(X, i) = 0 Or S2(X, i) = 2 Then GoTo 103S2(X,
i) = 3 Then CX(c) = X: CY(c) = i: c = c + 1Ifi
'Вправоi = Y To Y + 3i > 9 Then
GoTo 104Num = 1 ThenS1(X, i) = 1 Then GoTo 110S1(X, i) = 0 Or S1(X, i) = 2 Then
GoTo 104S1(X, i) = 3 Then CX(c) = X: CY(c) = i: c = c + 1IfNum = 2 ThenS2(X, i)
= 1 Then GoTo 110S2(X, i) = 0 Or S2(X, i) = 2 Then GoTo 104S2(X, i) = 3 Then
CX(c) = X: CY(c) = i: c = c + 1Ifi
' Убит= 0x0(10), y0(10)=
"Убит" i
= 0 To
c - 1
'подсчитываем, какой был убит
X1 = CX(i)= CY(i)L = 0 To mx0(L) =
X1 Then If y0(L) = Y1 Then GoTo 106L(m) = X1(m) = Y1= m + 1
For j = -1 To 1k = -1 To 1= CX(i) +
kX1 < 0 Or X1 > 9 Then GoTo 105= CY(i) + jY1 < 0 Or Y1 > 9 Then
GoTo 105Num = 1 Then If S1(X1, Y1) = 0 Then S1(X1, Y1) = 2: V1(X1, Y1) = 2Num =
2 Then If S2(X1, Y1) = 0 Then S2(X1, Y1) = 2: V2(X1, Y1) = 2
Next kjii = 0 To mx0(i) = XPos Then
If y0(i) = YPos Then GoTo 107i= m + 1
ShipL = Str(m)
'Ранен=
"Ранен"SubOpenVSea(Num As Byte)Num = 1 Theni = 0 To 9j = 0 To 9(j, i)
= S1(j, i)jiSubIfi = 0 To 9j = 0 To 9(j, i) = S2(j, i)jiSubSub
Strike(Num
As Byte)
'- Выбирает ячейку на поле Num
для "огня" по ней.
'На выходе выдаёт переменные StrX
и StrY, которые
используются
'в качестве X
и Y для
"выстрела" (Fire
(Num, StrX,
StrY)), а
'также увеличивает переменную Moves
на 1 за каждый раз.
500 If Num < 1 Or Num > 2 Then
GoTo 99
'Делаем виртуальный оттиск текущего открытого
поля, дальше работаем с ним
Dim S0(9, 9) As ByteNum = 1 Theni =
0 To 9:j = 0 To 9:
S0(i, j) = V1(i, j):j:
Next iIfNum = 2 Theni = 0 To 9:j = 0
To 9:
S0(i, j) = V2(i, j):j:
Next
i
End
If
'Проверяем, есть ли повреждённые
cnt = 0i = 0 To 9j = 0 To 9S0(j, i)
< 2 Then cnt = cnt + 1jicnt = 0 Then Err = True: ErrName = "Ни одного
простреленного поля": Exit Subi = 0 To 9j = 0 To 9S0(j, i) = 3 Then X = j:
Y = i: GoSub 120ji
'Если нет:110
'Сложность (если уровень > 3) :)
If
Slozhnost > 3 Then
If Slozhnost = 4 Then skv = 150: If
Moves < 30 Then GoTo 100Slozhnost = 5 Then skv = 300: If Moves < 15 Then
GoTo 100Slozhnost = 6 Then skv = 500: If Moves < 10 Then GoTo 100Slozhnost =
7 Then skv = 600: If Moves < 5 Then GoTo 100Slozhnost = 8 Then skv =
700Slozhnost = 9 Then skv = 850v = Int(Rnd * 1000)v = Int(v / skv)v <> 1
Then GoTo 100i = 1 To 50110Num = 1 Then If S1(X, Y) = 1 Then GoTo 100Num = 2
Then If S2(X, Y) = 1 Then GoTo 100 i
End
If
'Пробуем стрелять рядом с уже простреленными
местами (если уровень > 0)
If Slozhnost > 0 Theni = 0 To
(Slozhnost * 2)110X > 0 Then If Y > 0 Then If S0(X - 1, Y - 1) = 1 Then
GoTo 100X > 0 Then If Y > 0 Then If S0(X - 1, Y - 1) = 3 Then GoTo 100X
< 9 Then If Y < 9 Then If S0(X + 1, Y + 1) = 1 Then GoTo 100X < 9 Then
If Y < 9 Then If S0(X + 1, Y + 1) = 3 Then GoTo 100X > 0 Then If Y < 9
Then If S0(X - 1, Y + 1) = 1 Then GoTo 100X > 0 Then If Y < 9 Then If
S0(X - 1, Y + 1) = 3 Then GoTo 100X < 9 Then If Y > 0 Then If S0(X + 1, Y
- 1) = 1 Then GoTo 100X < 9 Then If Y > 0 Then If S0(X + 1, Y - 1) = 3
Then GoTo 100 i
End
If
'Стреляем по координате
If S0(X, Y) > 1 Then GoTo 500=
Moves + 1= X= Y Sub
'Случайным образом выбираем координаты для
выстрела
Randomize= Int(Rnd * 10)= Int(Rnd *
10)
'Проверяем, стреляли ли мы уже туда
If S0(X, Y) = 2 Or S0(X, Y) = 4 Then
GoTo 110
'Проверяем смежные с повреждённым сектором места
m = 0mx(4) As Byte, my(4) As Byte= 0
'ВверхX > 0 Then= X - 1= YS0(X1,
Y1) = 3 Then conf = 1conf <> 2 Then If S0(X1, Y1) = 0 Or S0(X1, Y1) = 1
Then m = m + 1: mx(m) = X1: my(m) = Y1If
'ВнизX < 9 Then= X + 1= YS0(X1,
Y1) = 3 Then conf = 1conf <> 2 Then If S0(X1, Y1) = 0 Or S0(X1, Y1) = 1
Then m = m + 1: mx(m) = X1: my(m) = Y1If
'ВлевоY > 0
Then= X= Y - 1S0(X1, Y1) = 3 Then conf = 2conf <> 1 Then If S0(X1, Y1) =
0 Or S0(X1, Y1) = 1 Then m = m + 1: mx(m) = X1: my(m) = Y1If
'ВправоY < 9 Then= X= Y + 1S0(X1,
Y1) = 3 Then conf = 2conf <> 1 Then If S0(X1, Y1) = 0 Or S0(X1, Y1) = 1
Then m = m + 1: mx(m) = X1: my(m) = Y1If
'Определение точкиm < 1 Then GoTo
130conf <> 0 Then If m < 1 Then GoTo 130= Int(Rnd * 100)= 0k = 1 To m=
n + 1n > m Then n = 1kconf = 2 Then If mx(n) <> X Then GoTo 130conf =
1 Then If my(n) <> Y Then GoTo 130
X = mx(n)= my(n)100
130 Return
'Ошибка
Err = True
ErrName
= "Неправильный НОМЕР (должно быть 1 или 2)"
End
Sub
Sub
CalcShipsLeft() - Подсчитывает,
сколько "неубитых" сегментов кораблей есть на поле 1 и поле 2, и
выдаёт на выходе соответствующие переменные: P1Left
и P2Left.
P1Left = 0Left = 0i = 0 To 9j = 0 To
9S1(j, i) = 1 Then P1Left = P1Left + 1S2(j, i) = 1 Then P2Left = P2Left +
1jiSub ClearSea(Num
As Byte)
'- Полностью стирает данные об "открытых" местах на поле Num.
For i = 0 To 9j = 0 To 9Num = 1 Then
V1(j, i) = 0Num = 2 Then V2(j, i) = 0jiSubSub
Заключение
В данном курсовом проекте была рассмотрена
теория и практика создания компьютерных игр в целом на примере игры «Морской
бой».
Проведя практическую работу по осуществлению
проекта, была исследована теория создания компьютерных игр
Используя среду программирования Visual
Basic 6.0. разработано Windows-приложение
компьютерной игры «Морской бой», которое является законченной программой и
может использоваться для игры.
В работе был дан теоретический обзор исследуемой
задачи; разработана блок-схема алгоритма; описана программа; продемонстрирован
внешний вид программы.