- Четко построенный алгоритм;
- Интуитивно понятный интерфейс;
- Удобное управление;
- Простота в использовании;
- Вполне понятное руководство пользователя;
- Отсутствие лишних дополнений.
11. Список литературы
10.1 Учебное пособие. «Основы алгоритмизации и программирования», Е. Н. Сафьяновой
10.2 Самоучитель. «Программирование в TurboPascal», Н. Культин.
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; {Файловая переменная}