Разработка компьютерной игры "Морской бой"

Тип работы:
Курсовая
Предмет:
Программирование


Узнать стоимость

Детальная информация о работе

Выдержка из работы

Содержание проекта

Введение

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

101

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-приложение компьютерной игры «Морской бой», которое является законченной программой и может использоваться для игры.

В работе был дан теоретический обзор исследуемой задачи; разработана блок-схема алгоритма; описана программа; продемонстрирован внешний вид программы.

ПоказатьСвернуть
Заполнить форму текущей работой