bashrw_ttt 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (130) hide show
  1. data/bin/play.rb +10 -0
  2. data/lib/ttt/ai.rb +33 -0
  3. data/lib/ttt/ai_easy.rb +17 -0
  4. data/lib/ttt/ai_hard.rb +21 -0
  5. data/lib/ttt/ai_medium.rb +21 -0
  6. data/lib/ttt/ai_medium_back.rb +58 -0
  7. data/lib/ttt/board.rb +37 -0
  8. data/lib/ttt/config_helper.rb +53 -0
  9. data/lib/ttt/config_options.rb +27 -0
  10. data/lib/ttt/context.rb +214 -0
  11. data/lib/ttt/four_by_four.rb +62 -0
  12. data/lib/ttt/game.rb +94 -0
  13. data/lib/ttt/game_history.rb +37 -0
  14. data/lib/ttt/game_interactor.rb +126 -0
  15. data/lib/ttt/human.rb +12 -0
  16. data/lib/ttt/interfaces/cli/lib/cli/board_selection.rb +34 -0
  17. data/lib/ttt/interfaces/cli/lib/cli/cli_game.rb +186 -0
  18. data/lib/ttt/interfaces/cli/lib/cli/cli_presenter.rb +216 -0
  19. data/lib/ttt/interfaces/cli/lib/cli/clio.rb +17 -0
  20. data/lib/ttt/interfaces/cli/lib/cli/play_again.rb +38 -0
  21. data/lib/ttt/interfaces/cli/lib/cli/player_selection.rb +43 -0
  22. data/lib/ttt/interfaces/cli/lib/cli/selection.rb +8 -0
  23. data/lib/ttt/interfaces/cli/lib/cli/walk_history.rb +48 -0
  24. data/lib/ttt/interfaces/cli/spec/cli/board_selection_spec.rb +29 -0
  25. data/lib/ttt/interfaces/cli/spec/cli/cli_game_spec.rb +376 -0
  26. data/lib/ttt/interfaces/cli/spec/cli/cli_presenter_spec.rb +147 -0
  27. data/lib/ttt/interfaces/cli/spec/cli/play_again_spec.rb +39 -0
  28. data/lib/ttt/interfaces/cli/spec/cli/player_selection_spec.rb +62 -0
  29. data/lib/ttt/interfaces/cli/spec/cli/walk_history_spec.rb +115 -0
  30. data/lib/ttt/interfaces/cli/spec/spec_helper.rb +14 -0
  31. data/lib/ttt/interfaces/limelight/four_by_four/props.rb +1 -0
  32. data/lib/ttt/interfaces/limelight/four_by_four/styles.rb +74 -0
  33. data/lib/ttt/interfaces/limelight/four_by_four_finished/props.rb +1 -0
  34. data/lib/ttt/interfaces/limelight/four_by_four_finished/styles.rb +74 -0
  35. data/lib/ttt/interfaces/limelight/game_list/players/load_button.rb +10 -0
  36. data/lib/ttt/interfaces/limelight/game_list/props.rb +17 -0
  37. data/lib/ttt/interfaces/limelight/game_list/styles.rb +8 -0
  38. data/lib/ttt/interfaces/limelight/main_menu/players/exit_ttt.rb +3 -0
  39. data/lib/ttt/interfaces/limelight/main_menu/players/load_game.rb +3 -0
  40. data/lib/ttt/interfaces/limelight/main_menu/players/new_game.rb +3 -0
  41. data/lib/ttt/interfaces/limelight/main_menu/props.rb +17 -0
  42. data/lib/ttt/interfaces/limelight/new_game/players/board_type.rb +1 -0
  43. data/lib/ttt/interfaces/limelight/new_game/players/new_game.rb +5 -0
  44. data/lib/ttt/interfaces/limelight/new_game/players/player_type.rb +1 -0
  45. data/lib/ttt/interfaces/limelight/new_game/players/setup_button.rb +21 -0
  46. data/lib/ttt/interfaces/limelight/new_game/props.rb +21 -0
  47. data/lib/ttt/interfaces/limelight/new_game/styles.rb +23 -0
  48. data/lib/ttt/interfaces/limelight/partials/board_partial.rb +14 -0
  49. data/lib/ttt/interfaces/limelight/partials/menu_button_partial.rb +5 -0
  50. data/lib/ttt/interfaces/limelight/partials/move_history_partial.rb +6 -0
  51. data/lib/ttt/interfaces/limelight/partials/title_history_partial.rb +10 -0
  52. data/lib/ttt/interfaces/limelight/players/board.rb +3 -0
  53. data/lib/ttt/interfaces/limelight/players/game.rb +4 -0
  54. data/lib/ttt/interfaces/limelight/players/generic_move_history.rb +5 -0
  55. data/lib/ttt/interfaces/limelight/players/generic_player.rb +8 -0
  56. data/lib/ttt/interfaces/limelight/players/left_button.rb +3 -0
  57. data/lib/ttt/interfaces/limelight/players/main_menu.rb +3 -0
  58. data/lib/ttt/interfaces/limelight/players/right_button.rb +3 -0
  59. data/lib/ttt/interfaces/limelight/playscripts/game_playscript.rb +169 -0
  60. data/lib/ttt/interfaces/limelight/production.rb +14 -0
  61. data/lib/ttt/interfaces/limelight/spec/game_playscript_spec.rb +218 -0
  62. data/lib/ttt/interfaces/limelight/spec/main_menu/main_menu_spec.rb +38 -0
  63. data/lib/ttt/interfaces/limelight/spec/new_game/new_game_spec.rb +45 -0
  64. data/lib/ttt/interfaces/limelight/spec/spec_helper.rb +8 -0
  65. data/lib/ttt/interfaces/limelight/stages.rb +6 -0
  66. data/lib/ttt/interfaces/limelight/styles.rb +119 -0
  67. data/lib/ttt/interfaces/limelight/three_by_three/props.rb +1 -0
  68. data/lib/ttt/interfaces/limelight/three_by_three/styles.rb +39 -0
  69. data/lib/ttt/interfaces/limelight/three_by_three_by_three/props.rb +1 -0
  70. data/lib/ttt/interfaces/limelight/three_by_three_by_three/styles.rb +119 -0
  71. data/lib/ttt/interfaces/limelight/three_by_three_by_three_finished/props.rb +1 -0
  72. data/lib/ttt/interfaces/limelight/three_by_three_by_three_finished/styles.rb +119 -0
  73. data/lib/ttt/interfaces/limelight/three_by_three_finished/props.rb +1 -0
  74. data/lib/ttt/interfaces/limelight/three_by_three_finished/styles.rb +39 -0
  75. data/lib/ttt/interfaces/rails/app/controllers/application_controller.rb +3 -0
  76. data/lib/ttt/interfaces/rails/app/controllers/ttt_games_controller.rb +86 -0
  77. data/lib/ttt/interfaces/rails/app/helpers/application_helper.rb +2 -0
  78. data/lib/ttt/interfaces/rails/app/models/ttt_game.rb +34 -0
  79. data/lib/ttt/interfaces/rails/app/presenters/web_game_presenter.rb +159 -0
  80. data/lib/ttt/interfaces/rails/autotest/discover.rb +1 -0
  81. data/lib/ttt/interfaces/rails/config/application.rb +67 -0
  82. data/lib/ttt/interfaces/rails/config/boot.rb +6 -0
  83. data/lib/ttt/interfaces/rails/config/environment.rb +5 -0
  84. data/lib/ttt/interfaces/rails/config/environments/development.rb +37 -0
  85. data/lib/ttt/interfaces/rails/config/environments/production.rb +67 -0
  86. data/lib/ttt/interfaces/rails/config/environments/test.rb +37 -0
  87. data/lib/ttt/interfaces/rails/config/initializers/backtrace_silencers.rb +7 -0
  88. data/lib/ttt/interfaces/rails/config/initializers/inflections.rb +15 -0
  89. data/lib/ttt/interfaces/rails/config/initializers/mime_types.rb +5 -0
  90. data/lib/ttt/interfaces/rails/config/initializers/secret_token.rb +7 -0
  91. data/lib/ttt/interfaces/rails/config/initializers/session_store.rb +8 -0
  92. data/lib/ttt/interfaces/rails/config/initializers/wrap_parameters.rb +14 -0
  93. data/lib/ttt/interfaces/rails/config/routes.rb +49 -0
  94. data/lib/ttt/interfaces/rails/db/schema.rb +28 -0
  95. data/lib/ttt/interfaces/rails/db/seeds.rb +7 -0
  96. data/lib/ttt/interfaces/rails/spec/controllers/ttt_games_controller_spec.rb +211 -0
  97. data/lib/ttt/interfaces/rails/spec/models/ttt_game_spec.rb +76 -0
  98. data/lib/ttt/interfaces/rails/spec/presenters/web_game_presenter_spec.rb +52 -0
  99. data/lib/ttt/interfaces/rails/spec/spec_helper.rb +13 -0
  100. data/lib/ttt/interfaces/web_interface/html_generator.rb +76 -0
  101. data/lib/ttt/interfaces/web_interface/web_game_presenter.rb +0 -0
  102. data/lib/ttt/minimax.rb +46 -0
  103. data/lib/ttt/move_history.rb +10 -0
  104. data/lib/ttt/move_traverser.rb +49 -0
  105. data/lib/ttt/player.rb +15 -0
  106. data/lib/ttt/riak_db.rb +53 -0
  107. data/lib/ttt/setup.rb +59 -0
  108. data/lib/ttt/three_by_three.rb +35 -0
  109. data/lib/ttt/three_by_three_by_three.rb +37 -0
  110. data/spec/spec_helper.rb +22 -0
  111. data/spec/ttt/ai_easy_spec.rb +15 -0
  112. data/spec/ttt/ai_hard_spec.rb +76 -0
  113. data/spec/ttt/ai_medium_spec.rb +65 -0
  114. data/spec/ttt/ai_spec.rb +50 -0
  115. data/spec/ttt/board_spec.rb +96 -0
  116. data/spec/ttt/config_helper_spec.rb +54 -0
  117. data/spec/ttt/context_spec.rb +398 -0
  118. data/spec/ttt/four_by_four_spec.rb +112 -0
  119. data/spec/ttt/game_history_spec.rb +41 -0
  120. data/spec/ttt/game_interactor_spec.rb +197 -0
  121. data/spec/ttt/game_spec.rb +246 -0
  122. data/spec/ttt/human_spec.rb +18 -0
  123. data/spec/ttt/move_history_spec.rb +13 -0
  124. data/spec/ttt/move_traverser_spec.rb +75 -0
  125. data/spec/ttt/player_spec.rb +13 -0
  126. data/spec/ttt/riak_db_spec.rb +64 -0
  127. data/spec/ttt/setup_spec.rb +63 -0
  128. data/spec/ttt/three_by_three_by_three_spec.rb +130 -0
  129. data/spec/ttt/three_by_three_spec.rb +110 -0
  130. metadata +238 -0
