Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
POYaSNITEL_NAYa_ZAPISKA.doc
Скачиваний:
11
Добавлен:
20.09.2019
Размер:
139.26 Кб
Скачать

Объявление массивов

Type <Имя массива>=arrray[<диапазон индексов>] of <тип элемента>

В качестве имени массива может выступать любое не зарезервированное слово или сочетание символов.

В качестве диапазона индексов может выступать диапазон основанный на любом перечислимом типе. В случае с многомерным массивом задаётся не один диапазон индексов а несколько, не существует ограничения на сочетание диапазонов т.е. возможны двумерные массивы с одним диапазоном основанным на символьном типе(Char) и другим, основанным, к примеру, на типе integer.

В качестве типа элемента можно использовать любой тип.

Пример объявления :

Type arr=array[1..10] of integer;

Var z,x:arr;

Или

Var z:array[1..10] of word;

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

Для массивов при совпадении типов определена операция присвоения одного массива другому. Стандартные функции модуля System: Low и High возвращают минимальное и максимальное значение индекса массива.

Возможны также и операции над отдельными элементами массива выполняющиеся также как и операции над переменными типа соответствующего типу элементов массива. В общем виде элемент массива A представляется как переменная с именем A[i] где i индекс данного элемента в массиве, в случае одномерного массива, и A[i,j,k] где i, j и k индексы элементов для трёхмерного массива, аналогично и для других многомерных массивов.

Пример использования:

Z[1]:=1;

For i:=1 to 9 do Z[i+1]:=z[1]+z[i];

Особенности использования массивов в данной программе.

Целесообразность применения массивов в данной программе обусловлена необходимостью обработки достаточно большого количества однотипных данных, а конкретно значения карт. Из этого логически следуют особенности работы с массивами в данной программе: Количество элементов массивов одинаково и равно 36 (для хранения максимального количества карт). Существует несколько параллельных массивов для хранения информации о каждом игроке и колоде, что значительно упрощает доступ к ним, что в свою очередь значительно облегчает процедуры поиска и изменения нужных карт.

    1. Описание функционирования системы

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

    1. Описание основных алгоритмов

      1. Искусственный интеллект

Искусственный интеллект в данной программе осуществляется с помощью набора различных процедур. Каждая из этих процедур отвечает за определенный вид выбора вариантов хода компьютера в определенных игровых ситуациях. Главным принципом этих процедур является выбор карты с наименьшим значением номинала и допустимой в данных условиях. Для этого используется временные массивы, в которых накапливаются промежуточные выборы, и временные переменные содержащие текущий минимум. Также в этих процедурах содержится огромное количество флагов, с помощью, которых удается избежать ошибочных выборов. Эти процедуры в основном отличаются друг от друга лишь флагами и условиями включения во временный массив.

      1. Расшифровка и прорисовка карты на экране.

Хранение изображений различных карт осуществляется с помощью текстового файла содержащего закодированную информацию. Файл представляет собой набор цифр, располагающихся по две в строке. При активации процедуры прорисовки карты определяется, какой именно файл будет использован для прорисовки, а затем файл открывается для чтения. Также при активации задаются начальные координаты карты. После того как файл открыт, начинается цикл прорисовки. В начале этого цикла читается первое число в строке, оно определяет сколько следующих пикселов будут закрашены цветом, содержащимся во втором файле в строке. Заданной переменой присваивается значение первого числа в строке и при каждом последующей прорисовке пиксела уменьшается на 1. Когда заданная переменная становится равной нулю, считывается вторая строка из файла. Сам же цикл прорисовки состоит из двух частей: прорисовки общего для всех фона карты и прорисовка самого символа. Символ карты состоит из двух частей (номинала и масти), которые хранятся в отдельных файлах. Чтобы правильно нарисовать карту, используется два цикла For. Первый цикл с количеством итераций равным высоте карты в пикселах и второй с количеством итераций равным ширине карты в пикселах. При прорисовке к начальным координатам прибавляются номера итерации (первого к Y – координатам, второй к Х - координатам).

      1. Процедура хода

Сначала выбирается игрок, который будет ходить первым. Определяется игрок, обладающий козырем наименьшего номинала. После этого маркеру №1 присваивается значение равное порядковому номеру игрока (игрок – 0, компьютер №1 – 1, и т.д.). Затем начинается цикл хода. То есть ход осуществляет игрок с номером равным остатку от деления маркера №1 на количество игроков. После этого начинается подцикл ответа-подкидывания. То есть игрок, с номером равным остатку от деления маркера №1 плюс один на количество игроков, осуществляет ответ, далее следуют подкидывания и продолжаются до того момента, пока все игроки не откажутся подкидывать или игрок не откажется отвечать. Процедура подкидывания осуществляется по очереди всеми игроками, кроме отбивающегося. То есть при запуске подцикла ответ-подкидывание маркер №2 приобретает значение маркера №1, после каждого подкидывания или паса возрастает на один, если остаток от деления маркера №2 стал равен значению номера отбивающегося игрока, то он повторно увеличивается на один. Если отбивающийся игрок отказался отвечать, то он забирает карты, находящиеся на столе, и значение маркера №1 увеличивается на два. Если же все остальные игроки отказались подкидывать, то карты со стола уничтожаются, а маркер №1 увеличивается на 1.

    1. Описание стандартных и нестандартных подпрограмм

  • Процедура Img (x,y,s:integer)

Сначала открывает изображение фона карты и рисует его, начиная с координат X и Y. Затем загружает из файла изображение номинала карты в зависимости от результата остатка от деления на 9 и прорисовывает его, начиная с координат X+5 и Y+5. После чего загружает из файла изображение масти карты в зависимости от результата целочисленного деления на 9 и рисует, начиная с координат X+20 и Y+5. Данная процедура используется при прорисовке карт игрока, а также карт на столе и козыря.

  • Процедура Img1 (x,y:integer)

Рисует изображение рубашки карты, с помощью встроенной процедуры Bar. Начинает прорисовку из координат X и Y. Используется для прорисовки карт компьютеров и карт, находящихся в колоде.

  • Процедура Hit (x : integer)

Перерисовывает карты находящиеся на игровом поле, и добавляет карту со значением Х, используя процедуру Img, убавляя количество карт на руке, сходившего игрока. Также перерисовывает карты находящиеся в руках игрока и компьютеров. Рисует колоду и козырь, пока количество карт в колоде больше нуля, а козырь не взят.

  • Процедура Сlear (x : integer)

Перерисовывает карты находящиеся на игровом поле. Также перерисовывает карты находящиеся в руках игрока и компьютеров и выводит на экран поясняющую, либо побудительную надпись, используя встроенную процедуру OutTextXY, в зависимости от значения Х. Облегчает понимание и улучшает восприятие процесса игры.

  • Процедура Draw (x : integer)

Совершает набор карт в руку тех игроков, у которых на руках в данный момент менее 6 карт. Изменяет флаги, отвечающие за наличие козыря и за окончание колоды. Зависит от переменной Х, которая обозначает количество играющих компьютеров.

  • Процедура Pturn

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

  • Процедура Сturn

В зависимости от маркера выбирается, какой именно компьютер будет ходить. Выбранный компьютер производит поиск в принадлежащих ему картах наименьшей по номиналу и производит процедуру Hit от нее. Данная процедура осуществляет простейшую тактику компьютера.

  • Процедура Pback

Запускает цикл, прерывающийся при нажатии на клавишу мыши или на клавишу клавиатуры. Если была нажата клавиши мыши, то запускается проверка на координаты мыши в момент щелчка, если координаты соответствуют полю карт игрока, то считываются координаты щелчка мыши. Далее вычисляется на какой именно карте был сделан щелчок. Затем осуществляется проверка корректности хода. Если ход правильный, то производится процедура Hit от этой карты, если нет, то выдается сообщение о некорректности хода. Если же была нажата какая-либо клавиша, то в зависимости от ASCII – кода клавиши, либо происходит выход из программы, либо пропускается ход. Данная процедура непосредственно осуществляет ответный ход игрока.

  • Процедура Сback

В зависимости от маркера производит поиск в картах принадлежащих определенному компьютеру, наименьшей из допустимых карт для хода и производит процедуру Hit от нее. Если же таких карт не обнаружено. То компьютер пасует и забирает карты со стола. Данная процедура осуществляет простейшую тактику компьютера.

  • Процедура Padd

Запускает цикл, прерывающийся при нажатии на клавишу мыши или на клавишу клавиатуры. Если была нажата клавиши мыши, то запускается проверка на координаты мыши в момент щелчка, если координаты соответствуют полю карт игрока, то считываются координаты щелчка мыши. Далее вычисляется, на какой именно карте был сделан щелчок. Затем осуществляется проверка корректности хода. Если ход правильный, то производится процедура Hit от этой карты, если нет, то выдается сообщение о некорректности хода. Если же была нажата какая-либо клавиша, то в зависимости от ASCII – кода клавиши, либо происходит выход из программы, либо пропускается ход. Данная процедура непосредственно осуществляет ответный ход игрока.

  • Процедура Сadd

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

  1. Заключение

В заключении хочу сказать, что все пункты, содержавшиеся в Техническом Задании, были выполнены. Но несмотря на это, программа все же требует некоторой доработки. Код программы до конца не оптимизирован, можно сократить объем кода, путем унифицирования некоторых процедур, отвечающих за интеллект компьютера. То есть можно вывести основные алгоритмы нахождения хода компьютером в отдельные процедуры, а при инициализации процедуры хода компьютера лишь присваивать переменные, связанные с этим компьютером, временным переменным, а при выходе, уже обработанные временные данные присваивать обратно. Также простейшая стратегия компьютера требует большой доработки, чтобы хотя бы как-то соответствовать уровню игры даже начинающих игроков. Это можно осуществить путем усложнения проверки хода, введя массив карт вышедших из игры. Также следует ввести огромное количество флагов (окончание колоды, о карты, предположительно находящиеся в руке игрока или другого компьютера) и временных массивов. Все это поможет компьютеру лучше анализировать ситуацию и принимать более эффективные решения. Графика тоже не на самом высоком уровне. Должно быть убрано «моргание», с помощью изменения активной и визуальной страницы. Также можно ввести картинки для каждой карты, но либо это займет много времени для кодировки в формат, используемый данной программой, либо придется «научить» программу читать файлы bmp, либо использовать спрайты, и тогда можно будет даже показать передвижение карты из колоды в руку, и из руки на стол. Еще следует найти более рациональный способ перемешивания колоды, так как тот способ, который используется в данной программе, занимает слишком много времени, из-за того, что при приближении количества занятых мест в массиве, случайно «попасть» в пустой элемент становится слишком трудно.

21

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]