connect_four2311 0.1.2

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: 8f6802494752d02b2ea929f4933212dc870b0ca2f6b4a18ddf618cfcf430b009
4
+ data.tar.gz: 679c8cd3d60cd0fc13cd635a0d2ff0520e442b14722c685def95c57d4d073a79
5
+ SHA512:
6
+ metadata.gz: 45514df2db191138a64dbfbde4129073552f35a7f20d75e4b7bcef77a51588455074dd28954ff90c237bfeeddf61ad489c90e375f113058b4ca81db58b876cdd
7
+ data.tar.gz: fd8ee635b2ff210f5a4020ac2a9c70deb162da61b58ba74731334b6211f496eed75b16f2890e2e610f8f2880415975c58a77cbaaa2443e374bcdc09160f724bd
data/bin/connect ADDED
@@ -0,0 +1,4 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'connect'
4
+ Connect.connect
@@ -0,0 +1,66 @@
1
+ class Board
2
+
3
+ attr_accessor :cells
4
+
5
+ def initialize
6
+ @cells = Array.new(6){Array.new(7, '.')}
7
+ end
8
+
9
+ def display
10
+ puts '-------------'
11
+ puts 'A B C D E F G'
12
+ puts '============='
13
+ @cells.each {|row| puts row.join(' ')}
14
+ puts '-------------'
15
+ end
16
+
17
+ def add_piece(column, piece)
18
+ range = ("A".."G").to_a
19
+
20
+ if range.any?(column)
21
+ chosen_column = ('A'..'G').to_a.index(column)
22
+ rows = cells.length - 1
23
+
24
+ while rows >= 0 && @cells[rows][chosen_column] != '.'
25
+ rows -= 1
26
+ end
27
+
28
+ @cells[rows][chosen_column] = piece if rows >= 0
29
+ else
30
+ nil
31
+ end
32
+ end
33
+
34
+ def win?
35
+ four_in_a_row_by_row(@cells) ||
36
+ four_in_a_row_by_row(@cells.transpose) ||
37
+ four_in_a_row_by_row(diagonals(@cells)) ||
38
+ four_in_a_row_by_row(diagonals((@cells.transpose.reverse)))
39
+ end
40
+
41
+ def four_in_a_row_by_row(cells)
42
+ cells.each do |row|
43
+ a = row.each_cons(4).find { |a| a.uniq.size == 1 && a.first != '.' }
44
+ return true unless a.nil?
45
+ end
46
+ false
47
+ end
48
+
49
+ def diagonals(cells)
50
+ diagonals_right_to_left = (0..cells.size-4).map do |i|
51
+ (0..cells.size-1-i).map do |j|
52
+ cells[i+j][j]
53
+ end
54
+ end
55
+
56
+ diagonals_right_to_left.concat((1..cells.first.size-4).map do |j|
57
+ (0..cells.size-j-1).map do |i|
58
+ cells[i][j+i]
59
+ end
60
+ end)
61
+ end
62
+
63
+ def draw?
64
+ !@cells[0].include?('.')
65
+ end
66
+ end
@@ -0,0 +1,49 @@
1
+ class Computer
2
+
3
+ attr_reader :piece
4
+
5
+ def initialize
6
+ @piece = 'O'
7
+ end
8
+
9
+ def make_move(board)
10
+ win = find_win_column(board)
11
+ block = find_block_column(board)
12
+ random = find_random_column(board)
13
+
14
+ if win
15
+ board.add_piece(win, @piece)
16
+ elsif block
17
+ board.add_piece(block, @piece)
18
+ else
19
+ board.add_piece(random, @piece)
20
+ end
21
+ end
22
+
23
+ def find_random_column(board)
24
+ columns = ('A'..'G').to_a
25
+ columns.sample
26
+ end
27
+
28
+ def find_win_column(board)
29
+ piece = @piece
30
+ find_column(piece, board)
31
+ end
32
+
33
+ def find_block_column(board)
34
+ piece = 'X'
35
+ find_column(piece, board)
36
+ end
37
+
38
+ def find_column(piece, board)
39
+ columns = ('A'..'G').to_a
40
+ columns.each do |column|
41
+ board_copy = Board.new
42
+ board_copy.cells = board.dup.cells.map(&:dup)
43
+ board_copy.add_piece(column, piece)
44
+
45
+ return column if board_copy.win?
46
+ end
47
+ nil
48
+ end
49
+ end
@@ -0,0 +1,109 @@
1
+ require './lib/connect/board'
2
+ require './lib/connect/player'
3
+ require './lib/connect/computer'
4
+
5
+ class Game
6
+
7
+ attr_reader :board, :player, :computer, :current_player, :turns_taken
8
+
9
+ def initialize
10
+ @board = Board.new
11
+ @player = Player.new
12
+ @computer = Computer.new
13
+ @current_player = @player
14
+ @turns_taken = 0
15
+ end
16
+
17
+ def make_new_board
18
+ @board = Board.new
19
+ @current_player = @player
20
+ end
21
+
22
+ def welcome_message
23
+ puts 'Welcome to Connect Four'
24
+ end
25
+
26
+ def change_current_player
27
+ @current_player = (@current_player == @player) ? @computer : @player
28
+ end
29
+
30
+ def player_turn
31
+ puts 'Please select a column between A - G:'
32
+ input = gets.chomp.upcase
33
+
34
+ until @player.make_move(input, @board) != nil
35
+ puts 'Please select a valid column between A - G:'
36
+ input = gets.chomp.upcase
37
+ end
38
+ end
39
+
40
+ def computer_turn
41
+ until @computer.make_move(@board) != nil
42
+ @computer.make_move(@board)
43
+ end
44
+ end
45
+
46
+ def endgame_win?
47
+ @board.win?
48
+ end
49
+
50
+ def endgame_draw?
51
+ @board.draw?
52
+ end
53
+
54
+ def take_turn
55
+ loop do
56
+ player_selector
57
+
58
+ @turns_taken += 1
59
+ if endgame_win? && @current_player == @player
60
+ puts "You won in a total of #{@turns_taken} turns!"
61
+ @board.display
62
+ break
63
+ elsif endgame_win? && @current_player == @computer
64
+ puts "You lose!"
65
+ @board.display
66
+ break
67
+ elsif endgame_draw?
68
+ puts "The game has ended in a draw!"
69
+ break
70
+ end
71
+
72
+ change_current_player
73
+ end
74
+
75
+ play_game
76
+ end
77
+
78
+ def player_selector
79
+ if @current_player == @player
80
+ @board.display
81
+ player_turn
82
+ else
83
+ computer_turn
84
+ end
85
+ end
86
+
87
+ def main_menu
88
+ puts "Press 'P' to play or 'Q' to quit"
89
+ input = gets.chomp.upcase
90
+ end
91
+
92
+ def play_game
93
+ make_new_board
94
+ welcome_message
95
+ play_input = main_menu
96
+ loop do
97
+ case play_input
98
+ when 'P'
99
+ take_turn
100
+ when 'Q'
101
+ puts 'Goodbye!'
102
+ exit
103
+ else
104
+ puts 'Please select a valid option'
105
+ play_input = main_menu
106
+ end
107
+ end
108
+ end
109
+ end
@@ -0,0 +1,12 @@
1
+ class Player
2
+
3
+ attr_reader :piece
4
+
5
+ def initialize
6
+ @piece = 'X'
7
+ end
8
+
9
+ def make_move(column, board)
10
+ board.add_piece(column, @piece)
11
+ end
12
+ end
data/lib/connect.rb ADDED
@@ -0,0 +1,7 @@
1
+ require './lib/connect/game'
2
+
3
+ class Connect
4
+ def self.connect
5
+ Game.new.play_game
6
+ end
7
+ end
metadata ADDED
@@ -0,0 +1,49 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: connect_four2311
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.2
5
+ platform: ruby
6
+ authors:
7
+ - Jack & Igor
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2024-01-07 00:00:00.000000000 Z
12
+ dependencies: []
13
+ description: A simple connect four game gem
14
+ email: jackcsweeney@gmail.com
15
+ executables:
16
+ - connect
17
+ extensions: []
18
+ extra_rdoc_files: []
19
+ files:
20
+ - bin/connect
21
+ - lib/connect.rb
22
+ - lib/connect/board.rb
23
+ - lib/connect/computer.rb
24
+ - lib/connect/game.rb
25
+ - lib/connect/player.rb
26
+ homepage: https://github.com/JackCSweeney/connect_four_project
27
+ licenses:
28
+ - MIT
29
+ metadata: {}
30
+ post_install_message:
31
+ rdoc_options: []
32
+ require_paths:
33
+ - lib
34
+ required_ruby_version: !ruby/object:Gem::Requirement
35
+ requirements:
36
+ - - ">="
37
+ - !ruby/object:Gem::Version
38
+ version: '0'
39
+ required_rubygems_version: !ruby/object:Gem::Requirement
40
+ requirements:
41
+ - - ">="
42
+ - !ruby/object:Gem::Version
43
+ version: '0'
44
+ requirements: []
45
+ rubygems_version: 3.3.26
46
+ signing_key:
47
+ specification_version: 4
48
+ summary: Connect_Four
49
+ test_files: []