Ostinato alternatives and similar packages
Based on the "Misc" category.
Alternatively, view Ostinato alternatives based on common mentions on social networks and blogs.
-
BootZooka
Simple project to quickly start developing a Scala-based microservice or web application, without the need to write login, user registration etc. -
ScalaSTM
A library-based Software Transactional Memory (STM) for Scala, coupled with transactional sets and maps -
Miniboxing
Miniboxing is a program transformation that improves the performance of Scala generics when used with primitive types. It can speed up generic collections by factors between 1.5x and 22x, while maintaining bytecode duplication to a minimum. You can easily add miniboxing to your sbt project: -
aws4s
DISCONTINUED. Non-blocking AWS SDK for Scala exposing strongly-typed APIs built on top of http4s, fs2 and cats -
media4s
Scala command-line wrapper around ffmpeg, ffprobe, ImageMagick, and other tools relating to media. -
powerscala
Powerful framework providing many useful utilities and features on top of the Scala language. -
GoogleApiScala
This API is a wrapper for the google java libraries. Currently mapping Admin Directory, Drive, and Calendar. -
Easy Config
Easy Config makes Scala application configuration extremely easy. It reads configuration from the environment or command line arguments.
InfluxDB - Purpose built for real-time analytics at any scale.
* Code Quality Rankings and insights are calculated and provided by Lumnify.
They vary from L1 to L5 with "L5" being the highest.
Do you think we are missing an alternative of Ostinato or a related project?
README
[Ostinato](ostinato.jpg?v=1) A chess library that runs on the server (Scala), on the browser (ScalaJS) and on the REPL.
Best introduction to the library with code examples in JavaScript, Scala and in the REPL.
Chess Game Parser (using ChessBoardJS)
Tool to paste any chess match in any known notation and browse through the moves via Chessboard. Also play from any board state against the AI, or convert to any other notation.
Chess Game (using ChessBoardJS)
Play a Chess Match against the AI. A hacker will be able to play from whatever board starting position, as white or black, configuring AI's strength and enabling debug mode.
Convert any pasted chess match in any known notation to any other known notation.
Chess Auto-play (using ChessBoardJS)
Two AI's playing each other (making random moves).
Features
- Supporting the following Chess notations (with variants): PGN, Algebraic, Figurine, Coordinate, Descriptive, ICCF, Smith and FEN
- Random and Basic AI available based on minimax with alpha-beta pruning
- Compiled for JVM and JS => can serve as backend or in the frontend
- Fully stateless design => thread-safe & scalable; no shared mutable state & no side-effects
Functional design; no nulls or exception handling
xObject Oriented design with inheritance but no downcasting
- ostinato.js on the front-end, Akka HTTP Server on the back-end
- Docker Hub image available; Kubernetes deployment, service and auto-scaling examples on the blogpost
Importing a ChessBoard
$ sbt pack && scala -cp target/pack/lib/ostinato_2.12-1.0.2.jar
scala> import ostinato.chess.core._
import ostinato.chess.core._
// Import a chessboard by drawing it
scala> val game = ChessGame.fromGridString(
"""........
|........
|........
|...♜....
|........
|........
|........
|........""".stripMargin, turn = BlackChessPlayer).get
// Get available actions (note that the board keeps track of turns; 0 actions for white here!)
scala> val actions = game.board.actions
actions: Set[ostinato.chess.core.ChessAction] = Set(Black's Rook moves to a5, Black's Rook moves to d2,
Black's Rook moves to d3, ...)
// Print them out!
scala> actions map game.board.doAction foreach (b => println(b.get + "\n"))
// -> Shows on console (outlined horizontally for brevity)
...♜.... ........ ........ ........ ........ ........ ........
........ ........ ........ ........ ........ ........ ........
........ ...♜.... ........ ........ ........ ........ ........
........ ........ .♜...... ♜....... .....♜.. ........ ....♜...
........ ........ ........ ........ ........ ........ ........
........ ........ ........ ........ ........ ........ ........
........ ........ ........ ........ ........ ...♜.... ........
........ ........ ........ ........ ........ ........ ........
........ ........ ........ ........ ........ ........ ........
........ ...♜.... ........ ........ ........ ........ ........
........ ........ ........ ........ ........ ........ ........
........ ........ .......♜ ......♜. ..♜..... ........ ........
........ ........ ........ ........ ........ ........ ...♜....
........ ........ ........ ........ ........ ...♜.... ........
........ ........ ........ ........ ........ ........ ........
...♜.... ........ ........ ........ ........ ........ ........
Importing a game from any known notation, without specifying which one
it("should parse the same game in different notations") {
val pgn =
Notation.parseMatchString("""[Event "Ostinato Testing"]
|[Site "Buenos Aires, Argentina"]
|[Date "2015.??.??"]
|[Round "1"]
|[Result "½–½"]
|[White "Fake Player 1"]
|[Black "Fake Player 2"]
|
|1. e4 e6 2. d4 d5 3. Nc3 Bb4 4. Bb5+ Bd7 5. Bxd7+ Qxd7 6. Nge2
|dxe4 7. 0-0
|""".stripMargin)
val algebraic =
Notation.parseMatchString("""e4 e6
|d4 d5
|Nc3 Bb4
|Bb5+ Bd7
|Bxd7+ Qxd7
|Nge2 dxe4
|0-0""".stripMargin)
val figurine =
Notation.parseMatchString("""e4 e6
|d4 d5
|♘c3 ♝b4
|♗b5+ ♝d7
|♗xd7+ ♛xd7
|♘ge2 dxe4
|0-0""".stripMargin)
val coordinate =
Notation.parseMatchString("""
|1. e2-e4 e7-e6
|2. d2-d4 d7-d5
|3. b1-c3 f8-b4
|4. f1-b5+ c8-d7
|5. b5xd7+ d8xd7
|6. g1-e2 d5xe4
|7. 0-0""".stripMargin)
val descriptive =
Notation.parseMatchString("""
|1. P-K4 P-K3
|2. P-Q4 P-Q4
|3. N-QB3 B-N5
|4. B-N5ch B-Q2
|5. BxBch QxB
|6. KN-K2 PxP
|7. 0-0
|""".stripMargin)
val iccf =
Notation.parseMatchString("""
|1. 5254 5756
|2. 4244 4745
|3. 2133 6824
|4. 6125 3847
|5. 2547 4847
|6. 7152 4554
|7. 5171""".stripMargin)
val smith =
Notation.parseMatchString("""
|1. e2e4 e7e6
|2. d2d4 d7d5
|3. b1c3 f8b4
|4. f1b5 c8d7
|5. b5d7b d8d7b
|6. g1e2 d5e4p
|7. e1g1c""".stripMargin)
Set(pgn, algebraic, figurine, coordinate, descriptive, iccf, smith) foreach {
case Right(parsedGame) ⇒
parsedGame.size shouldBe 13
parsedGame.last shouldBe (CastlingAction.whiteKingside(), ChessGame.fromString(
"""♜♞..♚.♞♜
|♟♟♟♛.♟♟♟
|....♟...
|........
|.♝.♙♟...
|..♘.....
|♙♙♙.♘♙♙♙
|♖.♗♕.♖♔.""".stripMargin, turn = BlackChessPlayer, castlingAvailable = castlingOnlyBlackAvailable,
fullMoveNumber = 7, halfMoveClock = 1
).board)
case _ ⇒
fail
}
}
Some illustrative tests
En Passant
it("should not find en passant take move for black pawn, since king would be threatened") { val game = ChessGame.fromGridString( """....♖... |........ |...↓.... |...♙♟... |........ |........ |....♚... |........""".stripMargin).get game.whitePlayer.pawns.head.actions(game.board).size shouldBe 1 }
Algebraic Notation
CastlingAction.blackQueenside().toAn shouldBe "0-0-0" TakeMovement(♝(XY(1, 3), WhiteChessPlayer), XY(1, -1), ♞(XY(2, 2), BlackChessPlayer)).toAn shouldBe "Bxc6"
FEN Notation importing/exporting
it("should encode this board") { ChessGame.fromGridString( """.......♔ |........ |♚.♙..... |.......♟ |........ |........ |........ |........""".stripMargin).get.board.toFen shouldBe "7K/8/k1P5/7p/8/8/8/8" } it("should decode a chess setup with black en passant in FEN Notation") { ChessGame.fromFen("rnbqkbnr/p1pppppp/8/1p6/8/8/PPPPPPPP/RNBQKBNR w KQkq b6 4 5") shouldBe Some(ChessGame.fromGridString( """♜♞♝♛♚♝♞♜ |♟.♟♟♟♟♟♟ |.↓...... |.♟...... |........ |........ |♙♙♙♙♙♙♙♙ |♖♘♗♕♔♗♘♖""".stripMargin, turn = WhiteChessPlayer, castlingFullyAvailable, 5, 4).get) }
*Note that all licence references and agreements mentioned in the Ostinato README section above
are relevant to that project's source code only.