Delphi. Учимся на примерах - страница 29

стр.

>

> AssignFile(f2, dir2);

> Reset(f1); //открываем первый файл на чтение

> Rewrite(f2); //второй – на запись

> while not Eof(fl) do

> begin //пока не достигнут конец первого файла

>  Read(f1, cop); //считываем один символ из файла

>  сор:= Chr(Ord(cop) xor 101); //расшифровываем символ

>  Write(f2, сор); //записываем расшифрованный символ в файл

end;

> CloseFile(f1); //закрываем первый файл

> CloseFile(f2); //закрываем второй файл

> {$I+} //включаем контроль ошибок ввода/вывода

Win:= TIniFile.Create(dir2); //работаем с ini-файлом

> //считываем количество вопросов в базе

> ss:= Win.ReadString('num', 'num', ss);

> //преобразовываем строку в число и записываем значение в n

n:= StrToInt(ss);

> vopr:=Random(4) + 1;

>//случайное число от 1 до 4

vars(vopr); {передаем число процедуре vars, которая сортирует варианты ответов}

>end;

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

Теперь очередь процедуры question_select:

>procedure TForm1.question_seleсt();

>label ran; //метка ran для быстрого перехода

>begin

> Randomize;

>ran:

> a:=Random(n); //выбираем случайный вопрос из базы

> //проверяем: не задавали ли мы этот вопрос ранее

> for i:=1 to n do

>  if mass[i] = a then goto ran;

> for i:=1 to n do

>  if mass[i] = 0 then begin

>   mass[i]:= а; {записываем номер вопроса, чтобы не задавать его больше }

>   Break;

end;

> //сбрасываем флажки со всех вариантов ответов

> an1.Checked:= False;

> an2.Checked:= False;

> an3.Checked:= False;

> an4.Checked:= False;

>end;

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

Процедура verno:

>procedure TForm1.verno();

>begin

> if an1.Checked then

>  if yes = an1.Caption then balls:= balls + 1;

> if an2.Checked then

>  if yes = an2.Caption then balls:= balls + 1;

> if an3.Checked then

>  if yes = an3.Caption then balls:= balls + 1;

> if an4.Checked then

>  if yes = an4.Caption then balls:= balls + 1;

>end;

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

Процедура vars:

>procedure TForm1.vars(var variant: integer);

>begin

> //вызываем процедуру выбора случайного вопроса question_select();

> case variant of

> 1:

>  begin

>   Win:= TIniFile.Create(dir2); //открываем ini-файл

>   //считываем вопрос

>   Memo1.Text:= Win.ReadString('Q', IntToStr(a), Memo1.Text);

>   //считываем правильный вариант ответа

>   an1.Caption:= Win.ReadString('A', IntToStr(a), an1.Caption);

>   //считываем три неверных варианта к данному вопросу

>   an2.Caption:= Win.ReadString('W1', IntToStr(a), an2.Caption);

>   an3.Caption:= Win.ReadString('W2', IntToStr(a), an3.Caption);

>   an4.Caption:= Win.ReadString('W3', IntToStr(a), an4.Caption);

>   Win.Free; //освобождаем ini-файл

>   //помечаем первый вариант как правильный

>   yes:= an1.Caption;

>  end;

> 2:

>  begin

>   Win:= TIniFile.Create(dir2);

>   Memo1.Text:= Win.ReadString('Q', IntToStr(a), Memo1.Text);

>   an2.Caption:= Win.Readstring('A', IntToStr(a), an2.Caption);

>   an1.Caption:= Win.Readstring('W1', IntToStr(a), an1.Caption);

>   an3.Caption:= Win.ReadString('W2', IntToStr(a), an3.Caption);

>   an4.Caption:= Win.ReadString('W3', IntToStr(a), an4.Caption);

>   Win.Free;

>   yes: = an2.Caption;

>  end;

> 3:

>  begin

>   Win:= TIniFile.Create(dir2);

>   Memo1.Text:= Win.ReadString('Q', IntToStr(a), Memo1.Text);

>   an3.Caption:= Win.ReadString('A', IntToStr(a), an3.Caption);

>   an2.Caption:= Win.ReadString('W1', IntToStr(a), an2.Caption);

>   an1.Caption:= Win.ReadString('W2', IntToStr(a), an1.Caption);

>   an4.Caption:= Win.ReadString('W3', IntToStr(a), an4.Caption);

>   Win.Free;

>   yes:= an3.Caption;

>  end;