Разработка компьютерной игры «Морской бой»
Взаимодействие с играющим — совокупность средств, предоставляемых играющему для изменения игровой среды. Чаще всего это клавиатура персонального компьютера. При имитации автомобильных гонок водитель изменяет направление и скорость движения по трассе, при этом большое значение имеет быстрота реакции на перемену декораций, изменение трассы, появление препятствий (на трассе могут быть повороты… Читать ещё >
Разработка компьютерной игры «Морской бой» (реферат, курсовая, диплом, контрольная)
Содержание проекта
I. Теоретическая часть Игры и искусственный интеллект
II. Разработка приложения Общая блок-схема программы Описание программы Внешний вид рабочей программы Необходимые переменные, процедуры и функции Описание объектов, используемых в приложении Листинг программного кода Заключение
Описание правил игры «Морской бой».
На игровой площадке размером 10 на 10 клеток Игрок расставляет один корабль размером четыре клетки, два корабля размером три клетки, три корабля размером две клетки и четыре корабля размером в одну клетку (для облегчения корабли расставляются автоматически). При этом корабль представляет собой последовательность соседних клеток, стоящих на одной вертикали или на одной горизонтали. Соседние корабли не должны иметь общих точек. Противником Игрока является Комп (Компьютер), который автоматически расставляет корабли на своем поле по указанным выше правилам.
После расстановки начинается бой. Он представляет собой поочередные выстрелы Игрока и Компа. При попадании в корабль противника участник боя получает возможность проведения внеочередного выстрела. Игра заканчивается при уничтожении одним из участников всех кораблей противника.
Постановка задачи.
В данном проекте необходимо реализовать известную игру «Морской бой». Наиболее важные алгоритмы этой игры: алгоритмы расстановки кораблей по полю, выбора направления удара Компа в поле Игрока и непосредственно нанесение удара им.
I. Теоретическая часть
Игры и искусственный интеллект
Человек наделен интеллектом. А компьютер? Сейчас много говорят о так называемом искусственном интеллекте. У компьютера это, прежде всего память. Его оперативная память (предназначенная для быстрого использования) позволяет записывать слова и получать информацию за микросекунды.
Компьютер обладает большими возможностями по логической обработке информации, его логический инструментарий весьма обширен и непрерывно совершенствуется. В программы компьютера могут быть заложены эвристические приемы, выработанные людьми при различных видах деятельности. Например, при построении программ для игры в шахматы используется опыт лучших шахматистов мира.
Конечно, люди имеют неоспоримые интеллектуальные преимущества перед компьютерами, но ведь компьютеры — это порождение высокоразвитого человеческого интеллекта, следовательно, взаимодействуя с ними, человек сталкивается по существу с модифицированным человеческим интеллектом.
И все же самое слабое место компьютера — его интеллект. Сейчас происходит необычно быстрое расширение сфер применения машинного интеллекта, но движение вглубь, в направлении совершенствования его механизмов идет медленно.
Следует отметить еще одну особенность современных компьютеров — возможность их связи между собой и создание на этой основе вычислительных систем и сетей. С помощью локальных сетей объединяют компьютеры одного здания или предприятия. Телефонные сети и спутники позволяют создать глобальные вычислительные сети.
Большое применение находят оптические волоконные каналы связи. Через каналы связи компьютеры обмениваются программами и данными, происходит информационное объединение ресурсов. Таким образом, компьютер становится терминалом вычислительной системы, и когда человек имеет с ним дело, то он сталкивается с распределенным в пространстве и во времени машинным интеллектом.
Человек использует компьютер либо в качестве партнера в игре, либо в качестве посредника при играх с другими людьми. А можно ли компьютер рассматривать как партнера? Ведь он не обладает эмоциями, чувствами, у него нет души и сердца. Конечно, разница между человеком и компьютером громадная, но человек передал компьютеру часть своего интеллекта, опыта, знаний, навыков с соответствующей эмоциональной окраской. Недаром говорят о дружественном программном обеспечении. А вместе с интеллектом человек передал компьютеру и часть своего тепла, свое умение любить и ненавидеть, свое отношение к окружающему миру и другим людям.
Компьютерные игры появились вместе с первыми компьютерами. По мере совершенствования машин совершенствовались и игры. Компьютерные игры заняли важное место в программном обеспечении ЭВМ. В производственной сфере они используются для обучения, психологической разгрузки персонала.
Компьютерные игры реального времени на персональной ЭВМ для одного играющего без применения специального оборудования («мышек», «джойстиков» и др.) можно рассматривать как определенную задачу — в ней имеются условия, цель и средства ее достижения. Решение задачи — процесс, управляемый играющим в реальном времени по определенным правилам. Течение процесса оценивается по установленному критерию.
В компьютерной игре можно выделить три компонента: игровую среду, взаимодействие с играющим и оценку игровой ситуации.
Игровая среда — совокупность объектов, связей в игре и правил их изменения. Так, в шахматах игровая среда представляет совокупность доски, двух наборов фигур, правил перемещения фигур по доске и правил их взятия или превращения.
Взаимодействие с играющим — совокупность средств, предоставляемых играющему для изменения игровой среды. Чаще всего это клавиатура персонального компьютера. При имитации автомобильных гонок водитель изменяет направление и скорость движения по трассе, при этом большое значение имеет быстрота реакции на перемену декораций, изменение трассы, появление препятствий (на трассе могут быть повороты разной крутизны, камни, стекла, лужи, машину может занести, она может потерпеть аварию).
Оценка игровой ситуации — соотношения и условия, которые определяют цель поведения играющего. Сюда включается система очков и штрафов за игровые действия, описание начальной и конечной ситуации.
После разработки сюжета, описания игровой среды, выбора способов взаимодействия с играющим и системы критериев оценки поведения играющего начинается этап создания компьютерной программы. Игровая программа чаще всего состоит из двух частей: первая реализует внутреннюю, логическую структуру компьютерной игры, т. е. отображает игру в системе машинных данных и алгоритмов, вторая — отображает процесс игры на терминале (эта часть связана с эстетическими и эргономическими аспектами, поэтому ей придается особое значение, ведь игра должна приносить играющему удовольствие). В компьютерных играх используется небольшое количество сюжетов, чаще всего это модификации обычных, традиционных игр и жизненных ситуаций, но формы их реализации огромны.
Программирование изобразительной стороны игры более трудоемко, чем логической. Основу игровой программы составляет ее логическая структура, в которой выделяют три иерархических уровня (плана) — оперативный, тактический и стратегический.
Оперативный план — совокупность действий внутри программы между двумя возможными действиями играющего.
Тактический план — совокупность игровых действий, ведущих к достижению какой-либо локальной цели.
Стратегический план — план всей игры, которая должна строиться так, чтобы достичь цели и добиться выигрыша (при автомобильных гонках не потерпеть аварии, быстро прийти к финишу, уменьшить затраты на восстановительный ремонт машины). Достижение стратегических целей — дело не простое. Лишь многократное участие в игре, постижение всех ее особенностей, быстрота реакции, предвидение позволяют добиваться хороших результатов.
II. Разработка приложения
Общая блок-схема программы
P1Left и P2Left — количество неубитых палуб кораблей полей 1 и 2 соответственно.
Блок-схемы алгоритмов.
Описание программы
Программа «Морской бой» состоит из трех форм и одного модуля, в котором находятся все основные процедуры. На основной форме расположены объекты, при помощи которых выполняются различные события. Так с помощью управляющих кнопок можно:
начать игру (тут же автоматически расставить корабли) изменить сложность игры;
получить информацию о правилах игры;
получить справку об авторе.
Внешний вид рабочей программы
Необходимые переменные, процедуры и функции
игра морской бой компьютер
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 — количество проделанных ходов Компа.
Moixody — количество проделанных ходов Игрока.
Err — индикатор ошибки. Может быть True, если ошибка была, либо False, если её не было.
ErrName — описание ошибки, если она была. Тип переменной — String.
Можно упростить программирование, разбивая задачу на небольшие логические компоненты. В Visual Basic используется несколько видов процедур:
Процедуры Sub (не возвращают значения) Процедуры Function (возвращают значения) Процедуры Property (могут возвращать и присваивать значения), а также устанавливать ссылки.
В приложении использованы следующие процедуры:
DrawSea (Num) — отображает всё поле номер Num
ViewSea (Num) — отображает открытые места поля номер Num
HideSea (Num) — скрывает поле номер Num
NoErr — отключает запись об ошибке: делает Err = False, а ErrName = «»
SetShips (Num) — расставляет корабли на поле Num случайным образом
Strike (Num) — выбирает ячейку на поле Num для «огня» по ней. Алгоритм эффективен в зависимости от уровня игры компьютера (Slozhnost).
На выходе выдаёт переменные StrX и StrY, которые используются в качестве X и Y для «выстрела» (Fire (Num, StrX, StrY)), а также увеличивает переменную Moves на 1 за каждый раз.
Fire (Num, X, Y) — производит «огонь» по ячейке с координатами X, Y на поле Num.
На выходе выдаёт переменные ShotResult и ShipL
OpenVSea (Num) — полностью открывает неизвестную игроку территорию поля Num
ClearSea (Num) — полностью стирает данные об «открытых» местах на поле Num.
CalcShipsLeft — подсчитывает, сколько «неубитых» сегментов кораблей есть на поле 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 (Кадр) — используется для создания идентифицируемых групп других элементов управления, т. е. как контейнер.
Листинг программного кода
Morskoi_boi. Form
Dim Moixody As Byte
Private Sub CmdNewgame_Click ()
lblKompxody.Caption = «0»
lblMoixody.Caption = «0»
Label6.Caption = «20»
Label7.Caption = «20»
Moves = 0
Moixody = 0
SetShips (1)
SetShips (2)
DrawSea (1)
HideSea (2)
ClearSea (1)
ClearSea (2)
OpenVSea (1)
CalcShipsLeft
Picture2.Visible = False
End Sub
Private Sub cmdFor_autor_Click ()
Spravka.Show
End Sub
Private Sub cmdExit_Click ()
End
End Sub
Private Sub cmdPravila_Click ()
Pravila_igry.Show
End Sub
Private Sub CmdComp_Proff_Click ()
Main
End Sub
Private Sub Form_Load ()
Main
End Sub
Private Sub P2_Click (Index As Integer)
Moixody = Moixody + 1
lblMoixody.Caption = Str (Moixody)
X = Int (Index / 10)
Y = Index — (X * 10)
Fire 2, X, Y
res = ShotResult
Label1.Caption = ShotResult
Label2.Caption = ShipL
ViewSea (2)
lblKompxody.Caption = Str (Moves)
If res = «Ранен» Or res = «Убит» Then GoTo 2
1: Pl2. Enabled = False
Strike (1)
Wait 0.5
Fire 1, StrX, StrY
res = ShotResult
ViewSea (1)
lblKompxody.Caption = Str (Moves)
If res = «Ранен» Or res = «Убит» Then GoTo 1
Pl2.Enabled = True
2: CalcShipsLeft
Label6.Caption = Str (P1Left) + ««
Label7.Caption = Str (P2Left) + ««
If P1Left = 0 Then If P1Left = P2Left Then MsgBox «Ничья!» + vbCrLf + «В следующий раз обязательно повезет!!!», «Исход игры: Ничья»: Exit Sub
If P2Left = 0 Then MsgBox «Игрок победил на «+ Str (Moixody) + «-м ходу!!!», «Исход игры: Поздравления»: Exit Sub
If P1Left = 0 Then MsgBox «Комп победил на «+ Str (Moves) + «-м ходу!!!», «Исход игры: Поражение»: Exit Sub
End Sub
Sub Main ()
Morskoi_boi.Show
SetShips (1)
SetShips (2)
DrawSea (1)
HideSea (2)
For i = 0 To 99
Morskoi_boi.P1(i).BorderStyle = 1
Morskoi_boi.P2(i).BorderStyle = 1
Next i
Dim lv As String
Do
lv = InputBox («Задайте сложность игры (1−9):», «Добро пожаловать!!!»)
Slozhnost = Val (lv)
Loop While Slozhnost < 1 Or Slozhnost > 9
CmdComp_Proff.Caption = «Уровень Компа: «+ Str (Slozhnost)
End Sub
Public Sub Wait (seconds) 'Замедляющая процедура — пауза на (n) секунд
Timer1.Enabled = True
Morskoi_boi.Timer1.Interval = 1000 * seconds
While Me. Timer1.Interval > 0
DoEvents
Wend
Timer1.Enabled = False
End Sub
Private Sub Timer1_Timer ()
Timer1.Interval = 0
End Sub
Procedurs_Modul. bas
Public S1(9, 9) As Byte, S2(9, 9) As Byte, V1(9, 9) As Byte, V2(9, 9) As Byte
Public P1Left As Integer, P2Left As Integer
Public Err As Boolean, Moves As Integer, ErrName As String, ShotResult As String
Public ShipL As Byte, Slozhnost As Byte, StrX As Byte, StrY As Byte
Sub DrawSea (Num As Byte) ' - отображает всё поле номер Num
'Если поле № 1, то:
If Num = 1 Then
For i = 0 To 9
For j = 0 To 9
Morskoi_boi.P1(j * 10 + i).Picture = Morskoi_boi.Sprite (S1(j, i))
Next j
Next i
Exit Sub
End If
'Если поле № 2, то:
If Num = 2 Then
For i = 0 To 9
For j = 0 To 9
Morskoi_boi.P2(j * 10 + i).Picture = Morskoi_boi.Sprite (S2(j, i))
Next j
Next i
Exit Sub
End If
End Sub
Sub ViewSea (Num As Byte) '- отображает открытые места поля номер Num
'Если поле № 1, то:
If Num = 1 Then
For i = 0 To 9
For j = 0 To 9
Morskoi_boi.P1(j * 10 + i).Picture = Morskoi_boi.Sprite (V1(j, i))
Next j
Next i
Exit Sub
End If
'Если поле № 2, то:
If Num = 2 Then
For i = 0 To 9
For j = 0 To 9
Morskoi_boi.P2(j * 10 + i).Picture = Morskoi_boi.Sprite (V2(j, i))
Next j
Next i
Exit Sub
End If
End Sub
Sub HideSea (Num As Byte) ' - скрывает поле номер Num
'Если поле № 1, то:
If Num = 1 Then
For i = 0 To 9
For j = 0 To 9
Morskoi_boi.P1(j * 10 + i).Picture = Morskoi_boi.Sprite (0)
Next j
Next i
Exit Sub
End If
'Если поле № 2, то:
If Num = 2 Then
For i = 0 To 9
For j = 0 To 9
Morskoi_boi.P2(j * 10 + i).Picture = Morskoi_boi.Sprite (0)
Next j
Next i
Exit Sub
End If
End Sub
Sub SetShips (Num As Byte) ' - расставляет корабли на поле Num случайным образом
Dim S0(9, 9) As Byte
Dim SX (3) As Byte, SY (3) As Byte
10 'Начало расстановки
For i = 0 To 9
For j = 0 To 9
S0(j, 1) = 0
Next j
Next i
'Четверные
L = 4 'длина
GoSub 100
'Тройные
For m = 1 To 2
L = 3 'длина
GoSub 100
Next m
'Двойные
For m = 1 To 3
L = 2 'длина
GoSub 100
Next m
'Одинарные
For m = 1 To 4
L = 1 'длина
GoSub 100
Next m
GoTo 99
Exit Sub
100 'Расстановка кораблей
Err = False
tries = 100
tries = tries — 1
If tries < 0 Then Err = True: GoTo 10
Randomize
X = Int (Rnd * 10)
Y = Int (Rnd * 10)
If X = 10 Or Y = 10 Then GoTo 100
v = Int (Rnd * 2000)
v = Int (v / 1000)
For i = 1 To L
SX (i — 1) = X
SY (i — 1) = Y
If v = 0 Then X = X + 1 Else Y = Y + 1
Next i
For i = 1 To L
X = SX (i — 1)
Y = SY (i — 1)
If X > 9 Or Y > 9 Then GoTo 101
For j = -1 To 1
For k = -1 To 1
X1 = X + j
If X1 > 9 Or X1 < 0 Then GoTo 102
Y1 = Y + k
If Y1 > 9 Or Y1 < 0 Then GoTo 102
If S0(X1, Y1) <> 0 Then GoTo 101
102 Next k
Next j
Next i
For i = 1 To L
X = SX (i — 1)
Y = SY (i — 1)
S0(X, Y) = 1
Next i
Return
99 For i = 0 To 9
For j = 0 To 9
If Num = 1 Then S1(j, i) = S0(j, i) Else S2(j, i) = S0(j, i)
Next j
Next i
End Sub
Sub Fire (Num, XPos, YPos) '- производит «огонь» по ячейке с координатами X, Y на поле Num. На выходе выдаёт переменные ShotResult и ShipL
X = XPos
Y = YPos
'Тест поля 1
If Num = 1 Then
If S1(X, Y) = 0 Then S1(X, Y) = 2: V1(X, Y) = 2: ShotResult = «Мимо»: Exit Sub
If S1(X, Y) = 1 Then S1(X, Y) = 3: V1(X, Y) = 3: GoSub 100: Exit Sub
If S1(X, Y) = 2 Then ShotResult = «Повторная стрельба (мимо) — ход засчитан»: Exit Sub
If S1(X, Y) = 3 Then ShotResult = «Повторная стрельба (было попадание) — ход засчитан»: Exit Sub
End If
If S2(X, Y) = 0 Then S2(X, Y) = 2: V2(X, Y) = 2: ShotResult = «Мимо»: Exit Sub
If S2(X, Y) = 1 Then S2(X, Y) = 3: V2(X, Y) = 3: GoSub 100: Exit Sub
If S2(X, Y) = 2 Then ShotResult = «Повторная стрельба (мимо) — ход засчитан»: Exit Sub
If S2(X, Y) = 3 Then ShotResult = «Повторная стрельба (было попадание) — ход засчитан»: Exit Sub
Exit Sub
100 'Тест: ранен или убит
c = 0
Dim CX (16) As Byte, CY (16) As Byte
'Вниз
For i = X To X + 3
If i > 9 Then GoTo 101
If Num = 1 Then
If S1(i, Y) = 1 Then GoTo 110
If S1(i, Y) = 0 Or S1(i, Y) = 2 Then GoTo 101
If S1(i, Y) = 3 Then CX© = i: CY© = Y: c = c + 1
End If
If Num = 2 Then
If S2(i, Y) = 1 Then GoTo 110
If S2(i, Y) = 0 Or S2(i, Y) = 2 Then GoTo 101
If S2(i, Y) = 3 Then CX© = i: CY© = Y: c = c + 1
End If
Next i
101 'Вверх
For i = X To X — 3 Step -1
If i < 0 Then GoTo 102
If Num = 1 Then
If S1(i, Y) = 1 Then GoTo 110
If S1(i, Y) = 0 Or S1(i, Y) = 2 Then GoTo 102
If S1(i, Y) = 3 Then CX© = i: CY© = Y: c = c + 1
End If
If Num = 2 Then
If S2(i, Y) = 1 Then GoTo 110
If S2(i, Y) = 0 Or S2(i, Y) = 2 Then GoTo 102
If S2(i, Y) = 3 Then CX© = i: CY© = Y: c = c + 1
End If
Next i
102 'Влево
For i = Y To Y — 3 Step -1
If i < 0 Then GoTo 103
If Num = 1 Then
If S1(X, i) = 1 Then GoTo 110
If S1(X, i) = 0 Or S1(X, i) = 2 Then GoTo 103
If S1(X, i) = 3 Then CX© = X: CY© = i: c = c + 1
End If
If Num = 2 Then
If S2(X, i) = 1 Then GoTo 110
If S2(X, i) = 0 Or S2(X, i) = 2 Then GoTo 103
If S2(X, i) = 3 Then CX© = X: CY© = i: c = c + 1
End If
Next i
103 'Вправо
For i = Y To Y + 3
If i > 9 Then GoTo 104
If Num = 1 Then
If S1(X, i) = 1 Then GoTo 110
If S1(X, i) = 0 Or S1(X, i) = 2 Then GoTo 104
If S1(X, i) = 3 Then CX© = X: CY© = i: c = c + 1
End If
If Num = 2 Then
If S2(X, i) = 1 Then GoTo 110
If S2(X, i) = 0 Or S2(X, i) = 2 Then GoTo 104
If S2(X, i) = 3 Then CX© = X: CY© = i: c = c + 1
End If
Next i
104 ' Убит
m = 0
Dim x0(10), y0(10)
ShotResult = «Убит»
For i = 0 To c — 1
'подсчитываем, какой был убит
X1 = CX (i)
Y1 = CY (i)
For L = 0 To m
If x0(L) = X1 Then If y0(L) = Y1 Then GoTo 106
Next L
x0(m) = X1
y0(m) = Y1
m = m + 1
106 For j = -1 To 1
For k = -1 To 1
X1 = CX (i) + k
If X1 < 0 Or X1 > 9 Then GoTo 105
Y1 = CY (i) + j
If Y1 < 0 Or Y1 > 9 Then GoTo 105
If Num = 1 Then If S1(X1, Y1) = 0 Then S1(X1, Y1) = 2: V1(X1, Y1) = 2
If Num = 2 Then If S2(X1, Y1) = 0 Then S2(X1, Y1) = 2: V2(X1, Y1) = 2
105 Next k
Next j
Next i
For i = 0 To m
If x0(i) = XPos Then If y0(i) = YPos Then GoTo 107
Next i
m = m + 1
107 ShipL = Str (m)
Return
110 'Ранен
ShotResult = «Ранен»
Return
End Sub
Sub OpenVSea (Num As Byte)
If Num = 1 Then
For i = 0 To 9
For j = 0 To 9
V1(j, i) = S1(j, i)
Next j
Next i
Exit Sub
End If
For i = 0 To 9
For j = 0 To 9
V2(j, i) = S2(j, i)
Next j
Next i
Exit Sub
End Sub
Sub 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 Byte
If Num = 1 Then
For i = 0 To 9:
For j = 0 To 9:
S0(i, j) = V1(i, j):
Next j:
Next i
End If
If Num = 2 Then
For i = 0 To 9:
For j = 0 To 9:
S0(i, j) = V2(i, j):
Next j:
Next i
End If
'Проверяем, есть ли повреждённые
cnt = 0
For i = 0 To 9
For j = 0 To 9
If S0(j, i) < 2 Then cnt = cnt + 1
Next j
Next i
If cnt = 0 Then Err = True: ErrName = «Ни одного простреленного поля»: Exit Sub
For i = 0 To 9
For j = 0 To 9
If S0(j, i) = 3 Then X = j: Y = i: GoSub 120
Next j
Next i
'Если нет:
GoSub 110
'Сложность (если уровень > 3) :)
If Slozhnost > 3 Then
If Slozhnost = 4 Then skv = 150: If Moves < 30 Then GoTo 100
If Slozhnost = 5 Then skv = 300: If Moves < 15 Then GoTo 100
If Slozhnost = 6 Then skv = 500: If Moves < 10 Then GoTo 100
If Slozhnost = 7 Then skv = 600: If Moves < 5 Then GoTo 100
If Slozhnost = 8 Then skv = 700
If Slozhnost = 9 Then skv = 850
Let v = Int (Rnd * 1000)
Let v = Int (v / skv)
If v <> 1 Then GoTo 100
For i = 1 To 50
GoSub 110
If Num = 1 Then If S1(X, Y) = 1 Then GoTo 100
If Num = 2 Then If S2(X, Y) = 1 Then GoTo 100
Next i
End If
'Пробуем стрелять рядом с уже простреленными местами (если уровень > 0)
If Slozhnost > 0 Then
For i = 0 To (Slozhnost * 2)
GoSub 110
If X > 0 Then If Y > 0 Then If S0(X — 1, Y — 1) = 1 Then GoTo 100
If X > 0 Then If Y > 0 Then If S0(X — 1, Y — 1) = 3 Then GoTo 100
If X < 9 Then If Y < 9 Then If S0(X + 1, Y + 1) = 1 Then GoTo 100
If X < 9 Then If Y < 9 Then If S0(X + 1, Y + 1) = 3 Then GoTo 100
If X > 0 Then If Y < 9 Then If S0(X — 1, Y + 1) = 1 Then GoTo 100
If X > 0 Then If Y < 9 Then If S0(X — 1, Y + 1) = 3 Then GoTo 100
If X < 9 Then If Y > 0 Then If S0(X + 1, Y — 1) = 1 Then GoTo 100
If X < 9 Then If Y > 0 Then If S0(X + 1, Y — 1) = 3 Then GoTo 100
Next i
End If
100 'Стреляем по координате
If S0(X, Y) > 1 Then GoTo 500
Moves = Moves + 1
StrX = X
StrY = Y
Exit Sub
110 'Случайным образом выбираем координаты для выстрела
Randomize
X = Int (Rnd * 10)
Y = Int (Rnd * 10)
'Проверяем, стреляли ли мы уже туда
If S0(X, Y) = 2 Or S0(X, Y) = 4 Then GoTo 110
Return
120 'Проверяем смежные с повреждённым сектором места
m = 0
Dim mx (4) As Byte, my (4) As Byte
conf = 0
'Вверх
If X > 0 Then
X1 = X — 1
Y1 = Y
If S0(X1, Y1) = 3 Then conf = 1
If conf <> 2 Then If S0(X1, Y1) = 0 Or S0(X1, Y1) = 1 Then m = m + 1: mx (m) = X1: my (m) = Y1
End If
121 'Вниз
If X < 9 Then
X1 = X + 1
Y1 = Y
If S0(X1, Y1) = 3 Then conf = 1
If conf <> 2 Then If S0(X1, Y1) = 0 Or S0(X1, Y1) = 1 Then m = m + 1: mx (m) = X1: my (m) = Y1
End If
122 'Влево
If Y > 0 Then
X1 = X
Y1 = Y — 1
If S0(X1, Y1) = 3 Then conf = 2
If conf <> 1 Then If S0(X1, Y1) = 0 Or S0(X1, Y1) = 1 Then m = m + 1: mx (m) = X1: my (m) = Y1
End If
123 'Вправо
If Y < 9 Then
X1 = X
Y1 = Y + 1
If S0(X1, Y1) = 3 Then conf = 2
If conf <> 1 Then If S0(X1, Y1) = 0 Or S0(X1, Y1) = 1 Then m = m + 1: mx (m) = X1: my (m) = Y1
End If
124 'Определение точки
If m < 1 Then GoTo 130
If conf <> 0 Then If m < 1 Then GoTo 130
v = Int (Rnd * 100)
n = 0
For k = 1 To m
n = n + 1
If n > m Then n = 1
Next k
If conf = 2 Then If mx (n) <> X Then GoTo 130
If conf = 1 Then If my (n) <> Y Then GoTo 130
X = mx (n)
Y = my (n)
GoTo 100
130 Return
99 'Ошибка
Err = True
ErrName = «Неправильный НОМЕР (должно быть 1 или 2)»
End Sub
Sub CalcShipsLeft () — Подсчитывает, сколько «неубитых» сегментов кораблей есть на поле 1 и поле 2, и выдаёт на выходе соответствующие переменные: P1Left и P2Left.
P1Left = 0
P2Left = 0
For i = 0 To 9
For j = 0 To 9
If S1(j, i) = 1 Then P1Left = P1Left + 1
If S2(j, i) = 1 Then P2Left = P2Left + 1
Next j
Next i
End Sub
Sub ClearSea (Num As Byte) '- Полностью стирает данные об «открытых» местах на поле Num.
For i = 0 To 9
For j = 0 To 9
If Num = 1 Then V1(j, i) = 0
If Num = 2 Then V2(j, i) = 0
Next j
Next i
Exit Sub
End Sub
Заключение
В данном курсовом проекте была рассмотрена теория и практика создания компьютерных игр в целом на примере игры «Морской бой».
Проведя практическую работу по осуществлению проекта, была исследована теория создания компьютерных игр Используя среду программирования Visual Basic 6.0. разработано Windows-приложение компьютерной игры «Морской бой», которое является законченной программой и может использоваться для игры.
В работе был дан теоретический обзор исследуемой задачи; разработана блок-схема алгоритма; описана программа; продемонстрирован внешний вид программы.