tic_cat_toe 0.1.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.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: cd87267dae512a2bd39c3e4af3ee473176dfee66
4
+ data.tar.gz: b92d3500feb4d01df2750efb8bde7755482979fe
5
+ SHA512:
6
+ metadata.gz: 5c707a9c1a6b77299c54186ecebc2d9a3f074f45093ab82797ff1b2d17b19d9ad89725705777a4aa4d24046c284d37a4de7c07f40fe2c4ff48ecc01289b409f6
7
+ data.tar.gz: e49481caf6caf4b6335dfe7df85a5a1d4379d0539cb4e3d308463728a5e93064df5be68b96298e35c6f63eb75c5350da40a84863e804eb74ec5ec899b4ce285a
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'os'
4
+ require_relative 'tic_cat_toe/version'
5
+ require_relative 'tic_cat_toe/game'
6
+
7
+ # Ready to play
8
+ module TicCatToe
9
+ class Error < StandardError; end
10
+
11
+ def self.play
12
+ game = Game.new
13
+ game.play
14
+ end
15
+ end
@@ -0,0 +1,92 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Here I go again
4
+ class Board
5
+ attr_accessor :slots
6
+ attr_reader :size
7
+
8
+ def initialize(size)
9
+ @size = size
10
+ @slots = build_tic_tac_toe(size)
11
+ end
12
+
13
+ def build_tic_tac_toe(size)
14
+ size >= 3 ? Array.new(size**2) : Array.new(3)
15
+ end
16
+
17
+ def to_print
18
+ @size.times do |index|
19
+ @size.times do |jndex|
20
+ case @slots[@size * index + jndex]
21
+ when 'X' then print "\e[1;31m[#{index},#{jndex} X ]\e[0m"
22
+ when 'O' then print "\e[1;36m[#{index},#{jndex} O ]\e[0m"
23
+ else print "[#{index},#{jndex} ]"
24
+ end
25
+ end
26
+ puts
27
+ end
28
+ end
29
+
30
+ def check_slot(row, col)
31
+ # @slots[@size * row + col] != 'X' && @slots[@size * row + col] != 'O' ? true : false
32
+ # @slots[@size * row + col].match(/^[X|O]$/) ? false : true
33
+ @slots[@size * row + col].nil? ? true : false
34
+ end
35
+
36
+ def put_mark(row, col, mark)
37
+ @slots[@size * row + col] = mark
38
+ check_board(mark)
39
+ end
40
+
41
+ def vertical(mark)
42
+ @size.times do |col|
43
+ matches_count = 0
44
+ @size.times do |index|
45
+ matches_count += 1 if /^#{mark}$/.match(@slots[@size * index + col])
46
+ return true if matches_count.equal?(@size)
47
+ end
48
+ end
49
+ false
50
+ end
51
+
52
+ def horizontal(mark)
53
+ @size.times do |row|
54
+ matches_count = 0
55
+ @size.times do |index|
56
+ matches_count += 1 if /^#{mark}$/.match(@slots[@size * row + index])
57
+ return true if matches_count.equal?(@size)
58
+ end
59
+ end
60
+ false
61
+ end
62
+
63
+ def negative_line(mark)
64
+ matches_count = 0
65
+ @size.times do |index|
66
+ matches_count += 1 if /^#{mark}$/.match(@slots[index * (@size + 1)])
67
+ return true if matches_count.equal?(@size)
68
+ end
69
+ false
70
+ end
71
+
72
+ def positive_line(mark)
73
+ matches_count = 0
74
+ @size.times do |index|
75
+ matches_count += 1 if /^#{mark}$/.match(@slots[(index + 1) * (@size - 1)])
76
+ return true if matches_count.equal?(@size)
77
+ end
78
+ false
79
+ end
80
+
81
+ def diagonals(mark)
82
+ negative_line(mark) || positive_line(mark) ? true : false
83
+ end
84
+
85
+ def check_board(mark)
86
+ vertical(mark) || horizontal(mark) || diagonals(mark) ? true : false
87
+ end
88
+
89
+ def available_slots
90
+ @slots.compact.length.equal?(@size**2) ? true : false
91
+ end
92
+ end
@@ -0,0 +1,118 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'os'
4
+ require_relative './board'
5
+ require_relative './player'
6
+
7
+ # The Game
8
+ class Game
9
+ attr_accessor :board, :player1, :player2, :winner, :current_player
10
+
11
+ def initialize(*args)
12
+ puts args
13
+ @board = Board.new(args[0] || 3)
14
+ @current_player = args[1] || 'O'
15
+ @player1 = Player.new('X')
16
+ @player2 = Player.new('O')
17
+ @current_x = 0
18
+ @current_y = 0
19
+ @winner = false
20
+ end
21
+
22
+ def check_input(input)
23
+ if /^([0-9]+)[,|.]\s*([0-9]+)$/.match(input)
24
+ x = input.split(//)[0].to_i
25
+ y = input.split(//)[2].to_i
26
+ if check_range(x, y) && check_duplicate(x, y)
27
+ @current_x = x
28
+ @current_y = y
29
+ return true
30
+ end
31
+ end
32
+ false
33
+ end
34
+
35
+ def check_size(size)
36
+ size.is_a?(Integer) && (3..9).cover?(size) ? true : false
37
+ end
38
+
39
+ def check_range(abs, ord)
40
+ (0..@board.size).cover?(abs) && (0..@board.size).cover?(ord) ? true : false
41
+ end
42
+
43
+ def check_duplicate(abs, ord)
44
+ @board.check_slot(abs, ord) ? true : false
45
+ end
46
+
47
+ def check_slots?
48
+ @board.available_slots ? true : false
49
+ end
50
+
51
+ def yes_not(input)
52
+ input.eql?('y') || input.eql?('yes') ? play : false
53
+ end
54
+
55
+ def show_game
56
+ OS.windows? ? system('cls') : system('clear')
57
+ # system('cls')
58
+ # puts "Player X: #{player1.victories} Player O: #{player2.victories}"
59
+ @board.to_print
60
+ end
61
+
62
+ def next_turn(mark)
63
+ case mark
64
+ when 'X' then 'O'
65
+ when 'O' then 'X'
66
+ end
67
+ end
68
+
69
+ def player_move(mark)
70
+ print "Player #{mark}=> "
71
+ player = gets.chomp
72
+ case check_input(player)
73
+ when true
74
+ @winner = @board.put_mark(@current_x, @current_y, mark)
75
+ @current_player = next_turn(mark)
76
+ when false then player_move(mark)
77
+ else puts 'Something has gone wrong'
78
+ end
79
+ end
80
+
81
+ def check_game
82
+ show_game
83
+ case @winner
84
+ when true
85
+ @current_player = next_turn(@current_player)
86
+ puts "#{@current_player} WINS! Do you want to play again? Y/N"
87
+ yes_not(gets.chomp.downcase)
88
+ when false
89
+ puts 'DRAW! Do you want to play again? Y/N'
90
+ yes_not(gets.chomp.downcase)
91
+ end
92
+ end
93
+
94
+ def play
95
+ puts 'Type an integer number=> '
96
+ new_dimention = gets.chomp.to_i
97
+ if check_size(new_dimention)
98
+ initialize(new_dimention, next_turn(@current_player))
99
+ run
100
+ else
101
+ play
102
+ end
103
+ end
104
+
105
+ def run
106
+ while @winner != true
107
+ break if check_slots?
108
+
109
+ show_game
110
+ case @current_player
111
+ when player1.mark then player_move(player1.mark)
112
+ when player2.mark then player_move(player2.mark)
113
+ else puts 'Comun demonio! Lo que faltaba'
114
+ end
115
+ end
116
+ check_game
117
+ end
118
+ end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Player methods
4
+ class Player
5
+ attr_reader :mark, :victories
6
+
7
+ def initialize(simbol)
8
+ @mark = simbol
9
+ @victories = 0
10
+ end
11
+
12
+ def wins
13
+ @victories += 1
14
+ end
15
+ end
@@ -0,0 +1,3 @@
1
+ module TicCatToe
2
+ VERSION = '0.1.0'
3
+ end
metadata ADDED
@@ -0,0 +1,93 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: tic_cat_toe
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Mojicator
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2019-07-31 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '2.0'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '2.0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: minitest
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '5.0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '5.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rake
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '10.0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '10.0'
55
+ description: Tic Tac Toe game
56
+ email:
57
+ - oscar2mojica@gmail.com
58
+ executables: []
59
+ extensions: []
60
+ extra_rdoc_files: []
61
+ files:
62
+ - lib/tic_cat_toe.rb
63
+ - lib/tic_cat_toe/board.rb
64
+ - lib/tic_cat_toe/game.rb
65
+ - lib/tic_cat_toe/player.rb
66
+ - lib/tic_cat_toe/version.rb
67
+ homepage: ''
68
+ licenses:
69
+ - MIT
70
+ metadata:
71
+ homepage_uri: ''
72
+ source_code_uri: ''
73
+ post_install_message:
74
+ rdoc_options: []
75
+ require_paths:
76
+ - lib
77
+ required_ruby_version: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - ">="
80
+ - !ruby/object:Gem::Version
81
+ version: '0'
82
+ required_rubygems_version: !ruby/object:Gem::Requirement
83
+ requirements:
84
+ - - ">="
85
+ - !ruby/object:Gem::Version
86
+ version: '0'
87
+ requirements: []
88
+ rubyforge_project:
89
+ rubygems_version: 2.5.2
90
+ signing_key:
91
+ specification_version: 4
92
+ summary: A simple game gem to play in your terminal
93
+ test_files: []