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

Институт Менеджмента и Информационных Технологий

Филиал Санкт-Петербургского Государственного Политехнического Университета

 

 

 

 

 

 

Кафедра: ПО ВТ и АС

Дисциплина: ПЯВУ

 

 

 

 

 

Пояснительная Записка к Курсовой Работе «Карточная Игра Дурак»

 

 

 

 

 

Выполнил: студент гр. 0.251

Харламов Артем Глебович

Принял:

 

 

 

 

 

 

 

Череповец, 2006.

  1. Постановка задачи

Целью курсовой работы является создание и отладка программы «карточная игра Дурак» на языке программирования высокого уровня Pascal, целью, которой является развлечение и проведения досуга. В ней должны быть реализованы следующие функции:

- Оформление в графическом режиме (Все отображаемые на экране объекты должны быть нарисованы с помощью графики, а не псевдографики)

- Обработка карт, колоды, козыря (Каждая карта должна четко идентифицироваться и иметь определенное изображение)

- Интеллект компьютера (наличие простейшей стратегии)

- Управление картами с помощью мыши

- Сброс, перемешивание

  1. Краткая теория

    1. Хранение изображений, Загрузка и Прорисовка карты

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

    1. Мышь

Программа, работающая с устройством "мышь" в операционной системе MS-DOS, должна использовать прерывание с номером 51 ( в десятичной системе счисления, но привычнее использовать шестнадцатеричное $33). Это специальное прерывание. Оно представляет 36 функций, обеспечивающих настройку устройства "мышь" и его указателя, а также сообщающих информацию о событиях. Все эти функции требуют заполнения регистров процессора перед вызовом их. В частности, номер функции всегда заносится в регистр AX. И в регистрах процессора функции "возвращают" информацию. Тогда обращение к регистрам процессора производится с помощью переменной типа REGISTERS, которая описана в модуле DOS.

type

Registers = record

case Integer of

0: (AX, BX, CX, DX, BP, SI, DI, DS, ES, Flags: Word);

1: (AL, AH, BL, BH, CL, CH, DL, DH: Byte);

end;

Для вызова прерывания нужно заполнить регистры процессора так, как указано в описании функции, и вызвать процедуру intr. Ей передаются два параметра:

  1. номер прерывания;

  2. имя переменной типа REGISTERS

Сначала нужно проверить поддерживается ли мышь на данной ЭВМ. Для этого используется функция с номером 0. Эта функция проверяет, имеется ли поддержка мыши на данной ЭВМ, и если имеется, то в регистр AX будет записано число $FFFF. Если нет, то 0, но не обязательно. В регистр BX. В него записывается количество кнопок мыши.

Если мышь имеется, эта функция выполняет следующие действия в текстовом режиме

  • перемещает указатель мыши в центр экрана;

  • прячет указатель мыши. Для того, чтобы его показать, используется функция с номером 1;

  • очищает "область исключения" перемещения указателя мыши, установленную функцией $10. В пределах это прямоугольной области указатель курсора мыши не виден;

  • устанавливает вид курсора "по умолчанию". Его изменяет функция $0A;

  • разрешает перемещение указателя мыши по всей области экрана. Его ограничивает функция номер 7;

  • устанавливает отображение курсора мыши на первую видеостраницу. Напомню, что в текстовом режиме 8 видеостраниц. Первая имеет номер 0;

  • устанавливает "обычную" скорость перемещения указателя мыши. То есть, на какое расстояние перемещается указатель мыши при движении манипулятора. А также устанавливает значение интервала между "двойными кликами" по умолчанию. (То есть при двойном щелчке манипулятор может переместится немного, но это не считается). Такие параметры изменяются с помощью функции номер $1A. Если перед вызовом функции был установлен графический режим, то устанавливается указатель в виде стрелки для данного режима. Для того, чтобы определить, не произошло ли чего с мышью, в этой программе используется функция с номером 3 "Опросить положение и состояние кнопок" ( Здесь reg - переменная типа REGISTERS). Если нажата левая клавиша мыши, то reg.BX and 1 = 1, тогда в CX будет содержаться X координата (горизонтальная) курсора мыши, а в DX будет содержаться Y координата (вертикальная) курсора мыши.

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

    1. Структурная схема

Меню

Игра

Прорисовка

Карт

Ход

Управление

Игрой

Выбор

Кор-

рекция


Основными блоками программы являются: Меню и Игра. Через Меню осуществляется запуск и выход из блока Игра. Также с помощью Меню вводится значимая для Игры переменная – количество игроков. Игра же в свою очередь состоит из трех подблоков: Прорисовка карт, Ход и Управление игрой. Из названий подблоков достаточно ясно какие функции они осуществляют (Прорисовка – рисует, Управление – управляет ходом игры с помощью мыши и различных «флагов»). Ход также делится на две части: Выбор и Коррекция. В зависимости от того ходит ли компьютер или игрок, блок Выбор либо производит обработку карт компьютера, либо принимает и обрабатывает сигнал от мыши. После Выбора блок Коррекция проверяет выбранную карту на соответствие ситуации и оценивает допустимость хода, если ход невозможен, то появляется предупреждение.

    1. Математическая постановка задачи

      1. Перемешивание колоды – случайное распределение чисел от 1 до 36 в массиве, состоящем из 36 элементов. Поочередно присваиваем значения от 1 до 36 случайному элементу с номером n массива A[1..36]. Случайность выбора элемента осуществляем с помощью функции Random и процедуры Randomize. Если же значение элемента А[n] отлично от нуля то повторяем процедуру выбора случайного элемента до тех пор пока все значения не будут распределены в массиве А.

      1. Определение карты – Разделение числа на две части путем деления на 9. Целая часть определяет масть, остаток от деления определяет номинал. Карты находящиеся в руках игроков обозначаются значениями в массивах (для каждого игрока он свой). При обращении программы к карте считывается значение из массива (p:=B[n]). Для определения ее масти происходит целочисленное деление значения на 9 (m:=p div 9), так как карт всего 36, значение m может варьироваться в пределах четырех значений (от 0 до 3). Так что можно принять каждое из этих значений за определенную масть. Для определения номинала требуется получить остаток от деления на 9, он будет находиться в промежутке от 0 до 8 (n:=p mod 9).

      1. Прорисовка карты – открытие определенного файла, содержащего закодированное изображение, в зависимости от номинала и масти карты. После определения масти карты, используя оператор case, присваиваем переменой файлового типа выбранный файл содержащий закодированный рисунок данной масти (Assign(F,*.txt)). Соответственно производим обработку номинала карты и после этого проверяем значение масти, если эта масть «черная», то рисунок номинала должен быть загружен из файла с черным номиналом, если масть «красная» - то и номинал красный.

      1. Количество игроков (2-4) – формируется последовательность хода в зависимости от переменной, обозначающей количество игроков. Значение данной переменной задается в стартовом меню, в зависимости от неё изменяются различные флаги и маркеры контролирующие процесс и порядок хода, подкидывания и ответа. Используется два маркера: первый регулирует ход и ответ игрока, а второй порядок подкидывания. Значение маркера после окончания хода возрастает на 1 или 2,в зависимости от различных условий. Для определения активного игрока значение маркера делится на количество игроков минус один (case (mark1 mod (Numplayers-1)) of).

      1. Определение игрока, ходящего первым – определение козыря и поиск игрока, обладающего картой наименьшего номинала и той же масти, что и козырь. Значение козыря определяется после перемешивания колоды, значение первой карты становится значением козыря (koz:=A[36]). Затем происходит поиск карт, с результатом целочисленного деления на 9 равным результату такого же деления значения представляющего козырь, в массивах содержащих значения карт, находящихся в руках игроков. После того как такие карты найдены, происходит проверка на самый маленький номинал, то есть выбирается карта с наименьшим значением остатка от деления на 9, для массива первого игрока. Эта карта считается минимальной, после этого происходит проверка номиналов карт следующего игрока, только теперь номиналы сравниваются с минимумом, и если значение остатка от деления меньше, чем минимум, то значение этой карты становится минимумом. И так далее для каждого игрока. После определения минимума, находится игрок, обладающий картой со значением равным минимуму, и маркеру, управляющему порядком хода, присваивается определенное значение.

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

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

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

    1. Описание входных и выходных данных

      1. Входные данные – определение координат мыши, нажатия левой клавиши мыши и клавиш клавиатуры. При перемещении мыши ее координаты считываются и курсор перерисовывается. При нажатии на левую клавишу мыши срабатывает триггер и в некоторые переменные записываются горизонтальные вертикальные координаты мыши. Функция Keypressed:Boolean возвращает true, если нажата любая клавиша. Функция Readkey: char; Возвращает ASCII код символа нажатой клавиши. Для клавиш, не сопоставленных символам, вернется #0. Такие клавиши (например, функциональные, управления курсором и т.д.) определяются расширенным скан-кодом. Для обычных буквенно-цифровых клавиш скан-код (код сканирования) равен ASCII-коду символа. В расширенном скан-коде значимым является второй байт, который считывается вторым вызовом функции Readkey. Код в этом случае будет

key:=ReadKey;{ чтение первого байта кода}

If c=#0 then key:=ReadKey {если нажата не буквенно-цифровая клавиша, то в key будет значение расширенного скан-кода}

      1. Выходные данные – изменения изображения на экране (прорисовка карт, поля и колоды; пояснительный и пригласительный текст). При произведении некоторых манипуляции старое изображение на экране стирается и появляется новое, содержание этого изображения зависит от произведенных манипуляций. Изображение может поменяться из-за появления новой карты, в случае хода, или наоборот отчистки стола, при взятии или окончании хода, или выведения пояснительного или пригласительного текста («Ход противника», «Вы подкидываете»). Также смена изображения происходит при начале или окончании игры.

    1. Структуры данных

      1. Формат TXT

Формат txt посимвольно хранит, содержащуюся в нем информацию. Каждый символ обозначается своим кодом из ASCII – таблицы. Информация разбита на строки различной длины заканчивающиеся кодом клавиши Enter. Также формат txt частично хранит форматирование (шрифт). При считывании из файла формата txt, считывается сочетание символов до первого пробела, при считывании строки, до первого конца строки.

      1. Массивы

Массив - структура данных состоящая из последовательно расположенных в памяти однотипных элементов.

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