connect_four_2211 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/bin/connect_four_2211 +10 -0
- data/lib/board.rb +146 -0
- data/lib/computer.rb +13 -0
- data/lib/connect_four_2211.rb +8 -0
- data/lib/game.rb +121 -0
- data/lib/player.rb +24 -0
- data/lib/turn.rb +59 -0
- metadata +64 -0
checksums.yaml
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
---
|
|
2
|
+
SHA256:
|
|
3
|
+
metadata.gz: ec07b36148167ab269d48e34b63d87a63e420c95be36931b6bbaf9c7a72864d2
|
|
4
|
+
data.tar.gz: cde17a2a1a414f3b7489652c5f2eeef4d4d88e91bdb96aa2db4c30b1e336c241
|
|
5
|
+
SHA512:
|
|
6
|
+
metadata.gz: 1bcb0fa36925d36a3862d4408a44fc5eff6f099e78ed1a18969467e7011bad36bf6fb74d1de06b8a48331caf97f3d4c7e15bd20c42b601565ce0bc5a47851538
|
|
7
|
+
data.tar.gz: d793ba93b7ef8a8bef275fbdc69d6c453127a4fba5a0a5682506e3d6abc69238ed5182ee049d05553dc87d61132560c35c5af3a809643600deae8faa564cd59b
|
data/lib/board.rb
ADDED
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
class Board
|
|
2
|
+
attr_accessor :board
|
|
3
|
+
attr_reader :computer, :player, :rows
|
|
4
|
+
|
|
5
|
+
def initialize(player, computer)
|
|
6
|
+
@player = player
|
|
7
|
+
@rows = []
|
|
8
|
+
@computer = computer
|
|
9
|
+
@temp_array = []
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def create_board
|
|
13
|
+
@rows = []
|
|
14
|
+
@temp_array = []
|
|
15
|
+
@board = {
|
|
16
|
+
'A' => ['.', '.', '.', '.', '.', '.'],
|
|
17
|
+
'B' => ['.', '.', '.', '.', '.', '.'],
|
|
18
|
+
'C' => ['.', '.', '.', '.', '.', '.'],
|
|
19
|
+
'D' => ['.', '.', '.', '.', '.', '.'],
|
|
20
|
+
'E' => ['.', '.', '.', '.', '.', '.'],
|
|
21
|
+
'F' => ['.', '.', '.', '.', '.', '.'],
|
|
22
|
+
'G' => ['.', '.', '.', '.', '.', '.']
|
|
23
|
+
}
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def full?
|
|
27
|
+
all_positions = @board.values.flatten
|
|
28
|
+
if all_positions.include?('.')
|
|
29
|
+
false
|
|
30
|
+
else
|
|
31
|
+
true
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def show_board
|
|
36
|
+
# Board prints in rows, so created an array of rows in the proccess
|
|
37
|
+
puts "A B C D E F G"
|
|
38
|
+
counter = 0
|
|
39
|
+
6.times do
|
|
40
|
+
row = []
|
|
41
|
+
board.each do |key, value|
|
|
42
|
+
print "#{value[counter]} "
|
|
43
|
+
row << "#{value[counter]}"
|
|
44
|
+
end
|
|
45
|
+
puts "\n"
|
|
46
|
+
counter += 1
|
|
47
|
+
@rows << row
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def row_winner_check
|
|
52
|
+
n = 0
|
|
53
|
+
winner_array_checks = []
|
|
54
|
+
@rows.map {|n| n.each_cons(4) {|element| winner_array_checks.push(element)}}
|
|
55
|
+
|
|
56
|
+
check_array_for_winner(winner_array_checks)
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
def column_winner_check
|
|
60
|
+
winner_array_checks = []
|
|
61
|
+
@board.values.map {|n| n.each_cons(4) {|element| winner_array_checks.push(element)}}
|
|
62
|
+
check_array_for_winner(winner_array_checks)
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
def diagonal_arrays(array)
|
|
66
|
+
diagonal_arrays_set_one(array)
|
|
67
|
+
diagonal_arrays_set_two(array)
|
|
68
|
+
diagonal_arrays_set_three(array)
|
|
69
|
+
diagonal_arrays_set_four(array)
|
|
70
|
+
|
|
71
|
+
@temp_array.delete_if {|n| n.include?(nil)}
|
|
72
|
+
return @temp_array
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
def diagonal_arrays_set_one(array)
|
|
76
|
+
i = 0
|
|
77
|
+
n = 3
|
|
78
|
+
until n == 6
|
|
79
|
+
@temp_array << (i..n).collect {|i| array[i][i]}
|
|
80
|
+
@temp_array << (i..n).collect {|i| array[i+1][i]}
|
|
81
|
+
@temp_array << (i..n).collect {|i| array[i][i+1]}
|
|
82
|
+
i += 1
|
|
83
|
+
n += 1
|
|
84
|
+
end
|
|
85
|
+
@temp_array
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
def diagonal_arrays_set_two(array)
|
|
89
|
+
i = 0
|
|
90
|
+
n = 1
|
|
91
|
+
@temp_array << (i..3).collect {|i| array[i][n+=1]}
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
def diagonal_arrays_set_three(array)
|
|
95
|
+
i = 0
|
|
96
|
+
n = 3
|
|
97
|
+
2.times do
|
|
98
|
+
@temp_array << (i..n).collect {|i| array[i+2][i]}
|
|
99
|
+
i += 1
|
|
100
|
+
n += 1
|
|
101
|
+
end
|
|
102
|
+
@temp_array
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
def diagonal_arrays_set_four(array)
|
|
106
|
+
i = 0
|
|
107
|
+
n = -1
|
|
108
|
+
@temp_array << (i..3).collect {|i| array[i+3][n+=1]}
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
def reversed_board_columns
|
|
112
|
+
temp_board = @board.dup
|
|
113
|
+
reverse_board = temp_board.map {|key, value| value.reverse}
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
def diagonal_winner_check
|
|
117
|
+
winner_array_checks = []
|
|
118
|
+
temp_board = @board.dup
|
|
119
|
+
winner_array_checks.concat(diagonal_arrays(temp_board.values))
|
|
120
|
+
winner_array_checks.concat(diagonal_arrays(reversed_board_columns))
|
|
121
|
+
check_array_for_winner(winner_array_checks)
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
def check_array_for_winner(array)
|
|
125
|
+
winner = nil
|
|
126
|
+
array.each do |array|
|
|
127
|
+
if array == ['X', 'X', 'X', 'X']
|
|
128
|
+
winner = player
|
|
129
|
+
break
|
|
130
|
+
elsif array == ["O", "O", "O", "O"]
|
|
131
|
+
winner = computer
|
|
132
|
+
break
|
|
133
|
+
end
|
|
134
|
+
end
|
|
135
|
+
return winner
|
|
136
|
+
end
|
|
137
|
+
|
|
138
|
+
def winner
|
|
139
|
+
game_winner = []
|
|
140
|
+
game_winner << column_winner_check
|
|
141
|
+
game_winner << row_winner_check
|
|
142
|
+
game_winner << diagonal_winner_check
|
|
143
|
+
game_winner.compact!
|
|
144
|
+
return game_winner[0]
|
|
145
|
+
end
|
|
146
|
+
end
|
data/lib/computer.rb
ADDED
data/lib/game.rb
ADDED
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
class Game
|
|
2
|
+
def initialize
|
|
3
|
+
@computer = Computer.new
|
|
4
|
+
@player = Player.new('name')
|
|
5
|
+
@board = Board.new(@player, @computer)
|
|
6
|
+
@turn = Turn.new(@board)
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
def start
|
|
10
|
+
p 'Welcome to Connect Four.'
|
|
11
|
+
p 'Enter p to play. Enter q to quit.'
|
|
12
|
+
begin_game = 'test'
|
|
13
|
+
until begin_game.downcase == 'p' || begin_game.downcase == 'q'
|
|
14
|
+
begin_game_messages
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def begin_game_messages
|
|
19
|
+
begin_game = gets.strip
|
|
20
|
+
if begin_game.downcase == 'p'
|
|
21
|
+
puts "------------------------------------------------------"
|
|
22
|
+
get_player_name
|
|
23
|
+
instructions
|
|
24
|
+
elsif begin_game.downcase == 'q'
|
|
25
|
+
p "Hope to see you soon--bye!"
|
|
26
|
+
exit
|
|
27
|
+
return "Hope to see you soon--bye!"
|
|
28
|
+
else
|
|
29
|
+
p "Didn't catch that. If you want to play, type 'p', otherwise type 'q'."
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def get_player_name
|
|
34
|
+
p "Lets play! First, what is your name?"
|
|
35
|
+
@player.name = gets.strip
|
|
36
|
+
puts "------------------------------------------------------"
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def instructions
|
|
40
|
+
p "#{@player.name}, you will be assigned the piece 'X'."
|
|
41
|
+
p "At any point in time, type 'exit' to exit the game. Good luck!"
|
|
42
|
+
puts "------------------------------------------------------"
|
|
43
|
+
@board.create_board
|
|
44
|
+
play_game
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
def play_game
|
|
48
|
+
until @board.winner == @computer || @board.winner == @player || @board.full? == true
|
|
49
|
+
player_move
|
|
50
|
+
computer_move
|
|
51
|
+
end
|
|
52
|
+
end_game
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
def player_move
|
|
56
|
+
p 'Choose a column (A-G). Type the letter.'
|
|
57
|
+
@board.show_board
|
|
58
|
+
valid_input_check
|
|
59
|
+
valid_move_check
|
|
60
|
+
puts "------------------------------------------------------"
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
def valid_input_check
|
|
64
|
+
@player.input = gets.strip
|
|
65
|
+
until @player.valid_input? == true
|
|
66
|
+
@player.input = gets.strip
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
def valid_move_check
|
|
71
|
+
input = @player.input.upcase
|
|
72
|
+
until @turn.column_space_check(input) == true
|
|
73
|
+
p 'Uh-oh! That column is full. Choose another column.'
|
|
74
|
+
@player.input = gets.strip
|
|
75
|
+
input = @player.input.upcase
|
|
76
|
+
end
|
|
77
|
+
@turn.player_valid_move?
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
def computer_move
|
|
81
|
+
p "Computer's move"
|
|
82
|
+
@board.computer.give_input
|
|
83
|
+
input = @board.computer.input
|
|
84
|
+
until @turn.column_space_check(input) == true
|
|
85
|
+
@board.computer.give_input
|
|
86
|
+
input = @board.computer.input
|
|
87
|
+
end
|
|
88
|
+
@turn.computer_valid_move?
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
def end_game
|
|
92
|
+
if @board.winner == @player
|
|
93
|
+
p "#{@player.name} won--nice job!"
|
|
94
|
+
elsif @board.winner == @computer
|
|
95
|
+
p "Computer won this round."
|
|
96
|
+
elsif @board.full? == true
|
|
97
|
+
p "Draw!"
|
|
98
|
+
end
|
|
99
|
+
play_again
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
def play_again
|
|
103
|
+
p "Would you like to play again? Type 'yes' or 'no'."
|
|
104
|
+
answer = 'test'
|
|
105
|
+
until answer.downcase == 'yes' || answer.downcase == 'no'
|
|
106
|
+
play_again_messages
|
|
107
|
+
end
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
def play_again_messages
|
|
111
|
+
answer = gets.strip
|
|
112
|
+
if answer.downcase == 'yes'
|
|
113
|
+
instructions
|
|
114
|
+
elsif answer.downcase =='no'
|
|
115
|
+
p 'See you next time!'
|
|
116
|
+
exit
|
|
117
|
+
else
|
|
118
|
+
p "Didn't catch that. Enter 'yes' or 'no'."
|
|
119
|
+
end
|
|
120
|
+
end
|
|
121
|
+
end
|
data/lib/player.rb
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
class Player
|
|
2
|
+
attr_reader :piece
|
|
3
|
+
attr_accessor :input, :name
|
|
4
|
+
|
|
5
|
+
def initialize(name)
|
|
6
|
+
@name = name
|
|
7
|
+
@input = nil
|
|
8
|
+
@piece = 'X'
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def valid_input?
|
|
12
|
+
valid_inputs = ['A', 'B', 'C', 'D', 'E', 'F', 'G']
|
|
13
|
+
if valid_inputs.include?(@input.upcase)
|
|
14
|
+
true
|
|
15
|
+
elsif @input.upcase == 'EXIT'
|
|
16
|
+
p 'See you later!'
|
|
17
|
+
exit
|
|
18
|
+
return 'See you later!'
|
|
19
|
+
else
|
|
20
|
+
p 'Typo? It happens to the best of us!'
|
|
21
|
+
p 'Type the letter of the column you would like to play (A-G).'
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
data/lib/turn.rb
ADDED
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
class Turn
|
|
2
|
+
attr_reader :board, :input
|
|
3
|
+
|
|
4
|
+
def initialize (board)
|
|
5
|
+
@board = board
|
|
6
|
+
@input = nil
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
def column_space_check(input)
|
|
10
|
+
@input = input
|
|
11
|
+
board.board[@input].any? do |column|
|
|
12
|
+
column.include?('.')
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def player_valid_move?
|
|
17
|
+
if column_space_check(input) == false
|
|
18
|
+
return 'Uh-oh! That column is full. Choose another column.'
|
|
19
|
+
else
|
|
20
|
+
player_place_piece
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def computer_valid_move?
|
|
25
|
+
@input = input
|
|
26
|
+
if column_space_check(input) == false
|
|
27
|
+
return 'Computer chooses another column.'
|
|
28
|
+
else
|
|
29
|
+
computer_place_piece
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def player_place_piece
|
|
34
|
+
board.board[@input].reverse.find do |column|
|
|
35
|
+
column.replace(board.player.piece) if column.include?('.')
|
|
36
|
+
end
|
|
37
|
+
player__turn_message
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def player__turn_message
|
|
41
|
+
puts '------------------------------------------------------'
|
|
42
|
+
p "Your move"
|
|
43
|
+
board.show_board
|
|
44
|
+
return 'Nice move!'
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
def computer_place_piece
|
|
48
|
+
board.board[@input].reverse.find do |column|
|
|
49
|
+
column.replace(board.computer.piece) if column.include?('.')
|
|
50
|
+
end
|
|
51
|
+
computer_turn_message
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
def computer_turn_message
|
|
55
|
+
board.show_board
|
|
56
|
+
puts '------------------------------------------------------'
|
|
57
|
+
return 'End of computer turn.'
|
|
58
|
+
end
|
|
59
|
+
end
|
metadata
ADDED
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
|
2
|
+
name: connect_four_2211
|
|
3
|
+
version: !ruby/object:Gem::Version
|
|
4
|
+
version: 0.1.0
|
|
5
|
+
platform: ruby
|
|
6
|
+
authors:
|
|
7
|
+
- Axel De La Guardia
|
|
8
|
+
- Jasmine Hamou
|
|
9
|
+
autorequire:
|
|
10
|
+
bindir: bin
|
|
11
|
+
cert_chain: []
|
|
12
|
+
date: 2022-12-11 00:00:00.000000000 Z
|
|
13
|
+
dependencies:
|
|
14
|
+
- !ruby/object:Gem::Dependency
|
|
15
|
+
name: rspec
|
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
|
17
|
+
requirements:
|
|
18
|
+
- - "~>"
|
|
19
|
+
- !ruby/object:Gem::Version
|
|
20
|
+
version: '3.7'
|
|
21
|
+
type: :development
|
|
22
|
+
prerelease: false
|
|
23
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
24
|
+
requirements:
|
|
25
|
+
- - "~>"
|
|
26
|
+
- !ruby/object:Gem::Version
|
|
27
|
+
version: '3.7'
|
|
28
|
+
description:
|
|
29
|
+
email:
|
|
30
|
+
executables:
|
|
31
|
+
- connect_four_2211
|
|
32
|
+
extensions: []
|
|
33
|
+
extra_rdoc_files: []
|
|
34
|
+
files:
|
|
35
|
+
- bin/connect_four_2211
|
|
36
|
+
- lib/board.rb
|
|
37
|
+
- lib/computer.rb
|
|
38
|
+
- lib/connect_four_2211.rb
|
|
39
|
+
- lib/game.rb
|
|
40
|
+
- lib/player.rb
|
|
41
|
+
- lib/turn.rb
|
|
42
|
+
homepage:
|
|
43
|
+
licenses: []
|
|
44
|
+
metadata: {}
|
|
45
|
+
post_install_message:
|
|
46
|
+
rdoc_options: []
|
|
47
|
+
require_paths:
|
|
48
|
+
- lib
|
|
49
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
|
50
|
+
requirements:
|
|
51
|
+
- - ">="
|
|
52
|
+
- !ruby/object:Gem::Version
|
|
53
|
+
version: '0'
|
|
54
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
55
|
+
requirements:
|
|
56
|
+
- - ">="
|
|
57
|
+
- !ruby/object:Gem::Version
|
|
58
|
+
version: '0'
|
|
59
|
+
requirements: []
|
|
60
|
+
rubygems_version: 3.0.3.1
|
|
61
|
+
signing_key:
|
|
62
|
+
specification_version: 4
|
|
63
|
+
summary: Connect Four - Pair Project
|
|
64
|
+
test_files: []
|