Игра "Открой двери". 4 двери, 4 ключа. Pascal.

Ответить
Gregory
Сообщения: 3
Зарегистрирован: 29 ноя 2008, 19:49

Помогите, пожалуйста, написать игрушку. Осталось 6 лаб написать. На этой вот застрял. Креатива не хватает. Может кто уже сталкивался с такой?

Генерация случайных последовательностей чисел.
”Открой двери”. Перед играющим 4 запертые двери. Открыть все двери, имея 4 ключа, каждый из которых может подходить к нескольким дверям. Предлагается 10 попыток. Двери изображаются цифрами от 1 до 4, а ключи помечены буквами от А до D. За один ход играющий выбирает один ключ и пробует открыть любую запертую дверь. Соответствие между множеством дверей и множе-ством ключей устанавливается случайным образом.
Esgal
Сообщения: 78
Зарегистрирован: 04 ноя 2008, 01:15

нет никаких ограничений на то ко скольким дверям будет подходить ключ?

например если ключ А открывает двери 1, 2, 4, то логично что у них одинаковые замки, и не может существовать ключа. который бы открывал, на пример, двери 2 и 3...

и может ли быть такое что в наборе ключей попадаются одинаковые?
и можно ли одним ключём открыть несколько дверей. или после использования ключ "пропадает?

или могут существоать ключи А(открывает 1 и 4), В(открывает 1 и 2)?

сейчас напишу вот как
так как будто могут существовать ключи А(открывает 1 и 4), В(открывает 1 и 2), и после успешного использование с ключём ничего не происходит, и каждая дверь должна открываться хотябы одним ключём

сегодня сделаю если меня ничего не отвлечёт, ждите
Esgal
Сообщения: 78
Зарегистрирован: 04 ноя 2008, 01:15

Обещал, сделал!
Алгоритм далеко не идеальный, но всё работает.... можете попробовать упростить, убрать чтонибудь лишнее, добавить чтонибудь своё...
В общем распоряжайтесь...

прошу

Код: Выделить всё

program doors;
uses crt;
const count=4;
type num=1..count;
var locks:array[num,num] of 0..1; {dver,kluch}
    OpenDoors:array[num] of boolean;
    door,key:char;
    IDoor,IKey:num;
    t,done:0..10;

procedure CreateLocks;
var i,j:num;
    k:0..count;
    flag:boolean;
begin
  randomize;
  flag:=false;
  for i:=1 to count do
    begin
      k:=0;
      for j:=1 to count do
        begin
          locks[i,j]:=random(2);
          if locks[i,j]=0 then inc(k);
        end;
      if k=4 then flag:=true;
    end;
  if flag=true then CreateLocks;
end;

function KeyToInt(k:char):num;
begin
  case k of
   'a':KeyToInt:=1;
   'b':KeyToInt:=2;
   'c':KeyToInt:=3;
   'd':KeyToInt:=4;
  else
    begin
    end;
  end;
end;

function DoorToInt(k:char):num;
begin
  case k of
   '1' :D oorToInt:=1;
   '2' :D oorToInt:=2;
   '3' :D oorToInt:=3;
   '4' :D oorToInt:=4;
  else
    begin
    end;
  end;
end;

function DoorOpen(d,k:num):boolean;
begin
  if locks[d,k]=1 then DoorOpen:=true
  else DoorOpen:=false;
end;

procedure DInit;
var i:num;
begin
  t:=0;
  done:=0;
  for i:=1 to count do OpenDoors[i]:=false;
end;

begin
  clrscr;
  DInit;
  CreateLocks;
  writeln('Pered vami 4 dvery, u vas 4 klucha, i 10 popitok...');
  repeat
    writeln;
    writeln('Viberete cluch (nazhmite a, b, c ili d) ');
    key:=readkey;
    writeln('Podoydite k dveri (nazhmite 1, 2, 3 ili 4) ');
    door:=readkey;
    writeln('Vi hotite popytatsy otkrit dver? (y/n)');
    if readkey='y' then
      begin
        inc(t);
        IKey:=KeyToInt(key);
        IDoor:=DoorToInt(door);
        if OpenDoors[IDoor]=false then
          if DoorOpen(IDoor,IKey) then
            begin
              writeln('Vam udalos otkrit dver!');
              OpenDoors[IDoor]:=true;
              inc(done);
            end
          else writeln('Vam ne udalos otkrit dver...')
        else
          begin
            writeln('Vi uzhe pitalis otkrit etu dver');
            dec(t);
          end;
      end;
    if done=4 then break;
    writeln;
    writeln('U vas esche ',10-t,' popitok');
  until t=10;
  if done=4 then writeln('Pozdravlaem vas s pobedoy!')
  else writeln('Vi proigrali');
  readln;
end.

Вот както так)
Вопросы будут, пишите

Прикреплю исходник
Вложения

[Расширение txt было запрещено, вложение больше недоступно.]

capta1n
Сообщения: 2
Зарегистрирован: 08 дек 2008, 02:19

ТОж написал задачку-игру вашу с комментами - обращаться по ICQ 397097640
Esgal
Сообщения: 78
Зарегистрирован: 04 ноя 2008, 01:15

если что непонятно, откоменчу

хотя есйчас уже самому не очень нраивтся реальзация открывания двери
Gregory
Сообщения: 3
Зарегистрирован: 29 ноя 2008, 19:49

Esgal: Странно, ругается на key:=readkey;
capta1n: Не могу вас найти, пишет, что юзера с таким номером не существует.
capta1n
Сообщения: 2
Зарегистрирован: 08 дек 2008, 02:19

Gregory : дико извиняюсь, я ошибся в цифрах =))) извиняюсь - вот аська 397970640
Esgal
Сообщения: 78
Зарегистрирован: 04 ноя 2008, 01:15

какая версия компилятора?

на турбо паскале не помню каком всё нормально


МОжно заменить на readln(key);
Ответить