Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
37 commits
Select commit Hold shift + click to select a range
a59d239
Add name to README
robertjosephwayne Feb 8, 2017
c9d4ca1
Initial game outline
robertjosephwayne Feb 8, 2017
1559e58
Add initialize method
robertjosephwayne Feb 8, 2017
8d58a54
Add play method
robertjosephwayne Feb 8, 2017
a8a0dab
Add check_game_over method
robertjosephwayne Feb 8, 2017
3f23fa6
Add check_victory method
robertjosephwayne Feb 8, 2017
45f2270
Add switch_players method
robertjosephwayne Feb 8, 2017
e80c057
Add initialize method
robertjosephwayne Feb 8, 2017
b3bd0c0
Add get_column method
robertjosephwayne Feb 8, 2017
3b1da10
Add ask_for_column method
robertjosephwayne Feb 8, 2017
359ba0e
Add validate_column_format method
robertjosephwayne Feb 8, 2017
a1c8a67
Add initialize method
robertjosephwayne Feb 8, 2017
fcf9fe7
Add render method
robertjosephwayne Feb 8, 2017
be86f4a
Add valid_move? method
robertjosephwayne Feb 8, 2017
51fc195
Add column_valid? method
robertjosephwayne Feb 8, 2017
6ba9f98
Build column_available? method
robertjosephwayne Feb 8, 2017
f5b921f
Finish building add_piece method
robertjosephwayne Feb 8, 2017
877f784
Add winning_combination? method
robertjosephwayne Feb 8, 2017
1a29f54
Add horizontals method
robertjosephwayne Feb 8, 2017
c412202
Add verticals method
robertjosephwayne Feb 8, 2017
10f4cbc
Render board before displaying winning message
robertjosephwayne Feb 8, 2017
189e6e5
Add winning_vertical? method
robertjosephwayne Feb 8, 2017
f64aadb
Add winning_horizontal? method
robertjosephwayne Feb 8, 2017
315cd64
Add winning_diagonals? method
robertjosephwayne Feb 8, 2017
3320a88
Fix typo
robertjosephwayne Feb 8, 2017
b523b62
Add winning_diagonal? method
robertjosephwayne Feb 8, 2017
7bf460c
Add full? method
robertjosephwayne Feb 8, 2017
b8f3cc8
Add ComputerPlayer class
robertjosephwayne Feb 8, 2017
851f14f
Add dup_board method
robertjosephwayne Feb 8, 2017
807fb1c
Add winning_vertical_available? method
robertjosephwayne Feb 8, 2017
adbe2c5
Add slot_available? and possible_move methods
robertjosephwayne Feb 8, 2017
7d5de01
Add winning_horizontal_available? method
robertjosephwayne Feb 8, 2017
3049a21
Add to ask_for_column method to make ComputerPlayer smarter
robertjosephwayne Feb 8, 2017
2113034
Remove notes
robertjosephwayne Feb 9, 2017
55a6b6d
Make methods private where possible
robertjosephwayne Feb 9, 2017
adc09ad
Add examples to test for Board class
robertjosephwayne Feb 9, 2017
4ee4b89
Add examples to test for Board class
robertjosephwayne Feb 10, 2017
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
## project_game_center

