chess_rb 0.0.1

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
+ SHA1:
3
+ metadata.gz: fa3d318cecdbf7ca433d3dbd4a05f865d6acd390
4
+ data.tar.gz: 0674fc6547bed63a77ad029af20815221f1731c7
5
+ SHA512:
6
+ metadata.gz: 0fbc9bf5696a3b468989ee3b00b151f9e36ca6a84ab4a6e3249c3313e6e1ff2be8c25fdf9a5b63d9c4ed05f36600ba897fba4c7aea9daa25afc7d837068ae1eb
7
+ data.tar.gz: 7dc55e6ddb44420f5ff44c0abe1c5aced4243015ecfa195a5888bb3e8a232a4a1b29cb3eb636bf7ca7294493433b5b302857fd172f64cb3c06d10bbd3d927753
@@ -0,0 +1,86 @@
1
+ class ChessRB::Move
2
+ FILE_TO_NUM = [nil, 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']
3
+
4
+ attr_reader :to, :from, :promotion, :square, :san, :board
5
+
6
+ def initialize(move, pos, promotion = nil)
7
+ if move.split('-').length == 2
8
+ @square = move
9
+ else
10
+ @san = move
11
+ end
12
+
13
+ if pos.is_a? String
14
+ @board = ChessRB::Position.new pos
15
+ else
16
+ @board = pos
17
+ end
18
+
19
+ @promotion = promotion
20
+
21
+ @square = ChessRB::Notation.algebraic_to_square(self) if @square.nil?
22
+
23
+ squares = @square.split('-')
24
+ @from = squares[0]
25
+ @to = squares[1]
26
+
27
+ @san = ChessRB::Notation.square_to_algebraic(self) if @san.nil?
28
+
29
+ @valid = valid?
30
+ end
31
+
32
+ # TODO
33
+ # Returns true if move is a legal move in the given position, false otherwise.
34
+ def valid?
35
+ return @valid if !@valid.nil?
36
+ return true
37
+ end
38
+
39
+ # Returns true if move represents a queen-side castle, false otherwise.
40
+ def queen_castle?
41
+
42
+ return valid? && ChessRB::Piece.new(@board.piece_on(@to)).type == 'k' &&
43
+ (from_file - to_file).abs == 3
44
+ end
45
+
46
+ # Returns true if move represents a king-side castle, false otherwise.
47
+ def king_castle?
48
+ return valid? && ChessRB::Piece.new(@board.piece_on(@to)).type == 'k' &&
49
+ (from_file - to_file).abs == 2
50
+ end
51
+
52
+ # Returns true if move results in a capture, false otherwise.
53
+ def capture?
54
+ return valid? && @board.piece_on(@to) != 0
55
+ end
56
+
57
+ # Returns the rank of a given square
58
+ def self.rank(square)
59
+ return square[1].to_i
60
+ end
61
+
62
+ # Returns rank of this move's @to square
63
+ def to_rank
64
+ return self.rank(@to)
65
+ end
66
+
67
+ # Returns rank of this move's @from square
68
+ def from_rank
69
+ return self.rank(@from)
70
+ end
71
+
72
+ # Returns the file of a given square as a number (e.g., a = 1, b = 2, ...)
73
+ def self.file(square)
74
+ return FILE_TO_NUM.index(square[0])
75
+ end
76
+
77
+ # Returns file of this move's @to square
78
+ def to_file
79
+ return self.file(@to)
80
+ end
81
+
82
+ # Returns file of this move's @from square
83
+ def from_file
84
+ return self.file(@from)
85
+ end
86
+ end
@@ -0,0 +1,52 @@
1
+ class ChessRB::Notation
2
+ def self.square_to_algebraic(move)
3
+ board = move.board
4
+ piece = ChessRB::Piece.new(board.piece_on(move.from))
5
+ san = ""
6
+
7
+ raise ArgumentError.new "Invalid move and/or position" if !move.valid? ||
8
+ !board.valid?
9
+
10
+
11
+ if move.queen_castle?
12
+ san = "O-O-O"
13
+ elsif move.king_castle?
14
+ san = "O-O"
15
+ else
16
+ if piece.type == 'p'
17
+ if move.capture?
18
+ san = file_to_char(move.from_file)
19
+ end
20
+ else
21
+ san += piece.type.upcase
22
+ # test ambiguities
23
+ # file
24
+ # rank
25
+ # both
26
+ end
27
+ end
28
+
29
+ if move.capture?
30
+ san += "x"
31
+ end
32
+
33
+ san += move.to
34
+
35
+ san += "=#{move.promotion}" if move.promotion
36
+
37
+ =begin
38
+ board.make_move(move)
39
+ if (board.check?)
40
+ san += board.mate? ? "#" : "+"
41
+ end
42
+ board.undo_move(move)
43
+ =end
44
+
45
+ return san
46
+ end
47
+
48
+ # TODO
49
+ def self.algebraic_to_square(move)
50
+ return move.square
51
+ end
52
+ end
@@ -0,0 +1,52 @@
1
+ class ChessRB::Piece
2
+ WP = 1; WN = 2; WLB = 3; WDB = 4; WR = 5; WQ = 6; WK = 7
3
+ BP = 11; BN = 12; BLB = 13; BDB = 14; BR = 15; BQ = 16; BK = 17
4
+
5
+ attr_accessor :code
6
+
7
+ def initialize(code)
8
+ @code = code
9
+ end
10
+
11
+ def type
12
+ self.to_desc[-1, 1]
13
+ end
14
+
15
+ def to_desc
16
+ return ChessRB::Piece.constants.select{
17
+ |v| ChessRB::Piece.const_get(v) == @code }[0].to_s
18
+ end
19
+
20
+ def to_s(p, d)
21
+ case @code
22
+ when WP
23
+ d ? "♟" : "♙"
24
+ when WN
25
+ d ? "♞" : "♘"
26
+ when WLB
27
+ d ? "♝" : "♗"
28
+ when WDB
29
+ d ? "♝" : "♗"
30
+ when WR
31
+ d ? "♜" : "♖"
32
+ when WQ
33
+ d ? "♛" : "♕"
34
+ when WK
35
+ d ? "♚" : "♔"
36
+ when BP
37
+ d ? "♙" : "♟"
38
+ when BN
39
+ d ? "♘" : "♞"
40
+ when BLB
41
+ d ? "♗" : "♝"
42
+ when BDB
43
+ d ? "♗" : "♝"
44
+ when BR
45
+ d ? "♖" : "♜"
46
+ when BQ
47
+ d ? "♕" : "♛"
48
+ when BK
49
+ d ? "♔" : "♚"
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,72 @@
1
+ class ChessRB::Position
2
+ attr_accessor :fen
3
+
4
+ def initialize(fen)
5
+ @fen = fen
6
+ @fen_components = fen.split(' ')
7
+ @board = fen_to_board(fen)
8
+ end
9
+
10
+ # TODO
11
+ def valid?
12
+ return true
13
+ end
14
+
15
+ # Returns the piece code on the given square
16
+ def piece_on(square)
17
+ file = ChessRB::Move.file(square)
18
+ rank = ChessRB::Move.rank(square)
19
+ return @board[8 - rank][file - 1]
20
+ end
21
+
22
+ # TODO
23
+ def check?
24
+
25
+ end
26
+
27
+ # TODO
28
+ def mate?
29
+
30
+ end
31
+
32
+ def to_s(dark_background = true)
33
+ str = ""
34
+ board.each_with_index do |r, i|
35
+ str += (8 - i).to_s + "║"
36
+ r.each do |s|
37
+ str += " "
38
+ if s == 0
39
+ str += "…"
40
+ else
41
+ str += ChessRB::Piece.code_to_s(s, dark_background)
42
+ end
43
+ end
44
+ str += "\n"
45
+ end
46
+ str += " ╚════════════════\n A B C D E F G H"
47
+ return str
48
+ end
49
+
50
+ private
51
+
52
+ def fen_to_board(f)
53
+ board = Array.new(8) {Array.new(8,0)}
54
+ rows = f.split(' ')[0].split('/')
55
+ rows.each_with_index do |r, i|
56
+ j = 0
57
+ r.each_char do |c|
58
+ if c.to_i != 0
59
+ j += c.to_i
60
+ else
61
+ color = /[[:upper:]]/.match(c) ? 'W' : 'B'
62
+ if c.upcase == 'B'
63
+ c = i + j % 2 == 0 ? 'DB' : 'LB'
64
+ end
65
+ board[i][j] = ChessRB::Piece.const_get(color + c.upcase)
66
+ j += 1
67
+ end
68
+ end
69
+ end
70
+ return board
71
+ end
72
+ end
data/lib/chess_rb.rb ADDED
@@ -0,0 +1,10 @@
1
+ class ChessRB
2
+
3
+ end
4
+
5
+ require 'chess_rb/notation'
6
+ require 'chess_rb/move'
7
+ require 'chess_rb/position'
8
+ require 'chess_rb/piece'
9
+
10
+
metadata ADDED
@@ -0,0 +1,48 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: chess_rb
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Sabar Dasgupta
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-06-16 00:00:00.000000000 Z
12
+ dependencies: []
13
+ description: Chess functions written in Ruby
14
+ email: sabar.dasgupta@gmail.com
15
+ executables: []
16
+ extensions: []
17
+ extra_rdoc_files: []
18
+ files:
19
+ - lib/chess_rb.rb
20
+ - lib/chess_rb/move.rb
21
+ - lib/chess_rb/notation.rb
22
+ - lib/chess_rb/piece.rb
23
+ - lib/chess_rb/position.rb
24
+ homepage: http://rubygems.org/gems/chess_rb
25
+ licenses:
26
+ - MIT
27
+ metadata: {}
28
+ post_install_message:
29
+ rdoc_options: []
30
+ require_paths:
31
+ - lib
32
+ required_ruby_version: !ruby/object:Gem::Requirement
33
+ requirements:
34
+ - - ">="
35
+ - !ruby/object:Gem::Version
36
+ version: '0'
37
+ required_rubygems_version: !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - ">="
40
+ - !ruby/object:Gem::Version
41
+ version: '0'
42
+ requirements: []
43
+ rubyforge_project:
44
+ rubygems_version: 2.2.2
45
+ signing_key:
46
+ specification_version: 4
47
+ summary: Ruby chess library
48
+ test_files: []