русс | укр

Языки программирования

ПаскальСиАссемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование

Все о программировании


Linux Unix Алгоритмические языки Аналоговые и гибридные вычислительные устройства Архитектура микроконтроллеров Введение в разработку распределенных информационных систем Введение в численные методы Дискретная математика Информационное обслуживание пользователей Информация и моделирование в управлении производством Компьютерная графика Математическое и компьютерное моделирование Моделирование Нейрокомпьютеры Проектирование программ диагностики компьютерных систем и сетей Проектирование системных программ Системы счисления Теория статистики Теория оптимизации Уроки AutoCAD 3D Уроки базы данных Access Уроки Orcad Цифровые автоматы Шпаргалки по компьютеру Шпаргалки по программированию Экспертные системы Элементы теории информации

Использование массивов при программировании игр


Дата добавления: 2015-06-12; просмотров: 1315; Нарушение авторских прав


 

Какая польза от массивов при программировании игр? Вряд ли хоть одну «умную» игру можно запрограммировать без применения массивов. Возьмем хотя бы «крестики-нолики» на поле размером 3 на 3. Вам придется рисовать на экране большие клетки, а в них – нолики (кружочки) после ваших ходов и крестики (пересекающиеся косые линии) после ходов компьютера. Но этого недостаточно. Чтобы компьютер не поставил случайно крестик в занятом поле, он должен хотя бы знать, в каких клетках крестики и нолики уже стоят. Анализировать для этого информацию о пикселах экрана очень неудобно. Гораздо разумнее заранее организовать Dim a (1 To 3, 1 To 3) As Integer и записывать туда в нужные места нолики после ходов человека и, скажем, единички после ходов компьютера. Сразу же после записи в массив 0 или 1 программа должна рисовать в соответствующем месте экрана кружок или крестик. Мыслить компьютер мог бы при помощи примерно таких операторов – if a(1,1)=0 And a(1,2)=0 Then a(1,3)=1. Это очевидный защитный ход компьютера - на два кружочка в ряду он ставит в тот же ряд крестик.

 

Проиллюстрируем эту идею подробнее на специально придуманном примитивном примере (типа морского боя).

Задание на создание игры: Играют друг против друга два человека на квадратном поле размером 2 на 2:

 
 

 

Компьютер в игре участвует только как судья. Сначала первый игрок тайком от второго сообщает компьютеру, в каких двух клетках находятся его одноклеточные корабли (например, в правой верхней и правой нижней). Затем второй производит два выстрела (наугад – например, в левую верхнюю и правую нижнюю клетки). Если подбиты оба корабля - он выиграл, если один - ничья, если ни одного - проиграл.

Сначала запрограммируем эту игру без графики.

Поле боя после двух выстрелов будет показано на экране в следующем виде:



М к

О х

Здесь я использовал такие обозначения:

о - корабля здесь нет и сюда не стреляли

к - неподбитый корабль

х - подбитый корабль

м - мимо (стреляли и промахнулись)

Других вариантов быть не может. До окончания игры поле на экране не показывается.

Вот программа:

Dim a(1 To 2, 1 To 2) As String * 1 'Поле боя

Dim i As Integer

Dim j As Integer

Dim Подбито As Integer

______________________________________________________________________

Private Sub Command1_Click() 'Главная процедура

a(1, 1) = "о": a(2, 1) = "о" 'Поначалу на поле боя кораблей нет

a(1, 2) = "о": a(2, 2) = "о"

 

Устанавливаем_корабль 1

Устанавливаем_корабль 2

 

Подбито = 0 'Пока не стреляли

Выстрел 1

Выстрел 2

'Показываем поле боя после битвы:

For i = 1 To 2

For j = 1 To 2

Debug.Print a(i, j);

Next j

Debug.Print

Next i

Debug.Print Подбито 'Показываем исход битвы

End Sub

______________________________________________________________________

Private Sub Устанавливаем_корабль(Номер_корабля As Integer)

i = InputBox("Первый игрок, назовите номер строки корабля " & Номер_корабля)

j = InputBox("Первый игрок, назовите номер столбца корабля " & Номер_корабля)

a(i, j) = "к"

End Sub

______________________________________________________________________

Private Sub Выстрел(Номер_выстрела As Integer)

i = InputBox("Второй игрок, назовите номер строки для выстрела " & Номер_выстрела)

j = InputBox("Второй игрок, назовите номер столбца для выстрела " & Номер_выстрела)

If a(i, j) = "к" Then 'Если попал, то

a(i, j) = "х" 'ставим крестик

Подбито = Подбито + 1 'и увеличиваем счетчик подбитых кораблей

ElseIf a(i, j) = "о" Then 'иначе если промахнулся, то

a(i, j) = "м" 'ставим м

End If

End Sub

Пояснения касательно Dim a(1 To 2, 1 To 2) As String *1 :

Конструкция String * 1 означает приказ компьютеру считать значения переменной a имеющими длину в 1 символ. Вообще-то можно было написать просто String, но так все-таки лучше, четче и экономнее. Теперь компьютер отведет в памяти под каждое значение a ровно 1 байт и не будет думать, хватит этого или не хватит.

Определение победителя оставляю вам.

 

Когда готова и работает программа без графики, можно подумать о том, как оживить ее графическими изображениями. Эффективнее всего создать единую процедуру, которая сначала оператором Cls все стирает с экрана, а затем все рисует снова согласно новым значениям массива a. Например, рисует во весь экран пустое поле из 4 клеток и тут же их заполняет: скажем, ставит маленькие кружочки туда, куда стреляли и промахнулись, красит красным клетки с подбитыми кораблями и синим - с неподбитыми. Для заполнения достаточно в написанном уже фрагменте, показывающем поле

For i = 1 To 2

For j = 1 To 2

Debug.Print a(i, j);

Next j

Debug.Print

Next i

вместо Debug.Print a(i, j) написать некий код такого примерно смысла:

If a(i, j) = "х" Then Крась_красным i j

If a(i, j) = "к" Then Крась_синим i j

If a(i, j) = "м" Then Рисуй_кружок i j

Здесь мы видим три процедуры с параметрами i и j, от значения которых зависят координаты кружочков на форме и закрашиваемых квадратов. Зависимость эту продумайте сами.

Что замечательно - в остальном программа от добавлении графики не изменится. Процедуру эту можно будет, не думая о графике, использовать всякий раз, когда мы хотим обновить поле на экране. Особенно это удобно в настоящем морском бое и настоящих крестиках-ноликах, когда поле надо обновлять после каждого хода.



<== предыдущая лекция | следующая лекция ==>
Какие бывают массивы | Массивы элементов управления


Карта сайта Карта сайта укр


Уроки php mysql Программирование

Онлайн система счисления Калькулятор онлайн обычный Инженерный калькулятор онлайн Замена русских букв на английские для вебмастеров Замена русских букв на английские

Аппаратное и программное обеспечение Графика и компьютерная сфера Интегрированная геоинформационная система Интернет Компьютер Комплектующие компьютера Лекции Методы и средства измерений неэлектрических величин Обслуживание компьютерных и периферийных устройств Операционные системы Параллельное программирование Проектирование электронных средств Периферийные устройства Полезные ресурсы для программистов Программы для программистов Статьи для программистов Cтруктура и организация данных


 


Не нашли то, что искали? Google вам в помощь!

 
 

© life-prog.ru При использовании материалов прямая ссылка на сайт обязательна.

Генерация страницы за: 0.008 сек.