just_xiangqi 0.1.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.
@@ -0,0 +1,69 @@
1
+ require 'just_xiangqi/square'
2
+ require 'board_game_grid'
3
+
4
+ module JustXiangqi
5
+
6
+ # = Square Set
7
+ #
8
+ # A collection of Squares with useful filtering functions
9
+ class SquareSet < BoardGameGrid::SquareSet
10
+
11
+ # New objects can be instantiated by passing in a hash with squares.
12
+ # They can be square objects or hashes.
13
+ #
14
+ # @param [Array<Square,Hash>] squares
15
+ # An array of squares, each with an x and y co-oordinates an a piece.
16
+ #
17
+ # ==== Example:
18
+ # # Instantiates a new Square Sete
19
+ # JustXiangqi::SquareSet.new({
20
+ # squares: [
21
+ # { id: '1', x: 0, y: 0, piece: { id: 1, player_number: 1, type: 'zu' } }
22
+ # ]
23
+ # })
24
+ def initialize(squares: )
25
+ @squares = if squares.instance_of?(Array)
26
+ if squares.all? { |s| s.instance_of?(Hash) }
27
+ squares.map { |s| Square.new(**s) }
28
+ elsif squares.all? { |s| s.instance_of?(Square) }
29
+ squares
30
+ else
31
+ raise ArgumentError, "all squares must have the same class"
32
+ end
33
+ else
34
+ raise ArgumentError, "squares must be an array"
35
+ end
36
+ end
37
+
38
+ # Find the square occupied by the player's king
39
+ #
40
+ # @param [Fixnum] player_number
41
+ # the number of the player
42
+ #
43
+ # @return [Square]
44
+ # ==== Example:
45
+ # # Find the square occupied by player 2's jiang
46
+ # square_est.find_jiang_for_player(2)
47
+ def find_jiang_for_player(player_number)
48
+ find { |s| s.piece && s.piece.is_a?(JustXiangqi::Jiang) && s.occupied_by_player?(player_number) }
49
+ end
50
+
51
+ # Returns all squares threatened by the specified player
52
+ #
53
+ # @param [Fixnum] player_number
54
+ # the player's number.
55
+ #
56
+ # @param [GameState] game_state
57
+ # the current game state.
58
+ #
59
+ # @return [SquareSet]
60
+ def threatened_by(player_number, game_state)
61
+ _squares = occupied_by_player(player_number).map do |s|
62
+ s.piece.potential_capture_squares(s, game_state).squares
63
+ end.flatten.uniq
64
+
65
+ self.class.new(squares: _squares)
66
+ end
67
+ end
68
+ end
69
+
@@ -0,0 +1,3 @@
1
+ module JustXiangqi
2
+ VERSION = "0.1.0"
3
+ end
@@ -0,0 +1,9 @@
1
+ require "just_xiangqi/version"
2
+
3
+ # :nodoc:
4
+ module JustXiangqi
5
+ class Error < StandardError; end
6
+
7
+ end
8
+
9
+ require 'just_xiangqi/game_state'
metadata ADDED
@@ -0,0 +1,133 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: just_xiangqi
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Mark Humphreys
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2021-11-07 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: 2.1.4
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: 2.1.4
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: 13.0.1
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: 13.0.1
41
+ - !ruby/object:Gem::Dependency
42
+ name: minitest
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: 5.14.0
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: 5.14.0
55
+ - !ruby/object:Gem::Dependency
56
+ name: board_game_grid
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: 0.1.9
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: 0.1.9
69
+ description: Provides a representation of a xiangqi game complete with rules enforcement
70
+ and serialisation.
71
+ email:
72
+ - mark@mrlhumphreys.com
73
+ executables: []
74
+ extensions: []
75
+ extra_rdoc_files: []
76
+ files:
77
+ - ".gitignore"
78
+ - CODE_OF_CONDUCT.md
79
+ - Gemfile
80
+ - Gemfile.lock
81
+ - LICENSE.txt
82
+ - README.md
83
+ - Rakefile
84
+ - bin/console
85
+ - bin/setup
86
+ - just_xiangqi.gemspec
87
+ - lib/just_xiangqi.rb
88
+ - lib/just_xiangqi/errors/error.rb
89
+ - lib/just_xiangqi/errors/invalid_move_error.rb
90
+ - lib/just_xiangqi/errors/moved_into_check_error.rb
91
+ - lib/just_xiangqi/errors/no_legal_moves_error.rb
92
+ - lib/just_xiangqi/errors/no_piece_error.rb
93
+ - lib/just_xiangqi/errors/not_players_turn_error.rb
94
+ - lib/just_xiangqi/errors/off_board_error.rb
95
+ - lib/just_xiangqi/errors/piece_not_found_error.rb
96
+ - lib/just_xiangqi/errors/square_occupied_error.rb
97
+ - lib/just_xiangqi/game_state.rb
98
+ - lib/just_xiangqi/piece_factory.rb
99
+ - lib/just_xiangqi/pieces/jiang.rb
100
+ - lib/just_xiangqi/pieces/ju.rb
101
+ - lib/just_xiangqi/pieces/ma.rb
102
+ - lib/just_xiangqi/pieces/pao.rb
103
+ - lib/just_xiangqi/pieces/piece.rb
104
+ - lib/just_xiangqi/pieces/shi.rb
105
+ - lib/just_xiangqi/pieces/xiang.rb
106
+ - lib/just_xiangqi/pieces/zu.rb
107
+ - lib/just_xiangqi/square.rb
108
+ - lib/just_xiangqi/square_set.rb
109
+ - lib/just_xiangqi/version.rb
110
+ homepage: https://github.com/mrlhumphreys/just_xiangqi
111
+ licenses:
112
+ - MIT
113
+ metadata: {}
114
+ post_install_message:
115
+ rdoc_options: []
116
+ require_paths:
117
+ - lib
118
+ required_ruby_version: !ruby/object:Gem::Requirement
119
+ requirements:
120
+ - - ">="
121
+ - !ruby/object:Gem::Version
122
+ version: 2.7.0
123
+ required_rubygems_version: !ruby/object:Gem::Requirement
124
+ requirements:
125
+ - - ">="
126
+ - !ruby/object:Gem::Version
127
+ version: '0'
128
+ requirements: []
129
+ rubygems_version: 3.1.2
130
+ signing_key:
131
+ specification_version: 4
132
+ summary: A Xiangqi engine written in ruby
133
+ test_files: []