Программирование игры в крестики-нолики

Программирование компьютерных игр может оказаться наиболее технически сложной (и, возможно, наиболее высокооплачиваемой) работой, которую может выполнять программист. Игры высшего уровня требуют лучшего как от программистов, так и от компьютеров.

Visual Basic 6 теперь полностью игнорируется как платформа для программирования игр. (На самом деле это никогда не было. Даже в «старые добрые времена» серьезные программисты никогда не использовали бы язык высокого уровня, такой как VB 6, потому что вы просто не могли добиться высочайшей производительности, которая требуется большинству игр.) простая игра «Крестики-нолики» – отличное введение в программирование, которое немного сложнее, чем «Hello World!»

Это отличное введение для многих фундаментальных концепций программирования, поскольку он сочетает в себе методы, включая:

  • Использование массивов. Маркеры X и O хранятся в отдельных массивах, и целые массивы передаются между функциями для отслеживания хода игры.
  • Использование графики уровня VB 6: VB 6 не предлагает отличных графические возможности, но игра – хорошее введение в то, что доступно. Большая часть остальной части этой серии посвящена изучению того, как GDI +, следующее поколение графики Microsoft, заменяет графику уровня VB 6.
  • Использование математических вычислений для управления программой: программа использует умный модуль по модулю ( Mod) и вычисления целочисленного деления с использованием массивов маркеров для двух игр, чтобы определить, когда произошла «победа» из трех элементов.

Класс программирования в этой статье, возможно, только немного превышает начальный уровень, но он должен быть хорош для программистов “среднего уровня”. Но давайте начнем с элементарного уровня, чтобы проиллюстрировать некоторые концепции и начать свою карьеру в области программирования игр на Visual Basic. Даже более продвинутые ученики могут обнаружить, что получить объекты в правильной форме немного сложно.

Как играть в крестики-нолики

Если вы никогда не играли в крестики-нолики, вот правила. Два игрока поочередно расставляют крестики и крестики на игровом поле 3 x 3.

Перед началом игры оба игрока должны договориться о том, кто и кто пойдет первым. будет отмечать свои ходы каким символом. После первого хода игроки поочередно ставят свои отметки в любую пустую клетку. Цель игры – стать первым игроком с тремя отметками на горизонтальной, диагональной или вертикальной линии. Если нет пустых ячеек и ни один из игроков не имеет выигрышной комбинации, игра считается ничьей.

Запуск программы

Перед тем, как начинать собственно кодирование, всегда рекомендуется изменить имена любых используемых вами компонентов. Как только вы начнете кодировать, Visual Basic будет автоматически использовать это имя, поэтому вы хотите, чтобы это было правильное имя. Мы будем использовать имя формы frmTicTacToe , а также изменим заголовок на «О крестиках-ноликах.. “

Создав форму, используйте элемент управления Line Toolbox, чтобы нарисовать сетку 3 x 3. Щелкните инструмент линии, затем нарисуйте линию там, где вы хотите . Таким образом вам придется создать четыре линии и отрегулировать их длину и положение, чтобы они выглядели правильно. В Visual Basic также есть несколько удобных инструментов в меню «Формат», которые помогут. Это отличный шанс попрактиковаться с ними.

В дополнение к игровой сетке нам понадобятся некоторые объекты для символов X и O, которые будут размещены на сетке. Поскольку в grid, мы создадим массив объектов с девятью пробелами, которые в Visual Basic называются элементами.

Есть несколько способов сделать практически все в Visual Basic среда разработки, и создание массивов элементов управления не является исключением. Вероятно, самый простой способ – создать первую метку (щелкнуть и нарисовать, как инструмент линии), назвать ее, установить все атрибуты (например, Font и ForeColor) и затем сделайте копии с него. VB 6 спросит, хотите ли вы создать массив элементов управления. Используйте имя lblPlayGround для первой метки.

