Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ Бег трех звездочек

Автор: JoB 14.11.2005 22:40

Дословно: написать программу для трех звездочек...
выглядит эта прога примерно так: на экрани носятся три звездочки, начиная свой "бег" слевого края экрана и заканчивая правым краем (при этом звездочки не выходят за приделы экрана и не меняет своей строки) Каждая звездочка проходит эту дистанцию по разному, при чем скорость звездочки меняется с каждым новым "забегом".
*
*
*
Вот что то в этом роде...
Я конечно ща сяду сам писать эту прогу, но хотелось бы услышать совет профессионалов.

Автор: Guest 16.11.2005 2:44

Вот немного пописал эту прогу...

uses crt;
var i,i1,i2,s,mesto:integer;
begin
clrscr;
randomize;
i:=2;i1:=1;i2:=1;mesto:=1;
repeat
s:=random(2);
delay(50);
If s=0 then
begin
i:=i+1;
textcolor(white);
gotoxy(i,1);
write('*');
end
else
if s=1 then
begin
i1:=i1+1;
textcolor(white);
gotoxy(i1,1);
write('*');
end
else
begin
i2:=I2+1;
textcolor (white);
gotoxy(i2,3);
write('*');
end;
if i=80 then
begin
mesto:=mesto+1;
gotoxy(1,mesto+3);
writeln ('tochka1 zanila1',mesto,'mesto');
end;
if i=1 then
begin
mesto:=mesto+1;
gotoxy(1,3+mesto);
writeln ('tochka2 zanila',mesto,'mesto');
end;
begin
if i2=80 then
mesto:=mesto+1;
gotoxy(1,mesto+3);
write ('3 tochka zanila' ,mesto,'mesto');
end;
until(i>=80)and(i1>=80)and(i2>=80);
readln
end.



но проблема осталась почему то она выводит только результат третьей звездочки, и только ее перемещения по экрану... blink.gif Причем от звездочки остаются сдеды... а мне б хотелось что б она бежала, конечно я подозреваю что бы это сделать надо просто заменить цвет звездочки на черный. но вот только как это сделать.....
помогите!!!

М
теги для кода ставь
Altair


Автор: volvo 16.11.2005 2:51

Guest, вот тебе программа... Добавь вывод результатов и все готово blum.gif

uses crt;

const
n = 3;
var
delta, pos: array[1 .. n] of integer;
finish: boolean;
i: integer;

begin
clrscr;
randomize;
for i := 1 to n do begin
pos[i] := 1;
delta[i] := random(3) + 1;
end;

finish := false;
repeat
i := 1;
delay(125);
repeat
gotoxy(1, 10+i); clreol;
gotoxy(pos[i], 10+i); write('*');
inc(pos[i], delta[i]);
finish := pos[i] >= 80;
inc(i)
until (i > n) or finish;
until finish;
end.

Автор: JoB 16.11.2005 2:55

спасибо... good.gif

Автор: JoB 16.11.2005 3:18

тут не большая проблема возникла, две из звездочек в любом случае идут пораллельно, как исправить, что б все 3 шли асинхронно...
и еще что такое ink

Автор: volvo 16.11.2005 3:26

Цитата
как исправить, что б все 3 шли асинхронно...

Вот так:
uses crt;

const
n = 3;
var
delta, pos: array[1 .. n] of integer;
finish: boolean;
i, plus: integer;
T: set of byte;

begin
clrscr;
randomize; T := [];
for i := 1 to n do begin
pos[i] := 1;

{ Генерируем НЕповторяющиеся числа}
repeat
plus := random(4) + 1;
until not (plus in T); { Число еще не было сгенерировано ранее }

{
Добавить его во множество, в следующий раз
оно не должно повториться
}
T := T + [plus];
delta[i] := plus + 1;
end;

finish := false;
repeat
i := 1;
delay(125);
repeat
gotoxy(1, 10+i); clreol;
gotoxy(pos[i], 10+i); write('*');
inc(pos[i], delta[i]);
finish := pos[i] >= 80;
inc(i)
until (i > n) or finish;
until finish;
end.


А Inc(X) это то же самое, что и X := X + 1;

Автор: JoB 16.11.2005 4:04

Слушай, агромное тебе спасибо... smile.gif

Автор: Guest 16.11.2005 4:35

если я тебя еще не достал...
Скажи что за тип такой просто не первый раз встречаю set of byte;
и еще что такое clreol
А можно сделать так что б все точки добегали до финиша и еще тут попытался сделать вывод, но понятно как сделать вывод о победителе,а как о остальных звездочках - какое они место заняли...=)
...
gotoxy(1, 10+i); clreol;
gotoxy(pos[i], 10+i); write('*');
inc(pos[i], delta[i]);
finish := pos[i] >= 80;
i:=i+1;
until (i > n) or finish;
until finish;
writeln;
i:=i-1;
writeln('pobeda ', i ,' tochki');
readln
end.

Автор: Guest 16.11.2005 4:56

clreol - это очищение экрана от лишних звездочек, я понял =)

Автор: volvo 16.11.2005 4:58

Цитата
а как о остальных звездочках

так:
...
until finish; { это - окончание соревнования, то что было у меня }

writeln;
dec(i);
writeln('#', i, ' первое место');

if i = 1 then plus := 2
else plus := 1;

if pos[plus] > pos[6 - (plus + i)] then
writeln('#', plus, ' второе; #', 6 - (plus + i), ' третье')
else
writeln('#', 6 - (plus + i), ' второе; #', plus, ' третье');
end.



Цитата
что за тип такой просто не первый раз встречаю set of byte;
Это множество, сожержащее значения типа Byte. Подробнее про множества читай здесь:
http://forum.pascal.net.ru/index.php?showtopic=3318

Цитата
что такое clreol
Указание программе удалить все символы от текущего положения курсора до конца строки (курсор при этом остается на том же месте...)

Автор: JoB 16.11.2005 5:13

теперь уже толчно все работает и все рулез...
Короче спасибо тебе от всего Строительного Факультета АГТУ =)... good.gif