games_bfox 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (52) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +12 -0
  3. data/.rspec +3 -0
  4. data/.travis.yml +5 -0
  5. data/Gemfile +4 -0
  6. data/README.md +36 -0
  7. data/Rakefile +6 -0
  8. data/exe/mastermind +8 -0
  9. data/exe/setup +8 -0
  10. data/exe/tictactoe +8 -0
  11. data/games.gemspec +36 -0
  12. data/lib/games/mastermind/board.rb +43 -0
  13. data/lib/games/mastermind/board_builder.rb +9 -0
  14. data/lib/games/mastermind/board_presenter_terminal.rb +69 -0
  15. data/lib/games/mastermind/colors.rb +14 -0
  16. data/lib/games/mastermind/game.rb +64 -0
  17. data/lib/games/mastermind/game_config.rb +48 -0
  18. data/lib/games/mastermind/game_resetter.rb +19 -0
  19. data/lib/games/mastermind/game_state_changer.rb +41 -0
  20. data/lib/games/mastermind/guess_evaluator.rb +85 -0
  21. data/lib/games/mastermind/input_helper.rb +54 -0
  22. data/lib/games/mastermind/move_generator.rb +46 -0
  23. data/lib/games/mastermind/peg.rb +15 -0
  24. data/lib/games/mastermind/pegs.rb +50 -0
  25. data/lib/games/mastermind/pegs_factory.rb +26 -0
  26. data/lib/games/mastermind/players_factory.rb +15 -0
  27. data/lib/games/mastermind.rb +13 -0
  28. data/lib/games/shared/array_iterator.rb +28 -0
  29. data/lib/games/shared/game.rb +155 -0
  30. data/lib/games/shared/input_helper.rb +74 -0
  31. data/lib/games/shared/io_terminal.rb +25 -0
  32. data/lib/games/shared/player.rb +15 -0
  33. data/lib/games/shared/version.rb +3 -0
  34. data/lib/games/tictactoe/board.rb +40 -0
  35. data/lib/games/tictactoe/board_builder.rb +10 -0
  36. data/lib/games/tictactoe/board_presenter_terminal.rb +28 -0
  37. data/lib/games/tictactoe/game.rb +60 -0
  38. data/lib/games/tictactoe/game_config.rb +73 -0
  39. data/lib/games/tictactoe/game_resetter.rb +16 -0
  40. data/lib/games/tictactoe/game_state_changer.rb +17 -0
  41. data/lib/games/tictactoe/input_helper.rb +80 -0
  42. data/lib/games/tictactoe/minimax.rb +81 -0
  43. data/lib/games/tictactoe/move_generator.rb +68 -0
  44. data/lib/games/tictactoe/player.rb +11 -0
  45. data/lib/games/tictactoe/players_factory.rb +11 -0
  46. data/lib/games/tictactoe/square.rb +30 -0
  47. data/lib/games/tictactoe/squares.rb +129 -0
  48. data/lib/games/tictactoe/squares_factory.rb +56 -0
  49. data/lib/games/tictactoe.rb +13 -0
  50. data/lib/games/version.rb +3 -0
  51. data/lib/games.rb +5 -0
  52. metadata +173 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: ff3dcb410111396a3ce03ef859fb52d70a5b5d5d
4
+ data.tar.gz: 269d8193da9129cf52efd370764abc318d376de6
5
+ SHA512:
6
+ metadata.gz: cabca83cb240420badc2e59c271f6ef5de2c9ac9b2825fedbf65ef2f20d14b14f3ac9a9593e709381bdb55a2f38c86217b65134aa3d7eb36856e566b046f0f73
7
+ data.tar.gz: 648ab711ef30fc5ba0f7b9bc3fdb082bfbc761e4e03c9cf67f90c9ef5504533042bf3774d121d93592402cbd348ff6984fdea9851d996d2dbc84346a23ca1d74
data/.gitignore ADDED
@@ -0,0 +1,12 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
10
+
11
+ # rspec failure tracking
12
+ .rspec_status
data/.rspec ADDED
@@ -0,0 +1,3 @@
1
+ --require spec_helper
2
+ --format documentation
3
+ --color
data/.travis.yml ADDED
@@ -0,0 +1,5 @@
1
+ sudo: false
2
+ language: ruby
3
+ rvm:
4
+ - 2.4.0
5
+ before_install: gem install bundler -v 1.14.6
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in games.gemspec
4
+ gemspec
data/README.md ADDED
@@ -0,0 +1,36 @@
1
+ # Games
2
+
3
+ Welcome to your new gem! In this directory, you'll find the files you need to be able to package up your Ruby library into a gem. Put your Ruby code in the file `lib/games`. To experiment with that code, run `bin/console` for an interactive prompt.
4
+
5
+ TODO: Delete this and the text above, and describe your gem
6
+
7
+ ## Installation
8
+
9
+ Add this line to your application's Gemfile:
10
+
11
+ ```ruby
12
+ gem 'games'
13
+ ```
14
+
15
+ And then execute:
16
+
17
+ $ bundle
18
+
19
+ Or install it yourself as:
20
+
21
+ $ gem install games
22
+
23
+ ## Usage
24
+
25
+ TODO: Write usage instructions here
26
+
27
+ ## Development
28
+
29
+ After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
30
+
31
+ To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
32
+
33
+ ## Contributing
34
+
35
+ Bug reports and pull requests are welcome on GitHub at https://github.com/[USERNAME]/games.
36
+
data/Rakefile ADDED
@@ -0,0 +1,6 @@
1
+ require "bundler/gem_tasks"
2
+ require "rspec/core/rake_task"
3
+
4
+ RSpec::Core::RakeTask.new(:spec)
5
+
6
+ task :default => :spec
data/exe/mastermind ADDED
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "bundler/setup"
4
+ #below line requires mastermind which runs program
5
+ require "games/mastermind"
6
+
7
+ Mastermind.run
8
+
data/exe/setup ADDED
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+ set -vx
5
+
6
+ bundle install
7
+
8
+ # Do any other automated setup that you need to do here
data/exe/tictactoe ADDED
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "bundler/setup"
4
+ #below line requires tictactoe which runs program
5
+ require "games/tictactoe"
6
+
7
+ TicTacToe.run
8
+
data/games.gemspec ADDED
@@ -0,0 +1,36 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ games = File.expand_path('../lib/games', __FILE__)
4
+ mastermind = File.expand_path('../lib/games/mastermind', __FILE__)
5
+ shared = File.expand_path('../lib/games/shared', __FILE__)
6
+ tictactoe = File.expand_path('../lib/games/tictactoe', __FILE__)
7
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
8
+ $LOAD_PATH.unshift(games) unless $LOAD_PATH.include?(games)
9
+ $LOAD_PATH.unshift(mastermind) unless $LOAD_PATH.include?(mastermind)
10
+ $LOAD_PATH.unshift(shared) unless $LOAD_PATH.include?(shared)
11
+ $LOAD_PATH.unshift(tictactoe) unless $LOAD_PATH.include?(tictactoe)
12
+ require 'games/version'
13
+
14
+ Gem::Specification.new do |spec|
15
+ spec.name = "games_bfox"
16
+ spec.version = Games::VERSION
17
+ spec.authors = ["Brett Fox"]
18
+ spec.email = ["brettfox11@gmail.com"]
19
+
20
+ spec.summary = %q{Play tic tac toe and mastermind on the command line}
21
+ spec.description = %q{In order to play, download the gem, and type \"tictactoe\" or \"mastermind\" at your terminal.}
22
+ spec.homepage = "https://github.com/brett11/games"
23
+
24
+ spec.files = `git ls-files -z`.split("\x0").reject do |f|
25
+ f.match(%r{^(test|spec|features)/})
26
+ end
27
+ spec.bindir = "exe"
28
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
29
+ spec.require_paths = ["lib"]
30
+
31
+ spec.add_development_dependency "bundler", "~> 1.14"
32
+ spec.add_development_dependency "rake", "~> 10.0"
33
+ spec.add_development_dependency "rspec", "~> 3.6"
34
+ spec.add_development_dependency 'pry', '~> 0.10.4'
35
+ spec.add_development_dependency 'logging', '~> 2.2', '>= 2.2.2'
36
+ end
@@ -0,0 +1,43 @@
1
+ module MM
2
+ class Board
3
+ attr_accessor :number_of_rows, :number_of_cols, :pegs, :result_pegs
4
+
5
+ def initialize(args = {})
6
+ @number_of_rows = args[:number_of_rows]
7
+ @number_of_cols = args[:number_of_cols]
8
+ @pegs = args[:pegs]
9
+ @result_pegs = args[:result_pegs]
10
+ end
11
+
12
+ def change_peg(row, col, new_value)
13
+ peg_to_change = retrieve_peg(row, col)
14
+ peg_to_change.change_value(new_value)
15
+ end
16
+
17
+ def display_values
18
+ pegs.display_values
19
+ end
20
+
21
+ def result_values
22
+ result_pegs.display_values
23
+ end
24
+
25
+ def pegs_current_row(number_of_turns_taken)
26
+ pegs.current_row(number_of_turns_taken)
27
+ end
28
+
29
+ def result_pegs_current_row(number_of_turns_taken)
30
+ result_pegs.current_row(number_of_turns_taken)
31
+ end
32
+
33
+ private
34
+ def retrieve_peg(row, col)
35
+ return pegs.retrieve_peg(row, col)
36
+ end
37
+
38
+ #result_pegs is an instance of pegs
39
+ def retrieve_result_peg(row, col)
40
+ return result_pegs.retrieve_peg(row,col)
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,9 @@
1
+ require_relative 'pegs_factory'
2
+
3
+ module MM
4
+ class BoardBuilder
5
+ def generate_empty_board(config)
6
+ Board.new(number_of_rows: config.number_of_rows, number_of_cols: config.number_of_cols, pegs: PegsFactory.build_empty_pegs(config.number_of_rows, config.number_of_cols), result_pegs: PegsFactory.build_empty_pegs(config.number_of_rows, config.number_of_cols) )
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,69 @@
1
+ module MM
2
+ class BoardPresenterTerminal
3
+ attr_accessor :board
4
+
5
+ def present_board(board)
6
+ @board = board
7
+ present_board_and_results(self.board)
8
+ end
9
+
10
+ def present_board_only(board)
11
+ #board.display_values will return multidimensional array
12
+ display_values.each_with_index do |row, row_number|
13
+ row.each_with_index do |display_value, index|
14
+ #http://www.evc-cit.info/cit020/beginning-programming/chp_04/file_printf.html
15
+ if display_value == nil
16
+ print " "
17
+ else
18
+ printf "%2s", display_value
19
+ end
20
+
21
+ print " | " unless index == (row.size - 1)
22
+ end
23
+ print "\n"
24
+ puts "_"*(row.size * 5) unless row_number.equal? (number_of_rows - 1)
25
+ end
26
+ end
27
+
28
+ def present_board_and_results(board)
29
+ @board = board
30
+
31
+ print " Guess" + " " +"Result"
32
+ print "\n"
33
+ puts "-" * 40
34
+ guesses_and_results = display_values.zip(result_values)
35
+ #board.display_values will return multidimensional array
36
+ guesses_and_results.each do |values|
37
+ #values is either display_values or result_values
38
+ values.each_with_index do |row, row_number|
39
+ row.each_with_index do |display_value, index|
40
+ #http://www.evc-cit.info/cit020/beginning-programming/chp_04/file_printf.html
41
+ if display_value == nil
42
+ print " "
43
+ else
44
+ printf "%2s", display_value
45
+ end
46
+
47
+ print " | " unless index == (row.size - 1)
48
+ end
49
+ print " " unless row.equal? values.last
50
+ end
51
+ print "\n"
52
+ puts "_"*(values.size * 20) unless values.equal? guesses_and_results.last
53
+ end
54
+ end
55
+
56
+ def display_values
57
+ board.display_values
58
+ end
59
+
60
+ def result_values
61
+ board.result_values
62
+ end
63
+
64
+ def number_of_rows
65
+ board.number_of_rows
66
+ end
67
+
68
+ end
69
+ end
@@ -0,0 +1,14 @@
1
+ module MM
2
+ class Colors
3
+ def self.key
4
+ {
5
+ 1 => :red,
6
+ 2 => :green,
7
+ 3 => :blue,
8
+ 4 => :orange,
9
+ 5 => :yellow,
10
+ 6 => :brown
11
+ }
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,64 @@
1
+ require_relative '../shared/game'
2
+
3
+ module MM
4
+ class Game < Shared::Game
5
+ attr_accessor :code_setter, :secret_code, :guess_evaluator, :current_guess, :current_result, :won_flag
6
+
7
+ def local_setup
8
+ self.code_setter = config.code_setter
9
+ self.secret_code = config.secret_code
10
+ print secret_code
11
+ print "\n"
12
+ self.guess_evaluator = MM::GuessEvaluator.new
13
+ self.current_guess = []
14
+ self.current_result = []
15
+ self.won_flag = false
16
+ end
17
+
18
+ def over?
19
+ won? || over_with_no_winner?
20
+ end
21
+
22
+ def over_with_no_winner?
23
+ number_of_turns_taken >= 12
24
+ end
25
+
26
+ def won?
27
+ #depends on evaluate_guess returning an array of all "X"s for perfect guess
28
+ if won_flag
29
+ return true
30
+ end
31
+
32
+ if current_result == ("X" * number_of_cols).chars
33
+ self.won_flag = true
34
+ true
35
+ else
36
+ false
37
+ end
38
+ end
39
+
40
+ def change_peg(row, col, new_value)
41
+ board.change_peg(row, col, new_value)
42
+ end
43
+
44
+ def evaluate_guess(secret_code, guess)
45
+ guess_evaluator.evaluate_guess(secret_code, guess)
46
+ end
47
+
48
+ def pegs_current_row
49
+ board.pegs_current_row(number_of_turns_taken)
50
+ end
51
+
52
+ def result_pegs_current_row
53
+ board.result_pegs_current_row(number_of_turns_taken)
54
+ end
55
+
56
+ def number_of_cols
57
+ board.number_of_cols
58
+ end
59
+
60
+ def set_secret_code
61
+ config.set_secret_code
62
+ end
63
+ end
64
+ end
@@ -0,0 +1,48 @@
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
@@ -0,0 +1,19 @@
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
@@ -0,0 +1,41 @@
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
@@ -0,0 +1,85 @@
1
+ require_relative '../shared/array_iterator'
2
+ require 'set.rb'
3
+
4
+ module MM
5
+ class GuessEvaluator
6
+ attr_accessor :secret_code
7
+ attr_accessor :guess
8
+ attr_accessor :result
9
+
10
+ # returns "XXXX" if perfect guess. returns XXO, for example, if two perfect guesses and one right digit but wrong place
11
+ def evaluate_guess(secret_code, guess)
12
+ @secret_code = Marshal.load(Marshal.dump(secret_code))
13
+ @guess = Marshal.load(Marshal.dump(guess))
14
+ #default when game starts is to have empty current_guess array
15
+ if guess.empty?
16
+ return []
17
+ end
18
+ @result = find_result
19
+ end
20
+
21
+ def find_result
22
+ resX = find_exact_matches
23
+ resO = find_partial_matches
24
+ resX.concat resO
25
+ end
26
+
27
+ def find_exact_matches
28
+ resX = []
29
+ set_of_matched_indexes = Set.new
30
+ guess.each_with_index do |element, index|
31
+ if element == secret_code[index]
32
+ resX.push ("X")
33
+ set_of_matched_indexes.add(index)
34
+ end
35
+ end
36
+ delete_elements_already_matched(set_of_matched_indexes)
37
+ resX
38
+ end
39
+
40
+ def delete_elements_already_matched(set_of_matched_indexes)
41
+ secret_code.delete_if.with_index { |_, index| set_of_matched_indexes.include? index }
42
+ guess.delete_if.with_index { |_, index| set_of_matched_indexes.include? index }
43
+ end
44
+
45
+ def find_partial_matches
46
+ resO = []
47
+ return resO if secret_code.empty? || guess.empty?
48
+ secret_code.sort!
49
+ guess.sort!
50
+
51
+ secret_code_iterator = Shared::ArrayIterator.new(secret_code)
52
+ guess_iterator = Shared::ArrayIterator.new(guess)
53
+
54
+ #get first elements from enums
55
+ code_element = secret_code_iterator.next_item
56
+ guess_element = guess_iterator.next_item
57
+
58
+
59
+ while true
60
+ if guess_element == code_element
61
+ resO.push("O")
62
+ if secret_code_iterator.has_next? && guess_iterator.has_next?
63
+ code_element = secret_code_iterator.next_item
64
+ guess_element = guess_iterator.next_item
65
+ else
66
+ break
67
+ end
68
+ elsif guess_element > code_element
69
+ if secret_code_iterator.has_next?
70
+ code_element = secret_code_iterator.next_item
71
+ else
72
+ break
73
+ end
74
+ else
75
+ if guess_iterator.has_next?
76
+ guess_element = guess_iterator.next_item
77
+ else
78
+ break
79
+ end
80
+ end
81
+ end
82
+ resO
83
+ end
84
+ end
85
+ end
@@ -0,0 +1,54 @@
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 winning_prompt(current_player_name)
35
+ io.present_with_new_line("#{current_player_name} wins!")
36
+ end
37
+
38
+ def no_winner_prompt
39
+ io.present_with_new_line("Game over!")
40
+ end
41
+
42
+ def get_number_of_rows
43
+ 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|
44
+ input.to_i >=4 && input.to_i <=12
45
+ end
46
+ end
47
+
48
+ def get_number_of_cols
49
+ 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|
50
+ input.to_i >=4 && input.to_i <=6
51
+ end
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,46 @@
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
+
@@ -0,0 +1,15 @@
1
+ module MM
2
+ class Peg
3
+ attr_accessor :display_value, :row, :col
4
+
5
+ def initialize(args)
6
+ @display_value = args.fetch(:display_value, nil)
7
+ @row = args[:row]
8
+ @col = args[:col]
9
+ end
10
+
11
+ def change_value(new_value)
12
+ self.display_value = new_value
13
+ end
14
+ end
15
+ end