capim_tictactoe 0.1.17 → 1.0.1
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.
- checksums.yaml +4 -4
- data/lib/capim_tictactoe/ascii_art.rb +0 -2
- data/lib/capim_tictactoe/board.rb +1 -1
- data/lib/capim_tictactoe/evaluator.rb +14 -4
- data/lib/capim_tictactoe/game.rb +4 -2
- data/lib/capim_tictactoe/grid.rb +2 -2
- data/lib/capim_tictactoe/input_handler.rb +19 -0
- data/lib/capim_tictactoe/presenter.rb +2 -2
- data/lib/version.rb +3 -1
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 89bae6efb64c7d881f1a8ec496c2318bb6816230e248f1c9c7bdbd9a1ee6eb5f
|
4
|
+
data.tar.gz: 435c6aa8b6e950126b852ffe1e2b0f01e38593c84c807931b4dfa83fc23c2d78
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8ef9abad6802c13e04aed15f833d0ba50ebf3ad2ffbd11c0d398db8165561ccb83a601e2b4bc9916fb1558737ef95c1fea3f688ce3e1b44954c6db766045576c
|
7
|
+
data.tar.gz: 913b0ae6020a536213e40ba70ae997f1362840f0e4231e98dd4297cbe46343c6622a1894c45caad94d4cf4e463754d6b2637a9272f421a46486d63bb9aaa29e9
|
@@ -33,7 +33,7 @@ class Board
|
|
33
33
|
end
|
34
34
|
|
35
35
|
def game_over?(spots = @grid.spots)
|
36
|
-
valid_line?(@grid.rows(spots)) || valid_line?(@grid.columns(spots)) || valid_line?(@grid.diagonals)
|
36
|
+
valid_line?(@grid.rows(spots)) || valid_line?(@grid.columns(spots)) || valid_line?(@grid.diagonals(spots))
|
37
37
|
end
|
38
38
|
|
39
39
|
def tie?
|
@@ -1,17 +1,27 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module Evaluator
|
4
|
-
def eval_board(board, human_marker, computer_marker)
|
4
|
+
def eval_board(board, human_marker, computer_marker, game_mode)
|
5
|
+
# EASY behavior:
|
6
|
+
# 1 - Mark center if available
|
7
|
+
# 2 - Go through all available moves and checks if one of them is the winning move.
|
8
|
+
# 3 - If not, mark a random spot.
|
9
|
+
#
|
10
|
+
# HARD behavior:
|
11
|
+
# 1 - Mark center if available.
|
12
|
+
# 2 - Go through all available moves and checks if one of them is the winning move for both the machine or the player.
|
13
|
+
# 3 - If not, mark a random spot.
|
14
|
+
|
5
15
|
unless board.center_marked?
|
6
16
|
board.mark_center(computer_marker)
|
7
17
|
return
|
8
18
|
end
|
9
19
|
|
10
|
-
spot = get_best_move(board, human_marker, computer_marker)
|
20
|
+
spot = get_best_move(board, human_marker, computer_marker, game_mode)
|
11
21
|
board.grid.marked?(spot) ? nil : board.grid.spot_marker(spot, computer_marker)
|
12
22
|
end
|
13
23
|
|
14
|
-
def get_best_move(board, human_marker, computer_marker)
|
24
|
+
def get_best_move(board, human_marker, computer_marker, game_mode)
|
15
25
|
best_move = nil
|
16
26
|
|
17
27
|
board.available_spots.each do |available_spot|
|
@@ -20,7 +30,7 @@ module Evaluator
|
|
20
30
|
return best_move
|
21
31
|
end
|
22
32
|
|
23
|
-
best_move = available_spot.to_i if winning_move?(board, human_marker, available_spot.to_i)
|
33
|
+
best_move = available_spot.to_i if game_mode == :hard && winning_move?(board, human_marker, available_spot.to_i)
|
24
34
|
end
|
25
35
|
return best_move if best_move
|
26
36
|
|
data/lib/capim_tictactoe/game.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
class Game
|
4
|
+
require 'optparse'
|
4
5
|
require_relative 'board'
|
5
6
|
require_relative 'evaluator'
|
6
7
|
require_relative 'color'
|
@@ -16,6 +17,7 @@ class Game
|
|
16
17
|
@board = Board.new
|
17
18
|
@computer = x_marker
|
18
19
|
@human = o_marker
|
20
|
+
parse_args
|
19
21
|
end
|
20
22
|
|
21
23
|
def start_game
|
@@ -24,10 +26,10 @@ class Game
|
|
24
26
|
until @board.game_over? || @board.tie?
|
25
27
|
fetch_human_spot(@board, @human)
|
26
28
|
|
27
|
-
eval_board(@board, @human, @computer) unless @board.game_over? || @board.tie?
|
29
|
+
eval_board(@board, @human, @computer, @options[:game_mode]) unless @board.game_over? || @board.tie?
|
28
30
|
@board.grid.display
|
29
31
|
end
|
30
32
|
|
31
|
-
puts 'Game over'
|
33
|
+
puts @board.tie? ? "I'ts a tie!" : 'Game over'
|
32
34
|
end
|
33
35
|
end
|
data/lib/capim_tictactoe/grid.rb
CHANGED
@@ -31,8 +31,8 @@ class Grid
|
|
31
31
|
rows(spots).to_a.transpose
|
32
32
|
end
|
33
33
|
|
34
|
-
def diagonals
|
35
|
-
[[
|
34
|
+
def diagonals(spots = grid)
|
35
|
+
[[spots[0], spots[4], spots[8]], [spots[2], spots[4], spots[6]]]
|
36
36
|
end
|
37
37
|
|
38
38
|
def spot_marker(spot, marker)
|
@@ -1,5 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require 'rainbow'
|
4
|
+
|
3
5
|
module InputHandler
|
4
6
|
def fetch_human_spot(board, human_marker)
|
5
7
|
spot = nil
|
@@ -14,6 +16,23 @@ module InputHandler
|
|
14
16
|
board.grid.spot_marker(spot, human_marker)
|
15
17
|
end
|
16
18
|
|
19
|
+
def parse_args
|
20
|
+
@options = { game_mode: :hard, ascii_art: true, jokes: true }
|
21
|
+
OptionParser.new do |opts|
|
22
|
+
opts.banner = Rainbow('Usage: capim_tictactoe [options], the game will default to challenging mode.').red
|
23
|
+
|
24
|
+
opts.on('-e', '--easy', 'Runs the game in easy mode.') do
|
25
|
+
@options[:game_mode] = :easy
|
26
|
+
end
|
27
|
+
opts.on('-a', '--noart', 'Runs the game without ASCII art.') do
|
28
|
+
@options[:ascii_art] = false
|
29
|
+
end
|
30
|
+
opts.on('-j', '--nojokes', 'Runs the game without the silly lines.') do
|
31
|
+
@options[:jokes] = false
|
32
|
+
end
|
33
|
+
end.parse!
|
34
|
+
end
|
35
|
+
|
17
36
|
private
|
18
37
|
|
19
38
|
# to_i converts 'non integer' strings to 0: 'a'.to_i => 0.
|
@@ -8,8 +8,8 @@ module Presenter
|
|
8
8
|
GREEN_GRASS = AsciiArt::GREEN_GRASS
|
9
9
|
|
10
10
|
def present_game
|
11
|
-
print GREEN_GRASS
|
12
|
-
puts "\n#{SILLY_LINE}\n\n"
|
11
|
+
print "#{GREEN_GRASS}\n" if @options[:ascii_art]
|
12
|
+
puts "\n#{SILLY_LINE}\n\n" if @options[:jokes]
|
13
13
|
@board.grid.display
|
14
14
|
puts 'Enter [0-8]'
|
15
15
|
end
|
data/lib/version.rb
CHANGED