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 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
@@ -0,0 +1,10 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require './lib/player'
4
+ require './lib/computer'
5
+ require './lib/board'
6
+ require './lib/turn'
7
+ require './lib/game'
8
+
9
+ game = Game.new
10
+ game.start
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
@@ -0,0 +1,13 @@
1
+ class Computer
2
+ attr_reader :input, :piece
3
+
4
+ def initialize
5
+ @input = nil
6
+ @piece = "O"
7
+ end
8
+
9
+ def give_input
10
+ valid_input = ['A', 'B', 'C', 'D', 'E', 'F', 'G']
11
+ @input = valid_input.sample
12
+ end
13
+ end
@@ -0,0 +1,8 @@
1
+ require './lib/player'
2
+ require './lib/computer'
3
+ require './lib/board'
4
+ require './lib/turn'
5
+ require './lib/game'
6
+
7
+ game = Game.new
8
+ game.start
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: []