Back to Top

travis-status version downloads

Introduction

The rchess package is a chess move, generation/validation, piece placement/movement, and check/checkmate/stalemate detection.

Installation

Via standar install:

install.packages("rchess")

Or if you want to be risky you can install the latest development version from github with:

devtools::install_github("jbkunst/rchess")

Basic Usage

chss <- Chess$new()

Check the legal next moves:

chss$moves()
##  [1] "a3"  "a4"  "b3"  "b4"  "c3"  "c4"  "d3"  "d4"  "e3"  "e4"  "f3" 
## [12] "f4"  "g3"  "g4"  "h3"  "h4"  "Na3" "Nc3" "Nf3" "Nh3"

chss$moves(verbose = TRUE)
## Source: local data frame [20 x 6]
## 
##    color  from    to flags piece   san
##    (chr) (chr) (chr) (chr) (chr) (chr)
## 1      w    a2    a3     n     p    a3
## 2      w    a2    a4     b     p    a4
## 3      w    b2    b3     n     p    b3
## 4      w    b2    b4     b     p    b4
## 5      w    c2    c3     n     p    c3
## 6      w    c2    c4     b     p    c4
## 7      w    d2    d3     n     p    d3
## 8      w    d2    d4     b     p    d4
## 9      w    e2    e3     n     p    e3
## 10     w    e2    e4     b     p    e4
## 11     w    f2    f3     n     p    f3
## 12     w    f2    f4     b     p    f4
## 13     w    g2    g3     n     p    g3
## 14     w    g2    g4     b     p    g4
## 15     w    h2    h3     n     p    h3
## 16     w    h2    h4     b     p    h4
## 17     w    b1    a3     n     n   Na3
## 18     w    b1    c3     n     n   Nc3
## 19     w    g1    f3     n     n   Nf3
## 20     w    g1    h3     n     n   Nh3

Make a move:

chss$move("a3")

We can concate some moves (and a captures)

chss$move("e5")$move("f4")$move("Qe7")$move("fxe5")
plot(chss)

Or a ggplot2 version (I know, I need to change the chess pieces symbols in unicode; maybe use a chess typeface)

plot(chss, type = "ggplot")

There are function to get information of actual position:

chss$turn()
## [1] "b"

chss$square_color("h1")
## [1] "light"

chss$get("e5")
## $type
## [1] "p"
## 
## $color
## [1] "w"

chss$history(verbose = TRUE)
## Source: local data frame [5 x 8]
## 
##   color  from    to flags piece   san captured number_move
##   (chr) (chr) (chr) (chr) (chr) (chr)    (chr)       (int)
## 1     w    a2    a3     n     p    a3       NA           1
## 2     b    e7    e5     b     p    e5       NA           2
## 3     w    f2    f4     b     p    f4       NA           3
## 4     b    d8    e7     n     q   Qe7       NA           4
## 5     w    f4    e5     c     p  fxe5        p           5

chss$history()
## [1] "a3"   "e5"   "f4"   "Qe7"  "fxe5"

chss$undo()
## $color
## [1] "w"
## 
## $from
## [1] "f4"
## 
## $to
## [1] "e5"
## 
## $flags
## [1] "c"
## 
## $piece
## [1] "p"
## 
## $captured
## [1] "p"
## 
## $san
## [1] "fxe5"

chss$history()
## [1] "a3"  "e5"  "f4"  "Qe7"

chss$fen()
## [1] "rnb1kbnr/ppppqppp/8/4p3/5P2/P7/1PPPP1PP/RNBQKBNR w KQkq - 1 3"

You can edit the header.

chss$header("White", "You")
chss$header("WhiteElo", 1800)
chss$header("Black", "Me")
chss$header("Date", Sys.Date())
chss$header("Site", "This R session")

Get the header

chss$get_header()
## $White
## [1] "You"
## 
## $WhiteElo
## [1] "1800"
## 
## $Black
## [1] "Me"
## 
## $Date
## [1] "2015-11-18"
## 
## $Site
## [1] "This R session"

And get the pgn.

cat(chss$pgn())
## [White "You"]
## [WhiteElo "1800"]
## [Black "Me"]
## [Date "2015-11-18"]
## [Site "This R session"]
## 
## 1. a3 e5 2. f4 Qe7

Or plot the board in ascii format:

chss$ascii()
##    +------------------------+
##  8 | r  n  b  .  k  b  n  r |
##  7 | p  p  p  p  q  p  p  p |
##  6 | .  .  .  .  .  .  .  . |
##  5 | .  .  .  .  p  .  .  . |
##  4 | .  .  .  .  .  P  .  . |
##  3 | P  .  .  .  .  .  .  . |
##  2 | .  P  P  P  P  .  P  P |
##  1 | R  N  B  Q  K  B  N  R |
##    +------------------------+
##      a  b  c  d  e  f  g  h

Load PGN and FEN

FEN

chssfen <- Chess$new()

fen <- "rnbqkbnr/pp1ppppp/8/2p5/4P3/8/PPPP1PPP/RNBQKBNR w KQkq c6 0 2"

chssfen$load(fen)
## [1] TRUE

plot(chssfen)

PGN

pgn <- system.file("extdata/pgn/kasparov_vs_topalov.pgn", package = "rchess")
pgn <- readLines(pgn, warn = FALSE)
pgn <- paste(pgn, collapse = "\n")
cat(pgn)
## [Event "Hoogovens A Tournament"]
## [Site "Wijk aan Zee NED"]
## [Date "1999.01.20"]
## [EventDate "?"]
## [Round "4"]
## [Result "1-0"]
## [White "Garry Kasparov"]
## [Black "Veselin Topalov"]
## [ECO "B06"]
## [WhiteElo "2812"]
## [BlackElo "2700"]
## [PlyCount "87"]
## 
## 1. e4 d6 2. d4 Nf6 3. Nc3 g6 4. Be3 Bg7 5. Qd2 c6 6. f3 b5
## 7. Nge2 Nbd7 8. Bh6 Bxh6 9. Qxh6 Bb7 10. a3 e5 11. O-O-O Qe7
## 12. Kb1 a6 13. Nc1 O-O-O 14. Nb3 exd4 15. Rxd4 c5 16. Rd1 Nb6
## 17. g3 Kb8 18. Na5 Ba8 19. Bh3 d5 20. Qf4+ Ka7 21. Rhe1 d4
## 22. Nd5 Nbxd5 23. exd5 Qd6 24. Rxd4 cxd4 25. Re7+ Kb6
## 26. Qxd4+ Kxa5 27. b4+ Ka4 28. Qc3 Qxd5 29. Ra7 Bb7 30. Rxb7
## Qc4 31. Qxf6 Kxa3 32. Qxa6+ Kxb4 33. c3+ Kxc3 34. Qa1+ Kd2
## 35. Qb2+ Kd1 36. Bf1 Rd2 37. Rd7 Rxd7 38. Bxc4 bxc4 39. Qxh8
## Rd3 40. Qa8 c3 41. Qa4+ Ke1 42. f4 f5 43. Kc1 Rd2 44. Qa7 1-0

chsspgn <- Chess$new()

chsspgn$load_pgn(pgn)
## [1] TRUE

cat(chsspgn$pgn())
## [Event "Hoogovens A Tournament"]
## [Site "Wijk aan Zee NED"]
## [Date "1999.01.20"]
## [EventDate "?"]
## [Round "4"]
## [Result "1-0"]
## [White "Garry Kasparov"]
## [Black "Veselin Topalov"]
## [ECO "B06"]
## [WhiteElo "2812"]
## [BlackElo "2700"]
## [PlyCount "87"]
## 
## 1. e4 d6 2. d4 Nf6 3. Nc3 g6 4. Be3 Bg7 5. Qd2 c6 6. f3 b5
## 7. Nge2 Nbd7 8. Bh6 Bxh6 9. Qxh6 Bb7 10. a3 e5 11. O-O-O Qe7
## 12. Kb1 a6 13. Nc1 O-O-O 14. Nb3 exd4 15. Rxd4 c5 16. Rd1 Nb6
## 17. g3 Kb8 18. Na5 Ba8 19. Bh3 d5 20. Qf4+ Ka7 21. Rhe1 d4
## 22. Nd5 Nbxd5 23. exd5 Qd6 24. Rxd4 cxd4 25. Re7+ Kb6
## 26. Qxd4+ Kxa5 27. b4+ Ka4 28. Qc3 Qxd5 29. Ra7 Bb7
## 30. Rxb7 Qc4 31. Qxf6 Kxa3 32. Qxa6+ Kxb4 33. c3+ Kxc3
## 34. Qa1+ Kd2 35. Qb2+ Kd1 36. Bf1 Rd2 37. Rd7 Rxd7
## 38. Bxc4 bxc4 39. Qxh8 Rd3 40. Qa8 c3 41. Qa4+ Ke1 42. f4 f5
## 43. Kc1 Rd2 44. Qa7 1-0

chsspgn$history()
##  [1] "e4"    "d6"    "d4"    "Nf6"   "Nc3"   "g6"    "Be3"   "Bg7"  
##  [9] "Qd2"   "c6"    "f3"    "b5"    "Nge2"  "Nbd7"  "Bh6"   "Bxh6" 
## [17] "Qxh6"  "Bb7"   "a3"    "e5"    "O-O-O" "Qe7"   "Kb1"   "a6"   
## [25] "Nc1"   "O-O-O" "Nb3"   "exd4"  "Rxd4"  "c5"    "Rd1"   "Nb6"  
## [33] "g3"    "Kb8"   "Na5"   "Ba8"   "Bh3"   "d5"    "Qf4+"  "Ka7"  
## [41] "Rhe1"  "d4"    "Nd5"   "Nbxd5" "exd5"  "Qd6"   "Rxd4"  "cxd4" 
## [49] "Re7+"  "Kb6"   "Qxd4+" "Kxa5"  "b4+"   "Ka4"   "Qc3"   "Qxd5" 
## [57] "Ra7"   "Bb7"   "Rxb7"  "Qc4"   "Qxf6"  "Kxa3"  "Qxa6+" "Kxb4" 
## [65] "c3+"   "Kxc3"  "Qa1+"  "Kd2"   "Qb2+"  "Kd1"   "Bf1"   "Rd2"  
## [73] "Rd7"   "Rxd7"  "Bxc4"  "bxc4"  "Qxh8"  "Rd3"   "Qa8"   "c3"   
## [81] "Qa4+"  "Ke1"   "f4"    "f5"    "Kc1"   "Rd2"   "Qa7"

chsspgn$history(verbose = TRUE)
## Source: local data frame [87 x 8]
## 
##    color  from    to flags piece   san captured number_move
##    (chr) (chr) (chr) (chr) (chr) (chr)    (chr)       (int)
## 1      w    e2    e4     b     p    e4       NA           1
## 2      b    d7    d6     n     p    d6       NA           2
## 3      w    d2    d4     b     p    d4       NA           3
## 4      b    g8    f6     n     n   Nf6       NA           4
## 5      w    b1    c3     n     n   Nc3       NA           5
## 6      b    g7    g6     n     p    g6       NA           6
## 7      w    c1    e3     n     b   Be3       NA           7
## 8      b    f8    g7     n     b   Bg7       NA           8
## 9      w    d1    d2     n     q   Qd2       NA           9
## 10     b    c7    c6     n     p    c6       NA          10
## ..   ...   ...   ...   ...   ...   ...      ...         ...

plot(chsspgn)

Validation Functions

State validation

chss2 <- Chess$new("rnb1kbnr/pppp1ppp/8/4p3/5PPq/8/PPPPP2P/RNBQKBNR w KQkq - 1 3")
plot(chss2)

chss2$in_check()
## [1] TRUE

chss2$in_checkmate()
## [1] TRUE

Slatemate validation

chss3 <- Chess$new("4k3/4P3/4K3/8/8/8/8/8 b - - 0 78")

plot(chss3)


chss3$in_stalemate()
## [1] TRUE

Three fold repetition

chss4 <- Chess$new("rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1")

chss4$in_threefold_repetition()
## [1] FALSE

chss4$move('Nf3')$move('Nf6')$move('Ng1')$move('Ng8')

chss4$in_threefold_repetition()
## [1] FALSE

chss4$move('Nf3')$move('Nf6')$move('Ng1')$move('Ng8')

chss4$in_threefold_repetition()
## [1] TRUE

chss4$history()
## [1] "Nf3" "Nf6" "Ng1" "Ng8" "Nf3" "Nf6" "Ng1" "Ng8"

Insufficient material

chss5 <- Chess$new("k7/8/n7/8/8/8/8/7K b - - 0 1")

plot(chss5)


chss5$insufficient_material()
## [1] TRUE

Helpers Functions

There some helper function to get more information

History Detail

This functions is a detailed version from the history(verbose = TRUE).

chsspgn$history_detail()
## Source: local data frame [88 x 8]
## 
##          piece  from    to number_move piece_number_move   status
##          (chr) (chr) (chr)       (int)             (int)    (chr)
## 1      a1 Rook    a1    d1          21                 1       NA
## 2      a1 Rook    d1    d4          29                 2       NA
## 3      a1 Rook    d4    d1          31                 3       NA
## 4      a1 Rook    d1    d4          47                 4 captured
## 5    b1 Knight    b1    c3           5                 1       NA
## 6    b1 Knight    c3    d5          43                 2 captured
## 7    c1 Bishop    c1    e3           7                 1       NA
## 8    c1 Bishop    e3    h6          15                 2 captured
## 9  White Queen    d1    d2           9                 1       NA
## 10 White Queen    d2    h6          17                 2       NA
## ..         ...   ...   ...         ...               ...      ...
## Variables not shown: number_move_capture (int), captured_by (chr)

Plot a boad via ggplot

You can plot a specific fen vía ggplot:

ggchessboard(chsspgn$fen())

Auxiliar Data

There function to retrieve some data which is easier to plot:

Pieces

rchess:::.chesspiecedata()
## Source: local data frame [32 x 7]
## 
##      fen start_position        name                     name_long color
##    (chr)          (chr)       (chr)                         (chr) (chr)
## 1      R             a1     a1 Rook          White's Queen's Rook     w
## 2      N             b1   b1 Knight        White's Queen's Knight     w
## 3      B             c1   c1 Bishop        White's Queen's Bishop     w
## 4      Q             d1 White Queen                 White's Queen     w
## 5      K             e1  White King                  White's King     w
## 6      B             f1   f1 Bishop         White's King's Bishop     w
## 7      N             g1   g1 Knight         White's King's Knight     w
## 8      R             h1     h1 Rook           White's King's Rook     w
## 9      P             a2     a2 Pawn   White's Queen's Rook's Pawn     w
## 10     P             b2     b2 Pawn White's Queen's Knight's Pawn     w
## ..   ...            ...         ...                           ...   ...
## Variables not shown: unicode (chr), name_short (chr)

Board

rchess:::.chessboarddata()
## Source: local data frame [64 x 9]
## 
##    idcell   col   row     x     y  cell    cc piece     text
##     (dbl) (chr) (int) (int) (int) (chr) (chr) (chr)    (chr)
## 1       1     a     1     1     1    a1     b     R <U+2656>
## 2       2     b     1     2     1    b1     w     N <U+2658>
## 3       3     c     1     3     1    c1     b     B <U+2657>
## 4       4     d     1     4     1    d1     w     Q <U+2655>
## 5       5     e     1     5     1    e1     b     K <U+2654>
## 6       6     f     1     6     1    f1     w     B <U+2657>
## 7       7     g     1     7     1    g1     b     N <U+2658>
## 8       8     h     1     8     1    h1     w     R <U+2656>
## 9       9     a     2     1     2    a2     w     P <U+2659>
## 10     10     b     2     2     2    b2     b     P <U+2659>
## ..    ...   ...   ...   ...   ...   ...   ...   ...      ...

Data

The package have two data sets:

FIDE World cups

data("chesswc")
str(chesswc)
## Classes 'tbl_df', 'tbl' and 'data.frame':    1266 obs. of  11 variables:
##  $ event   : chr  "FIDE World Cup 2011" "FIDE World Cup 2011" "FIDE World Cup 2011" "FIDE World Cup 2011" ...
##  $ site    : chr  "Khanty-Mansiysk RUS" "Khanty-Mansiysk RUS" "Khanty-Mansiysk RUS" "Khanty-Mansiysk RUS" ...
##  $ date    : Date, format: "2011-08-28" "2011-08-28" ...
##  $ round   : num  1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 ...
##  $ white   : chr  "Kaabi, Mejdi" "Ivanchuk, Vassily" "Ibrahim, Hatim" "Ponomariov, Ruslan" ...
##  $ black   : chr  "Karjakin, Sergey" "Steel, Henry Robert" "Mamedyarov, Shakhriyar" "Gwaze, Robert" ...
##  $ result  : chr  "0-1" "1-0" "0-1" "1-0" ...
##  $ whiteelo: int  2344 2768 2402 2764 2449 2746 2477 2741 2493 2736 ...
##  $ blackelo: int  2788 2362 2765 2434 2760 2452 2744 2480 2739 2493 ...
##  $ eco     : chr  "D15" "E68" "E67" "B40" ...
##  $ pgn     : chr  "1. d4 d5 2. Nf3 Nf6 3. c4 c6 4. Nc3 dxc4 5. e3 b5 6. a4 b4 7. Nb1 Ba6 8. Ne5 e6 9. Nxc4 c5 10. b3 cxd4 11. exd4 Nc6 12. Be3 Be7"| __truncated__ "1. c4 Nf6 2. Nc3 g6 3. g3 Bg7 4. Bg2 O-O 5. d4 d6 6. Nf3 Nbd7 7. O-O e5 8. e4 c6 9. Rb1 exd4 10. Nxd4 Re8 11. h3 Nc5 12. Re1 a5"| __truncated__ "1. Nf3 Nf6 2. c4 g6 3. Nc3 Bg7 4. g3 O-O 5. Bg2 d6 6. O-O Nbd7 7. d4 e5 8. b3 exd4 9. Nxd4 Re8 10. Bb2 Nc5 11. Qc2 h5 12. Rad1 "| __truncated__ "1. e4 c5 2. Nf3 e6 3. d3 Nc6 4. g3 e5 5. Bg2 d6 6. O-O Be7 7. c3 Nf6 8. Nbd2 O-O 9. a3 b5 10. Re1 Kh8 11. d4 Bd7 12. b4 cxd4 13"| __truncated__ ...
head(chesswc)
## Source: local data frame [6 x 11]
## 
##                 event                site       date round
##                 (chr)               (chr)     (date) (dbl)
## 1 FIDE World Cup 2011 Khanty-Mansiysk RUS 2011-08-28   1.1
## 2 FIDE World Cup 2011 Khanty-Mansiysk RUS 2011-08-28   1.1
## 3 FIDE World Cup 2011 Khanty-Mansiysk RUS 2011-08-28   1.1
## 4 FIDE World Cup 2011 Khanty-Mansiysk RUS 2011-08-28   1.1
## 5 FIDE World Cup 2011 Khanty-Mansiysk RUS 2011-08-28   1.1
## 6 FIDE World Cup 2011 Khanty-Mansiysk RUS 2011-08-28   1.1
## Variables not shown: white (chr), black (chr), result (chr), whiteelo
##   (int), blackelo (int), eco (chr), pgn (chr)

Chess Openings

data("chessopenings")
str(chessopenings)
## Classes 'tbl_df', 'tbl' and 'data.frame':    554 obs. of  4 variables:
##  $ eco    : chr  "A01" "A02" "A03" "A04" ...
##  $ name   : chr  "Irregular Opening" "Bird's Opening" "Bird's Opening" "Irregular Opening" ...
##  $ variant: chr  "Nimzowitsch-Larsen Attack" "Bird's Opening" "Bird's Opening" "Reti Opening" ...
##  $ pgn    : chr  "1. b3" "1. f4" "1. f4 d5" "1. Nf3" ...
head(chessopenings)
## Source: local data frame [6 x 4]
## 
##     eco              name                   variant        pgn
##   (chr)             (chr)                     (chr)      (chr)
## 1   A01 Irregular Opening Nimzowitsch-Larsen Attack      1. b3
## 2   A02    Bird's Opening            Bird's Opening      1. f4
## 3   A03    Bird's Opening            Bird's Opening   1. f4 d5
## 4   A04 Irregular Opening              Reti Opening     1. Nf3
## 5   A05 Irregular Opening              Reti Opening 1. Nf3 Nf6
## 6   A06 Irregular Opening              Reti Opening  1. Nf3 d5

More Details

Under the hood

This package is mainly a wrapper of chessjs by jhlywa.

The main parts in this package are:

  • V8 package and chessjs javascript library.
  • R6 package for the OO system.
  • htmlwidget package and chessboardjs javascript library.

Thanks to the creators and maintainers of these packages and libraries.

Session Info

print(sessionInfo())
## R version 3.2.2 (2015-08-14)
## Platform: i386-w64-mingw32/i386 (32-bit)
## Running under: Windows 7 (build 7601) Service Pack 1
## 
## locale:
## [1] LC_COLLATE=Spanish_Chile.1252  LC_CTYPE=Spanish_Chile.1252   
## [3] LC_MONETARY=Spanish_Chile.1252 LC_NUMERIC=C                  
## [5] LC_TIME=Spanish_Chile.1252    
## 
## attached base packages:
## [1] stats     graphics  grDevices utils     datasets  methods   base     
## 
## other attached packages:
## [1] rchess_0.1
## 
## loaded via a namespace (and not attached):
##  [1] Rcpp_0.12.2        rstudioapi_0.3.1   knitr_1.11        
##  [4] magrittr_1.5       munsell_0.4.2      colorspace_1.2-6  
##  [7] R6_2.1.1           stringr_1.0.0      plyr_1.8.3        
## [10] dplyr_0.4.3        tools_3.2.2        parallel_3.2.2    
## [13] grid_3.2.2         gtable_0.1.2       DBI_0.3.1         
## [16] htmltools_0.2.6    lazyeval_0.1.10    yaml_2.1.13       
## [19] assertthat_0.1     digest_0.6.8       ggplot2_1.0.1.9003
## [22] formatR_1.2.1      htmlwidgets_0.5    curl_0.9.3        
## [25] evaluate_0.8       rmarkdown_0.8.1    V8_0.9            
## [28] stringi_1.0-1      scales_0.3.0       jsonlite_0.9.17