Advertisement
okrlbok

test

Dec 21st, 2023 (edited)
90
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Delphi 25.00 KB | None | 0 0
  1. Program Scrabble;
  2.  
  3. Uses
  4.     SysUtils,
  5.     Windows;
  6.  
  7. Type
  8.     TLetterArray = Array ['а' .. 'я'] Of Integer;
  9.     TWordArray = Array Of AnsiString;
  10.     TScoreArray = Array Of Integer;
  11.     TPlayerStringArray = Array Of AnsiString;
  12.     TBonusArray = Array Of Array [0 .. 1] Of Boolean;
  13.  
  14. Const
  15.     //wb - префикс от Word Bank
  16.     WbFilePath = 'WordBank.txt';
  17.     StartLetterBank: TLetterArray = (10, 3, 4, 3, 4, 16, 4, 4, 12, 4, 4, 4, 4, 12, 16, 5, 4, 8, 8, 4, 10, 8, 2, 4, 4, 4, 4, 2, 2, 4, 5, 5);
  18.  
  19. Function CreateWordBank(): TWordArray;
  20. Var
  21.     WbSize, WbCount: Integer;
  22.     WbInputWord: AnsiString;
  23.     WbBaseFile: TextFile;
  24.     WordBank: TWordArray;
  25. Begin
  26.     WbCount := 0;
  27.     AssignFile(WbBaseFile, WbFilePath);
  28.     Reset(WbBaseFile);
  29.     Readln(WbBaseFile, WbSize);
  30.     SetLength(WordBank, WbSize);
  31.     While Not EoF(WbBaseFile) Do
  32.     Begin
  33.         Readln(WbBaseFile, WbInputWord);
  34.         WordBank[WbCount] := WbInputWord;
  35.         Inc(WbCount);
  36.     End;
  37.     CloseFile(WbBaseFile);
  38.     CreateWordBank := WordBank;
  39. End;
  40.  
  41. Function InputNumberOfPlayers(): Integer;
  42. Const
  43.     MIN_NUM = 2;
  44.     MAX_NUM = 6;
  45. Var
  46.     NumOfPlayers: Integer;
  47.     IsInputCorrect: Boolean;
  48. Begin
  49.     Write('Введите количество игроков (целое число в диапазоне от 2 до 6): ');
  50.     Repeat
  51.         IsInputCorrect := True;
  52.         Try
  53.             Read(NumOfPlayers);
  54.         Except
  55.             IsInputCorrect := False;
  56.             Write('Введено недопустимое значение. Повторите ввод: ');
  57.         End;
  58.         If IsInputCorrect And ((NumOfPlayers < MIN_NUM) Or (NumOfPlayers > MAX_NUM)) Then
  59.         Begin
  60.             IsInputCorrect := False;
  61.             Write('Введено число, не входящее в диапазон допустимых значений. Повторите ввод: ');
  62.         End;
  63.     Until IsInputCorrect;
  64.     InputNumberOfPlayers := NumOfPlayers;
  65. End;
  66.  
  67. Function CheckLetterCount(PlayerString: String; LetterBank: TLetterArray): Boolean;
  68. Var
  69.     MissingLetters, LetterCounter: Integer;
  70.     I: AnsiChar;
  71.     IsEnough: Boolean;
  72. Begin
  73.     IsEnough := True;
  74.     MissingLetters := 10 - Length(PlayerString);
  75.     LetterCounter := 0;
  76.     For I := 'а' To 'я' Do
  77.         LetterCounter := LetterCounter + LetterBank[I];
  78.     If MissingLetters > LetterCounter Then
  79.         IsEnough := False;
  80.     CheckLetterCount := IsEnough;
  81. End;
  82.  
  83. Procedure FillPlayerString(Var TempPlayerString: AnsiString; Var LetterBank: TLetterArray);
  84. Var
  85.     RandomLetter: AnsiChar;
  86.     RandomIndex, CountOfLetter: Integer;
  87. Begin
  88.     Randomize;
  89.     While (Length(TempPlayerString) < 10) Do //Нужно набрать 10 букв
  90.     Begin
  91.         RandomIndex := Random(32) + 224;
  92.         RandomLetter := AnsiChar(RandomIndex);
  93.         CountOfLetter := LetterBank[RandomLetter];
  94.         If CountOfLetter > 0 Then
  95.         Begin
  96.             TempPlayerString := TempPlayerString + RandomLetter;
  97.             Dec(LetterBank[RandomLetter]);
  98.         End;
  99.     End;
  100. End;
  101.  
  102. Function ReadPlayersWord(Var LetterPack: AnsiString): AnsiString;
  103. Const
  104.     RUS_LETTERS = ['а' .. 'я'];
  105.     MAX_LENGTH = 10;
  106.     MOVE_SKIP = '';
  107.     FIFTY_FIFTY = '50';
  108.     FRIEND_HELP = '+';
  109. Var
  110.     CharCount, LetterCount, FoundLetters: Integer;
  111.     InputWord, StartPack: AnsiString;
  112.     IsInputCorrect: Boolean;
  113. Begin
  114.     StartPack := LetterPack;
  115.     Repeat
  116.         Readln(InputWord);
  117.         If (InputWord = '') Then
  118.             Read(InputWord);
  119.         IsInputCorrect := True;
  120.         Trim(InputWord);
  121.         If (InputWord <> FIFTY_FIFTY) And (InputWord <> FRIEND_HELP) And (InputWord <> MOVE_SKIP) Then
  122.         Begin
  123.             For CharCount := 1 To Length(InputWord) Do
  124.                 If Not(InputWord[CharCount] In RUS_LETTERS) Then
  125.                     IsInputCorrect := False;
  126.             If Not IsInputCorrect Or (Length(InputWord) > MAX_LENGTH) Then
  127.             Begin
  128.                 IsInputCorrect := False;
  129.                 Write('Слово введено некорректно. Повторите ввод: ');
  130.             End;
  131.         End;
  132.     Until IsInputCorrect;
  133.     ReadPlayersWord := InputWord;
  134. End;
  135.  
  136. Function IsWordInBank(ExpectedWord: String; WordBank: TWordArray; Var FindIndex: Integer): Boolean;
  137. Var
  138.     LeftIndex, RightIndex, MiddleIndex: Integer;
  139.     IsFound: Boolean;
  140. Begin
  141.     LeftIndex := 0;
  142.     IsFound := False;
  143.     RightIndex := High(WordBank);
  144.     FindIndex := -1;
  145.     While (LeftIndex <= RightIndex) And (IsFound = False) Do
  146.     Begin
  147.         MiddleIndex := (LeftIndex + RightIndex) Div 2;
  148.         If WordBank[MiddleIndex] = ExpectedWord Then
  149.         Begin
  150.             IsFound := True;
  151.             FindIndex := MiddleIndex;
  152.         End
  153.         Else
  154.         Begin
  155.             If WordBank[MiddleIndex] < ExpectedWord Then
  156.             Begin
  157.                 LeftIndex := MiddleIndex + 1;
  158.                 FindIndex := MiddleIndex;
  159.             End
  160.             Else
  161.                 RightIndex := MiddleIndex - 1;
  162.         End;
  163.     End;
  164.     IsWordInBank := IsFound;
  165. End;
  166.  
  167. //процедура очистки консоли, честно спизжена с просторов интернета
  168. Procedure ClearConsole();
  169. Var
  170.     HStdOut: HWND;
  171.     ScreenBufInfo: TConsoleScreenBufferInfo;
  172.     Coord1: TCoord;
  173.     Z: Integer;
  174. Begin
  175.     HStdOut := GetStdHandle(STD_OUTPUT_HANDLE);
  176.     GetConsoleScreenBufferInfo(HStdOut, ScreenBufInfo);
  177.     For Z := 1 To ScreenBufInfo.DwSize.Y Do
  178.         WriteLn;
  179.     Coord1.X := 0;
  180.     Coord1.Y := 0;
  181.     SetConsoleCursorPosition(HStdOut, Coord1);
  182. End;
  183.  
  184. Procedure OutputMoveConditions(PlayerCount: Integer; LetterPack: AnsiString);
  185. Var
  186.     LetterCount: Integer;
  187. Begin
  188.     ClearConsole();
  189.     Writeln('Ход игрока ', PlayerCount + 1, '.', #13#10);
  190.     Writeln('Нажмите Enter, если вы хотите пропустить ход.');
  191.     Writeln('Введите 50, если вы хотите использовать бонус "50/50".');
  192.     Writeln('Введите +, если вы хотите использовать бонус "Помощь друга".', #13#10);
  193.     Write('Ваш набор букв: [');
  194.     //чуть более читаемый вывод набора букв
  195.     For LetterCount := 1 To 9 Do
  196.         Write(LetterPack[LetterCount], ', ');
  197.     Writeln(LetterPack[10], '].', #13#10);
  198.     Write('Введите ваше слово: ');
  199. End;
  200.  
  201. Function ResultOfVote(PlayerCount, NumberOfPlayers: Integer): Boolean;
  202. Const
  203.     VOTE_FOR = 'да';
  204.     VOTE_AGAINST = 'нет';
  205. Var
  206.     VoteCount, VotesFor, MinAmountOfVotes: Integer;
  207.     Vote: AnsiString;
  208.     IsInputCorrect, IsVotedFor: Boolean;
  209. Begin
  210.     Writeln('Введите "да", чтобы проголосовать за, и "нет", чтобы проголосовать против.', #13#10);
  211.     MinAmountOfVotes := NumberOfPlayers Div 2 + NumberOfPlayers Mod 2;
  212.     VotesFor := 1;
  213.     Dec(NumberOfPlayers);
  214.     For VoteCount := 0 To NumberOfPlayers Do
  215.     Begin
  216.         If (VoteCount <> PlayerCount) Then
  217.         Begin
  218.             Write('Игрок ', VoteCount + 1, ', ваш голос: ');
  219.             Repeat
  220.                 IsInputCorrect := True;
  221.                 Readln(Vote);
  222.                 If (Vote = '') Then
  223.                     Read(Vote);
  224.                 If (Vote <> VOTE_FOR) And (Vote <> VOTE_AGAINST) Then
  225.                 Begin
  226.                     IsInputCorrect := False;
  227.                     Write('Введено некорректное значение. Повторите ввод: ');
  228.                 End;
  229.             Until IsInputCorrect;
  230.             If (Vote = VOTE_FOR) Then
  231.                 Inc(VotesFor);
  232.         End;
  233.     End;
  234.     If (VotesFor >= MinAmountOfVotes) Then
  235.         IsVotedFor := True
  236.     Else
  237.         IsVotedFor := False;
  238.     ResultOfVote := IsVotedFor;
  239. End;
  240.  
  241. Function ExecuteBonus50(Var PlayerString: AnsiString; Var LetterBank: TLetterArray; Var PlayersScore: TScoreArray; NumberOfPlayer: Integer): Boolean;
  242. Var
  243.     CountLetters, CountChar, ChangeIndex: Integer;
  244.     IsCorrect, IsOkay: Boolean;
  245.     LettertoChange: AnsiChar;
  246.     PlayersCopy, LetterStr: AnsiString;
  247. Begin
  248.     Randomize;
  249.     PlayersCopy := PlayerString;
  250.     For CountLetters := 0 To 4 Do
  251.     Begin
  252.         Write('Введите букву из вашего набора, которую вы хотели бы заменить: ');
  253.         Repeat
  254.             IsCorrect := False;
  255.             Readln(LetterStr);
  256.             If (LetterStr = '') Then
  257.                 Readln(LetterStr);
  258.             If (Length(LetterStr) = 1) Then
  259.             Begin
  260.                 LettertoChange := LetterStr[1];
  261.                 If (Ord(LettertoChange)>223) Then
  262.                 Begin
  263.                     For CountChar := 1 To 10 Do
  264.                         If (LetterToChange = PlayersCopy[CountChar]) Then
  265.                         Begin
  266.                             IsCorrect := True;
  267.                             PlayersCopy[CountChar] := '0';
  268.                             Repeat
  269.                                 IsOkay := True;
  270.                                 ChangeIndex := 255 - Random(32);
  271.                                 If (LetterBank[AnsiChar(ChangeIndex)] < 1) Then
  272.                                     IsOkay := False;
  273.                             Until (IsOkay);
  274.                             Dec(LetterBank[AnsiChar(ChangeIndex)]);
  275.                             PlayerString[CountChar] := AnsiChar(ChangeIndex);
  276.                             Break;
  277.                         End;
  278.                     If Not(IsCorrect) Then
  279.                         Write('В вашем наборе отсутствует такая буква или встречается меньшее количество раз. Повторите ввод: ');
  280.                 End
  281.                 Else
  282.                     Write('Введите букву. Повторите ввод: ')
  283.             End
  284.             Else
  285.                  Write('Введите только одну букву. Повторите ввод: ');
  286.         Until (IsCorrect);
  287.     End;
  288.     Dec(PlayersScore[NumberOfPlayer], 2);
  289.     ExecuteBonus50 := True;
  290. End;
  291.  
  292. Function CheckIfContains(PlayerString: AnsiString; Var LetterIndex: Integer; NumberOfPlayer: Integer): AnsiChar;
  293. Var
  294.     LetterCounter: Integer;
  295.     Letter: AnsiChar;
  296.     LetterStr: AnsiString;
  297.     IsCorrect: Boolean;
  298. Begin
  299.     Repeat
  300.         IsCorrect := False;
  301.         Readln(LetterStr);
  302.         If (LetterStr = '') Then
  303.             Readln(LetterStr);
  304.         If (Length(LetterStr) = 1) Then
  305.         Begin
  306.             Letter := LetterStr[1];
  307.             If (Ord(Letter)>223) Then
  308.             Begin
  309.                 For LetterCounter := 1 To 10 Do
  310.                     If (Letter = PlayerString[LetterCounter]) Then
  311.                     Begin
  312.                       IsCorrect := True;
  313.                       LetterIndex := LetterCounter;
  314.                     End;
  315.                 If Not(IsCorrect) Then
  316.                     Write('В наборе отсутствует такая буква или встречается меньшее количество раз. Повторите ввод: ');
  317.             End
  318.             Else
  319.                 Write('Введите букву. Повторите ввод: ');
  320.         End
  321.         Else
  322.             Write('Введите только одну букву. Повторите ввод: ');
  323.     Until (IsCorrect);
  324.     CheckIfContains := Letter;
  325. End;
  326.  
  327. Function ExecuteBonusHelp(Var PlayersLetters: TPlayerStringArray; NumberOfPlayer: Integer): Boolean;
  328. Var
  329.     IsCorrect: Boolean;
  330.     LetterToChange, DesiredLetter: AnsiChar;
  331.     LetterIndexToChange, DesiredLetterIndex, OtherPlayerNumber: Integer;
  332. Begin
  333.     Write('Введите букву из вашего набора, которую хотели бы заменить: ');
  334.     LetterToChange := CheckIfContains(PlayersLetters[NumberOfPlayer], LetterIndexToChange, NumberOfPlayer);
  335.     Write('Введите номер игрока, с которым хотели бы обменяться: ');
  336.     Repeat
  337.         IsCorrect := True;
  338.         Try
  339.             Readln(OtherPlayerNumber);
  340.         Except
  341.             IsCorrect := False;
  342.             Write('Введите цифру. Повторите ввод: ');
  343.         End;
  344.         if ((IsCorrect) And ((OtherPlayerNumber>0) And (OtherPlayerNumber<(High(PlayersLetters)+2)))) then
  345.         Begin
  346.             Dec(OtherPlayerNumber);
  347.             If (OtherPlayerNumber = NumberOfPlayer) Then
  348.             Begin
  349.                 Write('Вы не можете меняться с самим собой. Повторите ввод: ');
  350.                 IsCorrect := False;
  351.             End;
  352.             (*If (OtherPlayerNumber > High(PlayersLetters) ) Then
  353.             Begin
  354.                 Write('Такого игрока не существует. Повторите ввод: ');
  355.                 IsCorrect := False;
  356.             End;*)
  357.         End
  358.         Else
  359.         Begin
  360.             Write('Введите цифру от 1 до ', High(PlayersLetters)+1, ', кроме ', NumberOfPlayer+1,'. Повторите ввод: ');
  361.             IsCorrect := False;
  362.         End;
  363.     Until (IsCorrect);
  364.     Write('Введите букву из чужого набора, на которую вы хотели бы заменить свою букву: ');
  365.     DesiredLetter := CheckIfContains(PlayersLetters[OtherPlayerNumber], DesiredLetterIndex, OtherPlayerNumber);
  366.     PlayersLetters[NumberOfPlayer, LetterIndexToChange] := DesiredLetter;
  367.     PlayersLetters[OtherPlayerNumber, DesiredLetterIndex] := LetterToChange;
  368.     ExecuteBonusHelp := True;
  369. End;
  370.  
  371. Procedure RefillLetterPacks(Var PlayersLetters: TPlayerStringArray);
  372. Var
  373.     PlayerCount, LetterCount, RandomIndex: Integer;
  374. Begin
  375.     Randomize;
  376.     For PlayerCount := 0 To High(PlayersLetters) Do
  377.         For LetterCount := 1 To Length(PlayersLetters[PlayerCount]) Do
  378.             If (PlayersLetters[PlayerCount][LetterCount] = '0') Then
  379.             Begin
  380.                 RandomIndex := Random(32) + 224;
  381.                 PlayersLetters[PlayerCount][LetterCount] := AnsiChar(RandomIndex);
  382.             End;
  383. End;
  384.  
  385. Procedure AddInsertWord(Var WordBank: TWordArray; AddWord: String);
  386. Var
  387.     I, FindIndex, Len: Integer;
  388. Begin
  389.     If Not(IsWordInBank(AddWord, WordBank, FindIndex)) Then
  390.     Begin
  391.         SetLength(WordBank, Length(WordBank) + 1);
  392.         Len := FindIndex + 1; //Исправление: правильное определение Len
  393.         For I := High(WordBank) Downto Len Do
  394.             WordBank[I] := WordBank[I - 1];
  395.         WordBank[FindIndex] := AddWord;
  396.     End;
  397. End;
  398.  
  399. Procedure RewriteWordBankFile(Var WordBank: TWordArray);
  400. Var
  401.     InputFile: TextFile;
  402.     I: Integer;
  403. Begin
  404.     AssignFile(InputFile, WbFilePath);
  405.     Rewrite(InputFile);
  406.     Writeln(InputFile, Length(WordBank));
  407.     For I := 0 To High(WordBank) Do
  408.         Writeln(InputFile, WordBank[I]);
  409.     CloseFile(InputFile);
  410. End;
  411.  
  412. Procedure CalculatePoints(InputWord: AnsiString; Var LetterPack: AnsiString; Var WordBank: TWordArray; Var LastLetter: AnsiChar;
  413.   Var PlayersScore: TScoreArray; PlayerCount: Integer);
  414. Var
  415.     FirstLetterCount, SecondLetterCount, FoundLetters, FindIndex, I: Integer;
  416.     IsWordCorrect, IsVotedFor: Boolean;
  417. Begin
  418.     FoundLetters := 0;
  419.     For FirstLetterCount := 1 To Length(InputWord) Do
  420.         For SecondLetterCount := 1 To Length(LetterPack) Do
  421.             If (InputWord[FirstLetterCount] = LetterPack[SecondLetterCount]) Then
  422.             Begin
  423.                 Inc(FoundLetters);
  424.                 LetterPack[SecondLetterCount] := '0';
  425.                 Break;
  426.             End;
  427.     If (FoundLetters <> Length(InputWord)) Then
  428.     Begin
  429.         PlayersScore[PlayerCount] := PlayersScore[PlayerCount] + (-1) * Length(InputWord);
  430.         Writeln('Введено неверное слово. Ваш счёт: ', PlayersScore[PlayerCount]);
  431.     End
  432.     Else
  433.     Begin
  434.         IsWordCorrect := IsWordInBank(InputWord, WordBank, FindIndex);
  435.         If IsWordCorrect Then
  436.         Begin
  437.             If (InputWord[1] = LastLetter) Then
  438.                 PlayersScore[PlayerCount] := 2 * (PlayersScore[PlayerCount] + Length(InputWord))
  439.             Else
  440.                 PlayersScore[PlayerCount] := PlayersScore[PlayerCount] + Length(InputWord);
  441.             Writeln('Слово верное! Ваш счёт: ', PlayersScore[PlayerCount]);
  442.         End
  443.         Else
  444.         Begin
  445.             Writeln('Голосование: добавлять ли слово "', InputWord, '" в Банк Слов?');
  446.             IsVotedFor := ResultOfVote(PlayerCount, Length(PlayersScore));
  447.             If IsVotedFor Then
  448.             Begin
  449.                 If (InputWord[1] = LastLetter) Then
  450.                     PlayersScore[PlayerCount] := 2 * (PlayersScore[PlayerCount] + Length(InputWord))
  451.                 Else
  452.                     PlayersScore[PlayerCount] := PlayersScore[PlayerCount] + Length(InputWord);
  453.                 AddInsertWord(WordBank, InputWord);
  454.                 RewriteWordBankFile(WordBank);
  455.                 Writeln(#13#10, 'Слово внесено в Банк Слов! Ваш счёт: ', PlayersScore[PlayerCount]);
  456.             End
  457.             Else
  458.             Begin
  459.                 PlayersScore[PlayerCount] := PlayersScore[PlayerCount] + (-1) * Length(InputWord);
  460.                 Writeln(#13#10, 'Слово не внесено в Банк Слов. Ваш счёт: ', PlayersScore[PlayerCount]);
  461.             End;
  462.         End;
  463.     End;
  464.     For I := 0 To High(PlayersScore) Do
  465.         Writeln('Очки ', I + 1, ' игрока: ', PlayersScore[I]);
  466.     Writeln(#13#10, 'Нажмите Enter, чтобы перейти к следующему ходу.');
  467.     Readln;
  468.     //такие убогие условия иногда встречаются, какая-то проблема с самым первым считыванием
  469.     If (LastLetter = #0) Or (InputWord = '') Then
  470.         Readln;
  471. End;
  472.  
  473. Procedure PlayGame(Var WordBank: TWordArray; Var NumberOfPlayers: Integer; Var PlayersScore: TScoreArray; BonusUsageArray: TBonusArray);
  474. Const
  475.     MOVE_SKIP = '';
  476.     FIFTY_FIFTY = '50';
  477.     FRIEND_HELP = '+';
  478. Var
  479.     LastLetter: AnsiChar;
  480.     PlayerCount, SkippedMoves, HelpCount, CharCount: Integer;
  481.     IsGameOver, IsInputCorrect, IsSkipped: Boolean;
  482.     InputWord: AnsiString;
  483.     LetterBank: TLetterArray;
  484.     PlayersLetters: TPlayerStringArray;
  485. Begin
  486.     LastLetter := #0;
  487.     InputWord := '';
  488.     SetLength(PlayersLetters, NumberOfPlayers);
  489.     SetLength(PlayersScore, NumberOfPlayers);
  490.     SetLength(BonusUsageArray, NumberOfPlayers);
  491.     LetterBank := StartLetterBank;
  492.     IsGameOver := False;
  493.     //заполняются наборы букв
  494.     For PlayerCount := 0 To High(PlayersLetters) Do
  495.         FillPlayerString(PlayersLetters[PlayerCount], LetterBank);
  496.     Repeat
  497.         SkippedMoves := 0;
  498.         IsSkipped := False;
  499.         //цикл ходов игроков в рамках одного хода игры
  500.         For PlayerCount := 0 To High(PlayersScore) Do
  501.         Begin
  502.             RefillLetterPacks(PlayersLetters);
  503.             OutputMoveConditions(PlayerCount, PlayersLetters[PlayerCount]);
  504.             InputWord := ReadPlayersWord(PlayersLetters[PlayerCount]);
  505.             Writeln;
  506.             If (InputWord = MOVE_SKIP) Then
  507.             Begin //Первый скип
  508.                 Inc(SkippedMoves);
  509.                 IsSkipped := True;
  510.             End
  511.             Else
  512.                 If (InputWord = FIFTY_FIFTY) Then
  513.                 Begin
  514.                     If (BonusUsageArray[PlayerCount, 0]) Then
  515.                         Writeln('Вы уже использовали этот бонус. Повторите ввод: ')
  516.                     Else
  517.                     Begin
  518.                         BonusUsageArray[PlayerCount, 0] := ExecuteBonus50(PlayersLetters[PlayerCount], LetterBank, PlayersScore,
  519.                           PlayerCount);
  520.                         Write(#13#10, 'Ваш набор букв: [');
  521.                         For CharCount := 1 To 9 Do
  522.                             Write(PlayersLetters[PlayerCount][CharCount], ', ');
  523.                         Writeln(PlayersLetters[PlayerCount][10], '].');
  524.                         Write(#13#10, 'Введите ваше слово: ');
  525.                     End;
  526.                     Repeat
  527.                         IsInputCorrect := True;
  528.                         InputWord := ReadPlayersWord(PlayersLetters[PlayerCount]);
  529.                         If (InputWord = FIFTY_FIFTY) Or (InputWord = FRIEND_HELP) Then
  530.                         Begin
  531.                             IsInputCorrect := False;
  532.                             Write('Бонусы можно использовать только один раз за ход. Повторите ввод: ');
  533.                         End;
  534.                     Until IsInputCorrect;
  535.                     Writeln;
  536.                 End
  537.                 Else
  538.                     If (InputWord = FRIEND_HELP) Then
  539.                     Begin
  540.                         If (BonusUsageArray[PlayerCount, 0]) Then
  541.                             Writeln('Вы уже использовали этот бонус. Повторите ввод: ')
  542.                         Else
  543.                         Begin
  544.                             For HelpCount := 0 To High(PlayersLetters) Do
  545.                                 If (HelpCount <> PlayerCount) Then
  546.                                 Begin
  547.                                     Write('Набор игрока ', HelpCount + 1, ': [');
  548.                                     For CharCount := 1 To 9 Do
  549.                                         Write(PlayersLetters[HelpCount][CharCount], ', ');
  550.                                     Writeln(PlayersLetters[HelpCount][10], '].');
  551.                                 End;
  552.                             Writeln;
  553.                             BonusUsageArray[PlayerCount, 1] := ExecuteBonusHelp(PlayersLetters, PlayerCount);
  554.                             Write(#13#10, 'Ваш набор букв: [');
  555.                             For CharCount := 1 To 9 Do
  556.                                 Write(PlayersLetters[PlayerCount][CharCount], ', ');
  557.                             Writeln(PlayersLetters[PlayerCount][10], '].');
  558.                             Write(#13#10, 'Введите ваше слово: ');
  559.                         End;
  560.                         Repeat
  561.                             IsInputCorrect := True;
  562.                             InputWord := ReadPlayersWord(PlayersLetters[PlayerCount]);
  563.                             If (InputWord = FIFTY_FIFTY) Or (InputWord = FRIEND_HELP) Then
  564.                             Begin
  565.                                 IsInputCorrect := False;
  566.                                 Write('Бонусы можно использовать только один раз за ход. Повторите ввод: ');
  567.                             End;
  568.                         Until IsInputCorrect;
  569.                         Writeln;
  570.                     End;
  571.             If (InputWord = MOVE_SKIP) And (IsSkipped = False) Then
  572.                 Inc(SkippedMoves);
  573.             If IsSkipped = False Then
  574.                 CalculatePoints(InputWord, PlayersLetters[PlayerCount], WordBank, LastLetter, PlayersScore, PlayerCount);
  575.             If (InputWord <> MOVE_SKIP) Then
  576.                 LastLetter := InputWord[Length(InputWord)]
  577.         End;
  578.         If (SkippedMoves = Length(PlayersScore)) Then
  579.             IsGameOver := True;
  580.         If (SkippedMoves = Length(PlayersScore)) And (LastLetter = #0) Then
  581.             NumberOfPlayers := -1;
  582.     Until IsGameOver;
  583. End;
  584.  
  585. Procedure FindWinner(AmountOfPlayers: Integer; Var PlayerScore: TScoreArray);
  586. Var
  587.     NumberOfPlayer, Max, WinnerNumber: Integer;
  588. Begin
  589.     ClearConsole;
  590.     If (AmountOfPlayers <> -1) Then
  591.     Begin
  592.         Max := PlayerScore[0];
  593.         WinnerNumber := 0;
  594.         For NumberOfPlayer := 1 To High(PlayerScore) Do
  595.         Begin
  596.             If PlayerScore[NumberOfPlayer] > Max Then
  597.             Begin
  598.                 Max := PlayerScore[NumberOfPlayer];
  599.                 WinnerNumber := NumberOfPlayer;
  600.             End;
  601.         End;
  602.         Writeln('Игра завершена! Победитель - игрок под номером ', WinnerNumber + 1, ' со счётом ', Max, '.');
  603.         Writeln(#13#10, 'Поздравляем!', #13#10, #13#10, 'Нажмите Enter, чтобы выйти из игры.');
  604.     End
  605.     Else
  606.     Begin
  607.         Writeln('Не было сделано ни одного хода. Игра завершена.');
  608.         Writeln(#13#10, 'Нажмите Enter, чтобы выйти из игры.');
  609.     End;
  610.     Readln;
  611. End;
  612.  
  613. Var
  614.     WordBank: TWordArray;
  615.     NumberOfPlayers: Integer;
  616.     PlayersScore: TScoreArray;
  617.     BonusUsageArray: TBonusArray;
  618.  
  619. Begin
  620.     WordBank := CreateWordBank();
  621.     NumberOfPlayers := InputNumberOfPlayers();
  622.     PlayGame(WordBank, NumberOfPlayers, PlayersScore, BonusUsageArray);
  623.     FindWinner(NumberOfPlayers, PlayersScore);
  624.     Readln;
  625. End.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement