games_bfox 0.3.0 → 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +8 -12
- data/config/application.yml +5 -0
- data/games.gemspec +2 -1
- data/lib/games/mastermind/board_builder.rb +6 -2
- data/lib/games/mastermind/computer_player_expert.rb +31 -0
- data/lib/games/mastermind/computer_player_novice.rb +18 -0
- data/lib/games/mastermind/game.rb +69 -15
- data/lib/games/mastermind/guess_evaluator.rb +105 -68
- data/lib/games/mastermind/guess_evaluator_result.rb +11 -0
- data/lib/games/mastermind/human_player.rb +9 -0
- data/lib/games/mastermind/io_helpers.rb +65 -0
- data/lib/games/mastermind/peg.rb +2 -4
- data/lib/games/mastermind/pegs.rb +1 -9
- data/lib/games/mastermind/pegs_factory.rb +3 -5
- data/lib/games/mastermind/players_factory.rb +32 -8
- data/lib/games/mastermind/secret_code.rb +19 -0
- data/lib/games/mastermind.rb +9 -2
- data/lib/games/shared/game.rb +56 -70
- data/lib/games/shared/{input_helper.rb → io_helpers.rb} +40 -32
- data/lib/games/shared/player.rb +1 -3
- data/lib/games/shared/player_factory.rb +9 -0
- data/lib/games/shared/players_factory.rb +9 -0
- data/lib/games/tictactoe/board.rb +3 -4
- data/lib/games/tictactoe/board_builder.rb +3 -3
- data/lib/games/tictactoe/board_presenter_terminal.rb +3 -3
- data/lib/games/tictactoe/computer_player_expert.rb +12 -0
- data/lib/games/tictactoe/computer_player_novice.rb +10 -0
- data/lib/games/tictactoe/game.rb +45 -12
- data/lib/games/tictactoe/human_player.rb +9 -0
- data/lib/games/tictactoe/io_helpers.rb +81 -0
- data/lib/games/tictactoe/player.rb +4 -0
- data/lib/games/tictactoe/players_factory.rb +49 -5
- data/lib/games/tictactoe/square.rb +0 -3
- data/lib/games/tictactoe/squares.rb +1 -1
- data/lib/games/tictactoe/squares_factory.rb +7 -11
- data/lib/games/tictactoe.rb +9 -2
- data/lib/games/version.rb +1 -1
- metadata +32 -17
- data/lib/games/mastermind/colors.rb +0 -14
- data/lib/games/mastermind/game_config.rb +0 -48
- data/lib/games/mastermind/game_resetter.rb +0 -19
- data/lib/games/mastermind/game_state_changer.rb +0 -41
- data/lib/games/mastermind/input_helper.rb +0 -67
- data/lib/games/mastermind/move_generator.rb +0 -46
- data/lib/games/shared/array_iterator.rb +0 -28
- data/lib/games/tictactoe/game_config.rb +0 -73
- data/lib/games/tictactoe/game_resetter.rb +0 -16
- data/lib/games/tictactoe/game_state_changer.rb +0 -17
- data/lib/games/tictactoe/input_helper.rb +0 -87
- data/lib/games/tictactoe/move_generator.rb +0 -68
@@ -1,11 +1,55 @@
|
|
1
|
-
require_relative '
|
1
|
+
require_relative 'human_player'
|
2
|
+
require_relative 'computer_player_expert'
|
3
|
+
require_relative 'computer_player_novice'
|
2
4
|
|
3
5
|
module TTT
|
4
|
-
class PlayersFactory
|
5
|
-
def generate_players
|
6
|
-
player_1 =
|
7
|
-
player_2 =
|
6
|
+
class PlayersFactory < Shared::PlayersFactory
|
7
|
+
def generate_players
|
8
|
+
player_1 = generate_player_1_new
|
9
|
+
player_2 = generate_player_2(player_1.value)
|
8
10
|
[player_1, player_2]
|
9
11
|
end
|
12
|
+
|
13
|
+
def generate_player_2(player_value_taken)
|
14
|
+
player_2_type = io_helpers.get_player_2_type
|
15
|
+
if player_2_type == :human
|
16
|
+
generate_player_2_human(player_value_taken)
|
17
|
+
else #second_player_computer
|
18
|
+
computer_knowledge_level = io_helpers.get_computer_knowledge_level
|
19
|
+
if computer_knowledge_level == :novice
|
20
|
+
generate_player_2_computer_novice(player_value_taken)
|
21
|
+
else
|
22
|
+
generate_player_2_computer_expert(player_value_taken)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def generate_player_1_new
|
28
|
+
player_name = io_helpers.get_player_1_name
|
29
|
+
player_value = io_helpers.get_player_value(player_name, "")
|
30
|
+
TTT::HumanPlayer.new(name: player_name, value: player_value)
|
31
|
+
end
|
32
|
+
|
33
|
+
def generate_player_2_human(player_value_taken)
|
34
|
+
player_name = io_helpers.get_player_2_name
|
35
|
+
player_value = io_helpers.get_player_value(player_name, player_value_taken )
|
36
|
+
TTT::HumanPlayer.new(name: player_name, value: player_value)
|
37
|
+
end
|
38
|
+
|
39
|
+
def generate_player_2_computer_novice(player_value_taken)
|
40
|
+
TTT::ComputerPlayerNovice.new(name: "Computer", value: computer_value(player_value_taken))
|
41
|
+
end
|
42
|
+
|
43
|
+
def generate_player_2_computer_expert(player_value_taken)
|
44
|
+
TTT::ComputerPlayerExpert.new(name: "Computer", value: computer_value(player_value_taken))
|
45
|
+
end
|
46
|
+
|
47
|
+
def computer_value(taken)
|
48
|
+
if taken != "O"
|
49
|
+
"O"
|
50
|
+
else
|
51
|
+
"X"
|
52
|
+
end
|
53
|
+
end
|
10
54
|
end
|
11
55
|
end
|
@@ -1,13 +1,10 @@
|
|
1
1
|
module TTT
|
2
2
|
class Square
|
3
3
|
attr_accessor :value, :display_value
|
4
|
-
attr_reader :row, :col
|
5
4
|
|
6
5
|
def initialize(args)
|
7
6
|
@value = args[:value]
|
8
7
|
@display_value = args[:display_value]
|
9
|
-
@row = args[:row]
|
10
|
-
@col = args[:col]
|
11
8
|
end
|
12
9
|
|
13
10
|
def change_value(new_value)
|
@@ -2,7 +2,7 @@ require_relative 'squares'
|
|
2
2
|
require_relative 'square'
|
3
3
|
|
4
4
|
module TTT
|
5
|
-
|
5
|
+
class SquaresFactory
|
6
6
|
def self.build_custom_squares(config, squares_class = Squares)
|
7
7
|
|
8
8
|
rows_and_cols = config.length
|
@@ -14,7 +14,7 @@ module TTT
|
|
14
14
|
|
15
15
|
squares.each_with_index do |element, row|
|
16
16
|
element.each_index do |col|
|
17
|
-
squares[row][col] = create_custom_square(config[row][col][0],config[row][col][1]
|
17
|
+
squares[row][col] = create_custom_square(config[row][col][0],config[row][col][1])
|
18
18
|
end
|
19
19
|
end
|
20
20
|
|
@@ -23,11 +23,9 @@ module TTT
|
|
23
23
|
end
|
24
24
|
|
25
25
|
|
26
|
-
def self.create_custom_square(display_value, value,
|
26
|
+
def self.create_custom_square(display_value, value, square_class = Square)
|
27
27
|
square_class.new(display_value: display_value,
|
28
|
-
value: value
|
29
|
-
row: row,
|
30
|
-
col: col )
|
28
|
+
value: value)
|
31
29
|
end
|
32
30
|
|
33
31
|
def self.build_empty_squares(rows_and_cols, squares_class = Squares)
|
@@ -38,7 +36,7 @@ module TTT
|
|
38
36
|
i = 1
|
39
37
|
squares.each_with_index do |element, row|
|
40
38
|
element.each_index do |col|
|
41
|
-
squares[row][col] = create_empty_square(i
|
39
|
+
squares[row][col] = create_empty_square(i)
|
42
40
|
i += 1
|
43
41
|
end
|
44
42
|
end
|
@@ -46,11 +44,9 @@ module TTT
|
|
46
44
|
squares_class.new(collection_of_squares: squares)
|
47
45
|
end
|
48
46
|
|
49
|
-
def self.create_empty_square(display_value,
|
47
|
+
def self.create_empty_square(display_value, square_class = Square)
|
50
48
|
square_class.new(display_value: display_value,
|
51
|
-
value: nil
|
52
|
-
row: row,
|
53
|
-
col: col )
|
49
|
+
value: nil)
|
54
50
|
end
|
55
51
|
end
|
56
52
|
end
|
data/lib/games/tictactoe.rb
CHANGED
@@ -4,10 +4,17 @@ Dir[File.join(File.expand_path(File.dirname(__FILE__)), 'tictactoe', '*.rb')].ea
|
|
4
4
|
class TicTacToe
|
5
5
|
def self.run
|
6
6
|
io = Shared::IOTerminal.new
|
7
|
+
io_helpers = TTT::IOHelpers.new(io)
|
7
8
|
board_presenter = TTT::BoardPresenterTerminal.new
|
9
|
+
board_builder = TTT::BoardBuilder.new
|
10
|
+
players_factory = TTT::PlayersFactory.new(io_helpers)
|
8
11
|
|
9
|
-
game = TTT::Game.new(
|
10
|
-
|
12
|
+
game = TTT::Game.new(
|
13
|
+
io_helpers: io_helpers,
|
14
|
+
board_presenter: board_presenter,
|
15
|
+
board_builder: board_builder,
|
16
|
+
players_factory: players_factory,
|
17
|
+
)
|
11
18
|
game.play
|
12
19
|
end
|
13
20
|
end
|
data/lib/games/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: games_bfox
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Brett Fox
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-
|
11
|
+
date: 2017-11-02 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -86,8 +86,22 @@ dependencies:
|
|
86
86
|
- - ">="
|
87
87
|
- !ruby/object:Gem::Version
|
88
88
|
version: 2.2.2
|
89
|
-
|
90
|
-
|
89
|
+
- !ruby/object:Gem::Dependency
|
90
|
+
name: paint
|
91
|
+
requirement: !ruby/object:Gem::Requirement
|
92
|
+
requirements:
|
93
|
+
- - "~>"
|
94
|
+
- !ruby/object:Gem::Version
|
95
|
+
version: '2.0'
|
96
|
+
type: :development
|
97
|
+
prerelease: false
|
98
|
+
version_requirements: !ruby/object:Gem::Requirement
|
99
|
+
requirements:
|
100
|
+
- - "~>"
|
101
|
+
- !ruby/object:Gem::Version
|
102
|
+
version: '2.0'
|
103
|
+
description: In order to play, download the gem, and type "tictactoe" or "mastermind"
|
104
|
+
at your terminal. Type "exit" to quit the game.
|
91
105
|
email:
|
92
106
|
- brettfox11@gmail.com
|
93
107
|
executables:
|
@@ -103,6 +117,7 @@ files:
|
|
103
117
|
- Gemfile
|
104
118
|
- README.md
|
105
119
|
- Rakefile
|
120
|
+
- config/application.yml
|
106
121
|
- exe/mastermind
|
107
122
|
- exe/setup
|
108
123
|
- exe/tictactoe
|
@@ -112,35 +127,35 @@ files:
|
|
112
127
|
- lib/games/mastermind/board.rb
|
113
128
|
- lib/games/mastermind/board_builder.rb
|
114
129
|
- lib/games/mastermind/board_presenter_terminal.rb
|
115
|
-
- lib/games/mastermind/
|
130
|
+
- lib/games/mastermind/computer_player_expert.rb
|
131
|
+
- lib/games/mastermind/computer_player_novice.rb
|
116
132
|
- lib/games/mastermind/game.rb
|
117
|
-
- lib/games/mastermind/game_config.rb
|
118
|
-
- lib/games/mastermind/game_resetter.rb
|
119
|
-
- lib/games/mastermind/game_state_changer.rb
|
120
133
|
- lib/games/mastermind/guess_evaluator.rb
|
121
|
-
- lib/games/mastermind/
|
122
|
-
- lib/games/mastermind/
|
134
|
+
- lib/games/mastermind/guess_evaluator_result.rb
|
135
|
+
- lib/games/mastermind/human_player.rb
|
136
|
+
- lib/games/mastermind/io_helpers.rb
|
123
137
|
- lib/games/mastermind/peg.rb
|
124
138
|
- lib/games/mastermind/pegs.rb
|
125
139
|
- lib/games/mastermind/pegs_factory.rb
|
126
140
|
- lib/games/mastermind/players_factory.rb
|
127
|
-
- lib/games/
|
141
|
+
- lib/games/mastermind/secret_code.rb
|
128
142
|
- lib/games/shared/game.rb
|
129
|
-
- lib/games/shared/
|
143
|
+
- lib/games/shared/io_helpers.rb
|
130
144
|
- lib/games/shared/io_terminal.rb
|
131
145
|
- lib/games/shared/player.rb
|
146
|
+
- lib/games/shared/player_factory.rb
|
147
|
+
- lib/games/shared/players_factory.rb
|
132
148
|
- lib/games/shared/version.rb
|
133
149
|
- lib/games/tictactoe.rb
|
134
150
|
- lib/games/tictactoe/board.rb
|
135
151
|
- lib/games/tictactoe/board_builder.rb
|
136
152
|
- lib/games/tictactoe/board_presenter_terminal.rb
|
153
|
+
- lib/games/tictactoe/computer_player_expert.rb
|
154
|
+
- lib/games/tictactoe/computer_player_novice.rb
|
137
155
|
- lib/games/tictactoe/game.rb
|
138
|
-
- lib/games/tictactoe/
|
139
|
-
- lib/games/tictactoe/
|
140
|
-
- lib/games/tictactoe/game_state_changer.rb
|
141
|
-
- lib/games/tictactoe/input_helper.rb
|
156
|
+
- lib/games/tictactoe/human_player.rb
|
157
|
+
- lib/games/tictactoe/io_helpers.rb
|
142
158
|
- lib/games/tictactoe/minimax.rb
|
143
|
-
- lib/games/tictactoe/move_generator.rb
|
144
159
|
- lib/games/tictactoe/player.rb
|
145
160
|
- lib/games/tictactoe/players_factory.rb
|
146
161
|
- lib/games/tictactoe/square.rb
|
@@ -1,48 +0,0 @@
|
|
1
|
-
module MM
|
2
|
-
class GameConfig
|
3
|
-
attr_accessor :input_helper
|
4
|
-
|
5
|
-
attr_accessor :player_1_name
|
6
|
-
attr_accessor :code_setter
|
7
|
-
attr_accessor :secret_code
|
8
|
-
attr_accessor :number_of_rows
|
9
|
-
attr_accessor :number_of_cols
|
10
|
-
|
11
|
-
def initialize(input_helper)
|
12
|
-
@input_helper = input_helper
|
13
|
-
@number_of_rows = 12
|
14
|
-
@number_of_cols = 4
|
15
|
-
|
16
|
-
end
|
17
|
-
|
18
|
-
def one_time_setup
|
19
|
-
self.player_1_name = input_helper.get_player_1_name
|
20
|
-
#defaults set above. uncomment to ask the player to choose
|
21
|
-
# self.number_of_rows = input_helper.get_number_of_rows
|
22
|
-
# self.number_of_cols = input_helper.get_number_of_cols
|
23
|
-
end
|
24
|
-
|
25
|
-
def every_time_setup
|
26
|
-
self.code_setter = input_helper.computer_or_human_code_setter_inquiry(player_1_name)
|
27
|
-
self.secret_code = get_secret_code
|
28
|
-
end
|
29
|
-
|
30
|
-
def get_secret_code
|
31
|
-
code = nil
|
32
|
-
if code_setter == :human
|
33
|
-
code = input_helper.get_secret_code_from_user(player_1_name)
|
34
|
-
elsif code_setter == :computer
|
35
|
-
code = set_secret_code
|
36
|
-
end
|
37
|
-
code
|
38
|
-
end
|
39
|
-
|
40
|
-
def set_secret_code
|
41
|
-
secret_code = []
|
42
|
-
4.times do
|
43
|
-
secret_code.push((1..6).to_a.sample)
|
44
|
-
end
|
45
|
-
secret_code
|
46
|
-
end
|
47
|
-
end
|
48
|
-
end
|
@@ -1,19 +0,0 @@
|
|
1
|
-
module MM
|
2
|
-
class GameResetter
|
3
|
-
attr_accessor :game
|
4
|
-
|
5
|
-
def reset_game(game)
|
6
|
-
@game = game
|
7
|
-
reset_board
|
8
|
-
game.number_of_turns_taken = 0
|
9
|
-
game.won_flag = false
|
10
|
-
game.secret_code = game.set_secret_code
|
11
|
-
game.current_guess = []
|
12
|
-
game.current_result = []
|
13
|
-
end
|
14
|
-
|
15
|
-
def reset_board
|
16
|
-
game.board = game.generate_empty_board(game.config)
|
17
|
-
end
|
18
|
-
end
|
19
|
-
end
|
@@ -1,41 +0,0 @@
|
|
1
|
-
module MM
|
2
|
-
class GameStateChanger
|
3
|
-
attr_accessor :game
|
4
|
-
|
5
|
-
def change_game_state(guess, game)
|
6
|
-
@game = game
|
7
|
-
game.current_guess = guess
|
8
|
-
game.current_result = game.evaluate_guess(secret_code, current_guess)
|
9
|
-
change_pegs(guess, game.current_result)
|
10
|
-
if !game.won?
|
11
|
-
game.move_forward_one_turn
|
12
|
-
end
|
13
|
-
end
|
14
|
-
|
15
|
-
def change_pegs(guess, current_result)
|
16
|
-
current_row.each_with_index do |peg, index|
|
17
|
-
peg.change_value(guess[index])
|
18
|
-
end
|
19
|
-
|
20
|
-
result_pegs_current_row.each_with_index do |peg, index|
|
21
|
-
peg.change_value(current_result[index])
|
22
|
-
end
|
23
|
-
end
|
24
|
-
|
25
|
-
def current_row
|
26
|
-
game.pegs_current_row
|
27
|
-
end
|
28
|
-
|
29
|
-
def result_pegs_current_row
|
30
|
-
game.result_pegs_current_row
|
31
|
-
end
|
32
|
-
|
33
|
-
def secret_code
|
34
|
-
game.secret_code
|
35
|
-
end
|
36
|
-
|
37
|
-
def current_guess
|
38
|
-
game.current_guess
|
39
|
-
end
|
40
|
-
end
|
41
|
-
end
|
@@ -1,67 +0,0 @@
|
|
1
|
-
require_relative '../shared/input_helper'
|
2
|
-
|
3
|
-
module MM
|
4
|
-
class InputHelper < Shared::InputHelper
|
5
|
-
def computer_or_human_code_setter_inquiry(name)
|
6
|
-
user_choice = get_user_input("#{name}, please enter \"1\" if you would like to be the code-guesser. Enter \"2\" if you would like to set the code and have the computer guess.", "Invalid entry. Please enter either 1(computer picks code) or 2 (you pick code)") do |input|
|
7
|
-
input == 1 || input == 2
|
8
|
-
end
|
9
|
-
if user_choice == 1
|
10
|
-
return :computer
|
11
|
-
elsif user_choice == 2
|
12
|
-
return :human
|
13
|
-
end
|
14
|
-
end
|
15
|
-
|
16
|
-
def get_secret_code_from_user(name)
|
17
|
-
user_choice = get_user_input("#{name}, please enter a secret code consisting of four numbers that each correspond to a color. Do not separate with punctuation. The computer will try to guess this code.", "Please re-enter a secret code, using only 4 numbers, 1 through 6.") do |input|
|
18
|
-
input.to_s =~ /^[1-6]{4}$/
|
19
|
-
end
|
20
|
-
user_choice.to_s.chars.map(&:to_i)
|
21
|
-
end
|
22
|
-
|
23
|
-
def get_player_choice(game)
|
24
|
-
user_choice = get_user_input("#{game.current_player_name}, please enter a secret code consisting of 4 numbers that correspond to the color of your guess. Do not separate with punctuation.", "Please re-enter a secret code guess, using exactly 4 numbers, each being a digit 1 through 6.") do |input|
|
25
|
-
input.to_s =~ /^[1-6]{4}$/
|
26
|
-
end
|
27
|
-
user_choice.to_s.chars.map(&:to_i)
|
28
|
-
end
|
29
|
-
|
30
|
-
def draw_prompt
|
31
|
-
io.present_with_new_line("No such luck! Please try again.")
|
32
|
-
end
|
33
|
-
|
34
|
-
def initial_instructions
|
35
|
-
io.present_with_new_line("MASTERMIND")
|
36
|
-
io.present_with_new_line("__________")
|
37
|
-
io.present_with_new_line("Game Instructions: Try to guess a 4 digit code that contains a collection of numbers 1-6 (\"6241\", for example).")
|
38
|
-
io.present_with_new_line("After each guess, the \"Result\" section will generate an \"X\" for each digit in the guess that is perfect(correct number and correct spot) and an \"O\" for each digit that is the correct number but in the wrong spot.")
|
39
|
-
io.present_with_new_line("Type \"Exit\" to quit the game.")
|
40
|
-
io.present_with_new_line("___________")
|
41
|
-
end
|
42
|
-
|
43
|
-
def winning_prompt(current_player_name)
|
44
|
-
io.present_with_new_line("#{current_player_name} wins!")
|
45
|
-
end
|
46
|
-
|
47
|
-
def no_winner_prompt
|
48
|
-
io.present_with_new_line("Game over!")
|
49
|
-
end
|
50
|
-
|
51
|
-
def custom_final_message(game)
|
52
|
-
io.present_with_new_line("The secret code was #{game.secret_code.join(",")}")
|
53
|
-
end
|
54
|
-
|
55
|
-
def get_number_of_rows
|
56
|
-
get_user_input("Please choose how many rows of pegs you would like, from 4 to 12.", "Please choose a number between 4 and 12.") do |input|
|
57
|
-
input.to_i >=4 && input.to_i <=12
|
58
|
-
end
|
59
|
-
end
|
60
|
-
|
61
|
-
def get_number_of_cols
|
62
|
-
get_user_input("Please choose how many pegs you would like in each row, from 4 to 6.", "Please choose a number between 4 and 6.") do |input|
|
63
|
-
input.to_i >=4 && input.to_i <=6
|
64
|
-
end
|
65
|
-
end
|
66
|
-
end
|
67
|
-
end
|
@@ -1,46 +0,0 @@
|
|
1
|
-
module MM
|
2
|
-
class MoveGenerator
|
3
|
-
|
4
|
-
attr_accessor :game
|
5
|
-
|
6
|
-
def get_player_choice(game)
|
7
|
-
@game = game
|
8
|
-
get_move
|
9
|
-
end
|
10
|
-
|
11
|
-
def get_move
|
12
|
-
if human?
|
13
|
-
input_helper.get_player_choice(game)
|
14
|
-
elsif computer?
|
15
|
-
input_helper.computer_choosing_graphic
|
16
|
-
computer_move
|
17
|
-
end
|
18
|
-
end
|
19
|
-
|
20
|
-
def computer_move
|
21
|
-
secret_code = []
|
22
|
-
4.times do
|
23
|
-
secret_code.push((1..6).to_a.sample)
|
24
|
-
end
|
25
|
-
secret_code
|
26
|
-
end
|
27
|
-
|
28
|
-
|
29
|
-
def current_player
|
30
|
-
game.current_player
|
31
|
-
end
|
32
|
-
|
33
|
-
def input_helper
|
34
|
-
game.input_helper
|
35
|
-
end
|
36
|
-
|
37
|
-
def human?
|
38
|
-
game.current_player_human?
|
39
|
-
end
|
40
|
-
|
41
|
-
def computer?
|
42
|
-
game.current_player_computer?
|
43
|
-
end
|
44
|
-
end
|
45
|
-
end
|
46
|
-
|
@@ -1,28 +0,0 @@
|
|
1
|
-
#from Design Patterns by Russ Olsen pg 128-129
|
2
|
-
module Shared
|
3
|
-
class ArrayIterator
|
4
|
-
def initialize(array)
|
5
|
-
@array = array
|
6
|
-
@index = 0
|
7
|
-
end
|
8
|
-
|
9
|
-
def has_next?
|
10
|
-
@index < @array.length
|
11
|
-
end
|
12
|
-
|
13
|
-
def item
|
14
|
-
@array[@index]
|
15
|
-
end
|
16
|
-
|
17
|
-
def peek
|
18
|
-
@array[@index]
|
19
|
-
end
|
20
|
-
|
21
|
-
def next_item
|
22
|
-
value = @array[@index]
|
23
|
-
@index += 1
|
24
|
-
value
|
25
|
-
end
|
26
|
-
end
|
27
|
-
end
|
28
|
-
|
@@ -1,73 +0,0 @@
|
|
1
|
-
module TTT
|
2
|
-
class GameConfig
|
3
|
-
attr_accessor :input_helper
|
4
|
-
|
5
|
-
attr_accessor :player_1_name
|
6
|
-
attr_accessor :player_1_value
|
7
|
-
attr_accessor :player_2_type
|
8
|
-
attr_accessor :player_2_name
|
9
|
-
attr_accessor :player_2_value
|
10
|
-
attr_accessor :computer_difficulty_level
|
11
|
-
attr_accessor :number_of_rows_cols
|
12
|
-
|
13
|
-
def initialize(input_helper)
|
14
|
-
@input_helper = input_helper
|
15
|
-
end
|
16
|
-
|
17
|
-
def one_time_setup
|
18
|
-
set_player_1_values
|
19
|
-
set_player_2_values
|
20
|
-
set_board_rows_cols
|
21
|
-
end
|
22
|
-
|
23
|
-
def every_time_setup
|
24
|
-
|
25
|
-
end
|
26
|
-
|
27
|
-
def set_player_1_values
|
28
|
-
self.player_1_name = input_helper.get_player_1_name
|
29
|
-
self.player_1_value = input_helper.get_player_1_value(player_1_name)
|
30
|
-
end
|
31
|
-
|
32
|
-
def set_player_2_values
|
33
|
-
self.player_2_type = input_helper.get_player_2_type
|
34
|
-
if player_2_human?
|
35
|
-
self.player_2_name = input_helper.get_player_2_name
|
36
|
-
self.player_2_value = input_helper.get_player_2_value(player_1_value)
|
37
|
-
elsif player_2_computer?
|
38
|
-
self.player_2_name = "Computer"
|
39
|
-
self.player_2_value = get_computer_value
|
40
|
-
self.computer_difficulty_level = input_helper.get_computer_difficulty_level
|
41
|
-
end
|
42
|
-
end
|
43
|
-
|
44
|
-
def set_board_rows_cols
|
45
|
-
#need this if else logic because if computer is difficult, it runs minimax, which is too slow to allow for more than 3 rows/cols
|
46
|
-
if computer_difficult?
|
47
|
-
self.number_of_rows_cols = input_helper.get_number_of_rows_cols_max_3
|
48
|
-
else
|
49
|
-
self.number_of_rows_cols = input_helper.get_number_of_rows_cols_max_9
|
50
|
-
end
|
51
|
-
end
|
52
|
-
|
53
|
-
def player_2_human?
|
54
|
-
player_2_type == :human
|
55
|
-
end
|
56
|
-
|
57
|
-
def player_2_computer?
|
58
|
-
player_2_type == :computer
|
59
|
-
end
|
60
|
-
|
61
|
-
def computer_difficult?
|
62
|
-
computer_difficulty_level == :difficult
|
63
|
-
end
|
64
|
-
|
65
|
-
def get_computer_value
|
66
|
-
if player_1_value != "O"
|
67
|
-
"O"
|
68
|
-
else
|
69
|
-
"X"
|
70
|
-
end
|
71
|
-
end
|
72
|
-
end
|
73
|
-
end
|
@@ -1,16 +0,0 @@
|
|
1
|
-
module TTT
|
2
|
-
class GameResetter
|
3
|
-
attr_accessor :game
|
4
|
-
|
5
|
-
def reset_game(game)
|
6
|
-
@game = game
|
7
|
-
reset_board
|
8
|
-
game.number_of_turns_taken = 0
|
9
|
-
game.won_flag = false
|
10
|
-
end
|
11
|
-
|
12
|
-
def reset_board
|
13
|
-
game.board = game.generate_empty_board(game.config)
|
14
|
-
end
|
15
|
-
end
|
16
|
-
end
|
@@ -1,17 +0,0 @@
|
|
1
|
-
module TTT
|
2
|
-
class GameStateChanger
|
3
|
-
attr_accessor :game
|
4
|
-
|
5
|
-
def change_game_state(player_choice, game)
|
6
|
-
@game = game
|
7
|
-
change_square(player_choice)
|
8
|
-
end
|
9
|
-
|
10
|
-
def change_square(display_value)
|
11
|
-
game.change_square(display_value, game.current_player_value)
|
12
|
-
if !game.won?
|
13
|
-
game.move_forward_one_turn
|
14
|
-
end
|
15
|
-
end
|
16
|
-
end
|
17
|
-
end
|