[An Object-Oriented Ruby project from the Viking Code School](http://www.vikingcodeschool.com)
[An Object-Oriented Ruby project from the Viking Code School](http://www.vikingcodeschool.com)

Robert Wayne
1 change: 0 additions & 1 deletion connect_four/connect_four.rb

This file was deleted.

320 changes: 320 additions & 0 deletions connect_four/lib/board.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,320 @@
class Board
def initialize(*board_state)
@board = board_state || Array.new(6) { Array.new(7) }
end

def render
puts

5.downto(0) do |row|
@board[row].each do |column|
print "| "
column.nil? ? print("-") : print(column)
print " |"
end
puts
end

7.times { print "|---|" }
puts
1.upto(7) { |i| print "| #{i} |" }
puts
puts
end

def winning_combination?(piece)
winning_diagonal?(piece) || winning_vertical?(piece) || winning_horizontal?(piece)
end

def full?
@board.each do |row|
row.each do |slot|
return false if slot.nil?
end
end

true
end

def add_piece(column_label, piece)
column_index = column_label - 1

if move_valid?(column_label)
@board.each_with_index do |row, i|
if row[column_index].nil?
@board[i][column_index] = piece
return true
end
end
else
false
end
end

def winning_vertical_available?(piece)
verticals.each do |column|
consecutive_pieces = 0
column.each do |slot|
if slot == piece
consecutive_pieces += 1
elsif slot.nil? && consecutive_pieces == 3
return true
else
consecutive_pieces = 0
end
end
end
false
end

def winning_vertical_move(piece)
verticals.each_with_index do |column, column_index|
consecutive_pieces = 0
column.each do |slot|
if slot == piece
consecutive_pieces += 1
elsif slot == nil && consecutive_pieces == 3
return column_index
else
consecutive_pieces = 0
end
end
end

false
end

def winning_horizontal_available?(piece)
horizontals.each_with_index do |row, row_index|
consecutive_pieces = 0

row.each_with_index do |slot, column_index|
if slot == piece
consecutive_pieces += 1
elsif consecutive_pieces == 3
if column_index >= 4
column_before_sequence = column_index - 4
slot_before_sequence = @board[row_index][column_before_sequence]
return true if slot_before_sequence.nil?
end

return true if slot.nil?
end
end
end

false
end

def winning_horizontal_move(piece)
horizontals.each_with_index do |row, row_index|
consecutive_pieces = 0

row.each_with_index do |slot, column_index|
if slot == piece
consecutive_pieces += 1
elsif consecutive_pieces == 3
if column_index >= 4
column_before_sequence = column_index - 4
slot_before_sequence = @board[row_index][column_before_sequence]
return column_before_sequence if slot_before_sequence.nil?
end

return column_index if slot.nil?
end
end
end

false
end

private

def move_valid?(column_label)
if column_valid?(column_label) && column_available?(column_label)
true
else
puts "Invalid move."
false
end
end

def column_valid?(column_label)
if column_label >= 1 && column_label <= 7
true
else
puts "Invalid move."
end
end

def column_available?(column_label)
column(column_label).include?(nil) ? true : false
end

def column(column_label)
column_arr = []

@board.each do |row|
column_arr.push(row[column_label - 1])
end

column_arr
end

def winning_diagonal?(piece)
diagonals.each do |diagonal|
consecutive_pieces = 0
diagonal.each do |slot|
if slot == piece
consecutive_pieces += 1
return true if consecutive_pieces == 4
else
consecutive_pieces = 0
end
end
end

false
end

def winning_vertical?(piece)
verticals.each do |column|
consecutive_pieces = 0
column.each do |slot|
if slot == piece
consecutive_pieces += 1
return true if consecutive_pieces == 4
else
consecutive_pieces = 0
end
end
end

false
end

def winning_horizontal?(piece)
horizontals.each do |row|
consecutive_pieces = 0
row.each do |slot|
if slot == piece
consecutive_pieces += 1
return true if consecutive_pieces == 4
else
consecutive_pieces = 0
end
end
end

false
end

def diagonals
diagonals_arr = []

3.times do |i|
column_start = 0
row_start = 0
row_start += i
column = column_start
row = row_start
diagonal = []

while column <= 6 && row <= 5
diagonal.push(@board[row][column])
column += 1
row += 1
end

diagonals_arr.push(diagonal)
end

3.times do |i|
column_start = 1
row_start = 0
column_start += i
column = column_start
row = row_start
diagonal = []

while column <= 6 && row <= 5
diagonal.push(@board[row][column])
column += 1
row += 1
end

diagonals_arr.push(diagonal)
end

3.times do |i|
column_start = 6
row_start = 0
row_start += i
column = column_start
row = row_start
diagonal = []

while column >= 0 && row <= 5
diagonal.push(@board[row][column])
column -= 1
row += 1
end

diagonals_arr.push(diagonal)
end

3.times do |i|
column_start = 5
row_start = 0
column_start -= i
column = column_start
row = row_start
diagonal = []

while column >= 0 && row <= 5
diagonal.push(@board[row][column])
column -= 1
row += 1
end

diagonals_arr.push(diagonal)
end

diagonals_arr
end

def verticals
columns = []

1.upto(7) do |column_label|
columns.push(column(column_label))
end

columns
end

def horizontals
@board
end

def slot_available?
if @board[row_index][column_index].nil?
true
else
false
end
end

def possible_move?(column_index, row_index)
if slot_available?
if row_index == 0
true
elsif @board[row_index - 1][column_index].nil?
false
else
true
end
end
end

end
22 changes: 22 additions & 0 deletions connect_four/lib/computer_player.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
require_relative 'player'

class ComputerPlayer < Player
def initialize(name = "Computer Player", piece, board)
raise "Piece must be a symbol!" unless piece.is_a?(Symbol)
@name = name
@piece = piece
@board = board
end

private

def ask_for_column
if @board.winning_vertical_available?(piece)
@board.winning_vertical_move(piece) + 1
elsif @board.winning_horizontal_available?(piece)
@board.winning_horizontal_move(piece) + 1
else
rand(6) + 1
end
end
end
Loading