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 +7 -0
- data/lib/tic_cat_toe.rb +15 -0
- data/lib/tic_cat_toe/board.rb +92 -0
- data/lib/tic_cat_toe/game.rb +118 -0
- data/lib/tic_cat_toe/player.rb +15 -0
- data/lib/tic_cat_toe/version.rb +3 -0
- metadata +93 -0
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
|
data/lib/tic_cat_toe.rb
ADDED
@@ -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
|
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: []
|