Guest User

Untitled

a guest
Nov 24th, 2017
78
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.89 KB | None | 0 0
  1. (* Tennis Kata in OCaml! *)
  2.  
  3. type player = PlayerOne | PlayerTwo
  4.  
  5.  
  6. type point = Love | Fifteen | Thirty
  7.  
  8.  
  9. type score =
  10. | Points of point * point
  11. | Forty of player * point
  12. | Duece
  13. | Advantage of player
  14. | GameOver of player
  15.  
  16.  
  17. let is_player_one p =
  18. p = PlayerOne
  19.  
  20.  
  21. let new_game =
  22. Points(Love, Love)
  23.  
  24.  
  25. let transition_to_forty score player =
  26. match score with
  27. | Points (p1_point, p2_point) ->
  28. if is_player_one player then Forty(PlayerOne, p2_point)
  29. else Forty(PlayerTwo, p1_point)
  30.  
  31. | _ -> score (* You can only goto Forty from Points *)
  32.  
  33.  
  34. let transition_to_duece score player =
  35. match score with
  36. | Forty (player_w_forty, other_point) ->
  37. if player_w_forty <> player then Duece else score
  38.  
  39. | Advantage (player_w_adv) ->
  40. Duece
  41.  
  42. | _ -> score (* You can only goto Duece from Forty *)
  43.  
  44.  
  45. let transition_to_advantage score player =
  46. match score with
  47. | Duece -> Advantage(player)
  48. | _ -> score (* You can only goto Advantage from Deuce *)
  49.  
  50.  
  51. let transition_to_gameover score player =
  52. match score with
  53. | Advantage (player_w_adv) ->
  54. if player_w_adv = player then GameOver(player) else score
  55.  
  56. | Forty (player_w_forty, other_point) ->
  57. if player_w_forty = player then GameOver(player) else score
  58.  
  59. | _ -> score (* You can only goto GameOver from Advantage & Forty *)
  60.  
  61.  
  62. let next_score_from_points point other_point player score =
  63. match point with
  64. | Love -> Points(Fifteen, other_point)
  65. | Fifteen -> Points(Thirty, other_point)
  66. | Thirty -> transition_to_forty score player
  67.  
  68.  
  69. let next_score_from_forty player_w_forty point score player =
  70. match point with
  71. | Love -> Forty(player_w_forty, Fifteen)
  72. | Fifteen -> Forty(player_w_forty, Thirty)
  73. | Thirty -> transition_to_duece score player
  74.  
  75.  
  76. let player_scored score player =
  77. match score with
  78. | Points (p1, p2) ->
  79. if is_player_one player then next_score_from_points p1 p2 player score
  80. else next_score_from_points p2 p1 player score
  81.  
  82. | Forty (player_w_forty, other_point) ->
  83. if player_w_forty = player then transition_to_gameover score player
  84. else next_score_from_forty player_w_forty other_point score player
  85.  
  86. | Duece -> transition_to_advantage score player
  87.  
  88. | Advantage (player_w_adv) ->
  89. if player_w_adv = player then transition_to_gameover score player
  90. else transition_to_duece score player
  91.  
  92. | GameOver (winner) -> GameOver (winner) (* Still the winner *)
  93.  
  94.  
  95. (* Output as string helpers *)
  96.  
  97. let player_to_str = function
  98. | PlayerOne -> "Player 1"
  99. | PlayerTwo -> "Player 2"
  100.  
  101.  
  102. let point_to_str = function
  103. | Love -> "love"
  104. | Fifteen -> "15"
  105. | Thirty -> "30"
  106.  
  107.  
  108. let score_line p1 p2 =
  109. "Player 1: " ^ p1 ^ " Player 2: " ^ p2
  110.  
  111.  
  112. let score_to_str = function
  113. | Points (p_one, p_two) ->
  114. score_line (point_to_str p_one) (point_to_str p_two)
  115.  
  116. | Forty (player_w_forty, other) ->
  117. if is_player_one player_w_forty then score_line "40" (point_to_str other)
  118. else score_line (point_to_str other) "40"
  119.  
  120. | Duece ->
  121. "At duece"
  122.  
  123. | Advantage (player) ->
  124. "Advantage " ^ player_to_str player
  125.  
  126. | GameOver (player) ->
  127. "Game over! " ^ player_to_str player ^ " has won."
  128.  
  129.  
  130. (* "Test" scenarios *)
  131. let scenario_one_player1_kills start_game =
  132. let score_1 = player_scored new_game PlayerOne in
  133. let score_2 = player_scored score_1 PlayerOne in
  134. let score_3 = player_scored score_2 PlayerOne in
  135. let score_4 = player_scored score_3 PlayerOne in
  136. "START\n" ^
  137. (score_to_str start_game) ^ "\n" ^
  138. (score_to_str score_1) ^ "\n" ^
  139. (score_to_str score_2) ^ "\n" ^
  140. (score_to_str score_3) ^ "\n" ^
  141. (score_to_str score_4) ^ "\n" ^
  142. "END"
  143.  
  144. let scenario_two_good_game start_game =
  145. let score_1 = player_scored new_game PlayerOne in
  146. let score_2 = player_scored score_1 PlayerOne in
  147. let score_3 = player_scored score_2 PlayerOne in
  148. let score_4 = player_scored score_3 PlayerTwo in
  149. let score_5 = player_scored score_4 PlayerTwo in
  150. let score_6 = player_scored score_5 PlayerTwo in
  151. let score_7 = player_scored score_6 PlayerTwo in
  152. let score_8 = player_scored score_7 PlayerOne in
  153. let score_9 = player_scored score_8 PlayerOne in
  154. let score_10 = player_scored score_9 PlayerOne in
  155. "START (scenario_two_good_game)\n" ^
  156. (score_to_str start_game) ^ "\n" ^
  157. (score_to_str score_1) ^ "\n" ^
  158. (score_to_str score_2) ^ "\n" ^
  159. (score_to_str score_3) ^ "\n" ^
  160. (score_to_str score_4) ^ "\n" ^
  161. (score_to_str score_5) ^ "\n" ^
  162. (score_to_str score_6) ^ "\n" ^
  163. (score_to_str score_7) ^ "\n" ^
  164. (score_to_str score_8) ^ "\n" ^
  165. (score_to_str score_9) ^ "\n" ^
  166. (score_to_str score_10) ^ "\n" ^
  167. "END"
  168.  
  169. let () =
  170. print_endline (scenario_one_player1_kills new_game)
  171.  
  172. let () =
  173. print_endline (scenario_two_good_game new_game)
  174.  
  175. (*
  176. DEBUGGIN'
  177. print_endline (score_to_str (Points(Love, Love)));;
  178.  
  179. print_endline (score_to_str (Points(Love, Fifteen)));;
  180.  
  181. print_endline (score_to_str (Forty(PlayerOne, Fifteen)));;
  182.  
  183. print_endline (score_to_str (Forty(PlayerTwo, Thirty)));;
  184.  
  185. print_endline (score_to_str (Advantage(PlayerTwo)));;
  186.  
  187. print_endline (score_to_str (Advantage(PlayerOne)));;
  188.  
  189. print_endline (score_to_str (GameOver(PlayerOne)));;
  190.  
  191. print_endline (score_to_str (transition_to_forty (Points(Love, Fifteen)) PlayerOne));;
  192.  
  193. print_endline (score_to_str (transition_to_forty (Points(Love, Fifteen)) PlayerTwo));;
  194.  
  195. print_endline (score_to_str (transition_to_duece (Forty(PlayerOne, Fifteen))));;
  196.  
  197. print_endline (score_to_str (transition_to_advantage (Duece) PlayerOne));;
  198.  
  199. print_endline (score_to_str (transition_to_advantage (Duece) PlayerTwo));;
  200.  
  201. print_endline (score_to_str (transition_to_gameover (Advantage(PlayerTwo)) PlayerTwo));;
  202.  
  203. print_endline (score_to_str (transition_to_gameover (Advantage(PlayerOne)) PlayerTwo));;
  204.  
  205. print_endline (score_to_str (transition_to_gameover (Forty(PlayerTwo, Love)) PlayerTwo));;
  206.  
  207. print_endline (score_to_str (transition_to_gameover (Forty(PlayerOne, Fifteen)) PlayerTwo));;
  208. *)
Add Comment
Please, Sign In to add comment