Чтобы создать другие восемь элементов сетки, выберите первый объект метки, установите для свойства Index значение ноль, и нажмите CTRL + C (копировать). Теперь вы можете нажать CTRL + V (вставить), чтобы создать еще один объект метки. Когда вы копируете такие объекты, каждая копия наследует все свойства, кроме индекса, от первой. Индекс будет увеличиваться на единицу для каждой копии. Это контрольный массив, потому что все они имеют одно и то же имя, но разные значения индекса.

Если вы создадите массив таким образом, все копии будут уложены друг на друга в левом верхнем углу формы. Перетащите каждую метку в одну из позиций игровой сетки. Убедитесь, что значения индекса в сетке расположены последовательно. От этого зависит логика программы. Объект метки со значением индекса 0 должен находиться в верхнем левом углу, а метка внизу справа должна иметь индекс 8. Если метки закрывают игровую сетку, выберите каждую метку, щелкните правой кнопкой мыши и выберите «Отправить на задний план».

Поскольку существует восемь возможных способов выиграть игру, нам понадобится восемь разных линий, чтобы показать выигрыш в игровой сетке. Вы будете использовать ту же технику для создания другого массива элементов управления. Сначала нарисуйте линию, назовите ее linWin и установите для свойства Index значение ноль. Затем, используя технику копирования и вставки, нарисуйте еще семь линий. На следующем рисунке показано, как правильно установить номера индексов.

В дополнение к объектам метки и линии вам потребуются некоторые командные кнопки для игры и многое другое. ярлыки, чтобы вести счет. Шаги по их созданию здесь не подробно описаны, но это те объекты, которые вам нужны..

Два объекта кнопки:

  • cmdNewGame
  • cmdResetScore

Объект кадра fraPlayFirst, содержащий две кнопки выбора:

  • optXPlayer
  • optOPlayer

Объект кадра fraScoreBoard, содержащий шесть меток. В программном коде изменены только lblXScore и lblOScore.

  • lblX
  • lblXScore
  • lblO
  • lblOScore
  • lblMinus
  • lblColon

Наконец, вам также понадобится объект метки lblStartMsg, чтобы «замаскировать» кнопку cmdNewGame, когда ее нельзя нажимать. Этого не видно на рисунке ниже, поскольку он занимает то же место в форме, что и командная кнопка. Возможно, вам придется временно переместить командную кнопку, чтобы нарисовать эту метку в форме.

Пока что кодирование VB не было выполнено, но мы, наконец, готовы к этому.

Инициализация

Теперь вы наконец можете приступить к кодированию программы. Если вы еще этого не сделали, вы можете загрузить исходный код, чтобы следить за объяснением работы программы.

Один из первых вариантов дизайна решения, которые необходимо принять, – это то, как отслеживать текущее «состояние» игры. Другими словами, каковы текущие «крестики» и «против» в игровой сетке и кто ходит дальше. Концепция «состояния» имеет решающее значение во многих областях программирования, в частности, в программировании ASP и ASP.NET для Интернета

Есть несколько способов сделать это, так что это важный шаг в анализе. Если вы решали эту проблему самостоятельно, вы могли бы захотеть нарисовать блок-схему и опробовать различные варианты с «черновиком», прежде чем начинать кодирование.

Переменные

В нашем решении используются два «двумерных массива», потому что это помогает отслеживать «состояние» путем простого изменения индексов массива в циклах программы. Состояние левого верхнего угла будет в элементе массива с индексом (1, 1), правый верхний угол будет в (1, 3), правый нижний угол в (3,3) и т. Д. . Это два массива:

iXPos (x, y)

и

iOPos (x, y)

Есть много разных способов это можно сделать, и последнее решение VB.NET в этой серии показывает, как это сделать с помощью всего лишь одного одномерного массива.

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

Вам также понадобится несколько глобальных переменных, как показано ниже. Обратите внимание, что они находятся в коде «Общие» и «Объявления» для формы. Это делает их переменными “уровня модуля”, на которые можно ссылаться в любом месте кода для этой формы.. Дополнительные сведения об этом см. В разделе «Общие сведения о области действия переменных» в справке по Visual Basic.

Есть две области, где переменные инициализируются в нашей программе. Во-первых, несколько переменных инициализируются во время загрузки формы frmTicTacToe.

Private Sub Form_Load ()

Во-вторых, перед каждой новой игрой все переменные, которые необходимо сбросить до начальных значений, назначаются в подпрограмме инициализации.

Sub InitPlayGround ( )

Обратите внимание, что инициализация загрузки формы также вызывает инициализацию игровой площадки.

One Одним из важнейших навыков программиста является способность использовать средства отладки, чтобы понять, что делает код. Вы можете использовать эту программу, чтобы попробовать:

  • Пошаговое выполнение кода с помощью клавиши F8.
  • Установка следите за ключевыми переменными, такими как sPlaySign или iMove
    Установка точки останова и запрос значения переменных. Например, во внутреннем цикле инициализации:

lblPlayGround ((i – 1) * 3 + j – 1) .Caption = “”

Обратите внимание, что эта программа ясно показывает, почему хорошей практикой программирования является хранение данных в массивах, когда это возможно. Если бы у вас не было массивов в этой программе, вам пришлось бы написать примерно такой код:

Line0.Visible = False
Line1. Visible = False
Line2.Visible = False
Line3.Visible = False
Line4.Visible = False
Line5.Visible = False
Line6. Visible = False
Line7.Visible = False

вместо этого:

For i = 0 To 7
linWin (i) .Visible = False
Next i

Делаем ход

Если какую-либо часть системы можно рассматривать как «сердце», то это подпрограмма lblPlayGround_Click. Эта подпрограмма вызывается каждый раз, когда игрок щелкает игровую сетку. (Щелчки должны находиться внутри одного из девяти элементов lblPlayGround.) Обратите внимание, что эта подпрограмма имеет аргумент: (Индексировать как целое число). Большинство других «подпрограмм обработки событий», таких как cmdNewGame_Click (), этого не делают. Индекс указывает, какой объект метки был нажат. Например, index будет содержать нулевое значение для верхнего левого угла сетки и значение восемь для нижнего правого угла.

После игрока щелкает квадрат в игровой сетке, командная кнопка для запуска другой игры, cmdNewGame, «включается», делая ее видимой. Состояние этой командной кнопки выполняет двойную функцию, потому что она также используется в качестве логической переменной решения позже в программе. Использование значения свойства в качестве переменной решения обычно не рекомендуется, потому что, если когда-либо возникнет необходимость изменить программу (скажем, например, чтобы сделать командную кнопку cmdNewGame все время видимой), программа неожиданно завершится ошибкой, потому что вы можете не помнить что он также используется как часть логики программы. По этой причине всегда рекомендуется искать в программном коде и проверять использование всего, что вы изменяете при обслуживании программы, даже значений свойств. Эта программа частично нарушает правило, чтобы указать на это, а частично потому, что это относительно простой фрагмент кода, в котором легче увидеть, что делается, и избежать проблем позже.

Выбор игроком игрового квадрата обрабатывается путем вызова подпрограммы GamePlay с аргументом Index.

Обработка перемещения

Сначала вы проверяете, был ли нажат свободный квадрат.

Если lblPlayGround (xo_Move) .Caption = “” Тогда

Как только мы убедимся, что это законный ход, счетчик ходов (iMove) увеличивается. Следующие две строки очень интересны, поскольку они переводят координаты из одномерного массива компонентов If lblPlayGround в двумерные индексы, которые вы можете использовать в iXPos или iOPos. Модифицирование и целочисленное деление (обратная косая черта) – математические операции, которые вы не используете каждый день, но вот отличный пример, показывающий, насколько они могут быть очень полезны.

