cnnct4 0.0.1 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|