@@ -0,0 +1 @@
1
+ __install 'partials/title_history_partial.rb', :text => "3x3", :n => 9, :c => 1
@@ -0,0 +1,39 @@
1
+ square0 {
2
+ extends :square
3
+ extends :above_square
4
+ extends :left_of_square
5
+ }
6
+
7
+ square1 {
8
+ extends :square0
9
+ }
10
+
11
+ square2 {
12
+ extends :above_square
13
+ }
14
+
15
+ square3 {
16
+ extends :square0
17
+ }
18
+
19
+ square4 {
20
+ extends :square0
21
+ }
22
+
23
+ square5 {
24
+ extends :above_square
25
+ }
26
+
27
+ square6 {
28
+ extends :square
29
+ extends :left_of_square
30
+ }
31
+
32
+ square7 {
33
+ extends :square
34
+ extends :left_of_square
35
+ }
36
+
37
+ square8 {
38
+ extends :square
39
+ }
@@ -0,0 +1 @@
1
+ __install "partials/title_history_partial.rb", :c => 3, :n => 9, :text => "3x3x3"
@@ -0,0 +1,119 @@
1
+ move_history {
2
+ float :on
3
+ text_color :white
4
+ font_size 15
5
+ x 1100
6
+ y 200
7
+ }
8
+
9
+ square0 {
10
+ extends :square
11
+ extends :above_square
12
+ extends :left_of_square
13
+ }
14
+
15
+ square9 {
16
+ extends :square0
17
+ }
18
+
19
+ square18 {
20
+ extends :square0
21
+ }
22
+
23
+ square1 {
24
+ extends :square0
25
+ }
26
+
27
+ square10 {
28
+ extends :square0
29
+ }
30
+
31
+ square19 {
32
+ extends :square0
33
+ }
34
+
35
+ square2 {
36
+ extends :square
37
+ extends :above_square
38
+ }
39
+
40
+ square11 {
41
+ extends :square2
42
+ }
43
+
44
+ square20 {
45
+ extends :square2
46
+ }
47
+
48
+ square3 {
49
+ extends :square0
50
+ }
51
+
52
+ square12 {
53
+ extends :square0
54
+ }
55
+
56
+ square21 {
57
+ extends :square0
58
+ }
59
+
60
+ square4 {
61
+ extends :square0
62
+ }
63
+
64
+ square13 {
65
+ extends :square0
66
+ }
67
+
68
+ square22 {
69
+ extends :square0
70
+ }
71
+
72
+ square5 {
73
+ extends :square2
74
+ }
75
+
76
+ square14 {
77
+ extends :square2
78
+ }
79
+
80
+ square23 {
81
+ extends :square2
82
+ }
83
+
84
+ square6 {
85
+ extends :square
86
+ extends :left_of_square
87
+ }
88
+
89
+ square15 {
90
+ extends :square6
91
+ }
92
+
93
+ square24 {
94
+ extends :square6
95
+ }
96
+
97
+ square7 {
98
+ extends :square6
99
+ }
100
+
101
+ square16 {
102
+ extends :square6
103
+ }
104
+
105
+ square25 {
106
+ extends :square6
107
+ }
108
+
109
+ square8 {
110
+ extends :square
111
+ }
112
+
113
+ square17 {
114
+ extends :square
115
+ }
116
+
117
+ square26 {
118
+ extends :square
119
+ }
@@ -0,0 +1 @@
1
+ __install "partials/move_history_partial.rb", :c => 3, :n => 9, :text => "3x3x3"
@@ -0,0 +1,119 @@
1
+ move_history {
2
+ float :on
3
+ text_color :white
4
+ font_size 15
5
+ x 1100
6
+ y 200
7
+ }
8
+
9
+ square0 {
10
+ extends :square
11
+ extends :above_square
12
+ extends :left_of_square
13
+ }
14
+
15
+ square9 {
16
+ extends :square0
17
+ }
18
+
19
+ square18 {
20
+ extends :square0
21
+ }
22
+
23
+ square1 {
24
+ extends :square0
25
+ }
26
+
27
+ square10 {
28
+ extends :square0
29
+ }
30
+
31
+ square19 {
32
+ extends :square0
33
+ }
34
+
35
+ square2 {
36
+ extends :square
37
+ extends :above_square
38
+ }
39
+
40
+ square11 {
41
+ extends :square2
42
+ }
43
+
44
+ square20 {
45
+ extends :square2
46
+ }
47
+
48
+ square3 {
49
+ extends :square0
50
+ }
51
+
52
+ square12 {
53
+ extends :square0
54
+ }
55
+
56
+ square21 {
57
+ extends :square0
58
+ }
59
+
60
+ square4 {
61
+ extends :square0
62
+ }
63
+
64
+ square13 {
65
+ extends :square0
66
+ }
67
+
68
+ square22 {
69
+ extends :square0
70
+ }
71
+
72
+ square5 {
73
+ extends :square2
74
+ }
75
+
76
+ square14 {
77
+ extends :square2
78
+ }
79
+
80
+ square23 {
81
+ extends :square2
82
+ }
83
+
84
+ square6 {
85
+ extends :square
86
+ extends :left_of_square
87
+ }
88
+
89
+ square15 {
90
+ extends :square6
91
+ }
92
+
93
+ square24 {
94
+ extends :square6
95
+ }
96
+
97
+ square7 {
98
+ extends :square6
99
+ }
100
+
101
+ square16 {
102
+ extends :square6
103
+ }
104
+
105
+ square25 {
106
+ extends :square6
107
+ }
108
+
109
+ square8 {
110
+ extends :square
111
+ }
112
+
113
+ square17 {
114
+ extends :square
115
+ }
116
+
117
+ square26 {
118
+ extends :square
119
+ }
@@ -0,0 +1 @@
1
+ __install 'partials/move_history_partial.rb', :text => "3x3", :n => 9, :c => 1
@@ -0,0 +1,39 @@
1
+ square0 {
2
+ extends :square
3
+ extends :above_square
4
+ extends :left_of_square
5
+ }
6
+
7
+ square1 {
8
+ extends :square0
9
+ }
10
+
11
+ square2 {
12
+ extends :above_square
13
+ }
14
+
15
+ square3 {
16
+ extends :square0
17
+ }
18
+
19
+ square4 {
20
+ extends :square0
21
+ }
22
+
23
+ square5 {
24
+ extends :above_square
25
+ }
26
+
27
+ square6 {
28
+ extends :square
29
+ extends :left_of_square
30
+ }
31
+
32
+ square7 {
33
+ extends :square
34
+ extends :left_of_square
35
+ }
36
+
37
+ square8 {
38
+ extends :square
39
+ }
@@ -0,0 +1,3 @@
1
+ class ApplicationController < ActionController::Base
2
+ protect_from_forgery
3
+ end
@@ -0,0 +1,86 @@
1
+ require 'ttt/setup'
2
+ require 'ttt/context'
3
+
4
+ class TttGamesController < ApplicationController
5
+ before_filter :set_context
6
+
7
+ def welcome
8
+ redirect_to :action => "new"
9
+ end
10
+
11
+ def new
12
+ cookies[:game_id] = nil
13
+ cookies[:move_index] = nil
14
+ @players = @context.players
15
+ @boards = @context.boards
16
+ end
17
+
18
+ def create_game
19
+ game = @context.setup.new_game(player1: params[:player1], player2: params[:player2], board: params[:board])
20
+ cookies[:game_id] = @context.add_game(game)
21
+ flash[:notice] = "Welcome to Tic Tac Toe!"
22
+ redirect_to :action => "show"
23
+ end
24
+
25
+ def show
26
+ @game = @context.get_game(cookies[:game_id])
27
+ @web_game_presenter = WebGamePresenter.for(board: @game.board, id: cookies[:game_id])
28
+ @web_game_history = @context.get_history(cookies[:game_id])
29
+ @id = cookies[:game_id]
30
+ @finished = @game.board.finished?
31
+ flash[:notice], view_file = TttGame.evaluate_game(cookies[:game_id], @context)
32
+ render view_file
33
+ end
34
+
35
+ def game_list
36
+ @games = @context.game_list
37
+ end
38
+
39
+ def get_game
40
+ cookies[:game_id] = params[:id]
41
+ redirect_to :action => "show"
42
+ end
43
+
44
+ def move_history
45
+ @game = @context.get_game(params[:id])
46
+ @id, cookies[:game_id] = params[:id], params[:id]
47
+ @web_game_history = @context.get_history(@id)
48
+ adjust_move_index_pointers(params[:index_diff].to_i)
49
+ @game.board.board = TttGame.get_history_board(@game, cookies[:move_index])
50
+ @web_game_presenter = WebGamePresenter.for(board: @game.board, id: cookies[:game_id])
51
+ @finished = true
52
+ cookies[:last_id] = @id
53
+ flash[:notice], view_file = TttGame.evaluate_game(cookies[:game_id], @context)
54
+ render view_file
55
+ end
56
+
57
+ def update_game
58
+ @game = @context.get_game(params[:id])
59
+ @context.update_game(params[:id], params[:move], @game.current_player.side)
60
+ cookies[:game_id] = params[:id]
61
+ redirect_to :action => "show"
62
+ end
63
+
64
+ def next_move
65
+ @context.ai_move(params[:id])
66
+ redirect_to :action => "show"
67
+ end
68
+
69
+ private
70
+ def adjust_move_index_pointers(index_diff)
71
+ max_length = TttGame.get_history_length(cookies[:game_id], @context)
72
+ if cookies[:game_id] == cookies[:last_id]
73
+ cur_index = cookies[:move_index].to_i
74
+ temp_index = cur_index + index_diff
75
+ cur_index += index_diff if((max_length - temp_index.abs >= 0) && (temp_index <= 0))
76
+ cookies[:move_index] = cur_index
77
+ else
78
+ cookies[:move_index] = index_diff.to_i
79
+ end
80
+ end
81
+
82
+ def set_context
83
+ @context = TTT::Context.instance
84
+ @context.setup = TTT::Setup
85
+ end
86
+ end
@@ -0,0 +1,2 @@
1
+ module ApplicationHelper
2
+ end
@@ -0,0 +1,34 @@
1
+ require 'yaml'
2
+
3
+ class TttGame
4
+ def self.evaluate_game(game_id, context)
5
+ @game_id, @context = game_id, context
6
+ if finished? && winner?
7
+ winner = @context.winner(@game_id) + " is the winner!"
8
+ return winner, "end_game"
9
+ elsif finished?
10
+ return "It's a draw", "end_game"
11
+ else
12
+ player = @context.which_current_player?(@game_id) + "'s turn"
13
+ return player, "show"
14
+ end
15
+ end
16
+
17
+ def self.get_history_length(game_id, context)
18
+ context.get_history_length(game_id)
19
+ end
20
+
21
+ def self.get_history_board(game, move_index_diff)
22
+ move_traverser = game.history.move_traverser
23
+ move_traverser.adjust_move_index(move_index_diff.to_i)
24
+ move_traverser.history_board_builder(game.board, move_traverser.move_index)
25
+ end
26
+
27
+ def self.finished?
28
+ @context.finished?(@game_id)
29
+ end
30
+
31
+ def self.winner?
32
+ @context.winner?(@game_id)
33
+ end
34
+ end