Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Использование массивов при программировании игр
Какая польза от массивов при программировании игр? Вряд ли хоть одну «умную» игру можно запрограммировать без применения массивов. Возьмем хотя бы «крестики-нолики» на поле размером 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
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, от значения которых зависят координаты кружочков на форме и закрашиваемых квадратов. Зависимость эту продумайте сами. Что замечательно - в остальном программа от добавлении графики не изменится. Процедуру эту можно будет, не думая о графике, использовать всякий раз, когда мы хотим обновить поле на экране. Особенно это удобно в настоящем морском бое и настоящих крестиках-ноликах, когда поле надо обновлять после каждого хода.
|