Words.Mod 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. MODULE Words;
  2. IMPORT Files, Random;
  3. CONST maxLetters = 33;
  4. maxWords = 1000;
  5. TYPE
  6. Word* = RECORD
  7. len*: INTEGER;
  8. L*: ARRAY maxLetters OF CHAR;
  9. open*: ARRAY maxLetters OF BOOLEAN
  10. END;
  11. VAR loaded*: BOOLEAN;
  12. error: BOOLEAN;
  13. words: ARRAY maxWords, maxLetters OF CHAR;
  14. lengths: ARRAY maxWords OF INTEGER;
  15. nofwords: INTEGER;
  16. PROCEDURE RandomWord*(VAR word: Word);
  17. VAR i, n: INTEGER;
  18. BEGIN
  19. n := Random.Int(nofwords);
  20. word.len := lengths[n];
  21. FOR i := 0 TO word.len - 1 DO
  22. word.L[i] := words[n][i];
  23. word.open[i] := FALSE
  24. END
  25. END RandomWord;
  26. (** Returns TRUE if all letters in word are open. *)
  27. PROCEDURE IsOpen*(VAR word: Word): BOOLEAN;
  28. VAR i: INTEGER;
  29. BEGIN i := 0;
  30. WHILE (i # word.len) & word.open[i] DO INC(i) END
  31. RETURN i = word.len END IsOpen;
  32. PROCEDURE ApplyLetter*(VAR word: Word; L: CHAR; VAR applied: BOOLEAN);
  33. VAR i: INTEGER;
  34. BEGIN applied := FALSE;
  35. FOR i := 0 TO word.len - 1 DO
  36. IF ~word.open[i] & (word.L[i] = L) THEN
  37. word.open[i] := TRUE;
  38. applied := TRUE
  39. END
  40. END
  41. END ApplyLetter;
  42. PROCEDURE FallbackWords;
  43. BEGIN
  44. loaded := FALSE;
  45. nofwords := 2;
  46. words[0] := 'РЫБАЛКА'; lengths[0] := 7;
  47. words[1] := 'ЯКУБОВИЧ'; lengths[1] := 8
  48. END FallbackWords;
  49. PROCEDURE LoadWord*(VAR r: Files.Rider);
  50. VAR c: CHAR;
  51. i: INTEGER;
  52. BEGIN i := 0;
  53. Files.ReadChar(r, c);
  54. WHILE ~r.eof & (c > ' ') DO
  55. IF (i # maxLetters) & ('А' <= c) & (c <= 'Я') THEN
  56. words[nofwords][i] := c;
  57. INC(i)
  58. ELSE error := TRUE
  59. END;
  60. Files.ReadChar(r, c)
  61. END;
  62. lengths[nofwords] := i;
  63. INC(nofwords)
  64. END LoadWord;
  65. PROCEDURE LoadWords;
  66. VAR F: Files.File;
  67. r: Files.Rider;
  68. BEGIN
  69. F := Files.Old('words.dat');
  70. IF F = NIL THEN FallbackWords
  71. ELSE Files.Set(r, F, 0);
  72. nofwords := 0; error := FALSE;
  73. WHILE ~r.eof & ~error & (nofwords # maxWords) DO LoadWord(r) END;
  74. loaded := ~error
  75. END
  76. END LoadWords;
  77. BEGIN
  78. LoadWords
  79. END Words.