cnnct4 0.0.1 → 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 +4 -4
- data/Gemfile.lock +10 -2
- data/cnnct4.gemspec +1 -0
- data/lib/cnnct4/board.rb +21 -5
- data/lib/cnnct4/cell.rb +10 -0
- data/lib/cnnct4/game.rb +78 -5
- data/lib/cnnct4/game_play.rb +24 -23
- data/lib/cnnct4/playable.rb +16 -13
- data/lib/cnnct4/version.rb +1 -1
- data/lib/cnnct4.rb +1 -0
- metadata +17 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 363606068c9689a8d4d83de1c88ec11ab708709c4fa62c0c91ebf2e0649f4b9e
|
4
|
+
data.tar.gz: 57a2aa44535326e55e547500771ac0354009b4bb1b3984c5c6e3abb222847ac0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1d0f918cb97449beec87502501e30d2bbc8c6b365711bd017d769ac2dad38868380b5de736e5b14e4838addde8c32078b5bc333e5f638d4ab8c8a1ab4f45d507
|
7
|
+
data.tar.gz: 30778a4c2b72b780420311622d6dd67bc0bed3e7ff93a5f6989143e87b10b7ffcc86a501ab4fa26021fb99de88280443c99bca96c96e2226f0c7ffc2014af3b3
|
data/Gemfile.lock
CHANGED
@@ -1,13 +1,18 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
cnnct4 (0.
|
4
|
+
cnnct4 (0.1.0)
|
5
5
|
thor
|
6
6
|
|
7
7
|
GEM
|
8
8
|
remote: https://rubygems.org/
|
9
9
|
specs:
|
10
|
+
coderay (1.1.3)
|
10
11
|
diff-lcs (1.5.0)
|
12
|
+
method_source (1.0.0)
|
13
|
+
pry (0.14.2)
|
14
|
+
coderay (~> 1.1)
|
15
|
+
method_source (~> 1.0)
|
11
16
|
rake (13.0.6)
|
12
17
|
rspec (3.12.0)
|
13
18
|
rspec-core (~> 3.12.0)
|
@@ -26,11 +31,14 @@ GEM
|
|
26
31
|
|
27
32
|
PLATFORMS
|
28
33
|
x86_64-darwin-21
|
34
|
+
x86_64-darwin-22
|
35
|
+
x86_64-linux
|
29
36
|
|
30
37
|
DEPENDENCIES
|
31
38
|
cnnct4!
|
39
|
+
pry
|
32
40
|
rake (~> 13.0)
|
33
41
|
rspec (~> 3.0)
|
34
42
|
|
35
43
|
BUNDLED WITH
|
36
|
-
2.4.
|
44
|
+
2.4.3
|
data/cnnct4.gemspec
CHANGED
@@ -31,6 +31,7 @@ Gem::Specification.new do |spec|
|
|
31
31
|
# Uncomment to register a new dependency of your gem
|
32
32
|
# spec.add_dependency "example-gem", "~> 1.0"
|
33
33
|
spec.add_dependency "thor"
|
34
|
+
spec.add_development_dependency "pry"
|
34
35
|
spec.add_development_dependency "rspec", "~> 3.2"
|
35
36
|
|
36
37
|
# For more information and examples about making a new gem, check out our
|
data/lib/cnnct4/board.rb
CHANGED
@@ -2,13 +2,22 @@ class Board
|
|
2
2
|
attr_reader :board_array
|
3
3
|
|
4
4
|
def initialize
|
5
|
-
@board_array =
|
5
|
+
@board_array = [
|
6
|
+
[Cell.new(0, 'A'), Cell.new(0, 'B'), Cell.new(0, 'C'), Cell.new(0, 'D'), Cell.new(0, 'E'), Cell.new(0, 'F'), Cell.new(0, 'G')],
|
7
|
+
[Cell.new(1, 'A'), Cell.new(1, 'B'), Cell.new(1, 'C'), Cell.new(1, 'D'), Cell.new(1, 'E'), Cell.new(1, 'F'), Cell.new(1, 'G')],
|
8
|
+
[Cell.new(2, 'A'), Cell.new(2, 'B'), Cell.new(2, 'C'), Cell.new(2, 'D'), Cell.new(2, 'E'), Cell.new(2, 'F'), Cell.new(2, 'G')],
|
9
|
+
[Cell.new(3, 'A'), Cell.new(3, 'B'), Cell.new(3, 'C'), Cell.new(3, 'D'), Cell.new(3, 'E'), Cell.new(3, 'F'), Cell.new(3, 'G')],
|
10
|
+
[Cell.new(4, 'A'), Cell.new(4, 'B'), Cell.new(4, 'C'), Cell.new(4, 'D'), Cell.new(4, 'E'), Cell.new(4, 'F'), Cell.new(4, 'G')],
|
11
|
+
[Cell.new(5, 'A'), Cell.new(5, 'B'), Cell.new(5, 'C'), Cell.new(5, 'D'), Cell.new(5, 'E'), Cell.new(5, 'F'), Cell.new(5, 'G')]
|
12
|
+
]
|
6
13
|
end
|
7
14
|
|
8
15
|
def render
|
9
16
|
puts " A B C D E F G"
|
10
17
|
@board_array.each do |row|
|
11
|
-
|
18
|
+
mark_row = []
|
19
|
+
row.each {|cell| mark_row << cell.mark}
|
20
|
+
print " #{mark_row.join(" ")}"
|
12
21
|
puts
|
13
22
|
end
|
14
23
|
end
|
@@ -20,8 +29,8 @@ class Board
|
|
20
29
|
column = column.ord - 65
|
21
30
|
row = 5
|
22
31
|
while row >= 0
|
23
|
-
if @board_array[row][column] == "."
|
24
|
-
@board_array[row][column] = mark
|
32
|
+
if @board_array[row][column].mark == "."
|
33
|
+
@board_array[row][column].mark = mark
|
25
34
|
return true
|
26
35
|
else
|
27
36
|
row -= 1
|
@@ -32,6 +41,13 @@ class Board
|
|
32
41
|
end
|
33
42
|
|
34
43
|
def reset
|
35
|
-
@board_array =
|
44
|
+
@board_array = [
|
45
|
+
[Cell.new(0, 'A'), Cell.new(0, 'B'), Cell.new(0, 'C'), Cell.new(0, 'D'), Cell.new(0, 'E'), Cell.new(0, 'F'), Cell.new(0, 'G')],
|
46
|
+
[Cell.new(1, 'A'), Cell.new(1, 'B'), Cell.new(1, 'C'), Cell.new(1, 'D'), Cell.new(1, 'E'), Cell.new(1, 'F'), Cell.new(1, 'G')],
|
47
|
+
[Cell.new(2, 'A'), Cell.new(2, 'B'), Cell.new(2, 'C'), Cell.new(2, 'D'), Cell.new(2, 'E'), Cell.new(2, 'F'), Cell.new(2, 'G')],
|
48
|
+
[Cell.new(3, 'A'), Cell.new(3, 'B'), Cell.new(3, 'C'), Cell.new(3, 'D'), Cell.new(3, 'E'), Cell.new(3, 'F'), Cell.new(3, 'G')],
|
49
|
+
[Cell.new(4, 'A'), Cell.new(4, 'B'), Cell.new(4, 'C'), Cell.new(4, 'D'), Cell.new(4, 'E'), Cell.new(4, 'F'), Cell.new(4, 'G')],
|
50
|
+
[Cell.new(5, 'A'), Cell.new(5, 'B'), Cell.new(5, 'C'), Cell.new(5, 'D'), Cell.new(5, 'E'), Cell.new(5, 'F'), Cell.new(5, 'G')]
|
51
|
+
]
|
36
52
|
end
|
37
53
|
end
|
data/lib/cnnct4/cell.rb
ADDED
data/lib/cnnct4/game.rb
CHANGED
@@ -19,7 +19,9 @@ class Game
|
|
19
19
|
|
20
20
|
def check_for_win(array)
|
21
21
|
array.each do |row|
|
22
|
-
|
22
|
+
mark_row = []
|
23
|
+
row.each {|cell| mark_row << cell.mark}
|
24
|
+
mark_row.each_cons(4) do |group|
|
23
25
|
if group == ["X", "X", "X", "X"]
|
24
26
|
@game_win = true
|
25
27
|
elsif group == ["O", "O", "O", "O"]
|
@@ -30,15 +32,13 @@ class Game
|
|
30
32
|
end
|
31
33
|
|
32
34
|
def check_for_draw
|
33
|
-
@game_draw = true if
|
35
|
+
@game_draw = true if @board.board_array.flatten.none? {|cell| cell.mark == "."}
|
34
36
|
end
|
35
37
|
|
36
38
|
def vertical_sort
|
37
39
|
@board.board_array.transpose
|
38
40
|
end
|
39
41
|
|
40
|
-
# Look into .with_index
|
41
|
-
#possibly making both diagonal up and down one method with arguments
|
42
42
|
def diagonal_up_sort
|
43
43
|
padding = 5
|
44
44
|
padded_matrix = []
|
@@ -60,4 +60,77 @@ class Game
|
|
60
60
|
end
|
61
61
|
padded_matrix.transpose.map {|array| array.compact}
|
62
62
|
end
|
63
|
-
|
63
|
+
|
64
|
+
def comp_check
|
65
|
+
if check_for_3(vertical_sort)
|
66
|
+
true
|
67
|
+
elsif check_for_3(@board.board_array)
|
68
|
+
true
|
69
|
+
elsif check_for_3(diagonal_up_sort)
|
70
|
+
true
|
71
|
+
elsif check_for_3(diagonal_down_sort)
|
72
|
+
true
|
73
|
+
else
|
74
|
+
false
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
def check_for_3(method)
|
79
|
+
catch(:done) do
|
80
|
+
method.each do |row|
|
81
|
+
row.each_cons(4) do |cell_row|
|
82
|
+
mark_row = []
|
83
|
+
cell_row.each {|cell| mark_row << cell.mark}
|
84
|
+
check_win(cell_row, mark_row)
|
85
|
+
check_block(cell_row, mark_row)
|
86
|
+
end
|
87
|
+
end
|
88
|
+
false
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
def check_one_mark_down_and_place(cell_row, dot_pos)
|
93
|
+
cell_down = @board.board_array.flatten.select do |cell|
|
94
|
+
cell.row_pos == cell_row[dot_pos].row_pos + 1 && cell.column_pos == cell_row[dot_pos].column_pos
|
95
|
+
end
|
96
|
+
if cell_down[0]&.mark != "."
|
97
|
+
@board.place(cell_row[dot_pos].column_pos, "O")
|
98
|
+
|
99
|
+
throw(:done, true)
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
def check_win(cell_row, mark_row)
|
104
|
+
if mark_row == [".", "O", "O", "O"]
|
105
|
+
dot_pos = 0
|
106
|
+
check_one_mark_down_and_place(cell_row, dot_pos)
|
107
|
+
elsif mark_row == ["O", ".", "O", "O"]
|
108
|
+
dot_pos = 1
|
109
|
+
check_one_mark_down_and_place(cell_row, dot_pos)
|
110
|
+
elsif mark_row == ["O", "O", ".", "O"]
|
111
|
+
dot_pos = 2
|
112
|
+
check_one_mark_down_and_place(cell_row, dot_pos)
|
113
|
+
elsif mark_row == ["O", "O", "O", "."]
|
114
|
+
dot_pos = 3
|
115
|
+
check_one_mark_down_and_place(cell_row, dot_pos)
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
def check_block(cell_row, mark_row)
|
120
|
+
if mark_row == [".", "X", "X", "X"]
|
121
|
+
dot_pos = 0
|
122
|
+
check_one_mark_down_and_place(cell_row, dot_pos)
|
123
|
+
elsif mark_row == ["X", ".", "X", "X"]
|
124
|
+
dot_pos = 1
|
125
|
+
check_one_mark_down_and_place(cell_row, dot_pos)
|
126
|
+
elsif mark_row == ["X", "X", ".", "X"]
|
127
|
+
dot_pos = 2
|
128
|
+
check_one_mark_down_and_place(cell_row, dot_pos)
|
129
|
+
elsif mark_row == ["X", "X", "X", "."]
|
130
|
+
dot_pos = 3
|
131
|
+
check_one_mark_down_and_place(cell_row, dot_pos)
|
132
|
+
end
|
133
|
+
end
|
134
|
+
end
|
135
|
+
|
136
|
+
|
data/lib/cnnct4/game_play.rb
CHANGED
@@ -7,9 +7,9 @@ include Playable
|
|
7
7
|
@player1_name = nil
|
8
8
|
@player2_name = nil
|
9
9
|
@game = Game.new
|
10
|
-
@
|
10
|
+
@player1_turns = []
|
11
11
|
@player2_turns = []
|
12
|
-
@comp_turns = []
|
12
|
+
@comp_turns = [] #Need functionality for comp_check turns to be shoveled here
|
13
13
|
@player_wins = 0
|
14
14
|
@player2_wins = 0
|
15
15
|
@comp_wins = 0
|
@@ -19,10 +19,10 @@ include Playable
|
|
19
19
|
def player1_turn
|
20
20
|
column = gets.chomp
|
21
21
|
if @game.board.place(column, 'X')
|
22
|
-
@
|
22
|
+
@player1_turns << column
|
23
23
|
@game.win?
|
24
24
|
else
|
25
|
-
|
25
|
+
invalid_selection_message
|
26
26
|
player1_turn
|
27
27
|
end
|
28
28
|
end
|
@@ -33,19 +33,23 @@ include Playable
|
|
33
33
|
@player2_turns << column
|
34
34
|
@game.win?
|
35
35
|
else
|
36
|
-
|
36
|
+
invalid_selection_message
|
37
37
|
player2_turn
|
38
38
|
end
|
39
39
|
end
|
40
40
|
|
41
41
|
def computer_turn
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
42
|
+
if @game.comp_check
|
43
|
+
@game.win?
|
44
|
+
else
|
45
|
+
comp_column = (65 + rand(7)).chr
|
46
|
+
if @game.board.place(comp_column, 'O')
|
47
|
+
@comp_turns << comp_column
|
48
|
+
@game.win?
|
49
|
+
comp_column
|
50
|
+
else
|
51
|
+
computer_turn
|
52
|
+
end
|
49
53
|
end
|
50
54
|
end
|
51
55
|
|
@@ -64,35 +68,29 @@ include Playable
|
|
64
68
|
obtain_player_names
|
65
69
|
clear_terminal
|
66
70
|
end
|
67
|
-
two_player_turns(@player1_name, @player2_name, @
|
71
|
+
two_player_turns(@player1_name, @player2_name, @player1_turns, @player2_turns)
|
68
72
|
game_end_two_player
|
69
73
|
end
|
70
74
|
|
71
75
|
def turn_round
|
72
|
-
|
73
|
-
clear_terminal
|
74
|
-
show_last_moves('You', 'computer', @player_turns, @comp_turns)
|
75
|
-
render_board_with_lines
|
76
|
-
column_choice("intrepid player")
|
77
|
-
player1_turn
|
78
|
-
break if game_over?
|
79
|
-
computer_turn
|
80
|
-
break if game_over?
|
81
|
-
end
|
76
|
+
player_v_comp_turns('You', 'the computer', @player1_turns, @comp_turns)
|
82
77
|
game_end
|
83
78
|
end
|
84
79
|
|
85
80
|
def game_end
|
86
81
|
if @game.game_win == true
|
87
82
|
clear_terminal
|
83
|
+
@game.board.render
|
88
84
|
@player_wins += 1
|
89
85
|
puts 'YOU WON! HOW COOL!'
|
90
86
|
elsif @game.game_win == false
|
91
87
|
clear_terminal
|
88
|
+
@game.board.render
|
92
89
|
@comp_wins += 1
|
93
90
|
puts "YOU LOST! You're not smart enough to beat a computer choosing random columns? Sad day."
|
94
91
|
elsif @game.game_draw == true
|
95
92
|
clear_terminal
|
93
|
+
@game.board.render
|
96
94
|
@draws += 1
|
97
95
|
puts "That was a draw. BOOOOOOOORRRRRRIIIIIINGGGGGGGG. You're literally not smart enough to beat a computer choosing random columns."
|
98
96
|
end
|
@@ -104,14 +102,17 @@ include Playable
|
|
104
102
|
def game_end_two_player
|
105
103
|
if @game.game_win == true
|
106
104
|
clear_terminal
|
105
|
+
@game.board.render
|
107
106
|
@player_wins += 1
|
108
107
|
puts "#{@player1_name.capitalize} WON! HOW COOL!"
|
109
108
|
elsif @game.game_win == false
|
110
109
|
clear_terminal
|
110
|
+
@game.board.render
|
111
111
|
@player2_wins += 1
|
112
112
|
puts "#{@player2_name.capitalize} WON! HOW COOL!"
|
113
113
|
elsif @game.game_draw == true
|
114
114
|
clear_terminal
|
115
|
+
@game.board.render
|
115
116
|
@draws += 1
|
116
117
|
puts "That was a draw. BOOOOOOOORRRRRRIIIIIINGGGGGGGG."
|
117
118
|
end
|
data/lib/cnnct4/playable.rb
CHANGED
@@ -21,7 +21,7 @@ _________ __ _____
|
|
21
21
|
\______ /\____|__ /\____|__ /_______ / \_______ /\___/ /_______ / |____|_ /
|
22
22
|
\/ \/ \/ \/ \/ \/ \/ '
|
23
23
|
end
|
24
|
-
|
24
|
+
|
25
25
|
def reset_turns
|
26
26
|
@game.board.reset
|
27
27
|
@game.game_win = nil
|
@@ -31,6 +31,10 @@ _________ __ _____
|
|
31
31
|
@comp_turns = []
|
32
32
|
end
|
33
33
|
|
34
|
+
def invalid_selection_message
|
35
|
+
puts 'That is not a valid selection, please select a new column'
|
36
|
+
end
|
37
|
+
|
34
38
|
def clear_terminal
|
35
39
|
puts `clear`
|
36
40
|
end
|
@@ -92,19 +96,18 @@ _________ __ _____
|
|
92
96
|
break if game_over?
|
93
97
|
clear_terminal
|
94
98
|
end
|
99
|
+
end
|
95
100
|
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
end
|
101
|
+
def player_v_comp_turns(p1_name, p2_name, p1_turns, p2_turns)
|
102
|
+
loop do
|
103
|
+
clear_terminal
|
104
|
+
show_last_moves(p1_name, p2_name, p1_turns, p2_turns)
|
105
|
+
render_board_with_lines
|
106
|
+
column_choice("intrepid player")
|
107
|
+
player1_turn
|
108
|
+
break if game_over?
|
109
|
+
computer_turn
|
110
|
+
break if game_over?
|
107
111
|
end
|
108
112
|
end
|
109
|
-
|
110
113
|
end
|
data/lib/cnnct4/version.rb
CHANGED
data/lib/cnnct4.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: cnnct4
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Reid Miller
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-02-
|
11
|
+
date: 2023-02-27 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: thor
|
@@ -24,6 +24,20 @@ dependencies:
|
|
24
24
|
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: pry
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
27
41
|
- !ruby/object:Gem::Dependency
|
28
42
|
name: rspec
|
29
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -56,6 +70,7 @@ files:
|
|
56
70
|
- exe/cnnct4
|
57
71
|
- lib/cnnct4.rb
|
58
72
|
- lib/cnnct4/board.rb
|
73
|
+
- lib/cnnct4/cell.rb
|
59
74
|
- lib/cnnct4/cli.rb
|
60
75
|
- lib/cnnct4/game.rb
|
61
76
|
- lib/cnnct4/game_play.rb
|