chessboardjs icon indicating copy to clipboard operation
chessboardjs copied to clipboard

Feature request: allow boards smaller than 8x8

Open ivan444 opened this issue 4 years ago • 12 comments

Some games require boards which are smaller than 8x8. Add ability to create smaller boards. Controll it via config.

I'll send a PR.

ivan444 avatar Aug 30 '20 13:08 ivan444

Hello,

Any chance to see this nice feature in a next release?

Thanks in advance and have a nice day.

slolo2000 avatar Jun 10 '21 14:06 slolo2000

My PR https://github.com/oakmac/chessboardjs/pull/199 the implements this (works correctly). Considering I got no comments on it, it's unlikely for it to be merged (which is understandable).

Feel free to fork it.

On Thu, Jun 10, 2021, 16:16 slolo2000 @.***> wrote:

Hello,

Any chance to see this nice feature in a next release?

Thanks in advance and have a nice day.

— You are receiving this because you authored the thread. Reply to this email directly, view it on GitHub https://github.com/oakmac/chessboardjs/issues/198#issuecomment-858660776, or unsubscribe https://github.com/notifications/unsubscribe-auth/AAH4W2OY3YL2LSCS3H46OQ3TSDCLHANCNFSM4QPTYQMQ .

ivan444 avatar Jun 10 '21 14:06 ivan444

Any chance to see this nice feature in a next release?

I do not have any plans to add this to chessboard.js at this time (that does not mean "never", just "not right now").

@ivan444 solution looks like a good fix if you need this ASAP 👍 🤓

oakmac avatar Jun 10 '21 14:06 oakmac

Maybe if the chess.js library implemented this feature then it would make more sense in chessboardjs.

Anyway, thanks a lot for your answer.

slolo2000 avatar Jun 10 '21 14:06 slolo2000

I have had look to the PR #199

var config = {position: fenString, numRows: 6, numColumns: 6}; board = Chessboard('myBoard', config);

It works well and it display a board with 6x6 like expected. But if the fen string does not respect the real format (with 8 /) the board is not filled with chess pieces.

This issue is due to the validFen function which does not take care of board dimensions. Also, objToFen and fenToObj functions need to be adapted to support fen string lower than 8 chunks.

@ivan444 Do you think you could add this to your PR #199 ?

Like that the ability to create smaller boards will be fully functional and will be add to chessboardjs, I hope.

slolo2000 avatar Jun 11 '21 09:06 slolo2000

It works well and it display a board with 6x6 like expected. But if the fen string does not respect the real format (with 8 /) the board is not filled with chess pieces.

@ivan444 Do you think you could add this to your PR #199 ?

That's intentional, as FEN string by definition is 8 characters long. Some assumptions break when using it for smaller boards.

My bad for not making it clear in the PR description

ivan444 avatar Jun 11 '21 10:06 ivan444

You are right for the FEN string definition.

But for example, this one is valid on a 6x6 board:

6/5p/2N1pk/6/6/K1R3 w - - 1 1

And it could be really useful to support small board for young players when they have to solve chess problems.

slolo2000 avatar Jun 11 '21 10:06 slolo2000

Maybe a first step to fully support smaller boards than 8x8

Based on your works @ivan444 I have completed validFen, fenToObj and objToFen functions in order to take in consideration config._boardDimension It would be nice if you could complete you PR #199 in order to have a better support of small board.

chessboard-1.1.js.zip

slolo2000 avatar Jun 11 '21 12:06 slolo2000

@oakmac what do you think about merging PR #199?

ivan444 avatar Jun 11 '21 12:06 ivan444

I don't know how to merge my code into your PR and I am not really sure about my code addition. I have done so tests and it seems to work fine but if you could check what I have done before merging it would be nice.

slolo2000 avatar Jun 11 '21 12:06 slolo2000

@slolo2000 I meant that @oakmac merge PR #199 to the main repo.

You can then add your change base in the main repo. Or you can fork my fork of the repo and create PR based on that (I recomment the former).

ivan444 avatar Jun 11 '21 12:06 ivan444

Always based on @ivan444 work, I have completed my previous work on "support for smaller boards"

I use it without problem and it seems to work quite nice.

chessboard-1.1.1.js.zip

You can even use this feature with chess.js using a piece of code like below in order to "normalize" your fen string.

// Used to normalize a fen string from smaller board to "normal" chess board
// dimBoardLength: the number of squares in a row/column
function normalizeFenString(fen, dimBoardLength) {
	var deltaFen = 8 - dimBoardLength;
	var position = fen;
	
	if (deltaFen > 0) {
		var fenBegin = fen.replace(/ .+$/, '');
		var fenEnd = fen.replace(fenBegin, '');
		var rows = fenBegin.split('/');

		position = "";
		for (var i = 0; i < deltaFen; i++) {
			if (position != "") {
				position += "/";
			}
			position += "8";
		}
		for (var i = 0; i < rows.length; i++) {
			var c = rows[i].slice(-1);
			if (c.search(/[1-8]/) !== -1) {
				position += "/" + rows[i].substring(0, rows[i].length - 1) + (parseInt(c, 10) + deltaFen).toString();
			} else {
				position += "/" + rows[i] + deltaFen.toString();
			}
		}
		
		position += fenEnd;
	}
	
	return position;
}

slolo2000 avatar Jun 20 '21 20:06 slolo2000