Шахматни фигури

Напишете програма, която позволява въвеждането на координатите на две фигури, и отпечатва дали първата ще вземе втората, ако първата е:

  • топ
  • офицер
  • кон
  • царица
Публикувано в с етикети , . Постоянна връзка.

2 коментара по Шахматни фигури

  1. kaloyan каза:
    VAR red,kolona,red2,kolona2,figura,kolonachar_1 : integer;
    kolonachar,kolona2char: char;
    figura1 : string;
    BEGIN
    repeat
        write('izberete figurata:',#13#10,'1 - top',#13#10,'2 - oficer',#13#10,'3 - kon',#13#10,'4 - carica',#13#10,'izberete: '); readln(figura);
        if ((figura<=0) or (figura>=5)) then writeln('-->figurata moje da bade ot 1 do 4, nemoje da bade ', figura); writeln;
    until ((figura>=1) and (figura<=4));
        if figura=1 then figura1:='top'
          else
        if figura=2 then figura1:='oficer'
          else
        if figura=3 then figura1:='kon'
          else
        if figura=4 then figura1:='carica';
    
      writeln('-->izbranata figura e ', figura1); writeln;
    
      writeln('vavedete koordinatite na parvata figura: ');
    repeat
      write('red: '); readln(red);
        if ((red<1) or (red>8)) then writeln('reda nemoje da bade ', red);
    until ((red>=1) and (red<=8));
    repeat
      write('kolona: '); readln(kolonachar);
        if (kolonachar>chr(104)) then writeln('kolonata nemoje da bade ', kolonachar);
    until (((kolonachar>=chr(97)) and (kolonachar<=chr(104))) or ((kolonachar>=chr(65)) and (kolonachar<=chr(72))));
        if ((kolonachar='a') or (kolonachar='A')) then kolona:=1
          else
        if ((kolonachar='b') or (kolonachar='B')) then kolona:=2
          else
        if ((kolonachar='c') or (kolonachar='C')) then kolona:=3
          else
        if ((kolonachar='d') or (kolonachar='D')) then kolona:=4
          else
        if ((kolonachar='e') or (kolonachar='E')) then kolona:=5
          else
        if ((kolonachar='f') or (kolonachar='F')) then kolona:=6
          else
        if ((kolonachar='g') or (kolonachar='G')) then kolona:=7
          else
        if ((kolonachar='h') or (kolonachar='H')) then kolona:=8;
    
      writeln('vavedete koordinatite na vtorata figura: ');
    repeat
      write('red: '); readln(red2);
    until ((red2>=1) and (red2<=8));
    repeat
      write('kolona: '); readln(kolona2char);
    until (((kolona2char>=chr(97)) and (kolona2char<=chr(104))) or ((kolona2char>=chr(65)) and (kolona2char<=chr(72))));
        if ((kolona2char='a') or (kolonachar='A')) then kolona2:=1
          else
        if ((kolona2char='b') or (kolonachar='B')) then kolona2:=2
          else
        if ((kolona2char='c') or (kolonachar='C')) then kolona2:=3
          else
        if ((kolona2char='d') or (kolonachar='D')) then kolona2:=4
          else
        if ((kolona2char='e') or (kolonachar='E')) then kolona2:=5
          else
        if ((kolona2char='f') or (kolonachar='F')) then kolona2:=6
          else
        if ((kolona2char='g') or (kolonachar='G')) then kolona2:=7
          else
        if ((kolona2char='h') or (kolonachar='H')) then kolona2:=8;
    // TOP
        if figura=1 then
          begin
            if ((red=red2) and (kolona=kolona2)) then writeln('-->koordinatite na dvete figuri sa edni i sa6ti')
              else
            if ((red=red2) or (kolona=kolona2)) then writeln('-->vzima q')
            else writeln('-->ne q vzima');
          end;
    // OFICER
        if figura=2 then
          begin
            if ((red=red2) and (kolona=kolona2)) then writeln('-->koordinatite na dvete figuri sa edni i sa6ti')
              else
            if (abs(red-red2)=abs(kolona-kolona2)) then writeln('-->vzima q')
            else writeln('-->ne q vzima');
          end;
    // KON
        if figura=3 then
          begin
            if ((red=red2) and (kolona=kolona2)) then writeln('-->koordinatite na dvete figuri sa edni i sa6ti')
              else
            if( (((red+2)=red2) and ((kolona+1)=kolona2)) or
                (((red-2)=red2) and ((kolona+1)=kolona2)) or
                (((red+1)=red2) and ((kolona+2)=kolona2)) or
                (((red-1)=red2) and ((kolona+2)=kolona2)) or
                (((red-2)=red2) and ((kolona-1)=kolona2)) or
                (((red+2)=red2) and ((kolona-1)=kolona2)) or
                (((red+1)=red2) and ((kolona-3)=kolona2)) or
                (((red-1)=red2) and ((kolona-2)=kolona2))   ) then writeln('-->vzima q')
                else writeln('-->ne q vzima');
          end;
    // CARICA
        if figura=4 then
          begin
            if ((red=red2) and (kolona=kolona2)) then writeln('-->koordinatite na dvete figuri sa edni i sa6ti')
              else
            if ((red=red2) or (kolona=kolona2) or (((abs(red-red2))=(abs(kolona-kolona2))))) then writeln('-->vzima q')
            else writeln('-->ne q vzima');
          end;
    
    readln;
    END.
    
  2. Данаил каза:

    Калояне, решението на задачата е вярно. Поздравления за това, че се справи с тази задача, която е доста по-сложна от тези, които сме решавали до момента.

    Какво ми харесва в решението ти:
    * разглеждаш обстойно всички възможни варианти
    * правиш проверка за невалидни стойности на входните величини
    * програмата извежда информативни съобщения и е достатъчно дружелюбна с потребителя
    * имената на променливите са добре подбрани
    * кодът е структуриран много добре, така че е ясно кой блок в кой е
    * има коментари на ключовите места

    Какво още може да се подобри в нея:
    * да има повече коментари в основните блокове – така кодът ще бъде по-разбираем за другите, а и за теб след време
    * вместо да използваш chr(104) и т.н., може да ползваш самия символ – ‘h’ – по-ясно ще е за какво става въпрос
    * за получаване на номера на колоната вместо тези толкова много if-ове може да ползваш следното:

    if kolonachar>='a' then
    kolona:=Ord(kolonachar) - Ord('a') + 1
    else kolona:=Ord(kolonachar) - Ord('A') + 1;

    * проверката за еднакви координати на фигури може да е преди всички други, защото тя е еднаква за всички
    * проверката за конче ще е по-оптимално да е така:

    if ((abs(red-red2)= 2) and (abs(kolona-kolona2)=1)) or
    ((abs(red-red2)= 1) and (abs(kolona-kolona2)=2)) then
    writeln('-->vzima q')

    * създай си навика да не добавяш няколко команди на един ред. Това прави кода на програмата по-нечетлив, по-труден за редактиране и дебъгване.

    Това е. Очаквам да пуснеш подобрено решение :-)

Вашият коментар