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;