chess_engine 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.
Files changed (292) hide show
  1. checksums.yaml +7 -0
  2. data/Gemfile +5 -0
  3. data/Gemfile.lock +21 -0
  4. data/README.md +26 -0
  5. data/chess_engine.gemspec +14 -0
  6. data/lib/chess_engine/board.rb +95 -0
  7. data/lib/chess_engine/cli.rb +105 -0
  8. data/lib/chess_engine/game.rb +148 -0
  9. data/lib/chess_engine/input.rb +19 -0
  10. data/lib/chess_engine/move.rb +35 -0
  11. data/lib/chess_engine/piece.rb +97 -0
  12. data/lib/chess_engine/validator.rb +87 -0
  13. data/lib/chess_engine.rb +1 -0
  14. data/spec/board_spec.rb +70 -0
  15. data/spec/game_helper.rb +5 -0
  16. data/spec/game_spec.rb +79 -0
  17. data/spec/spec_helper.rb +100 -0
  18. data/spec/validator_spec.rb +26 -0
  19. data/vendor/bundle/bin/coderay +27 -0
  20. data/vendor/bundle/bin/pry +27 -0
  21. data/vendor/bundle/cache/coderay-1.1.2.gem +0 -0
  22. data/vendor/bundle/cache/colorize-0.8.1.gem +0 -0
  23. data/vendor/bundle/cache/method_source-0.9.2.gem +0 -0
  24. data/vendor/bundle/cache/pry-0.12.2.gem +0 -0
  25. data/vendor/bundle/cache/rb-readline-0.5.5.gem +0 -0
  26. data/vendor/bundle/gems/coderay-1.1.2/MIT-LICENSE +22 -0
  27. data/vendor/bundle/gems/coderay-1.1.2/README_INDEX.rdoc +123 -0
  28. data/vendor/bundle/gems/coderay-1.1.2/bin/coderay +215 -0
  29. data/vendor/bundle/gems/coderay-1.1.2/lib/coderay/duo.rb +81 -0
  30. data/vendor/bundle/gems/coderay-1.1.2/lib/coderay/encoders/_map.rb +17 -0
  31. data/vendor/bundle/gems/coderay-1.1.2/lib/coderay/encoders/comment_filter.rb +25 -0
  32. data/vendor/bundle/gems/coderay-1.1.2/lib/coderay/encoders/count.rb +39 -0
  33. data/vendor/bundle/gems/coderay-1.1.2/lib/coderay/encoders/debug.rb +49 -0
  34. data/vendor/bundle/gems/coderay-1.1.2/lib/coderay/encoders/debug_lint.rb +63 -0
  35. data/vendor/bundle/gems/coderay-1.1.2/lib/coderay/encoders/div.rb +23 -0
  36. data/vendor/bundle/gems/coderay-1.1.2/lib/coderay/encoders/encoder.rb +190 -0
  37. data/vendor/bundle/gems/coderay-1.1.2/lib/coderay/encoders/filter.rb +58 -0
  38. data/vendor/bundle/gems/coderay-1.1.2/lib/coderay/encoders/html/css.rb +65 -0
  39. data/vendor/bundle/gems/coderay-1.1.2/lib/coderay/encoders/html/numbering.rb +108 -0
  40. data/vendor/bundle/gems/coderay-1.1.2/lib/coderay/encoders/html/output.rb +166 -0
  41. data/vendor/bundle/gems/coderay-1.1.2/lib/coderay/encoders/html.rb +333 -0
  42. data/vendor/bundle/gems/coderay-1.1.2/lib/coderay/encoders/json.rb +83 -0
  43. data/vendor/bundle/gems/coderay-1.1.2/lib/coderay/encoders/lines_of_code.rb +45 -0
  44. data/vendor/bundle/gems/coderay-1.1.2/lib/coderay/encoders/lint.rb +59 -0
  45. data/vendor/bundle/gems/coderay-1.1.2/lib/coderay/encoders/null.rb +18 -0
  46. data/vendor/bundle/gems/coderay-1.1.2/lib/coderay/encoders/page.rb +24 -0
  47. data/vendor/bundle/gems/coderay-1.1.2/lib/coderay/encoders/span.rb +23 -0
  48. data/vendor/bundle/gems/coderay-1.1.2/lib/coderay/encoders/statistic.rb +95 -0
  49. data/vendor/bundle/gems/coderay-1.1.2/lib/coderay/encoders/terminal.rb +195 -0
  50. data/vendor/bundle/gems/coderay-1.1.2/lib/coderay/encoders/text.rb +46 -0
  51. data/vendor/bundle/gems/coderay-1.1.2/lib/coderay/encoders/token_kind_filter.rb +111 -0
  52. data/vendor/bundle/gems/coderay-1.1.2/lib/coderay/encoders/xml.rb +72 -0
  53. data/vendor/bundle/gems/coderay-1.1.2/lib/coderay/encoders/yaml.rb +50 -0
  54. data/vendor/bundle/gems/coderay-1.1.2/lib/coderay/encoders.rb +18 -0
  55. data/vendor/bundle/gems/coderay-1.1.2/lib/coderay/for_redcloth.rb +95 -0
  56. data/vendor/bundle/gems/coderay-1.1.2/lib/coderay/helpers/file_type.rb +151 -0
  57. data/vendor/bundle/gems/coderay-1.1.2/lib/coderay/helpers/plugin.rb +55 -0
  58. data/vendor/bundle/gems/coderay-1.1.2/lib/coderay/helpers/plugin_host.rb +221 -0
  59. data/vendor/bundle/gems/coderay-1.1.2/lib/coderay/helpers/word_list.rb +72 -0
  60. data/vendor/bundle/gems/coderay-1.1.2/lib/coderay/scanners/_map.rb +24 -0
  61. data/vendor/bundle/gems/coderay-1.1.2/lib/coderay/scanners/c.rb +189 -0
  62. data/vendor/bundle/gems/coderay-1.1.2/lib/coderay/scanners/clojure.rb +217 -0
  63. data/vendor/bundle/gems/coderay-1.1.2/lib/coderay/scanners/cpp.rb +217 -0
  64. data/vendor/bundle/gems/coderay-1.1.2/lib/coderay/scanners/css.rb +196 -0
  65. data/vendor/bundle/gems/coderay-1.1.2/lib/coderay/scanners/debug.rb +75 -0
  66. data/vendor/bundle/gems/coderay-1.1.2/lib/coderay/scanners/delphi.rb +144 -0
  67. data/vendor/bundle/gems/coderay-1.1.2/lib/coderay/scanners/diff.rb +221 -0
  68. data/vendor/bundle/gems/coderay-1.1.2/lib/coderay/scanners/erb.rb +81 -0
  69. data/vendor/bundle/gems/coderay-1.1.2/lib/coderay/scanners/go.rb +208 -0
  70. data/vendor/bundle/gems/coderay-1.1.2/lib/coderay/scanners/groovy.rb +268 -0
  71. data/vendor/bundle/gems/coderay-1.1.2/lib/coderay/scanners/haml.rb +168 -0
  72. data/vendor/bundle/gems/coderay-1.1.2/lib/coderay/scanners/html.rb +275 -0
  73. data/vendor/bundle/gems/coderay-1.1.2/lib/coderay/scanners/java/builtin_types.rb +421 -0
  74. data/vendor/bundle/gems/coderay-1.1.2/lib/coderay/scanners/java.rb +174 -0
  75. data/vendor/bundle/gems/coderay-1.1.2/lib/coderay/scanners/java_script.rb +237 -0
  76. data/vendor/bundle/gems/coderay-1.1.2/lib/coderay/scanners/json.rb +98 -0
  77. data/vendor/bundle/gems/coderay-1.1.2/lib/coderay/scanners/lua.rb +280 -0
  78. data/vendor/bundle/gems/coderay-1.1.2/lib/coderay/scanners/php.rb +527 -0
  79. data/vendor/bundle/gems/coderay-1.1.2/lib/coderay/scanners/python.rb +287 -0
  80. data/vendor/bundle/gems/coderay-1.1.2/lib/coderay/scanners/raydebug.rb +75 -0
  81. data/vendor/bundle/gems/coderay-1.1.2/lib/coderay/scanners/ruby/patterns.rb +178 -0
  82. data/vendor/bundle/gems/coderay-1.1.2/lib/coderay/scanners/ruby/string_state.rb +79 -0
  83. data/vendor/bundle/gems/coderay-1.1.2/lib/coderay/scanners/ruby.rb +477 -0
  84. data/vendor/bundle/gems/coderay-1.1.2/lib/coderay/scanners/sass.rb +232 -0
  85. data/vendor/bundle/gems/coderay-1.1.2/lib/coderay/scanners/scanner.rb +337 -0
  86. data/vendor/bundle/gems/coderay-1.1.2/lib/coderay/scanners/sql.rb +169 -0
  87. data/vendor/bundle/gems/coderay-1.1.2/lib/coderay/scanners/taskpaper.rb +36 -0
  88. data/vendor/bundle/gems/coderay-1.1.2/lib/coderay/scanners/text.rb +26 -0
  89. data/vendor/bundle/gems/coderay-1.1.2/lib/coderay/scanners/xml.rb +17 -0
  90. data/vendor/bundle/gems/coderay-1.1.2/lib/coderay/scanners/yaml.rb +140 -0
  91. data/vendor/bundle/gems/coderay-1.1.2/lib/coderay/scanners.rb +27 -0
  92. data/vendor/bundle/gems/coderay-1.1.2/lib/coderay/styles/_map.rb +7 -0
  93. data/vendor/bundle/gems/coderay-1.1.2/lib/coderay/styles/alpha.rb +153 -0
  94. data/vendor/bundle/gems/coderay-1.1.2/lib/coderay/styles/style.rb +18 -0
  95. data/vendor/bundle/gems/coderay-1.1.2/lib/coderay/styles.rb +15 -0
  96. data/vendor/bundle/gems/coderay-1.1.2/lib/coderay/token_kinds.rb +85 -0
  97. data/vendor/bundle/gems/coderay-1.1.2/lib/coderay/tokens.rb +161 -0
  98. data/vendor/bundle/gems/coderay-1.1.2/lib/coderay/tokens_proxy.rb +55 -0
  99. data/vendor/bundle/gems/coderay-1.1.2/lib/coderay/version.rb +3 -0
  100. data/vendor/bundle/gems/coderay-1.1.2/lib/coderay.rb +284 -0
  101. data/vendor/bundle/gems/colorize-0.8.1/CHANGELOG +65 -0
  102. data/vendor/bundle/gems/colorize-0.8.1/LICENSE +339 -0
  103. data/vendor/bundle/gems/colorize-0.8.1/README.md +105 -0
  104. data/vendor/bundle/gems/colorize-0.8.1/Rakefile +13 -0
  105. data/vendor/bundle/gems/colorize-0.8.1/colorize.gemspec +36 -0
  106. data/vendor/bundle/gems/colorize-0.8.1/lib/colorize/class_methods.rb +120 -0
  107. data/vendor/bundle/gems/colorize-0.8.1/lib/colorize/instance_methods.rb +132 -0
  108. data/vendor/bundle/gems/colorize-0.8.1/lib/colorize.rb +12 -0
  109. data/vendor/bundle/gems/colorize-0.8.1/lib/colorized_string.rb +19 -0
  110. data/vendor/bundle/gems/colorize-0.8.1/test/test_colorize.rb +164 -0
  111. data/vendor/bundle/gems/method_source-0.9.2/Gemfile +2 -0
  112. data/vendor/bundle/gems/method_source-0.9.2/LICENSE +25 -0
  113. data/vendor/bundle/gems/method_source-0.9.2/README.markdown +91 -0
  114. data/vendor/bundle/gems/method_source-0.9.2/Rakefile +81 -0
  115. data/vendor/bundle/gems/method_source-0.9.2/lib/method_source/code_helpers.rb +154 -0
  116. data/vendor/bundle/gems/method_source-0.9.2/lib/method_source/source_location.rb +138 -0
  117. data/vendor/bundle/gems/method_source-0.9.2/lib/method_source/version.rb +3 -0
  118. data/vendor/bundle/gems/method_source-0.9.2/lib/method_source.rb +141 -0
  119. data/vendor/bundle/gems/method_source-0.9.2/method_source.gemspec +35 -0
  120. data/vendor/bundle/gems/method_source-0.9.2/spec/method_source/code_helpers_spec.rb +43 -0
  121. data/vendor/bundle/gems/method_source-0.9.2/spec/method_source_spec.rb +143 -0
  122. data/vendor/bundle/gems/method_source-0.9.2/spec/spec_helper.rb +101 -0
  123. data/vendor/bundle/gems/pry-0.12.2/CHANGELOG.md +953 -0
  124. data/vendor/bundle/gems/pry-0.12.2/LICENSE +25 -0
  125. data/vendor/bundle/gems/pry-0.12.2/README.md +390 -0
  126. data/vendor/bundle/gems/pry-0.12.2/bin/pry +8 -0
  127. data/vendor/bundle/gems/pry-0.12.2/lib/pry/basic_object.rb +6 -0
  128. data/vendor/bundle/gems/pry-0.12.2/lib/pry/cli.rb +218 -0
  129. data/vendor/bundle/gems/pry-0.12.2/lib/pry/code/code_file.rb +110 -0
  130. data/vendor/bundle/gems/pry-0.12.2/lib/pry/code/code_range.rb +71 -0
  131. data/vendor/bundle/gems/pry-0.12.2/lib/pry/code/loc.rb +98 -0
  132. data/vendor/bundle/gems/pry-0.12.2/lib/pry/code.rb +353 -0
  133. data/vendor/bundle/gems/pry-0.12.2/lib/pry/code_object.rb +195 -0
  134. data/vendor/bundle/gems/pry-0.12.2/lib/pry/color_printer.rb +65 -0
  135. data/vendor/bundle/gems/pry-0.12.2/lib/pry/command.rb +723 -0
  136. data/vendor/bundle/gems/pry-0.12.2/lib/pry/command_set.rb +415 -0
  137. data/vendor/bundle/gems/pry-0.12.2/lib/pry/commands/amend_line.rb +98 -0
  138. data/vendor/bundle/gems/pry-0.12.2/lib/pry/commands/bang.rb +20 -0
  139. data/vendor/bundle/gems/pry-0.12.2/lib/pry/commands/bang_pry.rb +17 -0
  140. data/vendor/bundle/gems/pry-0.12.2/lib/pry/commands/cat/abstract_formatter.rb +27 -0
  141. data/vendor/bundle/gems/pry-0.12.2/lib/pry/commands/cat/exception_formatter.rb +79 -0
  142. data/vendor/bundle/gems/pry-0.12.2/lib/pry/commands/cat/file_formatter.rb +71 -0
  143. data/vendor/bundle/gems/pry-0.12.2/lib/pry/commands/cat/input_expression_formatter.rb +43 -0
  144. data/vendor/bundle/gems/pry-0.12.2/lib/pry/commands/cat.rb +63 -0
  145. data/vendor/bundle/gems/pry-0.12.2/lib/pry/commands/cd.rb +41 -0
  146. data/vendor/bundle/gems/pry-0.12.2/lib/pry/commands/change_inspector.rb +27 -0
  147. data/vendor/bundle/gems/pry-0.12.2/lib/pry/commands/change_prompt.rb +46 -0
  148. data/vendor/bundle/gems/pry-0.12.2/lib/pry/commands/clear_screen.rb +14 -0
  149. data/vendor/bundle/gems/pry-0.12.2/lib/pry/commands/code_collector.rb +167 -0
  150. data/vendor/bundle/gems/pry-0.12.2/lib/pry/commands/disable_pry.rb +27 -0
  151. data/vendor/bundle/gems/pry-0.12.2/lib/pry/commands/disabled_commands.rb +2 -0
  152. data/vendor/bundle/gems/pry-0.12.2/lib/pry/commands/easter_eggs.rb +112 -0
  153. data/vendor/bundle/gems/pry-0.12.2/lib/pry/commands/edit/exception_patcher.rb +25 -0
  154. data/vendor/bundle/gems/pry-0.12.2/lib/pry/commands/edit/file_and_line_locator.rb +36 -0
  155. data/vendor/bundle/gems/pry-0.12.2/lib/pry/commands/edit.rb +200 -0
  156. data/vendor/bundle/gems/pry-0.12.2/lib/pry/commands/exit.rb +43 -0
  157. data/vendor/bundle/gems/pry-0.12.2/lib/pry/commands/exit_all.rb +29 -0
  158. data/vendor/bundle/gems/pry-0.12.2/lib/pry/commands/exit_program.rb +23 -0
  159. data/vendor/bundle/gems/pry-0.12.2/lib/pry/commands/find_method.rb +191 -0
  160. data/vendor/bundle/gems/pry-0.12.2/lib/pry/commands/fix_indent.rb +19 -0
  161. data/vendor/bundle/gems/pry-0.12.2/lib/pry/commands/gem_cd.rb +26 -0
  162. data/vendor/bundle/gems/pry-0.12.2/lib/pry/commands/gem_install.rb +32 -0
  163. data/vendor/bundle/gems/pry-0.12.2/lib/pry/commands/gem_list.rb +33 -0
  164. data/vendor/bundle/gems/pry-0.12.2/lib/pry/commands/gem_open.rb +29 -0
  165. data/vendor/bundle/gems/pry-0.12.2/lib/pry/commands/gem_readme.rb +25 -0
  166. data/vendor/bundle/gems/pry-0.12.2/lib/pry/commands/gem_search.rb +40 -0
  167. data/vendor/bundle/gems/pry-0.12.2/lib/pry/commands/gem_stats.rb +83 -0
  168. data/vendor/bundle/gems/pry-0.12.2/lib/pry/commands/gist.rb +102 -0
  169. data/vendor/bundle/gems/pry-0.12.2/lib/pry/commands/help.rb +164 -0
  170. data/vendor/bundle/gems/pry-0.12.2/lib/pry/commands/hist.rb +181 -0
  171. data/vendor/bundle/gems/pry-0.12.2/lib/pry/commands/import_set.rb +23 -0
  172. data/vendor/bundle/gems/pry-0.12.2/lib/pry/commands/install_command.rb +54 -0
  173. data/vendor/bundle/gems/pry-0.12.2/lib/pry/commands/jump_to.rb +29 -0
  174. data/vendor/bundle/gems/pry-0.12.2/lib/pry/commands/list_inspectors.rb +35 -0
  175. data/vendor/bundle/gems/pry-0.12.2/lib/pry/commands/ls/constants.rb +58 -0
  176. data/vendor/bundle/gems/pry-0.12.2/lib/pry/commands/ls/formatter.rb +51 -0
  177. data/vendor/bundle/gems/pry-0.12.2/lib/pry/commands/ls/globals.rb +46 -0
  178. data/vendor/bundle/gems/pry-0.12.2/lib/pry/commands/ls/grep.rb +19 -0
  179. data/vendor/bundle/gems/pry-0.12.2/lib/pry/commands/ls/instance_vars.rb +38 -0
  180. data/vendor/bundle/gems/pry-0.12.2/lib/pry/commands/ls/interrogatable.rb +18 -0
  181. data/vendor/bundle/gems/pry-0.12.2/lib/pry/commands/ls/jruby_hacks.rb +49 -0
  182. data/vendor/bundle/gems/pry-0.12.2/lib/pry/commands/ls/local_names.rb +33 -0
  183. data/vendor/bundle/gems/pry-0.12.2/lib/pry/commands/ls/local_vars.rb +37 -0
  184. data/vendor/bundle/gems/pry-0.12.2/lib/pry/commands/ls/ls_entity.rb +69 -0
  185. data/vendor/bundle/gems/pry-0.12.2/lib/pry/commands/ls/methods.rb +54 -0
  186. data/vendor/bundle/gems/pry-0.12.2/lib/pry/commands/ls/methods_helper.rb +46 -0
  187. data/vendor/bundle/gems/pry-0.12.2/lib/pry/commands/ls/self_methods.rb +33 -0
  188. data/vendor/bundle/gems/pry-0.12.2/lib/pry/commands/ls.rb +113 -0
  189. data/vendor/bundle/gems/pry-0.12.2/lib/pry/commands/nesting.rb +25 -0
  190. data/vendor/bundle/gems/pry-0.12.2/lib/pry/commands/play.rb +102 -0
  191. data/vendor/bundle/gems/pry-0.12.2/lib/pry/commands/pry_backtrace.rb +25 -0
  192. data/vendor/bundle/gems/pry-0.12.2/lib/pry/commands/pry_version.rb +17 -0
  193. data/vendor/bundle/gems/pry-0.12.2/lib/pry/commands/raise_up.rb +33 -0
  194. data/vendor/bundle/gems/pry-0.12.2/lib/pry/commands/reload_code.rb +62 -0
  195. data/vendor/bundle/gems/pry-0.12.2/lib/pry/commands/reset.rb +18 -0
  196. data/vendor/bundle/gems/pry-0.12.2/lib/pry/commands/ri.rb +65 -0
  197. data/vendor/bundle/gems/pry-0.12.2/lib/pry/commands/save_file.rb +61 -0
  198. data/vendor/bundle/gems/pry-0.12.2/lib/pry/commands/shell_command.rb +75 -0
  199. data/vendor/bundle/gems/pry-0.12.2/lib/pry/commands/shell_mode.rb +25 -0
  200. data/vendor/bundle/gems/pry-0.12.2/lib/pry/commands/show_doc.rb +81 -0
  201. data/vendor/bundle/gems/pry-0.12.2/lib/pry/commands/show_info.rb +216 -0
  202. data/vendor/bundle/gems/pry-0.12.2/lib/pry/commands/show_input.rb +17 -0
  203. data/vendor/bundle/gems/pry-0.12.2/lib/pry/commands/show_source.rb +53 -0
  204. data/vendor/bundle/gems/pry-0.12.2/lib/pry/commands/stat.rb +40 -0
  205. data/vendor/bundle/gems/pry-0.12.2/lib/pry/commands/switch_to.rb +23 -0
  206. data/vendor/bundle/gems/pry-0.12.2/lib/pry/commands/toggle_color.rb +24 -0
  207. data/vendor/bundle/gems/pry-0.12.2/lib/pry/commands/watch_expression/expression.rb +38 -0
  208. data/vendor/bundle/gems/pry-0.12.2/lib/pry/commands/watch_expression.rb +107 -0
  209. data/vendor/bundle/gems/pry-0.12.2/lib/pry/commands/whereami.rb +197 -0
  210. data/vendor/bundle/gems/pry-0.12.2/lib/pry/commands/wtf.rb +70 -0
  211. data/vendor/bundle/gems/pry-0.12.2/lib/pry/commands.rb +6 -0
  212. data/vendor/bundle/gems/pry-0.12.2/lib/pry/config/behavior.rb +255 -0
  213. data/vendor/bundle/gems/pry-0.12.2/lib/pry/config/convenience.rb +28 -0
  214. data/vendor/bundle/gems/pry-0.12.2/lib/pry/config/default.rb +159 -0
  215. data/vendor/bundle/gems/pry-0.12.2/lib/pry/config/memoization.rb +48 -0
  216. data/vendor/bundle/gems/pry-0.12.2/lib/pry/config.rb +35 -0
  217. data/vendor/bundle/gems/pry-0.12.2/lib/pry/core_extensions.rb +142 -0
  218. data/vendor/bundle/gems/pry-0.12.2/lib/pry/editor.rb +128 -0
  219. data/vendor/bundle/gems/pry-0.12.2/lib/pry/exceptions.rb +76 -0
  220. data/vendor/bundle/gems/pry-0.12.2/lib/pry/forwardable.rb +23 -0
  221. data/vendor/bundle/gems/pry-0.12.2/lib/pry/helpers/base_helpers.rb +200 -0
  222. data/vendor/bundle/gems/pry-0.12.2/lib/pry/helpers/command_helpers.rb +157 -0
  223. data/vendor/bundle/gems/pry-0.12.2/lib/pry/helpers/documentation_helpers.rb +76 -0
  224. data/vendor/bundle/gems/pry-0.12.2/lib/pry/helpers/options_helpers.rb +27 -0
  225. data/vendor/bundle/gems/pry-0.12.2/lib/pry/helpers/platform.rb +58 -0
  226. data/vendor/bundle/gems/pry-0.12.2/lib/pry/helpers/table.rb +114 -0
  227. data/vendor/bundle/gems/pry-0.12.2/lib/pry/helpers/text.rb +115 -0
  228. data/vendor/bundle/gems/pry-0.12.2/lib/pry/helpers.rb +6 -0
  229. data/vendor/bundle/gems/pry-0.12.2/lib/pry/history.rb +161 -0
  230. data/vendor/bundle/gems/pry-0.12.2/lib/pry/hooks.rb +171 -0
  231. data/vendor/bundle/gems/pry-0.12.2/lib/pry/indent.rb +408 -0
  232. data/vendor/bundle/gems/pry-0.12.2/lib/pry/input_completer.rb +265 -0
  233. data/vendor/bundle/gems/pry-0.12.2/lib/pry/input_lock.rb +130 -0
  234. data/vendor/bundle/gems/pry-0.12.2/lib/pry/inspector.rb +27 -0
  235. data/vendor/bundle/gems/pry-0.12.2/lib/pry/last_exception.rb +61 -0
  236. data/vendor/bundle/gems/pry-0.12.2/lib/pry/method/disowned.rb +55 -0
  237. data/vendor/bundle/gems/pry-0.12.2/lib/pry/method/patcher.rb +122 -0
  238. data/vendor/bundle/gems/pry-0.12.2/lib/pry/method/weird_method_locator.rb +198 -0
  239. data/vendor/bundle/gems/pry-0.12.2/lib/pry/method.rb +552 -0
  240. data/vendor/bundle/gems/pry-0.12.2/lib/pry/object_path.rb +83 -0
  241. data/vendor/bundle/gems/pry-0.12.2/lib/pry/output.rb +50 -0
  242. data/vendor/bundle/gems/pry-0.12.2/lib/pry/pager.rb +250 -0
  243. data/vendor/bundle/gems/pry-0.12.2/lib/pry/platform.rb +91 -0
  244. data/vendor/bundle/gems/pry-0.12.2/lib/pry/plugins.rb +122 -0
  245. data/vendor/bundle/gems/pry-0.12.2/lib/pry/prompt.rb +145 -0
  246. data/vendor/bundle/gems/pry-0.12.2/lib/pry/pry_class.rb +425 -0
  247. data/vendor/bundle/gems/pry-0.12.2/lib/pry/pry_instance.rb +699 -0
  248. data/vendor/bundle/gems/pry-0.12.2/lib/pry/repl.rb +261 -0
  249. data/vendor/bundle/gems/pry-0.12.2/lib/pry/repl_file_loader.rb +73 -0
  250. data/vendor/bundle/gems/pry-0.12.2/lib/pry/ring.rb +84 -0
  251. data/vendor/bundle/gems/pry-0.12.2/lib/pry/rubygem.rb +84 -0
  252. data/vendor/bundle/gems/pry-0.12.2/lib/pry/slop/LICENSE +20 -0
  253. data/vendor/bundle/gems/pry-0.12.2/lib/pry/slop/commands.rb +195 -0
  254. data/vendor/bundle/gems/pry-0.12.2/lib/pry/slop/option.rb +206 -0
  255. data/vendor/bundle/gems/pry-0.12.2/lib/pry/slop.rb +661 -0
  256. data/vendor/bundle/gems/pry-0.12.2/lib/pry/terminal.rb +91 -0
  257. data/vendor/bundle/gems/pry-0.12.2/lib/pry/testable/evalable.rb +15 -0
  258. data/vendor/bundle/gems/pry-0.12.2/lib/pry/testable/mockable.rb +14 -0
  259. data/vendor/bundle/gems/pry-0.12.2/lib/pry/testable/pry_tester.rb +73 -0
  260. data/vendor/bundle/gems/pry-0.12.2/lib/pry/testable/utility.rb +26 -0
  261. data/vendor/bundle/gems/pry-0.12.2/lib/pry/testable/variables.rb +46 -0
  262. data/vendor/bundle/gems/pry-0.12.2/lib/pry/testable.rb +70 -0
  263. data/vendor/bundle/gems/pry-0.12.2/lib/pry/version.rb +3 -0
  264. data/vendor/bundle/gems/pry-0.12.2/lib/pry/wrapped_module/candidate.rb +131 -0
  265. data/vendor/bundle/gems/pry-0.12.2/lib/pry/wrapped_module.rb +378 -0
  266. data/vendor/bundle/gems/pry-0.12.2/lib/pry.rb +132 -0
  267. data/vendor/bundle/gems/rb-readline-0.5.5/CHANGES +94 -0
  268. data/vendor/bundle/gems/rb-readline-0.5.5/LICENSE +25 -0
  269. data/vendor/bundle/gems/rb-readline-0.5.5/README.md +81 -0
  270. data/vendor/bundle/gems/rb-readline-0.5.5/Rakefile +25 -0
  271. data/vendor/bundle/gems/rb-readline-0.5.5/bench/_rl_adjust_point.rb +26 -0
  272. data/vendor/bundle/gems/rb-readline-0.5.5/examples/example_readline.rb +8 -0
  273. data/vendor/bundle/gems/rb-readline-0.5.5/examples/example_readline_with_completion.rb +18 -0
  274. data/vendor/bundle/gems/rb-readline-0.5.5/examples/tinyirb.rb +11 -0
  275. data/vendor/bundle/gems/rb-readline-0.5.5/lib/rb-readline.rb +18 -0
  276. data/vendor/bundle/gems/rb-readline-0.5.5/lib/rbreadline/version.rb +3 -0
  277. data/vendor/bundle/gems/rb-readline-0.5.5/lib/rbreadline.rb +8920 -0
  278. data/vendor/bundle/gems/rb-readline-0.5.5/lib/readline.rb +539 -0
  279. data/vendor/bundle/gems/rb-readline-0.5.5/rb-readline.gemspec +51 -0
  280. data/vendor/bundle/gems/rb-readline-0.5.5/setup.rb +1585 -0
  281. data/vendor/bundle/gems/rb-readline-0.5.5/test/support/filesystem_completion_helper.rb +53 -0
  282. data/vendor/bundle/gems/rb-readline-0.5.5/test/test_completion.rb +100 -0
  283. data/vendor/bundle/gems/rb-readline-0.5.5/test/test_filename_completion_proc.rb +88 -0
  284. data/vendor/bundle/gems/rb-readline-0.5.5/test/test_history.rb +29 -0
  285. data/vendor/bundle/gems/rb-readline-0.5.5/test/test_rbreadline.rb +23 -0
  286. data/vendor/bundle/gems/rb-readline-0.5.5/test/test_readline.rb +221 -0
  287. data/vendor/bundle/specifications/coderay-1.1.2.gemspec +26 -0
  288. data/vendor/bundle/specifications/colorize-0.8.1.gemspec +38 -0
  289. data/vendor/bundle/specifications/method_source-0.9.2.gemspec +35 -0
  290. data/vendor/bundle/specifications/pry-0.12.2.gemspec +38 -0
  291. data/vendor/bundle/specifications/rb-readline-0.5.5.gemspec +39 -0
  292. metadata +363 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: b15851b7a37794b22b28cd86c5a79df19b682f8b8dbfe9c4e3d49ff461dc1bc7
4
+ data.tar.gz: dcaf7521f85bb9a629d9fc5a1cab10c380cd5eab759eeb0b1ffbaf8070dbb16f
5
+ SHA512:
6
+ metadata.gz: b85b9135a9236f23558e77eb5f86ec987933b2776b4f0348730de0b141c301dca7968be94242f5b8b1ae1a22a9597316f664c1f9b4e36c1fbb9aec392ba66fc4
7
+ data.tar.gz: 1993ff33b65b1f035d5c985a9710f8558bf0e496f4fadfacc0974b358ed2c8a7c4f8393468b54c6846d05789cbb02ad9d6bb732c15792fe4902d205b65f92ccd
data/Gemfile ADDED
@@ -0,0 +1,5 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gem 'pry', '~> 0.12.2'
4
+ gem 'rb-readline'
5
+ gem 'colorize', '~> 0.8.1'
data/Gemfile.lock ADDED
@@ -0,0 +1,21 @@
1
+ GEM
2
+ remote: https://rubygems.org/
3
+ specs:
4
+ coderay (1.1.2)
5
+ colorize (0.8.1)
6
+ method_source (0.9.2)
7
+ pry (0.12.2)
8
+ coderay (~> 1.1.0)
9
+ method_source (~> 0.9.0)
10
+ rb-readline (0.5.5)
11
+
12
+ PLATFORMS
13
+ ruby
14
+
15
+ DEPENDENCIES
16
+ colorize (~> 0.8.1)
17
+ pry (~> 0.12.2)
18
+ rb-readline
19
+
20
+ BUNDLED WITH
21
+ 2.0.1
data/README.md ADDED
@@ -0,0 +1,26 @@
1
+ # Command Line Chess
2
+ This is my final Ruby project before moving to Rails framework. In this PvP game I've tried to apply all the stuff I have learned to this moment.
3
+
4
+ ### Features:
5
+ * It works
6
+ * You can make all the legal moves, including:
7
+ * Castling
8
+ * En passant
9
+ * Pawn promotion
10
+ * The game detects and declares:
11
+ * Check
12
+ * Checkmate
13
+ * Stalemate
14
+ * You can quit and save the game at almost every moment
15
+
16
+ ## How to start
17
+ Here are the steps you need to make to play this game:
18
+ 1. Make sure that Ruby is installed on your machine
19
+ 2. Go to the main directory of the project
20
+ 3. Type `ruby lib/chess/cli.rb` in your command line
21
+
22
+ ## How to play
23
+ * Trivial moves are made by typing in something like "e2e4" or `e3 f5` or even ` a 1 b 3 ` (whitespace doesn't matter)
24
+ * Short castling is done by typing in `00`, `oo` or `OO`
25
+ * Long castling is done by typing in `000`, `ooo` or `OOO`
26
+ * To quit the game, type in "exit". You will be asked to save the game
@@ -0,0 +1,14 @@
1
+ Gem::Specification.new do |s|
2
+ s.name = "chess_engine"
3
+ s.summary = "Simple chess library that uses algebraic notation"
4
+ s.description = File.read(File.join(File.dirname(__FILE__), 'README.md'))
5
+ s.version = "0.0.1"
6
+ s.author = "Anikeev Gennadiy"
7
+ s.email = "genaydzhan70@gmail.com"
8
+ s.homepage = "https://github.com/anikeef/chess"
9
+ s.platform = Gem::Platform::RUBY
10
+ s.required_ruby_version = '>=1.9'
11
+ s.files = Dir['**/**']
12
+ s.test_files = Dir["spec/*.rb"]
13
+ s.has_rdoc = false
14
+ end
@@ -0,0 +1,95 @@
1
+ require_relative "piece"
2
+ require "colorize"
3
+
4
+ module ChessEngine
5
+ class Board
6
+ def initialize
7
+ @board = Array.new(8) { Array.new(8) { nil } }
8
+ end
9
+
10
+ def set_default
11
+ [[:white, 0, 1], [:black, 7, 6]].each do |color, row1, row2|
12
+ ["Rook", "Knight", "Elephant", "Queen", "King", "Elephant", "Knight", "Rook"].each.with_index do |class_name, column|
13
+ self[column, row1] = Module.const_get("ChessEngine::#{class_name}").new(color)
14
+ end
15
+
16
+ 0.upto(7) do |column|
17
+ self[column, row2] = Pawn.new(color)
18
+ end
19
+ end
20
+ end
21
+
22
+ def [](column, row)
23
+ @board[column][row]
24
+ end
25
+
26
+ def []=(column, row, piece)
27
+ @board[column][row] = piece
28
+ end
29
+
30
+ def at(coordinates)
31
+ return nil unless self.exists_at?(coordinates)
32
+ @board[coordinates[0]][coordinates[1]]
33
+ end
34
+
35
+ def set_at(coordinates, piece)
36
+ @board[coordinates[0]][coordinates[1]] = piece
37
+ end
38
+
39
+ def exists_at?(coordinates)
40
+ coordinates.all? { |c| c.between?(0, 7) }
41
+ end
42
+
43
+ def to_s
44
+ string = ""
45
+ colors = [[:default, :light_white].cycle, [:light_white, :default].cycle].cycle
46
+
47
+ 7.downto(0) do |row|
48
+ string += "#{row + 1} "
49
+ colors_cycle = colors.next
50
+
51
+ 0.upto(7) do |column|
52
+ piece = self[column, row]
53
+ string += piece.nil? ? " " : piece.symbol
54
+ string += " "
55
+ string[-2..-1] = string[-2..-1].colorize(background: colors_cycle.next)
56
+ end
57
+ string += "\n"
58
+ end
59
+
60
+ string += " a b c d e f g h"
61
+ string
62
+ end
63
+
64
+ def move_piece(from, to)
65
+ piece = self.at(from)
66
+ self.set_at(from, nil)
67
+ self.set_at(to, piece)
68
+ end
69
+
70
+ def pieces(color)
71
+ @board.flatten.compact.select { |piece| piece.color == color }
72
+ end
73
+
74
+ def Board.coordinates_list
75
+ list = []
76
+ (0..7).each do |x|
77
+ (0..7).each { |y| list << [x, y]}
78
+ end
79
+ list
80
+ end
81
+
82
+ def king_coords(color)
83
+ Board.coordinates_list.find do |coord|
84
+ at(coord) && at(coord).king? && at(coord).color == color
85
+ end
86
+ end
87
+
88
+ def piece_coordinates(color)
89
+ Board.coordinates_list.select do |coord|
90
+ piece = at(coord)
91
+ !piece.nil? && piece.color == color
92
+ end
93
+ end
94
+ end
95
+ end
@@ -0,0 +1,105 @@
1
+ require_relative "game"
2
+ require_relative "input"
3
+ require "yaml"
4
+
5
+
6
+ module ChessEngine
7
+ class NoGamesError < StandardError; end
8
+
9
+ class CLI
10
+ include Input
11
+
12
+ def initialize
13
+ begin
14
+ mode = get_input("\nChoose the game mode:\n1. New game\n2. Continue\nEnter your choice (1 or 2): ", /^[12]$/)
15
+ @game = mode == "1" ? Game.new : choose_game
16
+ rescue NoGamesError => e
17
+ puts "#{e.message}. Try again"
18
+ retry
19
+ end
20
+ play
21
+ save if save?
22
+ end
23
+
24
+ private
25
+
26
+ def play
27
+ until @game.over?
28
+ puts "\n#{@game.filename}\n#{@game.draw}"
29
+ declare_check if @game.check?
30
+ begin
31
+ promotion if @game.needs_promotion?
32
+ print "#{@game.current_color.to_s.capitalize}'s move (e. g. \"e2e4\" or \"exit\" or \"000\"/\"00\" (for castling)): "
33
+ move = gets.chomp.gsub(/\s+/, " ")
34
+ case move
35
+ when /^[oOоО0]{2}$/ #matches cyrillic letters
36
+ @game.castling(:short)
37
+ when /^[oOоО0]{3}$/
38
+ @game.castling(:long)
39
+ when /^[a-h][1-8][a-h][1-8]$/i
40
+ @game.move(move)
41
+ when /^exit$/i
42
+ return
43
+ else
44
+ raise InvalidMove, "Incorrect input"
45
+ end
46
+ rescue InvalidMove => e
47
+ puts "#{e.message}. Try again"
48
+ retry
49
+ end
50
+ end
51
+ game_over
52
+ end
53
+
54
+ def promotion
55
+ pieces = ["Queen", "Rook", "Knight", "Elephant"]
56
+ choice = get_input(
57
+ "Pawn promotion. Choose the new piece:\n1. Queen\n2. Rook\n3. Knight\n4. Elephant",
58
+ /^[1-4]$/, "Input must be a single digit"
59
+ )
60
+ @game.promotion(pieces[choice - 1])
61
+ end
62
+
63
+ def declare_check
64
+ puts "#{@game.current_color.to_s.capitalize} player is given a check"
65
+ end
66
+
67
+ def declare_checkmate
68
+ puts "#{@game.current_color.to_s.capitalize} player got mated!"
69
+ end
70
+
71
+ def game_over
72
+ puts @game.draw
73
+ if @game.check?
74
+ declare_checkmate
75
+ else
76
+ puts "Stalemate!"
77
+ end
78
+ end
79
+
80
+ def choose_game
81
+ saved_names = Dir["./saved_games/*.yaml"].map { |filename| filename[/\.\/saved_games\/(.+)\.yaml/, 1] }
82
+ raise NoGamesError, "You have no saved games" if saved_names.empty?
83
+ puts "\nSaved games (#{saved_names.size}):"
84
+ saved_names.each { |name| puts name }
85
+ filename = get_input("Enter the name of the game that you want to continue: ",
86
+ nil, "Such game doesn't exist, try again") { |input| saved_names.include?(input) }
87
+ return YAML::load(File.read("./saved_games/#{filename}.yaml"))
88
+ end
89
+
90
+ def save?
91
+ return false if @game.filename && File.exists?("./saved_games/#{@game.filename}.yaml") &&
92
+ YAML::dump(@game) == File.read("./saved_games/#{@game.filename}.yaml")
93
+ choice = get_input("Do you want to save the game? (y/n): ", /^[yn]$/i)
94
+ choice == "y" ? true : false
95
+ end
96
+
97
+ def save
98
+ @game.filename ||= get_input("Enter the game name: ", /[^\/\>\<\|\:\&]+/)
99
+ game = YAML::dump(@game)
100
+ File.open("./saved_games/#{@game.filename}.yaml", "w") { |file| file.write(game) }
101
+ end
102
+ end
103
+ end
104
+
105
+ ChessEngine::CLI.new
@@ -0,0 +1,148 @@
1
+ require_relative "board"
2
+ require_relative "validator"
3
+ require_relative "move"
4
+
5
+ module ChessEngine
6
+ class InvalidMove < StandardError; end
7
+
8
+ class Game
9
+ attr_accessor :filename
10
+ attr_reader :current_color
11
+ include MoveValidator
12
+
13
+ def initialize
14
+ @board = Board.new
15
+ @board.set_default
16
+ @current_color = :white
17
+ @last_piece = nil
18
+ @filename = nil
19
+ @promotion_coord = false
20
+ end
21
+
22
+ def move(string)
23
+ from, to = Game.string_to_move(string)
24
+ piece = @board.at(from)
25
+ raise InvalidMove, "Game is over" if over?
26
+ raise InvalidMove, "#{@current_color} player should execute pawn promotion first" if needs_promotion?
27
+ raise InvalidMove, "Empty square is chosen" if piece.nil?
28
+ raise InvalidMove, "This is not your piece" unless piece.color == @current_color
29
+ raise InvalidMove, "Invalid move" unless valid_moves(from).include?(to)
30
+ move = Move.new(@board, from, to)
31
+ move.commit
32
+ if king_attacked?
33
+ move.rollback
34
+ raise InvalidMove, "Fatal move"
35
+ end
36
+
37
+ @last_piece = piece
38
+ piece.moves_count += 1
39
+ @promotion_coord = to and return if piece.pawn? && [7, 0].include?(to[1])
40
+ next_player
41
+ end
42
+
43
+ def [](str)
44
+ letters = ("a".."h").to_a
45
+ return nil unless /[a-h][1-8]/.match?(str)
46
+ @board.at([letters.find_index(str[0]), str[1].to_i - 1])
47
+ end
48
+
49
+ def draw
50
+ @board.to_s
51
+ end
52
+
53
+ def promotion(class_name)
54
+ unless ["rook", "knight", "elephant", "queen"].include?(class_name.downcase)
55
+ raise InvalidMove, "Invalid promotion"
56
+ end
57
+ @board.set_at(@promotion_coord, Module.const_get("ChessEngine::#{class_name.capitalize}").new(@current_color))
58
+ @promotion_coord = nil
59
+ next_player
60
+ end
61
+
62
+ def castling(length)
63
+ row = @current_color == :white ? 0 : 7
64
+ king = @board.at([4, row])
65
+ if length == :short
66
+ rook = @board.at([7, row])
67
+ line = [5, 6]
68
+ moves = [Move.new(@board, [4, row], [6, row]),
69
+ Move.new(@board, [7, row], [5, row])]
70
+ else
71
+ rook = @board.at([0, row])
72
+ line = [1, 2, 3]
73
+ moves = [Move.new(@board, [4, row], [2, row]),
74
+ Move.new(@board, [0, row], [3, row])]
75
+ end
76
+ raise InvalidMove, "Invalid castling" unless
77
+ king && rook && king.moves_count == 0 && rook.moves_count == 0 &&
78
+ line.all? { |x| @board.at([x, row]).nil? }
79
+
80
+ moves.each { |move| move.commit }
81
+ if king_attacked?
82
+ moves.each { |move| move.rollback }
83
+ raise InvalidMove, "Fatal move"
84
+ end
85
+ @last_piece = nil
86
+ next_player
87
+ end
88
+
89
+ def over?
90
+ @board.piece_coordinates(@current_color).all? do |coord|
91
+ safe_moves(coord).empty?
92
+ end
93
+ end
94
+
95
+ def needs_promotion?
96
+ !!@promotion_coord
97
+ end
98
+
99
+ def check?
100
+ king_attacked?
101
+ end
102
+
103
+ private
104
+
105
+ def king_attacked?
106
+ king_coords = @board.king_coords(@current_color)
107
+ [[1, 1], [-1, 1], [-1, -1], [1, -1]].each do |move|
108
+ next_coords = relative_coords(king_coords, move)
109
+ piece = @board.at(next_coords)
110
+ return true if piece && piece.color != @current_color && (piece.pawn? || piece.king?)
111
+ edge_coords = repeated_move(king_coords, move).last
112
+ piece = edge_coords.nil? ? nil : @board.at(edge_coords)
113
+ return true if piece && piece.beats_diagonally?
114
+ end
115
+ [[1, 0], [-1, 0], [0, 1], [0, -1]].each do |move|
116
+ next_coords = relative_coords(king_coords, move)
117
+ piece = @board.at(next_coords)
118
+ return true if piece && piece.king?
119
+ edge_coords = repeated_move(king_coords, move).last
120
+ piece = edge_coords.nil? ? nil : @board.at(edge_coords)
121
+ return true if !piece.nil? && piece.beats_straight?
122
+ end
123
+ [[1, 2], [2, 1], [1, -2], [-2, 1],
124
+ [-1, 2], [2, -1], [-1, -2], [-2, -1]].each do |move|
125
+ coords = relative_coords(king_coords, move)
126
+ piece = valid_move?(coords) ? @board.at(coords) : nil
127
+ return true if !piece.nil? && piece.knight?
128
+ end
129
+ false
130
+ end
131
+
132
+ def Game.string_to_move(string)
133
+ string = string.gsub(/\s+/, "").downcase
134
+ raise InvalidMove, "Input must look like \"e2 e4\" or \"a6b5\"" unless /^[a-h][1-8][a-h][1-8]$/.match?(string)
135
+ letters = ("a".."h").to_a
136
+ [[letters.find_index(string[0]), string[1].to_i - 1],
137
+ [letters.find_index(string[2]), string[3].to_i - 1]]
138
+ end
139
+
140
+ def opposite_color
141
+ @current_color == :white ? :black : :white
142
+ end
143
+
144
+ def next_player
145
+ @current_color = opposite_color
146
+ end
147
+ end
148
+ end
@@ -0,0 +1,19 @@
1
+ module Input
2
+ class Incorrect < StandardError; end
3
+
4
+ def get_input(input_message, regex = nil, err_message = "Incorrect input, try again")
5
+ begin
6
+ print input_message
7
+ input = gets.chomp
8
+ if block_given?
9
+ raise Input::Incorrect unless yield(input)
10
+ else
11
+ raise Input::Incorrect unless regex.match?(input)
12
+ end
13
+ rescue
14
+ puts err_message
15
+ retry
16
+ end
17
+ input
18
+ end
19
+ end