feat: replace std::cout with std::println for consistent output formatting and add timing for map generation

Signed-off-by: szdytom <szdytom@qq.com>
This commit is contained in:
方而静 2025-08-02 09:28:03 +08:00
parent 7718d3fbf4
commit c7a1beea82
Signed by: szTom
GPG Key ID: 072D999D60C6473C

View File

@ -2,10 +2,11 @@
#include "generation.h" #include "generation.h"
#include "tile.h" #include "tile.h"
#include "tilemap.h" #include "tilemap.h"
#include <chrono>
#include <cstdlib> #include <cstdlib>
#include <format> #include <format>
#include <iomanip>
#include <iostream> #include <iostream>
#include <print>
#include <string> #include <string>
// Get BMP color for different base tile types // Get BMP color for different base tile types
@ -65,18 +66,14 @@ void generate_bmp(const istd::TileMap &tilemap, const std::string &filename) {
} }
if (!bmp.save(filename)) { if (!bmp.save(filename)) {
std::cerr << "Error: Could not save BMP file: " << filename std::println(stderr, "Error: Could not save BMP file: {}", filename);
<< std::endl;
return; return;
} }
std::cout << "BMP file generated: " << filename << std::endl; std::println("BMP file generated: {}", filename);
std::cout << "Image size: " << image_size << "x" << image_size << " pixels" std::println("Image size: {}x{} pixels", image_size, image_size);
<< std::endl; std::println("Tilemap size: {}x{} tiles", total_tiles, total_tiles);
std::cout << "Tilemap size: " << total_tiles << "x" << total_tiles std::println("Chunks: {}x{}", chunks_per_side, chunks_per_side);
<< " tiles" << std::endl;
std::cout << "Chunks: " << chunks_per_side << "x" << chunks_per_side
<< std::endl;
} }
// Print statistics about the generated map // Print statistics about the generated map
@ -102,27 +99,30 @@ void print_statistics(const istd::TileMap &tilemap) {
int total_tiles int total_tiles
= chunks_per_side * chunks_per_side * tiles_per_chunk * tiles_per_chunk; = chunks_per_side * chunks_per_side * tiles_per_chunk * tiles_per_chunk;
std::cout << "\nTile Statistics:\n"; std::println("\nTile Statistics:");
std::cout << "================\n"; std::println("================");
for (int i = 0; i < 5; ++i) { for (int i = 0; i < 5; ++i) {
double percentage = (double)tile_counts[i] / total_tiles * 100.0; double percentage = (double)tile_counts[i] / total_tiles * 100.0;
std::cout << std::setw(10) << tile_names[i] << ": " << std::setw(8) std::println(
<< tile_counts[i] << " (" << std::fixed "{:>10}: {:>8} ({:.1f}%)", tile_names[i], tile_counts[i], percentage
<< std::setprecision(1) << percentage << "%)\n"; );
} }
std::cout << "Total tiles: " << total_tiles << std::endl; std::println("Total tiles: {}", total_tiles);
} }
int main(int argc, char *argv[]) { int main(int argc, char *argv[]) {
// Parse command line arguments // Parse command line arguments
if (argc > 4) { if (argc > 4) {
std::cerr << "Usage: " << argv[0] std::println(
<< " <seed> <output_file.bmp> [chunks_per_side]\n"; stderr, "Usage: {} <seed> <output_file.bmp> [chunks_per_side]",
std::cerr << " seed - Random seed for generation\n"; argv[0]
std::cerr << " output_file - Output BMP filename\n"; );
std::cerr std::println(stderr, " seed - Random seed for generation");
<< " chunks_per_side- Number of chunks per side (default: 4)\n"; std::println(stderr, " output_file - Output BMP filename");
std::cerr << "Example: " << argv[0] << " 12345 output.bmp 6\n"; std::println(
stderr, " chunks_per_side- Number of chunks per side (default: 4)"
);
std::println(stderr, "Example: {} 12345 output.bmp 6", argv[0]);
return 1; return 1;
} }
@ -135,25 +135,30 @@ int main(int argc, char *argv[]) {
if (argc == 4) { if (argc == 4) {
chunks_per_side = std::atoi(argv[3]); chunks_per_side = std::atoi(argv[3]);
if (chunks_per_side <= 0) { if (chunks_per_side <= 0) {
std::cerr << "Error: chunks_per_side must be a positive integer\n"; std::println(
stderr, "Error: chunks_per_side must be a positive integer"
);
return 1; return 1;
} }
if (chunks_per_side > 20) { if (chunks_per_side > 20) {
std::cerr << "Warning: Large chunk counts may produce very large " std::println(
"images\n"; stderr,
"Warning: Large chunk counts may produce very large images"
);
} }
} }
// Validate output filename // Validate output filename
if (output_filename.length() < 4 if (output_filename.length() < 4
|| output_filename.substr(output_filename.length() - 4) != ".bmp") { || output_filename.substr(output_filename.length() - 4) != ".bmp") {
std::cerr << "Error: Output filename must end with .bmp\n"; std::println(stderr, "Error: Output filename must end with .bmp");
return 1; return 1;
} }
std::cout << "Generating " << chunks_per_side << "x" << chunks_per_side std::println(
<< " chunk tilemap with seed: " << seed.s[0] << ", " << seed.s[1] "Generating {}x{} chunk tilemap with seed: {}, {}", chunks_per_side,
<< std::endl; chunks_per_side, seed.s[0], seed.s[1]
);
// Create tilemap with specified size // Create tilemap with specified size
istd::TileMap tilemap(chunks_per_side); istd::TileMap tilemap(chunks_per_side);
@ -163,11 +168,34 @@ int main(int argc, char *argv[]) {
config.seed = seed; config.seed = seed;
// Generate the map // Generate the map
std::cout << "Generating terrain..." << std::endl; std::println("Generating terrain...");
// Start timing
auto start_time = std::chrono::high_resolution_clock::now();
istd::map_generate(tilemap, config); istd::map_generate(tilemap, config);
// End timing and calculate duration
auto end_time = std::chrono::high_resolution_clock::now();
auto duration = std::chrono::duration_cast<std::chrono::microseconds>(
end_time - start_time
);
// Convert to appropriate units for display
if (duration.count() < 1000) {
std::println(
"Map generation completed in {} microseconds", duration.count()
);
} else if (duration.count() < 1000000) {
double ms = duration.count() / 1000.0;
std::println("Map generation completed in {:.2f} milliseconds", ms);
} else {
double seconds = duration.count() / 1000000.0;
std::println("Map generation completed in {:.3f} seconds", seconds);
}
// Generate BMP output // Generate BMP output
std::cout << "Creating BMP visualization..." << std::endl; std::println("Creating BMP visualization...");
generate_bmp(tilemap, output_filename); generate_bmp(tilemap, output_filename);
// Print statistics // Print statistics