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 +7 -0
- data/bin/connect +4 -0
- data/lib/connect/board.rb +66 -0
- data/lib/connect/computer.rb +49 -0
- data/lib/connect/game.rb +109 -0
- data/lib/connect/player.rb +12 -0
- data/lib/connect.rb +7 -0
- metadata +49 -0
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,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
|
data/lib/connect/game.rb
ADDED
|
@@ -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
|
data/lib/connect.rb
ADDED
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: []
|