hilo.ocm 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. #
  2. -- $Source$
  3. -- $State$
  4. -- $Revision$
  5. #include "dec.ocm"
  6. -- General utilities: read and write strings.
  7. proc puts(value s[]) =
  8. seq i = [1 for s[byte 0]]
  9. output ! s[byte i]
  10. :
  11. proc gets(var s[]) =
  12. var length, finished, c:
  13. seq
  14. finished := false
  15. length := 0
  16. while not finished
  17. seq
  18. input ? c
  19. if
  20. c = 10
  21. finished := true
  22. true
  23. seq
  24. length := length + 1
  25. s[byte length] := c
  26. s[byte 0] := length
  27. :
  28. -- Our random number generator.
  29. var seed:
  30. proc randomise(value s) =
  31. seq
  32. seed := s
  33. :
  34. proc random(value range, var result) =
  35. seq
  36. seed := (20077 * seed) + 12345
  37. if
  38. seed < 0
  39. seed := -seed
  40. true
  41. skip
  42. result := seed \ range
  43. :
  44. -- Does the reading-in-the-name thing.
  45. proc getname =
  46. var seed, buffer[128]:
  47. seq
  48. puts("*nHi there! I'm written in Occam. Before we start, what is your name?*n")
  49. puts("> ")
  50. gets(buffer)
  51. seed := 0
  52. seq i = [1 for buffer[byte 0]]
  53. seed := seed + buffer[byte i]
  54. randomise(seed)
  55. puts("*nHello, ")
  56. puts(buffer)
  57. puts("! ")
  58. :
  59. -- Plays a single game.
  60. proc game =
  61. var Number, Attempts, finished, guess:
  62. seq
  63. puts("See if you can guess my number.*n")
  64. random(100, Number)
  65. Attempts := 1
  66. finished := false
  67. while not finished
  68. seq
  69. puts("*n> ")
  70. var c:
  71. seq
  72. c := '*s'
  73. decin(input, guess, c)
  74. if
  75. guess = Number
  76. seq
  77. puts("*nYou got it right in only ")
  78. decout(output, Attempts, 0)
  79. puts(" ")
  80. if
  81. Attempts = 1
  82. puts("go")
  83. true
  84. puts("goes")
  85. puts("!*n")
  86. finished := true
  87. guess < Number
  88. puts("*nTry a bit higher.*n")
  89. guess > Number
  90. puts("*nTry a bit lower.*n")
  91. Attempts := Attempts + 1
  92. :
  93. var finished, buffer[128]:
  94. seq
  95. output ! TEXT
  96. getname
  97. finished := false
  98. while not finished
  99. seq
  100. game
  101. puts("*nWould you like another go?*n")
  102. puts("> ")
  103. gets(buffer)
  104. if
  105. (buffer[byte 1] = 'n') or (buffer[byte 1] = 'N')
  106. seq
  107. finished := true
  108. puts("*nThanks for playing --- goodbye!*n")
  109. true
  110. puts("*nExcellent! ")