![]() |
Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология Образование Политология Производство Психология Стандартизация Технологии |
Перестановки в файле результатов. ⇐ ПредыдущаяСтр 3 из 3
В данном разделе необходимо совершить перестановки в массиве, но нужно не просто удалить какой то элемент, а на его место поставить текущий результат, нужно осуществить сдвиг всех элементов на один, а если текущей результат будет десятым, то заменить его. Эту задачу можно решить несколькими способами. Один из способов, это совершать перестановки непосредственно в массивах it и res и осуществлять сдвиг элементов, но, на мой взгляд, наиболее простой способ, это создать еще два массива, для удобства назовем их itv и resv, и в результате совершить простейшие операции перемещения элементов из одного массива в другой. Эти операции совершим по следующей схеме: При помощи инструкции For сравниваем каждый элемент массива результатов (it), с результатом текущего игрока (переменная hod). Если результат игрока из массива it меньше результата текущего игрока, то результат и имя игрока из массива it и res присваиваем массивам itv и resv. Если результат текущего игрока меньше чем очередной элемент массива it и больше предыдущего элемента массива it, то результат текущего игрока вносится в очередной элемент массивов itv и его имя присваивается очередному элементу массива resv, а результат текущего элемента массивов it и res добавляется в массивы itv и resv за результатами текущего игрока. Соответственно когда инструкция For начнет сравнивать следующий элемент массива it, то результат текущего игрока, будет меньше, как текущего так и предыдущего элементов массива it, а это не удовлетворяет условию. Это означает, что очередной элемент массивов it и res просто добавится за последним элементом массивов itv и resv. Так будет происходить пока массивы itv и resv не будут полностью заполнены, а последний элемент массивов it и res, соответственно не войдут, во вновь созданный список лучших игроков, которые описаны в массивах itv и resv. В итоге мы осуществим сдвиг результатов на одну позицию. Для более полного описания данной процедуры рассмотрим пример: В таблице 3 расположены две строки. В верхней содержатся элементы массива it, а в нижней массива res. Таблица 3 – Массивы it и res.
Предположим, что текущий игрок, под именем Z, победил за 44 хода. Программа начинает искать в каком интервале расположен текущей результат (44). Для этого каждый элемент массива it сравнивается с переменной hod. Если первый элемент меньше 44, то его имя и результат переносится в массивы itv и resv, если следующий элемент меньше 44, то и его переносят в массивы itv и resv (таблица 4) Таблица 4 – Массивы it и res.
Так происходит до тех пор пока, программа не найдет элемент в массиве it, который больше 44, но при этом программа проверяет, что 44 больше и предыдущего элемента массива it. Если данное условие выполняется, то программа добавляет результат и имя текущего игрока под именем Z, в массивы itv и resv соответственно, а текущий результат из массивов it и res, также добавляется в массив, но уже за результатами игрока Z (Таблица 5). Таблица 5 – Массивы it и res.
У нас получилось, что 44 меньше 50, но больше 40, по этому за результатом 40 добавили 44, а за ним текущий элемент с результатом 50. Далее, при проверки результата 44 со следующем элементом с результатом 60, 44 будет меньше результата 60, но 44 и меньше результата 50, а следовательно, условие не выполняется и игрок с результатом 60 переносится в массивы itv и resv. Так происходит пока оба массива itv и resv, не будут заполнены. А последний результат соответственно исчезнет (Таблица 6) Таблица 6 – Массивы it и res.
На первый взгляд, все достаточно усложнено, но при создании алгоритма перестановки непосредственно внутри массивов it и res, получается еще хуже.
Сохранения результатов в файл. В данном разделе информация из массивов itv и resv вносится в файл res.txt. Данный файл открывается в режиме перезаписи и информация в файле обновляется и когда пользователь выдя в Главное меню зайдет в раздел Результаты, он уже уведет обновленную информацию из файла res.txt и соответственно и свой результат. Результаты.
В данном разделе для пользователя отображается информация о лучших игроках, которые за наименьшее количество ходов собрали требуемую комбинацию. Данный раздел реализован при помощи процедуры result. Данная процедура считывает информацию из файла res.txt и выводит считанную информацию на экран для ознакомления пользователю. Реализована данная процедура, точно таким же способом, как и в разделе 5.1 Описание, за исключением, того, что обращение происходит к файлу res.txt, по этому подробно останавливаться на данном разделе не имеет смысла. Описание входных и выводных данных
В таблице 7 описываются входные и выходные данные, которые выстроены примерно в том порядке, в котором они должны взаимодействовать с пользователем Таблица 7 Описание входных и выходных данных
Программное и аппаратное обеспечение программы. Для запуска игры достаточно любого компьютера, на котором установлена хоть какая-нибудь операционная система, семейство Windows.
Руководство пользователя 9. 8.1. Для запуска программы необходимо запустить файл Super15.exe. Откроется Главное меню (Рисунок 1)
Рисунок 1 – Главное меню
Основное меню содержит пять пунктов: 1. Описание (About program). 2. Управление (Key). 3. Игра (Play). 4. Результаты (Results). 5. Выход (Exit). Перемещаясь при помощи курсора вверх или вниз, можно выбирать интересующие Вас меню.
8.2 При первом запуске программы пользователю рекомендуется прочитать раздел Описание (Рисунок 2), в котором указанно: - Назначение программы; - Разработчик; - Описание программы;
Рисунок 2 – Окно Описание
Раздел Управление.
Здесь пользователю выводится на экран клавиши управления (Рисунок 3). Рисунок 3 - Управление
Раздел Игра.
При переходе в этот раздел перед пользователем открывается основное табло игры (Рисунок 4), на котором расположены 15 цифр, заполненные в случайном порядке и одно пустое поле.
Рисунок 4 – Основное игровое поле.
Управление происходит при помощи клавиш курсора: - Стрелка влево – перемещает влево цифру, стоящую справа от пустой клетки; - Стрелка вправо – перемещает вправо цифру стоящую слева от пустой клетки; - Стрелка вниз – перемещает вниз цифру стоящую сверху от пустой клетки; Стрелка вверх – перемещает вверх цифру стоящую снизу от пустой клетки. Пользователю необходимо при помощи курсора перемещать клетки табло, до тех пор, пока на экране не отобразится, последовательная комбинация цифр, как показано на рисунке 5
Рисунок 5 – Игровое поле с правильно заполненной, комбинацией.
В течение всей игры, пользователь в любой момент может покинуть игру, для этого достаточно нажать клавишу ESC и игра завершает свою работу, а на экране появится Главное меню программы. В течение всей игры, программа считает каждый ход игрока и если игрок раскладывает требуемую комбинацию, за меньшее количество ходов, чем это сделали игроки ранее, то после победы, пользователю предлагается ввести свое имя и информация об игроке, который разложил расклад быстрее, заносится в список лучших игроков (Рисунок 6). Рисунок 6 - Ввод имени
Пункт Результаты. В данном разделе меню можно посмотреть результаты лучших игроков (Рисунок 7), а именно тех игроков, которые собрали требуемую комбинацию за наименьшее количество ходов. На экране небольшая табличка в левом столбце Move записано количество ходов, а в правом Name имя игрока.
Рисунок 7 – Список лучших игроков
Последний пункт меню Выход.
При нажатии на данный пункт меню, программа завершает свою работу.
Заключение
Не смотря на внешне кажущуюся простоту данной программы, он таит в себе ряд сложностей, которые реализуются с использованием всех основных приемов Турбо Паскаль. Вообще Турбо Паскаль как среда программирование уже давно устарела, но основы, которые лежат в среде программировании в Турбо Паскаль, лежат в болшенстве известных и популярных приложений. На мой взгляд, изучая программирование в Турбо Паскаль, можно освоить основные приемы программирования. Целью данной курсовой работы, являлось углубление знаний и расширение навыков по разработке алгоритмов и их реализации на персональном компьютере, на мой взгляд, разработанная мной программа, вполне отвечает поставленным целям. Особенностями данной программы является: - Четко построенный алгоритм; - Интуитивно понятный интерфейс; - Удобное управление; - Простота в использовании; - Вполне понятное руководство пользователя; - Отсутствие лишних дополнений.
Список литературы
10.1 Учебное пособие. «Основы алгоритмизации и программирования», Е. Н. Сафьяновой 10.2 Самоучитель. «Программирование в Turbo Pascal», Н. Культин. 10.3 Открытие Интернет источники. Приложение 1 Листинг программы program Game; uses crt, Graph; var as: array[1..4, 1..4] of string; {Двухмерный массив, содержит элементы табло} bs: array[1..16] of integer; {Массив для заполнения случайными числами} men: array[1..5] of integer; {Массив выводи элементы Главного меню} res: array[1..10] of string; {Имена игроков с лучшими результатами} it: array[1..10] of integer; {Результаты лучших игроков} resv: array[1..10] of string; {Массив со вновь сформированным списком лучших игроков} itv: array[1..10] of integer; {Массив со вновь сформированным списком результатов лучших игроков} i, j: integer; {Переменные для работы с массивами} strok, stolb: integer; {Координаты пустого элемента} hod: integer; {Счетчик, считывает каждый ход сделанный пользователем} lom: integer; {Переменная для работы с Главным меню} name: string; {Имя игравшего пользователя} ch: char; {Переменная, которой присваивается код нажатой клавиши на клавиатуре} prov: boolean; {Проверка правильности расклада} f: text; {файловая переменная} procedure Vivod; {Процедура вывода на экран табло с цифрами сформированное на момент отображения} var lx, ly: integer; {Координаты вывода двухмерного массива} x, y: integer; {Координаты клеток} j1, i1: integer; {Переменные счетчики, для рисование клеток} w1, h1: integer; {Ширина и высота клеток} begin OutTextXY(210, 50, 'For leaving press ESC'); w1: =30; h1: =30; {Клетка размером 30 на 30} for i1: =0 to 3 do {Цикл, прорисовки клеток} for j1: =0 to 3 do begin x: =235+j1*35; {Сдвиг клеток по х} y: =150+i1*35; {Сдвиг клеток по у} setFillStyle(1, 1); {Цвет и стиль клеток, цвет синий, стиль заполнение текущем цветом} Bar(x, y, x+w1, y+h1); {Рисование клетки} end; lx: =245; ly: =162; for i: =1 to 4 do {Цикл вывода двухмерного массива по вверх клеток} begin for j: =1 to 4 do begin OutTextXY(lx, ly, as[i, j]); {Вывод текста на экран} lx: =lx+35; end; lx: =245; ly: =ly+35; end; line(220, 135, 220, 300); {Рисование рамки} line(385, 135, 385, 300); line(220, 135, 385, 135); line(220, 300, 385, 300); end; procedure Tablo; {Формирование табло при первом запуске заполненное случайными и неповторяющимися цифрами} var b: integer; {Переменная, которой присваивается случайное число} k, z: integer; {Счетчики для операций с массивами} begin randomize; For z: =1 to 16 do begin b: =random(15); {Выбор случайного числа} k: =1; while k< > 17 do {Цикл пока не будет заполнен массив с целыми цифрами} begin if bs[k]=b then begin b: =random(17); k: =1; end else k: =k+1; end; bs[z]: =b; {Присвоение очередного неповторяющегося элемента массива} end; z: =1; for i: =1 to 4 do {Заполнение двухмерного массива, вместо цифр из одномерного, присваиваются строковые элементы} begin for j: =1 to 4 do begin case bs[z] of 1: as[i, j]: ='1 '; 2: as[i, j]: ='2 '; 3: as[i, j]: ='3 '; 4: as[i, j]: ='4 '; 5: as[i, j]: ='5 '; 6: as[i, j]: ='6 '; 7: as[i, j]: ='7 '; 8: as[i, j]: ='8 '; 9: as[i, j]: ='9 '; 10: as[i, j]: ='10'; 11: as[i, j]: ='11'; 12: as[i, j]: ='12'; 13: as[i, j]: ='13'; 14: as[i, j]: ='14'; 15: as[i, j]: ='15'; 16: as[i, j]: =' '; end; z: =z+1; end; end; vivod; {Вывод табло на экран} end; Procedure Poisk; {Поиск пустого элемента в табло} begin for i: =1 to 4 do begin for j: =1 to 4 do begin if as[i, j] = ' ' Then {Поиск, равен ли текущий элемент пробелу} begin Strok: =i; {Если равен, то присваиваются координаты пустого элемента} Stolb: =J end; end; end; end; procedure bonus; {Бонус, для проверки. При нажатии клавиши END на клавиатуре расклад собирается} begin as[1, 1]: ='1 '; as[1, 2]: ='2 '; as[1, 3]: ='3 '; as[1, 4]: ='4 '; as[2, 1]: ='5 '; as[2, 2]: ='6 '; as[2, 3]: ='7 '; as[2, 4]: ='8 '; as[3, 1]: ='9 '; as[3, 2]: ='10'; as[3, 3]: ='11'; as[3, 4]: ='12'; as[4, 1]: ='13'; as[4, 2]: ='14'; as[4, 4]: ='15'; as[4, 3]: =' '; Strok: =4; Stolb: =3; end; procedure napravlenie; {Ввод направления перехода} begin ch: =readkey; {Переменной присваивается код нажатой пользователем клавиши на клавиатуре} end; procedure Zamena; {Передвижение клеток с цифрами в зависимости от выбора пользователя} begin napravlenie; {Процедура, ввод направления перехода} if ord (ch)=79 then bonus; {Если нажата клавиша END на клавиатуре то расклад сам собирается} if ord(ch)=75 then {Если нажата клавиша влево} begin if stolb< > 4 then {Если это не последний элемент, стоящий у границы табло} begin as[strok, stolb]: =as[strok, stolb+1]; {На место пустого элемента присваивается элемент стоящий справа от пустого} as[strok, stolb+1]: =' '; {Элементу стоящему справа от пустого присваивается пустой элемент} stolb: =stolb+1; {Новая координата пустого элемента} hod: =hod+1; {Очередной сделанный ход} end; end; if ord(ch)=72 then {Если нажата клавиша вверх} begin if strok< > 4 then {Если это не последний элемент, стоящий у границы табло} begin as[strok, stolb]: =as[strok+1, stolb]; {На место пустого элемента присваевается элемент стоящий снизу от пустого} as[strok+1, stolb]: =' '; {Элементу стоящему снизу от пустого присваевается пустой элемент} strok: =strok+1; {Новая координата пустого элемента} hod: =hod+1; {Очередной сделанный ход} end; end; if ord(ch)=77 then {Если нажата клавиша вправо} begin if stolb< > 1 then {Если это не последний элемент, стоящий у границы табло} begin as[strok, stolb]: =as[strok, stolb-1]; {На место пустого элемента присваивается элемент стоящий слева от пустого} as[strok, stolb-1]: =' '; {Элементу стоящему слева от пустого присваивается пустой элемент} stolb: =stolb-1; {Новая координата пустого элемента} hod: =hod+1; {Очередной сделанный ход} end; end; if ord(ch)= 80 then {Если нажата клавиша вниз} begin if strok< > 1 then {Если это не последний элемент, стоящий у границы табло} begin as[strok, stolb]: =as[strok-1, stolb]; {На место пустого элемента присваивается элемент стоящий сверху от пустого} as[strok-1, stolb]: =' '; {Элементу стоящему сверху от пустого присваивается пустой элемент} strok: =strok-1; {Новая координата пустого элемента} hod: =hod+1; {Очередной сделанный ход} end; end; Vivod; end; procedure readFile; {Добавляет в файл информацию о лучших результатах} begin assign(f, 'res.txt'); {Объявления файла} reset(f); {Открытие файла} j: =1; for i: =1 to 10 do begin readln(f, res[i]); {Занесение имен лучших игроков из файла в массив} readln(f, it[j]); {Занесение результатов лучших игроков в массив} j: =j+1; {Счетчик для лучших результатов} end; close(f); end; procedure writeFile; {Считывает файл с лучшими результатами} begin assign(f, 'res.txt'); {Объявление файла} rewrite(f); {Открытие в режиме перезаписи} for i: =1 to 10 do begin writeln(f, resv[i]); writeln(f, itv[i]); {Внесение информации о лучших игроках и их результатах из массивов в файл} end; close(f); end;
procedure Mesto; {Процедура в которой устанавливается занял ли игрок какое либо место, если да то занесение в список лучших игроков} var chetcik: integer; {Счетчик, объявляет что информация о лучим игроке уже внесена, повторной информации не должно быть} begin if prov = true then {Если игрок разложил расклад} begin readfile; {Процедура считывание информации из файла с лучшими результатами} chetcik: =0; j: =1; for i: =1 to 10 do begin if (hod< =it[i]) and (hod> =it[i-1]) and (chetcik< 1) then begin {Ввод имени игрока} OutTextXY(132, 325, 'will Enter name and press Enter: '); line(400, 338, 530, 338); GoToXY(52, 21); read(name); {Присвоение очередному элементу данных текущего игрока} itv[i]: =hod; resv[i]: =name; j: =j+1; chetcik: =1; end; {Перенос из одного массива в другой} if j< =10 then begin itv[j]: =it[i]; resv[j]: =res[i]; j: =j+1; end; end; writeFile; {Сохранение информации в файл} OutTextXY(230, 360, 'For leaving press ENTER'); readln; end; end; procedure proverka; {Проверка правильно ли разложено табло} begin prov: =false; if (as[1, 1]='1 ') and (as[1, 2]='2 ') and (as[1, 3]='3 ') and (as[1, 4]='4 ') and (as[2, 1]='5 ') and (as[2, 2]='6 ') and (as[2, 3]='7 ') and (as[2, 4]='8 ') and (as[3, 1]='9 ') and (as[3, 2]='10') and (as[3, 3]='11') and (as[3, 4]='12') and (as[4, 1]='13') and (as[4, 2]='14') and (as[4, 3]='15') and (as[4, 4]=' ') then begin prov: =true; {Если табло разложено верно, то ИСТИНА} OutTextXY(230, 100, 'Congratulate You have won'); Mesto; {Процедура, устанавливающая на каком месте текущий пользователь} end; end; procedure Game15; {Подключение графики и переход в режим ИГРЫ} var grMode: integer; {Режим работы видеосистемы} grPath: string; {Путь к файлу} grDriver: integer; {Используемый программой драйвер видеоадаптера} begin hod: =0; grDriver: =VGA; grmode: =VGAHi; grPath: ='EGAVGA.BGI'; initGraph(grDriver, grMode, grPath); {Инициализация графического режима} Tablo; {Формирование табло} Poisk; {Поиск пустого элемента} repeat {Цикл, пока не нажата клавиша ESC или пока игрок не победил играть} Zamena; {Передвижение в массиве} proverka; {Проверка является ли данный расклад верным} until (ord (ch)=27) or (prov=true); closeGraph; {Закрытие графического режима} end; procedure help; {Переход в режим справки} var f: text; {Файловая переменная} g1: string; {Переменная для работы со строками в файле} begin clrscr; assign(f, 'fhelp.txt'); {Объявление файла} reset(f); {Открытие файла} readln(f, g1); writeln(g1); {Присвоение переменной строки файла и вывод ее на экран} readln(f, g1); writeln(g1); readln(f, g1); writeln(g1); readln(f, g1); writeln(g1); readln(f, g1); writeln(g1); readln(f, g1); writeln(g1); readln(f, g1); writeln(g1); writeln('For leaving press ENTER'); readln; close(f); {Закрытие файла} end; procedure result; {Отображение лучших игроков} begin clrscr; GoToXY(26, 5); writeln('Best players'); assign(f, 'res.txt'); reset(f); readfile; {Считывание информации из файла лучших результатов} {Вывод на экран в строгом порядке имена и результаты лучших игроков} GoToXY(26, 8); write('Move Name'); GoToXY(26, 10); write(it[1]); GoToXY(36, 10); writeln(res[1]); GoToXY(26, 11); write(it[2]); GoToXY(36, 11); writeln(res[2]); GoToXY(26, 12); write(it[3]); GoToXY(36, 12); writeln(res[3]); GoToXY(26, 13); write(it[4]); GoToXY(36, 13); writeln(res[4]); GoToXY(26, 14); write(it[5]); GoToXY(36, 14); writeln(res[5]); GoToXY(26, 15); write(it[6]); GoToXY(36, 15); writeln(res[6]); GoToXY(26, 16); write(it[7]); GoToXY(36, 16); writeln(res[7]); GoToXY(26, 17); write(it[8]); GoToXY(36, 17); writeln(res[8]); GoToXY(26, 18); write(it[9]); GoToXY(36, 18); writeln(res[9]); GoToXY(26, 19); write(it[10]); GoToXY(36, 19);; writeln(res[10]); GoToXY(26, 23); writeln('For leaving press ENTER'); readln; end; procedure avtor; {Вывод общей информации на экран в раздел описание } var f: text; {Файловая переменная} g1: string; {Переменная которой присваивается очередная строка из файла и выводится на экран} begin clrscr; assign(f, 'fhelp1.txt'); reset(f); readln(f, g1); writeln(g1); readln(f, g1); writeln(g1); readln(f, g1); writeln(g1); readln(f, g1); writeln(g1); readln(f, g1); writeln(g1); readln(f, g1); writeln(g1); readln(f, g1); writeln(g1); readln(f, g1); writeln(g1); readln(f, g1); writeln(g1); readln(f, g1); writeln(g1); readln(f, g1); writeln(g1); readln(f, g1); writeln(g1); readln(f, g1); writeln(g1); readln(f, g1); writeln(g1); readln(f, g1); writeln(g1); readln(f, g1); writeln(g1); readln(f, g1); writeln(g1); writeln('For exit press ENTER'); readln; close(f); end; begin {Основная программа} {Вывод на экран главного меню} {Элементы Главного меню, один из которых закрашен белым цветом, а остальные зеленым} men[1]: =15; men[2]: =2; men[3]: =2; men[4]: =2; men[5]: =2; repeat clrscr; strok: =1; {Текущая строка} Lom: =1; {Выбор цветов} GoToXY(32, 10); Textcolor(men[1]); writeln('Key'); GoToXY(32, 11); Textcolor(men[2]); writeln('About program'); GoToXY(32, 12); Textcolor(men[3]); writeln('Play'); GoToXY(32, 13); Textcolor(men[4]); writeln('Results'); GoToXY(32, 14); Textcolor(men[5]); writeln('Exit'); ch: =readkey; {Выбор направления передвижение элементов меню} if (ord(ch)=80) then {Если вниз тогда текущий становится белым, а нижний становится зеленым} begin for i: =1 to 5 do begin if (men[i]=15) and (strok< > 5) then begin men[strok]: =2; men[strok+1]: =15; end else strok: =strok+1; end; end; if ord(ch)=72 then {Если вверх, то текущий белым, а верхний зеленым} begin for i: =1 to 5 do begin if (men[i]=15) and (strok< > 1)then begin men[strok]: =2; men[strok-1]: =15; end else strok: =strok+1; end; end; if ord(ch)=13 then {Если нажат ENTER} begin for i: =1 to 5 do begin if men[i]=15 then begin if Lom=1 then begin Help; break; end; {Переход в режим справки} if Lom=2 then begin avtor; break; end; {Переход в режим игры} if Lom=3 then begin Game15; break; end; {Переход в режим игры} if Lom=4 then begin result; break; end; {Переход в режим игры} end else Lom: =Lom+1; end; end; until Lom=5 {До тех пор пока не нажат пункт EXIT} end. Приложение 2 Результаты работы.
Для демонстрации результата работы программы, возьмем основной раздел ИГРА. При запуске программы появляется табло, заполненное случайными неповторяющееся цифрами от 1 до 15 и один пустой элемент (Рисунок 8).
Рисунок 8 – Основное табло со случайными числами
Рисунок 9 – Первый ход В дальнейшем перемещая по одной клетки, при помощи курсора, расклад будет выполнен. Весь процесс до победы может занять очень много ходов, поэтому перейдем к предпоследнему моменту. К примеру, игрок долго играл и у него выпал следующий расклад (Рисунок 10). Рисунок 10 – очередной ход.
Теперь пользователю необходимо сделать один, последний ход, а именно переместить клетку с цифрой 15 на пустой элемент. В результате расклад будет выполнен (Рисунок 11). В случае если игрок разложил требуемый расклад за наименьшее количество ходов, чем игроки, игравшие ранее, то пользователю предлагается ввести имя и в дальнейшем его имя и результаты будет отображаться в разделе Результаты (Рисунок 11). Рисунок 11 – конец игры |
Последнее изменение этой страницы: 2019-10-24; Просмотров: 172; Нарушение авторского права страницы