Minesweeper game/D: Difference between revisions

Line 580:
import std.random;
import std.conv;
import std.formatstring;
import std.algorithm;
import std.range;
 
//Convenience function. Similar to Python's str.format.
string format(Args...)(string fmt, Args args)
{
auto writer = appender!string("");
 
writer.formattedWrite(fmt, args);
return writer.data();
}
 
class Board {
Line 615 ⟶ 606:
string toString() {
auto columnRange = iota(0, columns), rowRange = iota(0, rows);
auto accColumn = (string acc, uint column) { return=> acc ~ to!string(column + 1); },
accLine = (string acc, uint row) {
auto accCell = (string acc, uint column) { return=> acc ~ getCell(row, column).toString(); };
 
return acc ~ "\n%2s [ %s ]".format(row + 1, reduce!accCell("", columnRange));
};
 
return " %02s %s".format(numFlags, reduce!accColumn("", columnRange)) ~ reduce!accLine("", rowRange);
}
 
Line 670 ⟶ 661:
cell = cells[rand/columns][rand%columns];
} while(cell.isMined);
 
cell.isMined = true;
}
Line 732 ⟶ 723:
string toString() {
return isUncovered ? (isMined ? "*" : (numAdjacentMines ? to!string(numAdjacentMines) : " ")) :
(isFlagged ? "?" : ".");
}