Если lblPlayGround (xo_Move) .Caption = “” Тогда
iMove = iMove + 1
x = Int (xo_Move/3) + 1
y = (xo_Move Mod 3 ) + 1

Значение xo_Move 0 будет преобразовано в (1, 1), 1 в (1, 2) … 3 в (2, 1) … от 8 до (3, 3).

Значение в sPlaySign, переменной с областью видимости модуля, отслеживает, какой игрок сделал ход . После обновления массивов ходов компоненты метки в игровой сетке можно обновить с помощью соответствующего знака.

Если sPlaySign = “O”, то
iOPos (x, y) = 1
iWin = CheckWin (iOPos ())
Иначе
iXPos (x, y) = 1
iWin = CheckWin (iXPos ())
End If
lblPlayGround (xo_Move) .Caption = sPlaySign

Например, когда X player щелкает по верхнему левому углу сетки, переменные будут иметь следующие значения:

На экране пользователя отображается только X в верхнем левом поле, в то время как iXPos имеет 1 в верхнем левом поле и 0 во всех остальных. IOPos имеет 0 в каждом поле.

Значения изменяются, когда игрок O щелкает центральный квадрат сетки. Теперь iOPos показывает 1 в центральном поле, в то время как на экране пользователя отображается X в верхнем левом углу и O в центральном поле. IXPos показывает только 1 в верхнем левом углу и 0 во всех остальных полях..

Теперь, когда вы знаете, где игрок щелкнул и какой игрок щелкнул (используя значение в sPlaySign), все, что вам нужно сделать, это выяснить, если кто-то выиграл игру и выяснил, как показать это на дисплее.

Поиск победителя

После каждого хода Функция CheckWin проверяет выигрышную комбинацию. CheckWin работает, добавляя каждую строку, по каждому столбцу и по каждой диагонали. Отслеживание шагов через CheckWin с помощью функции отладки Visual Basic может быть очень полезным. Чтобы найти выигрыш, нужно сначала проверить, были ли найдены три единицы в каждой из отдельных проверок в переменной iScore, а затем вернуть уникальное значение «подписи» в Checkwin, которое используется в качестве индекса массива для изменения свойства Visible для один элемент в массиве компонентов linWin. Если победителя нет, CheckWin будет содержать значение -1. Если есть победитель, дисплей обновляется, табло изменяется, отображается поздравительное сообщение, и игра перезапускается.

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

‘Проверить строки для 3
для i = от 1 до 3
iScore = 0
CheckWin = CheckWin + 1
Для j = от 1 до 3
iScore = iScore + iPos (i, j)
Далее j
Если iScore = 3, то
Функция выхода
End If
Next i

Первое, на что следует обратить внимание, это то, что первый счетчик индекса i считает строки в обратном порядке, а второй j считает по столбцам. Затем внешний цикл просто переходит от одного ряда к другому. Внутренний цикл считает единицы в текущей строке. Если их три, то у вас есть победитель.

Обратите внимание, что вы также отслеживаете общее количество проверенных квадратов в переменной CheckWin, которая является значение, возвращаемое после завершения этой функции. Каждая выигрышная комбинация будет иметь уникальное значение в CheckWin от 0 до 7, которое используется для выбора одного из элементов в массиве компонентов linWin (). Это также делает важным порядок кода в функции CheckWin! Если вы переместили один из блоков кода цикла (например, тот, что был выше), в случае выигрыша на игровой сетке будет нарисована неправильная линия. Попробуйте и убедитесь!

Детали завершения

Единственный код, который еще не обсуждался, – это подпрограмма для новой игры и подпрограмма это сбросит счет. Остальная часть логики системы делает их создание довольно простым. Чтобы начать новую игру, вам достаточно вызвать подпрограмму InitPlayGround. Для удобства игроков, поскольку кнопку можно нажать в середине игры, вы запрашиваете подтверждение, прежде чем продолжить. Вы также запрашиваете подтверждение перед перезапуском табло..

Оцените статью
recture.ru
Добавить комментарий