minimax_rb 0.0.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/lib/minimax_rb.rb +83 -0
- metadata +44 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 6c43294f8e68ea64e505c0a4dfdf451227cac4480b94831b78cfe06dd5a52220
|
4
|
+
data.tar.gz: f6c00414447d0423a5f2e599e3afa90159b5e4b122f1fa3a0fe686a836d63fa8
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: d86ac7a345b0cbc017b22660b8a0578468673575f03bceddec9b67edfb356c9645cd56f7f2a3b88bb10908056730df7c1cfcfc101369b9f706197b5204d61659
|
7
|
+
data.tar.gz: cbdb86033be52846bb8497f124bfb8805fbfba66d35af29c84e34ea5f9d39eeb517bd07f4253d8c0dc4d34bf8a4996abeb54f184474bea6ffc8bb5b00d28a33f
|
data/lib/minimax_rb.rb
ADDED
@@ -0,0 +1,83 @@
|
|
1
|
+
module MinimaxRB
|
2
|
+
def self.best_move args
|
3
|
+
minimax(args[:board], args[:marker], args[:opponent], args.fetch(:empty_marker, nil))
|
4
|
+
end
|
5
|
+
|
6
|
+
private
|
7
|
+
def self.minimax board, marker, opponent, empty_marker, depth=0, best_score={}
|
8
|
+
return 0 if draw?(board, marker, opponent, empty_marker)
|
9
|
+
return -1 if win?(board, marker, opponent)
|
10
|
+
|
11
|
+
available_moves(board, empty_marker).each do |move|
|
12
|
+
board[move] = marker
|
13
|
+
best_score[move] = -1 * minimax(board, opponent, marker, empty_marker, depth+1, {})
|
14
|
+
board[move] = empty_marker
|
15
|
+
end
|
16
|
+
|
17
|
+
depth == 0 ? max_move(best_score) : max_score(best_score)
|
18
|
+
end
|
19
|
+
|
20
|
+
def self.max_move best_score
|
21
|
+
best_score.max_by { |key, value| value }[0]
|
22
|
+
end
|
23
|
+
|
24
|
+
def self.max_score best_score
|
25
|
+
best_score.max_by { |key, value| value }[1]
|
26
|
+
end
|
27
|
+
|
28
|
+
def self.available_moves array, empty_marker
|
29
|
+
available_moves = []
|
30
|
+
array.each_with_index do |value, index|
|
31
|
+
if value == empty_marker
|
32
|
+
available_moves << index
|
33
|
+
end
|
34
|
+
end
|
35
|
+
available_moves
|
36
|
+
end
|
37
|
+
|
38
|
+
def self.marker_winning_combo? marker, board
|
39
|
+
board.uniq.length == 1 and board.include?(marker)
|
40
|
+
end
|
41
|
+
|
42
|
+
def self.marker_winner? marker, board
|
43
|
+
combos = [rows(board), columns(board), diagonals(board)]
|
44
|
+
combos.each do |combo|
|
45
|
+
combo.each { |line| return true if marker_winning_combo?(marker, line) }
|
46
|
+
end
|
47
|
+
false
|
48
|
+
end
|
49
|
+
|
50
|
+
def self.rows board
|
51
|
+
board.each_slice(grid_size(board)).to_a
|
52
|
+
end
|
53
|
+
|
54
|
+
def self.columns board
|
55
|
+
rows(board).transpose
|
56
|
+
end
|
57
|
+
|
58
|
+
def self.diagonals board
|
59
|
+
left_diag = []
|
60
|
+
right_diag = []
|
61
|
+
(0...grid_size(board)).each do |i|
|
62
|
+
left_diag.push(rows(board)[i][i])
|
63
|
+
right_diag.push(rows(board).reverse[i][i])
|
64
|
+
end
|
65
|
+
[left_diag, right_diag]
|
66
|
+
end
|
67
|
+
|
68
|
+
def self.grid_size board
|
69
|
+
Math.sqrt(board.length)
|
70
|
+
end
|
71
|
+
|
72
|
+
def self.draw? board, marker, opponent, empty_marker
|
73
|
+
board_full?(board, empty_marker) and not win?(board, marker, opponent)
|
74
|
+
end
|
75
|
+
|
76
|
+
def self.win? board, marker, opponent
|
77
|
+
marker_winner?(marker, board) or marker_winner?(opponent, board)
|
78
|
+
end
|
79
|
+
|
80
|
+
def self.board_full? board, empty_marker
|
81
|
+
not board.include?(empty_marker)
|
82
|
+
end
|
83
|
+
end
|
metadata
ADDED
@@ -0,0 +1,44 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: minimax_rb
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Brian Sung
|
8
|
+
- Angelica Gonzalez
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2019-10-07 00:00:00.000000000 Z
|
13
|
+
dependencies: []
|
14
|
+
description: First iteration of Minimax Ruby gem
|
15
|
+
email: dev.junehoe@gmail.com
|
16
|
+
executables: []
|
17
|
+
extensions: []
|
18
|
+
extra_rdoc_files: []
|
19
|
+
files:
|
20
|
+
- lib/minimax_rb.rb
|
21
|
+
homepage: https://rubygems.org/gems/minimax_rb
|
22
|
+
licenses:
|
23
|
+
- MIT
|
24
|
+
metadata: {}
|
25
|
+
post_install_message:
|
26
|
+
rdoc_options: []
|
27
|
+
require_paths:
|
28
|
+
- lib
|
29
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
35
|
+
requirements:
|
36
|
+
- - ">="
|
37
|
+
- !ruby/object:Gem::Version
|
38
|
+
version: '0'
|
39
|
+
requirements: []
|
40
|
+
rubygems_version: 3.0.3
|
41
|
+
signing_key:
|
42
|
+
specification_version: 4
|
43
|
+
summary: Minimax for Ruby
|
44
|
+
test_files: []
|