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

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

Форум «Всё о Паскале» _ Задачи _ Пасьянс

Автор: Anastacia Adesso 7.12.2006 16:28

И вот ещё такой вопрос.

Есть программа. Суть-Пасьянс Free Cell. Задача- всего лишь раскинуть карты перед началом игры.

Хмм эта всего лишь выдаёт карты (постоянно одинаковые), попросту записано в теле программы, что где стоит.

А как можно написать, чтоб всегда всё было разное?
То есть чтоб были реально только, наверное в массиве, карты. Рандомизировать.. Но, чтоб не было повторов карт..
Я wacko.gif

Прикрепленный файл  UZD5.PAS ( 1.89 килобайт ) Кол-во скачиваний: 405

Автор: volvo 7.12.2006 16:38

Ну, наверное,

for i:=2 to 14 do zn[i]:=i;
for j:=1 to 4 do m[j]:=j;

заменить на:
var
X: byte;
S: set of byte;
...

randomize;
S := [];
for i := 2 to 14 do begin
repeat
X := random(13) + 2;
until not (X in S);

S := S + [X];
zn[i]:=X;
end;

S := [];
for i := 1 to 4 do begin
repeat
X := random(4) + 1;
until not (X in S);

S := S + [X];
m[i]:=X;
end;

?

Автор: Anastacia Adesso 7.12.2006 16:48

Урррра!!
Заработало!!! rolleyes.gif lol.gif

Автор: Anastacia Adesso 7.12.2006 17:06

Только теперь вот трудность появилась с выводом этих карт.

Тот жуткий кусок просто не нужен получается

Автор: volvo 7.12.2006 17:37

Ты знаешь, я бы на твоем месте сделал что-то вот такого типа все-таки:

uses crt;


var
cards: array[1 .. 52] of record
z, m: byte;
end;
i,j: integer;


procedure pech1(i:integer);
begin
case i of
2..10:write(i:5);
11:write(' J');
12:write(' Q');
13:write(' K');
14:write(' A');
end;
end;

procedure pech2(j:integer);
begin
case j of
1:write(chr(3));
2:write(chr(4));
3:write(chr(5));
4:write(chr(6));
end;
end;

procedure pech(i,j:integer);
begin
pech1(i);
pech2(j);
end;

var
X: byte;
S: set of byte;
begin
clrscr;

for i := 1 to 52 do
with cards[i] do begin
z := (pred(i) mod 13) + 2;
m := (pred(i) div 13) + 1;
end;

s := [];
for i := 1 to 52 do begin

repeat
X := random(52) + 1;
until not (X in S);
s := S + [X];
pech(cards[X].z, cards[X].m);
if i mod 4 = 0 then writeln;

end;

end.

Автор: Anastacia Adesso 7.12.2006 20:05

Коротко, красиво...Но...

Почему-то у меня всё работает как надо (само расположение карт в два блока), только в случае когда я делаю подобный ужас

writeln('            0(1)                      0(13) ');writeln;
i:=0;
for i:=1 to 6 do begin randomize;
pech(zn[13],m[2]);pech(zn[4],m[4]);pech(zn[11],m[3]);pech(zn[8],m[2]);
write(' ');
pech(zn[5],m[2]);pech(zn[13],m[4]);pech(zn[14],m[1]);pech(zn[3],m[4]);
writeln; writeln;
end;
pech(zn[13],m[2]);pech(zn[4],m[4]);pech(zn[11],m[3]);pech(zn[8],m[2]);
write(' ');
readkey;
end.


Но это же грубо unsure.gif
При том что все столбики одинаковы

Автор: volvo 7.12.2006 20:25

Ты бы еще рассказала, КАКИМ образом ты выбираешь то, что должно быть в левом блоке, а каким - то, что должно быть в правом? Случайно? Зависимость левого от правого? Правого от левого?

Автор: Anastacia Adesso 7.12.2006 20:45

На самом деле это простая колода карт.
Разбросана один раз.
Например таким образом.
Прикрепленное изображение
Прикол в том,что надо визуально отделить эти два столба, естественно, чтоб все карты были разные

Автор: volvo 7.12.2006 20:52

Цикл вывода (в сообщении №5) чуть подправь:

...
s := [];
for i := 1 to 52 do begin

repeat
X := random(52) + 1;
until not (X in S);
s := S + [X];
pech(cards[X].z, cards[X].m);

if i mod 8 = 0 then writeln { <--- Вот это добавить и ниже }
else if i mod 4 = 0 then write(' ');

end;
...

Автор: Anastacia Adesso 7.12.2006 21:05

Урааааа!!!!
Теперь да, работает!!!
lol.gif yes2.gif