Привет ребята выручайте. У меня курсовик игра "о счастливчик". Я не могу написать
продедуру(функцию, незнаю) которая бы вводила в графическом режиме вопросы и записывала
их в файл:
1. В начале появляется прямоугольник в котором выбирается уровень сложности вопросов. Если
пользователь введет цифру 1 значит должен активироваться 1 файл( так и с цифро 2 -- актив. 2
файл, 3 -- актив. 3 файл).
2. Потом пользователь нажимает клавишу и появляется окно для ввода вопроса (все идет в
графическом режиме). И после ввода вопроса, нажимаем любую клавишу и этот вопрос
записывается в файл.
3. Потом после ввода вопроса пользователь нажимает клавишу и появляется окно для ввода
правильного ответа. И после ввода ответа, нажимаем любую клавишу и этот ответ записывается
в файл.
4. И так для 3 не правильных ответов.
Причем ввод идет в графическом режиме(тоесть нада продедура ввода текста в граф. режим).
Моя проблема в том что я не понимаю как записать и куда все эти вопросы( а их может быть много) и
ответы. И что бы при случайном выводе вопроса в графический режим ответы(и не правильные
ответы) тоже должны совпадать с этим вопросом).
Прикрепленные файлы
file.PAS ( 2.3 килобайт )
Кол-во скачиваний: 266
Ты начинаешь не с того, с чего нужно начинать... Напиши сначала программу, которая будет стабильно работать в текстовом режиме, безо всяких финтифлюшек и рюшечек... А вот когда она заработает, тогда поменять процедуру ввода с текста на графику + изменить внешний вид интерфейса - дело получаса...
type
tquest = record
question: string[50];
answers: array[1 .. 4] of string[30];
right_answer: byte;
end;
var f_in: file of tquest;
как их связать чтобы при выводе вопроса нужные ответы выводились. И right_answer: byte это зачем???
Читаешь из файла запись полностью, в ней сразу будут содержаться И вопрос И 4 варианта ответа... Вот их и выводи на экран.
var zap: tquest;
...
writeln(zap.question);
for i:=1 to 4 do
writeln(zap.answers[i]);
мисс_граффити все так и делаю. Подскажите еще как несколько вопросов записать, а то они у меня один на другой накладываются..???
у меня ничего ни на что не накладывается
показывай, как делаешь
type
Tvopros=record
question: string;
answer: array [1..4] of string[30];
ranswer: byte;
end;
var
s1:Tvopros;
f1: file of Tvopros;
f2: file of Tvopros;
f3: file of Tvopros;
ch:char;
procedure vvod1; {ввод вопросов для 1 файла}
var
i:integer;
begin
writeln('Question???');
readln(s1.question);
readkey;
for i:=1 to 4 do
begin
writeln('answer', i);
readln(s1.answer[i]);
end;
assign(f1, 'D:\all\1.bin');
reset(f1);
write(f1, s1);
close(f1);
end;
procedure out; {процедура вывода вопросов и ответов}
var
i:integer;
begin
assign(f1, 'D:\all\1.bin');
reset(f1);
read(f1, s1);
writeln(s1.question);
for i:=1 to 4 do
writeln(s1.answer[i]);
end;
Стоп... Ты что, для ввода КАЖДОГО вопроса используешь vvod1? Там же у тебя Reset... Само собой все вопросы будут писаться в первую запись... Надо в основной программе открыть файл, а в процедуре никаких Reset чтоб не было...
Скажем, так:
var
f1: file of Tvopros;
...
procedure vvod1; {ввод вопросов для 1 файла}
var
i:integer;
begin
write('Question???'); readln(s1.question);
readkey;
for i:=1 to 4 do
begin
write('answer', i, ': '); readln(s1.answer[i]);
end;
write(f1, s1)
end;
{ Основная программа: }
...
{ Открыл файл }
assign(f1, 'D:\all\1.bin');
reset(f1);
for i := 1 to 20 do begin
vvod1; { Вводишь 20 вопросов }
end;
{ Ввод окончен - файл можно закрыть }
close(f1);
...
n := random(filesize(f1));
seek(f1, n);
read(f1, s1);
А как сделать чтобы если вопрос раньше выводился то потом он не выводился???
Я так понимаю, что если номер вопроса будет равен предыдущему номеру выведенного вопроса, то тогда надо вывести другой вопрос. Только как это записать???
Я бы сделал массив булинов размером с количество вопросов. В моём компиляторе все элементы массива изначально принимаю значения False.
n := random(filesize(f1));
If ms[n + 1] = False then
begin
seek(f1, n);
read(f1, s1);
ms[n + 1] := True;
end else writeln ('Vopros uzhe bil');
ms: array [0..{максимальное количество вопросов}] of boolean;
Почему с 1? Индексация в файле начинается с 0, здесь тоже надо бы с нуля...
Опять с этими вопросами, как сделать так что бы эти вопросы блокировались после вывода. Просто как посоветовал Tan немного не то, надо что после того как вывелся вопрос, он блокировался до нового запуска..
ну возьми так как я тебе советовал только после else не выводи сообщение о том, что вопроса нет а так :
else continue;то есть ничего не изменится и программа продолжит работу, организуй цикл.
procedure vvod;
var
s:string;
x,y:integer;
begin
s:='';
x:=72;
y:=88;
repeat
ch:=readkey;
case ch of
#0:
begin
ch:=readkey;
end;
#13:;
#8: if length(S)>0 then
begin
bar(x,y, x+textwidth(s), y+textheight(s));
s[0]:=chr(length(s)-1);
outtextxy(x, y, s);
end;
else
begin
s:=s+ch;
outtextxy(x,y, s);
end;
end;
until ch=#13;
end;
Люди как сделать, помогите! ПОЖАЛУЙСТА.
Народ скажите тут мы в записи объявляли right_answer для того что знать правильный ответ. Так вот что надо присвоить right_answer
Допустим
var
s1: Tquestion;
begin
s1.right_answer:=???????????
Че сложно ответить???