2024-04-09 22:16:23 +02:00

124 lines
3.0 KiB
C++

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include "StrangeFlag.hpp"
#include "StrangeFlag_Displayer.hpp"
extern "C" {
#include "tcl_displayer.h"
}
class StrangeFlag_Printer : public StrangeFlag_Displayer {
const char * tile2str(StrangeFlag::tile_t t) {
switch (t) {
case StrangeFlag::BLANK:
return " ";
case StrangeFlag::RED:
return "\033[31mR\033[0m";
case StrangeFlag::GREEN:
return "\033[32mG\033[0m";
case StrangeFlag::FULL:
return "#";
}
return "";
}
public:
void display_state(StrangeFlag * f) {
for (int i = 0; i < f->HEIGHT; i++) {
for (int h = 0; h < f->WIDTH; h++) {
printf("[%s]", tile2str(f->map(i, h)));
}
puts("");
}
puts("");
}
void display_fail(const size_t steps, const size_t tries) {
printf("\033[36m[Invalid attempt (%ld|%ld)]\033[0m\n\n", steps, tries);
}
void display_result(const bool is_success, const size_t steps) {
if (is_success) {
printf("\033[32mSolved in %ld steps.\033[0m\n", steps);
} else {
printf("\033[31mMission failed, we'll get em next time.\033[0m\n");
}
}
};
class StrangeFlag_tk : public StrangeFlag_Displayer {
public:
StrangeFlag_tk() {
tcl_setup();
}
void display_state(StrangeFlag * f) {
for (int i = 0; i < f->HEIGHT; i++) {
for (int h = 0; h < f->WIDTH; h++) {
Tcl_color_t color;
switch(f->map(i, h)) {
case StrangeFlag::FULL:
color = GRAY;
break;
case StrangeFlag::BLANK:
color = WHITE;
break;
case StrangeFlag::RED:
color = RED;
break;
case StrangeFlag::GREEN:
color = GREEN;
break;
}
tcl_set_tile(i, h, color);
}
}
}
void display_fail(const size_t steps, const size_t tries) {
tcl_display_fail(steps, tries);
}
void display_result(const bool is_success, const size_t steps) {
tcl_display_result(is_success, steps);
}
};
void setup() {
}
#define CONSOLE 1
#define TK 2
#define DISPLAY TK
signed main() {
setup();
srand(time(NULL));
const size_t max_tries =
//1'000'000
//100'000
//10'000
//7'000
3'000
;
#if DISPLAY == CONSOLE
StrangeFlag_Printer printer;
StrangeFlag_Displayer &displayer = printer;
#elif DISPLAY == TK
StrangeFlag_tk tk;
StrangeFlag_Displayer &displayer = tk;
#endif
while (true) {
StrangeFlag f;
size_t steps = f.solve(max_tries, &displayer);
if (steps) {
break;
}
}
while (true) { ; }
}