tic_tac_toe_master 0.1.0 → 0.1.2

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 351d57128ecff0b1e7863f2ef9b19deee6682ce88034d37ca1dadc84d221c724
4
- data.tar.gz: a5ad2103845661007da9d62b74db2195c2b137ed326dd75e90a9a5b979cd889e
3
+ metadata.gz: 9232d960106fae766f2e5d13f4963e7694e34590eb8b726510b78d1088770c69
4
+ data.tar.gz: a1bbe1379141080c951f6c93b5c9028bc32a7bd2f88c73864e1c04b70ec332d8
5
5
  SHA512:
6
- metadata.gz: 0e3901d3c0ddfe7161b359e22cb9fa7a0860a0dcb359e64b6031c3f278eba5e86e6d3eaf02010563215412fac66ecf20b8b399fceb29d5ac0ca4c42040b5e0f4
7
- data.tar.gz: 3f8c37708cec0f31dae1b8868ab92e4ad85b5cc24afb7d043c0ee3d5eebc59605c10ea3352cd64eea0dd8f37fbd4753958ac63a0afa8b3d0bb982297f07701cd
6
+ metadata.gz: b4f18a926b5e2f5c98907a2894baf81429f8f4349998ca5c9cfe300db3c0217aa017658527fc0c5c78616e8e6a812af27ca3f584763112ca9b65f0defb8c2346
7
+ data.tar.gz: 56e978fd0fdb40830d571d4956a95678b641567eacd1494cc77aef52720e3c4c1003da82f155d5228f7a560cd106a35c87a45821658bb54f9224d707896a6e24
data/bin/console ADDED
@@ -0,0 +1,11 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ require 'bundler/setup'
5
+ require 'tic_tac_toe_master'
6
+
7
+ # You can add fixtures and/or initialization code here to make experimenting
8
+ # with your gem easier. You can also use a different console, if you like.
9
+
10
+ require 'irb'
11
+ IRB.start(__FILE__)
data/bin/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/bin/tic_tac_toe ADDED
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ $LOAD_PATH.unshift(File.expand_path('../lib', __dir__))
5
+ require 'tic_tac_toe_master'
6
+
7
+ TicTacToeMaster.start
@@ -7,25 +7,10 @@ module TicTacToeMaster
7
7
 
8
8
  FIELD_SIZE = (1..9)
9
9
 
10
- WIN_CONBINATIONS = [
11
- [0, 1, 2], [3, 4, 5], [6, 7, 8],
12
- [0, 3, 6], [1, 4, 7], [2, 5, 8],
13
- [0, 4, 8], [2, 4, 6]
14
- ].freeze
15
-
16
10
  def initialize
17
11
  @grid = FIELD_SIZE.to_a
18
12
  end
19
13
 
20
- def draw
21
- puts '-----------'
22
-
23
- grid.each_slice(3) do |row|
24
- puts " #{row.join(' | ')} "
25
- puts '-----------'
26
- end
27
- end
28
-
29
14
  def place(position, symbol)
30
15
  return false unless valid_position?(position)
31
16
 
@@ -40,11 +25,5 @@ module TicTacToeMaster
40
25
  def full?
41
26
  grid.none?(Integer)
42
27
  end
43
-
44
- def winner?(symbol)
45
- WIN_CONBINATIONS.any? do |combo|
46
- combo.all? { |index| grid[index] == symbol }
47
- end
48
- end
49
28
  end
50
29
  end
@@ -5,10 +5,16 @@ module TicTacToeMaster
5
5
  class Game
6
6
  attr_reader :player1, :player2, :current_player, :board
7
7
 
8
+ WIN_CONBINATIONS = [
9
+ [0, 1, 2], [3, 4, 5], [6, 7, 8],
10
+ [0, 3, 6], [1, 4, 7], [2, 5, 8],
11
+ [0, 4, 8], [2, 4, 6]
12
+ ].freeze
13
+
8
14
  def initialize(player1_name:, player2_name:)
9
- @player1 = Player.new(player1_name, 'X')
10
- @player2 = Player.new(player2_name, 'O')
11
- @board = Board.new
15
+ @player1 = TicTacToeMaster::Player.new(player1_name, 'X')
16
+ @player2 = TicTacToeMaster::Player.new(player2_name, 'O')
17
+ @board = TicTacToeMaster::Board.new
12
18
  @current_player = @player1
13
19
  end
14
20
 
@@ -21,7 +27,7 @@ module TicTacToeMaster
21
27
  def make_move(position)
22
28
  return :invalid unless board.place(position, current_player.symbol)
23
29
 
24
- if board.winner?(current_player.symbol)
30
+ if winner?(current_player.symbol)
25
31
  :win
26
32
  elsif board.full?
27
33
  :draw
@@ -31,6 +37,12 @@ module TicTacToeMaster
31
37
  end
32
38
  end
33
39
 
40
+ def winner?(symbol)
41
+ WIN_CONBINATIONS.any? do |combo|
42
+ combo.all? { |index| board.grid[index] == symbol }
43
+ end
44
+ end
45
+
34
46
  private
35
47
 
36
48
  def switch_player
@@ -12,17 +12,17 @@ module TicTacToeMaster
12
12
  puts '🎮 Welcome to Tic Tac Toe!'
13
13
 
14
14
  loop do
15
- @game.board.draw
15
+ puts draw_board(@game.board)
16
16
 
17
17
  case @game.make_move(ask_for_move)
18
18
  when :invalid
19
19
  puts '❌ Invalid move, try again.'
20
20
  when :win
21
- @game.board.draw
21
+ puts draw_board(@game.board)
22
22
  puts "🏆 #{@game.current_player.name} wins!"
23
23
  break
24
24
  when :draw
25
- @game.board.draw
25
+ puts draw_board(@game.board)
26
26
  puts "🤝 It's a draw!"
27
27
  break
28
28
  end
@@ -32,6 +32,27 @@ module TicTacToeMaster
32
32
 
33
33
  private
34
34
 
35
+ def draw_board(board)
36
+ rows = board.grid.each_slice(3).map do |row|
37
+ "║ #{row[0]} ║ #{row[1]} ║ #{row[2]} ║"
38
+ end
39
+
40
+ top = '╔═════╦═════╦═════╗'
41
+ middle = '╠═════╬═════╬═════╣'
42
+ bottom = '╚═════╩═════╩═════╝'
43
+
44
+ [
45
+ top,
46
+ rows[0],
47
+ middle,
48
+ rows[1],
49
+ middle,
50
+ rows[2],
51
+ bottom,
52
+ ''
53
+ ].join("\n")
54
+ end
55
+
35
56
  def ask_for_move
36
57
  print "\n#{@game.current_player.name} #{@game.current_player.symbol}, " \
37
58
  "choose a position #{TicTacToeMaster::Board::FIELD_SIZE}: "
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module TicTacToeMaster
4
- VERSION = '0.1.0'
4
+ VERSION = '0.1.2'
5
5
  end
@@ -20,7 +20,7 @@ module TicTacToeMaster
20
20
  # Examples:
21
21
  # TicTacToeMaster.start
22
22
  # TicTacToeMaster.start(ui_class: UI::ConsoleUI, player1_name: 'Alice', player2_name: 'Bob')
23
- def start(ui_class: UI::ConsoleUI, player1_name: nil, player2_name: nil)
23
+ def start(ui_class: TicTacToeMaster::UI::ConsoleUI, player1_name: nil, player2_name: nil)
24
24
  player1_name, player2_name = resolve_player_names(ui_class, player1_name, player2_name)
25
25
 
26
26
  game = Game.new(player1_name: player1_name, player2_name: player2_name)
@@ -35,7 +35,7 @@ module TicTacToeMaster
35
35
  #
36
36
  # Returns an array: [player1_name, player2_name]
37
37
  def resolve_player_names(ui_class, player1_name, player2_name)
38
- if ui_class == UI::ConsoleUI
38
+ if ui_class == TicTacToeMaster::UI::ConsoleUI
39
39
  player1_name ||= ask_for_name('Player 1 (X)')
40
40
  player2_name ||= ask_for_name('Player 2 (O)')
41
41
  else
metadata CHANGED
@@ -1,22 +1,28 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tic_tac_toe_master
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Vitalii Matseiko
8
8
  autorequire:
9
- bindir: exe
9
+ bindir: bin
10
10
  cert_chain: []
11
- date: 2025-11-11 00:00:00.000000000 Z
11
+ date: 2025-11-24 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: TicTacToeMaster is a gem that allows you to play Tic Tac Toe in the console.
14
14
  email:
15
15
  - realnatisk@gmail.com
16
- executables: []
16
+ executables:
17
+ - console
18
+ - setup
19
+ - tic_tac_toe
17
20
  extensions: []
18
21
  extra_rdoc_files: []
19
22
  files:
23
+ - bin/console
24
+ - bin/setup
25
+ - bin/tic_tac_toe
20
26
  - lib/tic_tac_toe_master.rb
21
27
  - lib/tic_tac_toe_master/board.rb
22
28
  - lib/tic_tac_toe_master/game.rb