kenken 0.2.0 kenken: ^0.2.0 copied to clipboard
Create and solve Kenkens!
import 'dart:io';
import 'package:kenken/kenken.dart';
// This example uses a terminal and command line,
// but most likely you want
// to draw kenken and also handle custom events in a web application.
void main() {
var kenken = Kenken(3);
kenken
..addRuleFor([RC(1, 1)], Operation(singleValue), 1)
..addRuleFor([RC(1, 2), RC(1, 3)], Operation(sum, label: '+'), 5)
..addRuleFor([RC(2, 1), RC(3, 1)], Operation(diff, label: '-'), 1)
..addRuleFor([RC(2, 2), RC(2, 3)], Operation(sum, label: '+'), 4)
..addRuleFor([RC(3, 2), RC(3, 3)], Operation(sum, label: '+'), 3);
while (kenken.brokenRules.isNotEmpty) {
print(kenken.brokenRules);
printKenken(kenken);
// User enters a row number of cell:
p('Enter row:');
var row = int.tryParse(stdin.readLineSync());
// User enters a column numer of cell:
p('Enter col:');
var col = int.tryParse(stdin.readLineSync());
// User enters a value for cell:
p('Enter value:');
var val = int.tryParse(stdin.readLineSync());
kenken.setValue(row, col, val);
}
p('DONE!');
}
void printKenken(Kenken kenken) {
for (var rowNumber in kenken.rowOrColNumbers) {
for (var colNumber in kenken.rowOrColNumbers) {
var cell = kenken.cellOf(RC(rowNumber, colNumber));
// print top borders
p(topBorderAsString(cell, 8));
}
// print new line:
print('');
// print Left borders, rules, Right borders
for (var colNumber in kenken.rowOrColNumbers) {
var cell = kenken.cellOf(RC(rowNumber, colNumber));
//print left border, cell text and right border:
p(wrapTextWithLeftAndRightBorders(
'${cell.ruleText} ${cell.valueAsString}', cell, 8));
}
// print new line:
print('');
}
}
void p(val) {
stdout.write(val);
}
/// Returns string representation of top cell border.
String topBorderAsString(Cell cell, int cellWidth) =>
cell.isTopBorderBold ? '-' * cellWidth : '|' + ' ' * (cellWidth - 2) + '|';
/// Returns string with left and right borders and text between they
String wrapTextWithLeftAndRightBorders(String text, Cell cell, int cellWidth) {
var leftBorder = cell.isLeftBorderBold ? '|' : ' ';
var rightBorder = cell.isRightBorderBold ? '|' : ' ';
var spacesCount = cellWidth - text.length - 2;
return '$leftBorder$text' + (' ' * spacesCount) + rightBorder;
}