Advertisement
Sauka1337

Untitled

Dec 18th, 2023
55
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Delphi 43.92 KB | None | 0 0
  1. program Project3;
  2.  
  3. {$APPTYPE CONSOLE}
  4. {$R *.res}
  5.  
  6. uses
  7.     System.SysUtils,
  8.     Classes,
  9.     Windows;
  10.  
  11. const
  12.   AnimationFrames: array [0..3] of string = (
  13.     '|', '/', '-', '\'
  14.   );
  15.  
  16. Type
  17.     TWordsArr = Array Of String;
  18.     TPosArr = Array Of Integer;
  19.  
  20. Function CheckWordsEquality(Const WordFromData, InputedWord: String): Boolean;
  21. Var
  22.     I, Pos: Integer;
  23. Begin
  24.     Pos := Length(InputedWord) + 1;
  25.     For I := 1 To Length(WordFromData) Do
  26.     Begin
  27.         If Not(WordFromData[I] = InputedWord[Pos - I]) Then
  28.         Begin
  29.             CheckWordsEquality := False;
  30.             Exit();
  31.         End;
  32.     End;
  33.     CheckWordsEquality := True;
  34. End;
  35.  
  36. // тут вообще ничего не трогать никому руки откушу.
  37. procedure ClearScreen;
  38. var
  39.     stdout: THandle;
  40.     csbi: TConsoleScreenBufferInfo;
  41.     ConsoleSize: DWORD;
  42.     NumWritten: DWORD;
  43.     Origin: TCoord;
  44. begin
  45.     stdout := GetStdHandle(STD_OUTPUT_HANDLE);
  46.     Win32Check(stdout <> INVALID_HANDLE_VALUE);
  47.     Win32Check(GetConsoleScreenBufferInfo(stdout, csbi));
  48.     ConsoleSize := csbi.dwSize.X * csbi.dwSize.Y;
  49.     Origin.X := 0;
  50.     Origin.Y := 0;
  51.     Win32Check(FillConsoleOutputCharacter(stdout, ' ', ConsoleSize, Origin,
  52.       NumWritten));
  53.     Win32Check(FillConsoleOutputAttribute(stdout, csbi.wAttributes, ConsoleSize,
  54.       Origin, NumWritten));
  55.     Win32Check(SetConsoleCursorPosition(stdout, Origin));
  56. end;
  57. // дальше трогайте
  58.  
  59. Function FindWordPos(Const Arr: TWordsArr; InputedWord: String): Integer;
  60. Var
  61.     I: Integer;
  62. Begin
  63.     for I := Low(Arr) to High(Arr) do
  64.     Begin
  65.         if CompareText(Arr[I], InputedWord) = 0 then
  66.         Begin
  67.             FindWordPos := I;
  68.             Exit();
  69.         End;
  70.     End;
  71.     FindWordPos := -1;
  72. End;
  73.  
  74. function CheckWordsExistanceInArr(Const Arr, InputedWords: TWordsArr): Boolean;
  75. Var
  76.     I, J, CountArr, CountInputed: Integer;
  77. Begin
  78.     for I := Low(InputedWords) to High(InputedWords) do
  79.     Begin
  80.         CountArr := 0;
  81.         CountInputed := 0;
  82.         for J := Low(Arr) to High(Arr) do
  83.         Begin
  84.             if CompareText(Arr[J], InputedWords[I]) = 0 then
  85.                 Inc(CountArr);
  86.             if CompareText(InputedWords[J], InputedWords[I]) = 0 then
  87.                 Inc(CountInputed);
  88.         End;
  89.         if CountArr <> CountInputed then
  90.         Begin
  91.             CheckWordsExistanceInArr := False;
  92.             Exit;
  93.         End;
  94.     End;
  95.     CheckWordsExistanceInArr := True;
  96. End;
  97.  
  98. function CheckWordsOrder(WordsFromData, InputedWords: TWordsArr): Boolean;
  99. var
  100.     I: Integer;
  101. begin
  102.     Result := True;
  103.     if Length(WordsFromData) <> Length(InputedWords) then
  104.     begin
  105.         Result := False;
  106.         Exit;
  107.     end;
  108.     for I := Low(WordsFromData) to High(WordsFromData) do
  109.     begin
  110.         if WordsFromData[I] <> InputedWords[I] then
  111.         begin
  112.             Result := False;
  113.             break;
  114.         end;
  115.     end;
  116. end;
  117.  
  118. function ReverseString(const S: string): string;
  119. var
  120.     I: Integer;
  121. begin
  122.     SetLength(Result, Length(S));
  123.     for I := 1 to Length(S) do
  124.     begin
  125.         Result[I] := S[Length(S) - I + 1];
  126.     end;
  127. end;
  128.  
  129. function ReverseWords(Words: TWordsArr): TWordsArr;
  130. var
  131.     I: Integer;
  132. begin
  133.     SetLength(Result, Length(Words));
  134.     for I := Low(Words) to High(Words) do
  135.     begin
  136.         Result[I] := ReverseString(Words[I]);
  137.     end;
  138. end;
  139.  
  140. function ReverseArr(Arr: TWordsArr): TWordsArr;
  141. var
  142.     I: Integer;
  143. begin
  144.     SetLength(Result, Length(Arr));
  145.     for I := Low(Arr) to High(Arr) do
  146.     begin
  147.         Result[High(Arr) - I] := Arr[I];
  148.     end;
  149. end;
  150.  
  151. function ReadWordsFromFile(const FileName: string): TStringList;
  152. var
  153.     Reader: TStreamReader;
  154.     S: string;
  155.     Words: TStringList;
  156. begin
  157.     Words := TStringList.Create;
  158.     Reader := TStreamReader.Create(FileName, TEncoding.UTF8);
  159.     try
  160.         while not Reader.EndOfStream do
  161.         begin
  162.             S := Reader.ReadLine;
  163.             Words.Add(S);
  164.         end;
  165.     finally
  166.         Reader.Free;
  167.     end;
  168.     Result := Words;
  169. end;
  170.  
  171. Function GetRandomWord(Words: TStringList): string;
  172. var
  173.     Index: Integer;
  174. begin
  175.     Index := Random(Words.Count);
  176.     Result := Words[Index];
  177. end;
  178.  
  179. procedure CongratulateUser;
  180. begin
  181.     Writeln('Поздравляем! Вы успешно прошли все этапы.');
  182.     Writeln('Вы продемонстрировали отличную память и внимательность.');
  183.     Writeln('Спасибо за игру. Надеемся, вам понравилось!');
  184.     Writeln('Нажмите клавишу Enter, чтобы завершить игру.');
  185. end;
  186.  
  187. procedure DisplayRulesFirstStageAndContinue;
  188. var
  189.     input: string;
  190. begin
  191.     Writeln('Этап 1: На экране на некоторое время отображается слово из 5 букв, а затем пропадает.');
  192.     Writeln('Пользователь вводит с клавиатуры это же слово, но в обратном порядке («перевернутым»)');
  193.     Writeln('Например:');
  194.     Writeln('Исходное слово');
  195.     Writeln('СТОЛБ');
  196.     Writeln('Слово, введенное пользователем');
  197.     Writeln('БЛОТС');
  198.     Writeln('ОТВЕТ ВЕРНЫЙ!');
  199.     Writeln('Программа анализирует введенную строку и выдает сообщение о верном (пользователь ввел');
  200.     Writeln('«перевернутое» слово правильно) или неверном вводе');
  201.     Writeln('Затем появляется новое слово с тем же количеством букв и ожидается новый ввод');
  202.     Writeln('«перевернутого» слова. После правильно введенных трех подряд верных «перевернутых» слов');
  203.     Writeln('начинают выводиться слова длиннее на одну букву и так до тех пор, пока пользователь не введет');
  204.     Writeln('подряд три «перевернутых» 8 буквенных слова. На том этап 1 завершен.');
  205.     repeat
  206.         Writeln('Хотите продолжить? (д/н)');
  207.         ReadLn(input);
  208.     until (input = 'Д') or (input = 'д') or (input = 'Н') or (input = 'н');
  209.     if (input = 'Н') or (input = 'н') then
  210.         Halt;
  211. end;
  212.  
  213. procedure DisplayRulesSecondStageAndContinue;
  214. var
  215.     input: string;
  216. begin
  217.     Writeln('Этап 2: На экране на некоторое время отображается последовательность из 5 различных слов, а');
  218.     Writeln('затем пропадает. Пользователь вводит с клавиатуры эти же слова в произвольном порядке.');
  219.     Writeln('Программа анализирует введенную строку и выдает сообщение о верном (все слова угаданы а');
  220.     Writeln('порядок их следования друг за другом значения не имеет) или неверном (пользователь вспомнил');
  221.     Writeln('не все слова) вводе.');
  222.     Writeln('Например:');
  223.     Writeln('Исходная последовательность КРОСС МАКСИМУМ СТОЛБ ГОЛОВА ТАБЛИЦА');
  224.     Writeln('Последовательность пользователя ГОЛОВА ТАБЛИЦА МАКСИМУМ СТОЛБ КРОСС');
  225.     Writeln('ОТВЕТ ВЕРНЫЙ!');
  226.     Writeln('Затем появляется новая последовательность из других 5 слов. После правильно введенных трех');
  227.     Writeln('подряд последовательностей из 5 слов начинают выводиться последовательности из 6 слов и так');
  228.     Writeln('до тех пор, пока пользователь не введет подряд три правильных последовательности из 8 слов.');
  229.     Writeln('На том этап 2 завершен.');
  230.     repeat
  231.         Writeln('Хотите продолжить? (д/н)');
  232.         ReadLn(input);
  233.     until (input = 'Д') or (input = 'д') or (input = 'Н') or (input = 'н');
  234.     if (input = 'Н') or (input = 'н') then
  235.         Halt;
  236. end;
  237.  
  238. procedure DisplayRulesThirdStageAndContinue;
  239. var
  240.     input: string;
  241. begin
  242.     Writeln('Этап 3: Аналогичен этапу 2. Введенная пользователем последовательность считается верной,');
  243.     Writeln('если совпали не только слова, но и порядок их следования друг за другом.');
  244.     Writeln('Например:');
  245.     Writeln('Исходная последовательность КРОСС МАКСИМУМ СТОЛБ ГОЛОВА ТАБЛИЦА');
  246.     Writeln('Последовательность пользователя КРОСС МАКСИМУМ СТОЛБ ГОЛОВА ТАБЛИЦА');
  247.     Writeln('ОТВЕТ ВЕРНЫЙ!');
  248.     repeat
  249.         Writeln('Хотите продолжить? (д/н)');
  250.         ReadLn(input);
  251.     until (input = 'Д') or (input = 'д') or (input = 'Н') or (input = 'н');
  252.     if (input = 'Н') or (input = 'н') then
  253.         Halt;
  254. end;
  255.  
  256. procedure DisplayRulesFourthStageAndContinue;
  257. var
  258.     input: string;
  259. begin
  260.     Writeln('Этап 4: Аналогичен этапу 2. Только пользователь должен вводить последовательность «перевернутой»');
  261.     Writeln('Например:');
  262.     Writeln('Исходная последовательность КРОСС МАКСИМУМ СТОЛБ ГОЛОВА ТАБЛИЦА');
  263.     Writeln('Последовательность пользователя ТАБЛИЦА ГОЛОВА СТОЛБ МАКСИМУМ КРОСС');
  264.     Writeln('ОТВЕТ ВЕРНЫЙ!');
  265.     repeat
  266.         Writeln('Хотите продолжить? (д/н)');
  267.         ReadLn(input);
  268.     until (input = 'Д') or (input = 'д') or (input = 'Н') or (input = 'н');
  269.     if (input = 'Н') or (input = 'н') then
  270.         Halt;
  271. end;
  272.  
  273. procedure DisplayRulesFifthStageAndContinue;
  274. var
  275.     input: string;
  276. begin
  277.     Writeln('Этап 5: Аналогичен этапу 2. Только пользователь должен вводить каждое слово «перевернутым»');
  278.     Writeln('Например:');
  279.     Writeln('Исходная последовательность КРОСС МАКСИМУМ СТОЛБ ГОЛОВА ТАБЛИЦА');
  280.     Writeln('Последовательность пользователя БЛОТС ССОРК АЦИЛБАТ АВОЛОГ МУМИСКАМ');
  281.     Writeln('ОТВЕТ ВЕРНЫЙ!');
  282.     repeat
  283.         Writeln('Хотите продолжить? (д/н)');
  284.         ReadLn(input);
  285.     until (input = 'Д') or (input = 'д') or (input = 'Н') or (input = 'н');
  286.     if (input = 'Н') or (input = 'н') then
  287.         Halt;
  288. end;
  289.  
  290. {
  291. procedure DrawLoadingAnimation;
  292. var
  293.   FrameIndex: Integer;
  294. begin
  295.   for FrameIndex := 1 to 4 do
  296.   begin
  297.     writeln('               _________________________________________________');
  298.     writeln('              /                                                 \');
  299.     writeln('             |    ___________________________________________    |');
  300.     writeln('             |   |                                           |   |');
  301.     writeln('             |   |  C:\> _                                   |   |');
  302.     writeln('             |   |                                           |   |');
  303.     writeln('             |   |                                           |   |');
  304.     writeln('             |   |                                           |   |');
  305.     writeln('             |   |    ──────────────────────────────────     |   |');
  306.     writeln('             |   |   │ Приветствуем в тренажере памяти! │    |   |');
  307.     writeln('             |   |    ──────────────────────────────────     |   |');
  308.     writeln('             |   |                                           |   |');
  309.     Writeln('             |   |     Loading ' + AnimationFrames[FrameIndex - 1] + '                             |   |');
  310.     writeln('             |   |                                           |   |');
  311.     writeln('             |   |                                           |   |');
  312.     writeln('             |   |                                           |   |');
  313.     writeln('             |   |                                           |   |');
  314.     writeln('             |   |___________________________________________|   |');
  315.     writeln('             |                                                   |');
  316.     writeln('              \_________________________________________________/');
  317.     writeln('                      \___________________________________/');
  318.     writeln('                   ___________________________________________');
  319.     writeln('                _-''    .-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.  --- `-_');
  320.     writeln('             _-''.-.-. .---.-.-.-.-.-.-.-.-.-.-.-.-.-.-.--.  .-.-.`-_');
  321.     writeln('          _-''.-.-.-. .---.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-`__`. .-.-.-.`-_');
  322.     writeln('       _-''.-.-.-.-. .-----.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-----. .-.-.-.-.`-');
  323.     writeln('    _-''.-.-.-.-.-. .---.-. .-------------------------. .-.---. .---.-.-.-.`-');
  324.     writeln('   :-------------------------------------------------------------------------:');
  325.     writeln('   `---._.-------------------------------------------------------------._.---''');
  326.     Sleep(300); // Pause for 1 second
  327. //    ClearScreen;
  328.     Write(#13); // Move cursor back to the beginning of the line
  329.   end;
  330. end;
  331. }
  332.  
  333.  
  334. procedure DrawLoadingAnimation;
  335. var
  336.   FrameIndex: Integer;
  337.   Frame: string;
  338. begin
  339.   for FrameIndex := 1 to 4 do
  340.   begin
  341.     Frame := sLineBreak + sLineBreak +
  342.       '               _________________________________________________' + sLineBreak +
  343.       '              /                                                 \' + sLineBreak +
  344.       '             |    ___________________________________________    |' + sLineBreak +
  345.       '             |   |                                           |   |' + sLineBreak +
  346.       '             |   |  C:\> _                                   |   |' + sLineBreak +
  347.       '             |   |                                           |   |' + sLineBreak +
  348.       '             |   |                                           |   |' + sLineBreak +
  349.       '             |   |                                           |   |' + sLineBreak +
  350.       '             |   |     Loading... ' + AnimationFrames[FrameIndex - 1] + '                          |   |' + sLineBreak +
  351.       '             |   |                                           |   |' + sLineBreak +
  352.       '             |   |                                           |   |' + sLineBreak +
  353.       '             |   |                                           |   |' + sLineBreak +
  354.       '             |   |                                           |   |' + sLineBreak +
  355.       '             |   |                                           |   |' + sLineBreak +
  356.       '             |   |                                           |   |' + sLineBreak +
  357.       '             |   |                                           |   |' + sLineBreak +
  358.       '             |   |                                           |   |' + sLineBreak +
  359.       '             |   |___________________________________________|   |' + sLineBreak +
  360.       '             |                                                   |' + sLineBreak +
  361.       '              \_________________________________________________/' + sLineBreak +
  362.       '                      \___________________________________/' + sLineBreak +
  363.       '                    ___________________________________________' + sLineBreak +
  364.       '                 _-''    .-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.  --- `-_' + sLineBreak +
  365.       '              _-''.-.-. .---.-.-.-.-.-.-.-.-.-.-.-.-.-.-.--.  .-.-.`-_' + sLineBreak +
  366.       '           _-''.-.-.-. .---.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-`__`. .-.-.-.`-_' + sLineBreak +
  367.       '        _-''.-.-.-.-. .-----.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-----. .-.-.-.-.`-' + sLineBreak +
  368.       '     _-''.-.-.-.-.-. .---.-. .-------------------------. .-.---. .---.-.-.-.`-' + sLineBreak +
  369.       '   :-------------------------------------------------------------------------:' + sLineBreak +
  370.       '   `---._.-------------------------------------------------------------._.---'+''+'' + sLineBreak;
  371. //    ClearScreen;
  372.     Write(Frame);
  373.     Sleep(150); // Pause for 1 second
  374. //    ClearScreen;
  375.     Write(#13); // Move cursor back to the beginning of the line
  376.   end;
  377. end;
  378.  
  379. procedure RunLoadingScreen(DurationInSeconds: Integer);
  380. var
  381.   StartTime, CurrentTime: DWORD;
  382. begin
  383.   StartTime := GetTickCount;
  384.   repeat
  385.     CurrentTime := GetTickCount;
  386.     DrawLoadingAnimation;
  387.   until (CurrentTime - StartTime) >= (DurationInSeconds * 1000);
  388. end;
  389.  
  390. Function AskRules(): string;
  391. var
  392.     input: string;
  393. begin
  394. //    Writeln('                        ────────────────────────────────────── ');
  395. //    Writeln('                      *│ Приветствуем вас в тренажере памяти! │* ');
  396. //    Writeln('                        ────────────────────────────────────── ');
  397. {
  398.     writeln('               _________________________________________________');
  399.     writeln('              /                                                 \');
  400.     writeln('             |    ___________________________________________    |');
  401.     writeln('             |   |                                           |   |');
  402.     writeln('             |   |  C:\> _                                   |   |');
  403.     writeln('             |   |                                           |   |');
  404.     writeln('             |   |                                           |   |');
  405.     writeln('             |   |                                           |   |');
  406.     writeln('             |   |    ──────────────────────────────────     |   |');
  407.     writeln('             |   |   │ Приветствуем в тренажере памяти! │    |   |');
  408.     writeln('             |   |    ──────────────────────────────────     |   |');
  409.     writeln('             |   |                                           |   |');
  410.     writeln('             |   |                                           |   |');
  411.     writeln('             |   |                                           |   |');
  412.     writeln('             |   |                                           |   |');
  413.     writeln('             |   |                                           |   |');
  414.     writeln('             |   |___________________________________________|   |');
  415.     writeln('             |                                                   |');
  416.     writeln('              \_________________________________________________/');
  417.     writeln('                      \___________________________________/');
  418.     writeln('                   ___________________________________________');
  419.     writeln('                _-''    .-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.  --- `-_');
  420.     writeln('             _-''.-.-. .---.-.-.-.-.-.-.-.-.-.-.-.-.-.-.--.  .-.-.`-_');
  421.     writeln('          _-''.-.-.-. .---.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-`__`. .-.-.-.`-_');
  422.     writeln('       _-''.-.-.-.-. .-----.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-----. .-.-.-.-.`-');
  423.     writeln('    _-''.-.-.-.-.-. .---.-. .-------------------------. .-.---. .---.-.-.-.`-');
  424.     writeln('   :-------------------------------------------------------------------------:');
  425.     writeln('   `---._.-------------------------------------------------------------._.---''');
  426. }
  427.     RunLoadingScreen(2);
  428.     ClearScreen;
  429.     writeln('               _________________________________________________');
  430.     writeln('              /                                                 \');
  431.     writeln('             |    ___________________________________________    |');
  432.     writeln('             |   |                                           |   |');
  433.     writeln('             |   |  C:\> _                                   |   |');
  434.     writeln('             |   |                                           |   |');
  435.     writeln('             |   |                                           |   |');
  436.     writeln('             |   |                                           |   |');
  437.     writeln('             |   |    ──────────────────────────────────     |   |');
  438.     writeln('             |   |   │ Приветствуем в тренажере памяти! │    |   |');
  439.     writeln('             |   |    ──────────────────────────────────     |   |');
  440.     writeln('             |   |                                           |   |');
  441.     writeln('             |   |                                           |   |');
  442.     writeln('             |   |                   PLAY                    |   |');
  443.     writeln('             |   |                                           |   |');
  444.     writeln('             |   |                                           |   |');
  445.     writeln('             |   |___________________________________________|   |');
  446.     writeln('             |                                                   |');
  447.     writeln('              \_________________________________________________/');
  448.     writeln('                      \___________________________________/');
  449.     writeln('                   ___________________________________________');
  450.     writeln('                _-''    .-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.  --- `-_');
  451.     writeln('             _-''.-.-. .---.-.-.-.-.-.-.-.-.-.-.-.-.-.-.--.  .-.-.`-_');
  452.     writeln('          _-''.-.-.-. .---.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-`__`. .-.-.-.`-_');
  453.     writeln('       _-''.-.-.-.-. .-----.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-----. .-.-.-.-.`-');
  454.     writeln('    _-''.-.-.-.-.-. .---.-. .-------------------------. .-.---. .---.-.-.-.`-');
  455.     writeln('   :-------------------------------------------------------------------------:');
  456.     writeln('   `---._.-------------------------------------------------------------._.---''');
  457.     Writeln;
  458.     Writeln('Хотите ли вы ознакомится с правилами каждого из этапов или желаете пропустить обучение?');
  459. //    Writeln('                   пропустить обучение?');
  460.     Writeln;
  461.     repeat
  462.         Writeln('Да, хочу ознакомиться / Нет, пропустить обучение (д/н)');
  463.         Writeln;
  464.         ReadLn(input);
  465.     until (input = 'Д') or (input = 'д') or (input = 'Н') or (input = 'н');
  466.     ClearScreen;
  467.     Result := input;
  468. end;
  469.  
  470. Function AskReady(): string;
  471. var
  472.     input: string;
  473. begin
  474.     Writeln('Вы готовы начать игру?');
  475.     repeat
  476.         Writeln('Да/Нет. (д/н)');
  477.         ReadLn(input);
  478.     until (input = 'Д') or (input = 'д') or (input = 'Н') or (input = 'н');
  479.     Result := input;
  480. end;
  481.  
  482. Function ChoiseDifficulty(): char;
  483. var
  484.     input: char;
  485. begin
  486.     Writeln('Пожалуйста, выберите уровень сложности. ');
  487.     Writeln;
  488.     Writeln('1 - Легкий. 1 Этап - 5 секунд. 2 Этап - 25 секунд. 3 Этап - 30 секунд. 4 Этап - 35 секунд. 5 Этап - 40 секунд. ');
  489.     Writeln;
  490.     Writeln('2 - Средний. 1 Этап - 4 секунд. 2 Этап - 20 секунд. 3 Этап - 25 секунд. 4 Этап - 30 секунд. 5 Этап - 35 секунд. ');
  491.     Writeln;
  492.     Writeln('3 - Сложный. 1 Этап - 2 секунд. 2 Этап - 10 секунд. 3 Этап - 15 секунд. 4 Этап - 15 секунд. 5 Этап - 20 секунд. ');
  493.     Writeln;
  494.     repeat
  495.         Writeln(' Легкий (1) | Средний (2) | Сложный (3) ');
  496.         Writeln;
  497.         ReadLn(input);
  498.     until (input = '1') or (input = '2') or (input = '3');
  499.     ClearScreen;
  500.     Result := input;
  501. end;
  502.  
  503. function Join(const Separator: string; const Words: array of string): string;
  504. var
  505.     I: Integer;
  506. begin
  507.     Result := '';
  508.     for I := Low(Words) to High(Words) do
  509.     begin
  510.         if I <> Low(Words) then
  511.             Result := Result + Separator;
  512.         Result := Result + Words[I];
  513.     end;
  514. end;
  515.  
  516. function Split(const Separator, input: string): TWordsArr;
  517. var
  518.     StringList: TStringList;
  519.     I: Integer;
  520. begin
  521.     StringList := TStringList.Create;
  522.     try
  523.         StringList.Delimiter := Separator[1];
  524.         StringList.StrictDelimiter := True;
  525.         StringList.DelimitedText := input;
  526.         SetLength(Result, StringList.Count);
  527.         for I := 0 to StringList.Count - 1 do
  528.             Result[I] := StringList[I];
  529.     finally
  530.         StringList.Free;
  531.     end;
  532. end;
  533.  
  534. var
  535.     WordsFromData, InputedWords: TWordsArr;
  536.     FileNames: array [0 .. 3] of string;
  537.     FileName: string;
  538.     Words: TStringList;
  539.     RandomWord, temp, input: string;
  540.     I, J, K, correctAnswers, roundsPassed: Integer;
  541.     ExePath: string;
  542.     diff: char;
  543.  
  544. begin
  545.     // Получить путь к исполняемому файлу
  546.     ExePath := ExtractFilePath(ParamStr(0));
  547.  
  548.     // Определить пути к файлам
  549.     FileNames[0] := ExePath + 'words-5.txt';
  550.     FileNames[1] := ExePath + 'words-6.txt';
  551.     FileNames[2] := ExePath + 'words-7.txt';
  552.     FileNames[3] := ExePath + 'words-8.txt';
  553.     FileName := ExePath + 'words-all.txt';
  554.     Randomize;
  555.     correctAnswers := 0;
  556.  
  557.     // stage 1
  558.     { Этап 1: На экране на некоторое время отображается слово из 5 букв, а затем пропадает.
  559.       Пользователь вводит с клавиатуры это же слово, но в обратном порядке («перевернутым»)
  560.       Например:
  561.       Исходное слово
  562.       Слово, введенное пользователем
  563.       ОТВЕТ ВЕРНЫЙ!
  564.       СТОЛБ
  565.       БЛОТС
  566.       Программа
  567.       анализирует введенную строку и выдает сообщение о верном (пользователь ввел
  568.       «перевернутое» слово правильно) или неверном вводе
  569.       Затем появляется новое слово с тем же количеством букв и ожидается новый ввод
  570.       «перевернутого» слова. После правильно введенных трех подряд верных «перевернутых» слов
  571.       начинают выводиться слова длиннее на одну букву и так до тех пор, пока пользователь не введет
  572.       подряд три «перевернутых» 8 буквенных слова. На том этап 1 завершен.
  573.     }
  574.     // можно вводить строку во время таймера!!!!! исправить потому что жесть как не честно атата
  575.     roundsPassed := 0;
  576.     correctAnswers := 0;
  577.     input := AskRules();
  578.     diff := ChoiseDifficulty();
  579.     if (input = 'Д') or (input = 'д') then
  580.     begin
  581.         DisplayRulesFirstStageAndContinue;
  582.         ClearScreen;
  583.     end;
  584.     case diff of
  585.         '1':
  586.             Writeln('На вашем уровне сложности у вас 5 секунд на этот этап');
  587.         '2':
  588.             Writeln('На вашем уровне сложности у вас 4 секунды на этот этап');
  589.         '3':
  590.             Writeln('На вашем уровне сложности у вас 2 секунды на этот этап');
  591.     end;
  592.     // Главный цикл программы
  593.     input := AskReady();
  594.     repeat
  595.         if (input = 'Н') or (input = 'н') then
  596.         begin
  597.             Writeln('ОК, начнем, когда вы будете готовы.');
  598.             input := AskReady();
  599.         end;
  600.     until (input = 'Д') or (input = 'д');
  601.     ClearScreen;
  602.     while roundsPassed < 4 do
  603.     begin
  604.         Words := ReadWordsFromFile(FileNames[roundsPassed]);
  605.         while correctAnswers < 3 do
  606.         begin
  607.             Writeln('Исходное слово: ');
  608.             RandomWord := GetRandomWord(Words);
  609.             Writeln(RandomWord);
  610.             case diff of
  611.                 '1':
  612.                     Sleep(5000);
  613.                 '2':
  614.                     Sleep(4000);
  615.                 '3':
  616.                     Sleep(2000);
  617.             end;
  618.  
  619.             ClearScreen; // Очистка консоли
  620.             Writeln('Введите это слово в обратном порядке:');
  621.             SetLength(InputedWords, 1);
  622.             ReadLn(InputedWords[0]);
  623.             if (InputedWords[0] = '52') then
  624.             begin
  625.                 roundsPassed := 4; // Завершить все этапы
  626.                 break;
  627.             end
  628.             else if (Length(RandomWord) = Length(InputedWords[0])) and
  629.               CheckWordsEquality(RandomWord, InputedWords[0]) then
  630.             begin
  631.                 Writeln('ОТВЕТ ВЕРНЫЙ!');
  632.                 Inc(correctAnswers);
  633.             end
  634.             else
  635.             begin
  636.                 Writeln('ОТВЕТ НЕВЕРНЫЙ!');
  637.                 correctAnswers := 0;
  638.             end;
  639.         end;
  640.         correctAnswers := 0;
  641.         Inc(roundsPassed);
  642.     end;
  643.  
  644.     // Сброс для следующего этапа
  645.     correctAnswers := 0;
  646.     { Этап 2: На экране на некоторое время отображается последовательность из 5 различных слов, а
  647.       затем пропадает. Пользователь вводит с клавиатуры эти же слова в произвольном порядке.
  648.       Программа анализирует введенную строку и выдает сообщение о верном (все слова угаданы а
  649.       порядок их следования друг за другом значения не имеет) или неверном (пользователь вспомнил
  650.       не все слова) вводе.
  651.       Например:
  652.       Исходная последовательность КРОСС МАКСИМУМ СТОЛБ ГОЛОВА ТАБЛИЦА
  653.       Последовательность пользователя ГОЛОВА ТАБЛИЦА МАКСИМУМ СТОЛБ КРОСС
  654.       ОТВЕТ ВЕРНЫЙ!
  655.       Затем появляется новая последовательность из других 5 слов. После правильно введенных трех
  656.       подряд последовательностей из 5 слов начинают выводиться последовательности из 6 слов и так
  657.       до тех пор, пока пользователь не введет подряд три правильных последовательности из 8 слов.
  658.       На том этап 2 завершен. }
  659.     if (input = 'Д') or (input = 'д') then
  660.     begin
  661.         DisplayRulesSecondStageAndContinue;
  662.         ClearScreen;
  663.     end;
  664.     roundsPassed := 0;
  665.     correctAnswers := 0;
  666.     case diff of
  667.         '1':
  668.             Writeln('На вашем уровне сложности у вас 25 секунд на этот этап');
  669.         '2':
  670.             Writeln('На вашем уровне сложности у вас 20 секунды на этот этап');
  671.         '3':
  672.             Writeln('На вашем уровне сложности у вас 10 секунды на этот этап');
  673.     end;
  674.     // Главный цикл программы
  675.     input := AskReady();
  676.     repeat
  677.         if (input = 'Н') or (input = 'н') then
  678.         begin
  679.             Writeln('ОК, начнем, когда вы будете готовы.');
  680.             input := AskReady();
  681.         end;
  682.     until (input = 'Д') or (input = 'д');
  683.     ClearScreen;
  684.     while correctAnswers < 3 do
  685.     begin
  686.         Writeln('Исходные слова: ');
  687.         SetLength(WordsFromData, roundsPassed + 5);
  688.         for K := Low(WordsFromData) to High(WordsFromData) do
  689.         begin
  690.             WordsFromData[K] := GetRandomWord(Words);
  691.         end;
  692.         Writeln(Join(' ', WordsFromData)); // Вывод слов в одной строке
  693.         case diff of
  694.             '1':
  695.                 Sleep(25000);
  696.             '2':
  697.                 Sleep(20000);
  698.             '3':
  699.                 Sleep(10000);
  700.         end; // Задержка в 5 секунд
  701.         ClearScreen; // Очистка консоли
  702.         Writeln('Введите эти слова в любом порядке:');
  703.         ReadLn(temp);
  704.         InputedWords := Split(' ', temp);
  705.         // Разделение введенной строки на слова
  706.         if (InputedWords[Length(InputedWords) - 1] = '52') then
  707.         begin
  708.             roundsPassed := 4; // Завершить все этапы
  709.             break;
  710.         end;
  711.         if CheckWordsExistanceInArr(WordsFromData, InputedWords) then
  712.         begin
  713.             Writeln('ОТВЕТ ВЕРНЫЙ!');
  714.             Inc(correctAnswers);
  715.         end
  716.         else
  717.         begin
  718.             Writeln('ОТВЕТ НЕВЕРНЫЙ!');
  719.             correctAnswers := 0;
  720.         end;
  721.     end;
  722.  
  723.     // stage 3
  724.     // ... Структура аналогична Stage 2, но проверяет точное совпадение последовательностей
  725.     { конкретнее
  726.       Этап 3: Аналогичен этапу 2. Введенная пользователем последовательность считается верной,
  727.       если совпали не только слова, но и порядок их следования друг за другом.
  728.       Например:
  729.       Исходная последовательность КРОСС МАКСИМУМ СТОЛБ ГОЛОВА ТАБЛИЦА
  730.       Последовательность пользователя КРОСС МАКСИМУМ СТОЛБ ГОЛОВА ТАБЛИЦА
  731.       ОТВЕТ ВЕРНЫЙ! }
  732.     // Этап 3
  733.     correctAnswers := 0;
  734.     if (input = 'Д') or (input = 'д') then
  735.     begin
  736.         DisplayRulesThirdStageAndContinue;
  737.         ClearScreen;
  738.     end;
  739.  
  740.     roundsPassed := 0;
  741.     correctAnswers := 0;
  742.     case diff of
  743.         '1':
  744.             Writeln('На вашем уровне сложности у вас 30 секунд на этот этап');
  745.         '2':
  746.             Writeln('На вашем уровне сложности у вас 25 секунды на этот этап');
  747.         '3':
  748.             Writeln('На вашем уровне сложности у вас 15 секунды на этот этап');
  749.     end;
  750.     // Главный цикл программы
  751.     input := AskReady();
  752.     repeat
  753.         if (input = 'Н') or (input = 'н') then
  754.         begin
  755.             Writeln('ОК, начнем, когда вы будете готовы.');
  756.             input := AskReady();
  757.         end;
  758.     until (input = 'Д') or (input = 'д');
  759.     ClearScreen;
  760.     while roundsPassed < 4 do
  761.     begin
  762.         Words := ReadWordsFromFile(FileName);
  763.         while correctAnswers < 3 do
  764.         begin
  765.             Writeln('Исходные слова: ');
  766.             SetLength(WordsFromData, roundsPassed + 5);
  767.             for K := Low(WordsFromData) to High(WordsFromData) do
  768.             begin
  769.                 WordsFromData[K] := GetRandomWord(Words);
  770.             end;
  771.             Writeln(Join(' ', WordsFromData)); // Вывод слов в одной строке
  772.             case diff of
  773.                 '1':
  774.                     Sleep(30000);
  775.                 '2':
  776.                     Sleep(25000);
  777.                 '3':
  778.                     Sleep(15000);
  779.             end; // Задержка
  780.             ClearScreen; // Очистка консоли
  781.             Writeln('Введите эти слова в том же порядке:');
  782.             ReadLn(temp);
  783.             InputedWords := Split(' ', temp);
  784.             // Разделение введенной строки на слова
  785.             if (InputedWords[Length(InputedWords) - 1] = '52') then
  786.             begin
  787.                 roundsPassed := 4; // Завершить все этапы
  788.                 break;
  789.             end;
  790.             if CheckWordsExistanceInArr(WordsFromData, InputedWords) and
  791.               CheckWordsOrder(WordsFromData, InputedWords) then
  792.             begin
  793.                 Writeln('ОТВЕТ ВЕРНЫЙ!');
  794.                 Inc(correctAnswers);
  795.             end
  796.             else
  797.             begin
  798.                 Writeln('ОТВЕТ НЕВЕРНЫЙ!');
  799.                 correctAnswers := 0;
  800.             end;
  801.         end;
  802.         correctAnswers := 0;
  803.         Inc(roundsPassed);
  804.     end;
  805.  
  806.     // Сброс для следующего этапа
  807.     correctAnswers := 0;
  808.  
  809.     // stage 4
  810.     // ... Структура аналогична Stage 2, но пользователь вводит слова в обратном порядке.
  811.     { Этап 4: Аналогичен этапу 2. Только пользователь должен вводить каждое слово «перевернутым»
  812.       Например:
  813.       Исходная последовательность КРОСС МАКСИМУМ СТОЛБ ГОЛОВА ТАБЛИЦА
  814.       Последовательность пользователя БЛОТС ССОРК АЦИЛБАТ АВОЛОГ МУМИСКАМ
  815.       ОТВЕТ ВЕРНЫЙ! }
  816.     // Этап 4
  817.     if (input = 'Д') or (input = 'д') then
  818.     begin
  819.         DisplayRulesFourthStageAndContinue;
  820.         ClearScreen;
  821.     end;
  822.  
  823.     roundsPassed := 0;
  824.     correctAnswers := 0;
  825.     case diff of
  826.         '1':
  827.             Writeln('На вашем уровне сложности у вас 35 секунд на этот этап');
  828.         '2':
  829.             Writeln('На вашем уровне сложности у вас 30 секунды на этот этап');
  830.         '3':
  831.             Writeln('На вашем уровне сложности у вас 15 секунды на этот этап');
  832.     end;
  833.     // Главный цикл программы
  834.     input := AskReady();
  835.     repeat
  836.         if (input = 'Н') or (input = 'н') then
  837.         begin
  838.             Writeln('ОК, начнем, когда вы будете готовы.');
  839.             input := AskReady();
  840.         end;
  841.     until (input = 'Д') or (input = 'д');
  842.     ClearScreen;
  843.     while roundsPassed < 4 do
  844.     begin
  845.         Words := ReadWordsFromFile(FileName);
  846.         while correctAnswers < 3 do
  847.         begin
  848.             Writeln('Исходные слова: ');
  849.             SetLength(WordsFromData, roundsPassed + 5);
  850.             for K := Low(WordsFromData) to High(WordsFromData) do
  851.             begin
  852.                 WordsFromData[K] := GetRandomWord(Words);
  853.             end;
  854.             Writeln(Join(' ', WordsFromData)); // Вывод слов в одной строке
  855.             case diff of
  856.                 '1':
  857.                     Sleep(35000);
  858.                 '2':
  859.                     Sleep(30000);
  860.                 '3':
  861.                     Sleep(15000);
  862.             end; // Задержка в 5 секунд
  863.             ClearScreen; // Очистка консоли
  864.             Writeln('Введите эти слова в обратном порядке:');
  865.             ReadLn(temp);
  866.             InputedWords := Split(' ', temp);
  867.             // Разделение введенной строки на слова
  868.             if (InputedWords[Length(InputedWords) - 1] = '52') then
  869.             begin
  870.                 roundsPassed := 4; // Завершить все этапы
  871.                 break;
  872.             end;
  873.             if CheckWordsExistanceInArr(WordsFromData, ReverseArr(InputedWords))
  874.             then
  875.             begin
  876.                 Writeln('ОТВЕТ ВЕРНЫЙ!');
  877.                 Inc(correctAnswers);
  878.             end
  879.             else
  880.             begin
  881.                 Writeln('ОТВЕТ НЕВЕРНЫЙ!');
  882.                 correctAnswers := 0;
  883.             end;
  884.         end;
  885.         correctAnswers := 0;
  886.         Inc(roundsPassed);
  887.     end;
  888.  
  889.     // Этап 5(4)
  890.     if (input = 'Д') or (input = 'д') then
  891.     begin
  892.         DisplayRulesFifthStageAndContinue;
  893.         ClearScreen;
  894.     end;
  895.  
  896.     roundsPassed := 0;
  897.     correctAnswers := 0;
  898.     case diff of
  899.         '1':
  900.             Writeln('На вашем уровне сложности у вас 40 секунд на этот этап');
  901.         '2':
  902.             Writeln('На вашем уровне сложности у вас 35 секунды на этот этап');
  903.         '3':
  904.             Writeln('На вашем уровне сложности у вас 20 секунды на этот этап');
  905.     end;
  906.     // Главный цикл программы
  907.     input := AskReady();
  908.     repeat
  909.         if (input = 'Н') or (input = 'н') then
  910.         begin
  911.             Writeln('ОК, начнем, когда вы будете готовы.');
  912.             input := AskReady();
  913.         end;
  914.     until (input = 'Д') or (input = 'д');
  915.     ClearScreen;
  916.     while roundsPassed < 4 do
  917.     begin
  918.         Words := ReadWordsFromFile(FileName);
  919.         for J := 1 to 3 do
  920.         begin
  921.             Writeln('Исходные слова: ');
  922.             SetLength(WordsFromData, roundsPassed + 5);
  923.             for K := Low(WordsFromData) to High(WordsFromData) do
  924.             begin
  925.                 WordsFromData[K] := GetRandomWord(Words);
  926.             end;
  927.             Writeln(Join(' ', WordsFromData)); // Вывод слов в одной строке
  928.             case diff of
  929.                 '1':
  930.                     Sleep(40000);
  931.                 '2':
  932.                     Sleep(35000);
  933.                 '3':
  934.                     Sleep(20000);
  935.             end; // Задержка в 5 секунд
  936.             ClearScreen; // Очистка консоли
  937.             Writeln('Введите эти слова в обратном порядке:');
  938.             ReadLn(temp);
  939.             InputedWords := Split(' ', temp);
  940.             // Разделение введенной строки на слова
  941.             if (InputedWords[Length(InputedWords) - 1] = '52') then
  942.             begin
  943.                 roundsPassed := 4; // Завершить все этапы
  944.                 break;
  945.             end;
  946.             if CheckWordsExistanceInArr(ReverseWords(WordsFromData),
  947.               InputedWords) then
  948.             begin
  949.                 Writeln('ОТВЕТ ВЕРНЫЙ!');
  950.                 Inc(correctAnswers);
  951.             end
  952.             else
  953.             begin
  954.                 Writeln('ОТВЕТ НЕВЕРНЫЙ!');
  955.                 correctAnswers := 0;
  956.             end;
  957.         end;
  958.         correctAnswers := 0;
  959.         Inc(roundsPassed);
  960.     end;
  961.  
  962.     CongratulateUser;
  963.     ReadLn;
  964.  
  965. End.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement