I set off to build a piece of software to assist the tedious sorting typically involved in solving a jigsaw puzzle. Once I got started the ideas and possibilities grew and it shifted into a classical puzzle game instead.
The model for generating puzzles is written in C++ and pretty much make no more assumptions than the fact that pieces have edges and connect to each other. Supporting a multitude of puzzle styles and different edge shapes is easy. The game logic and GUI is written in Java.
A picture for the puzzle can be procedurally generated with one of the built in functions or loaded from an external file. There is also a multitude of methods to generate different tilings and edges.