From 577df85f3e3089200ce9a314f73f97af1f172f95 Mon Sep 17 00:00:00 2001 From: Matuush Date: Fri, 5 Jan 2024 16:04:06 +0100 Subject: [PATCH] catching up --- img/circle.png | Bin 0 -> 7993 bytes img/cross.png | Bin 0 -> 9449 bytes normal.cpp | 94 +++++++++++++++ recursive.cpp | 311 +++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 405 insertions(+) create mode 100644 img/circle.png create mode 100644 img/cross.png create mode 100644 normal.cpp create mode 100644 recursive.cpp diff --git a/img/circle.png b/img/circle.png new file mode 100644 index 0000000000000000000000000000000000000000..cc45f9d8e99ea8e0593d4251a2dc756ac9da8031 GIT binary patch literal 7993 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 literal 0 HcmV?d00001 diff --git a/normal.cpp b/normal.cpp new file mode 100644 index 0000000..484a19b --- /dev/null +++ b/normal.cpp @@ -0,0 +1,94 @@ +#include +#include + +enum tile {fr, p1, p2}; + +struct pos { + int y, x; + pos(int py, int px) : y(py), x(px) {} + pos() {} + pos operator*(int n) { + return {y*n, x*n}; + } + pos operator+(pos p){ + return {p.y+y, p.x+x}; + } + void operator+=(pos p){ + y += p.y; + x += p.x; + } +}; + +struct Game { + tile won = fr; + int size; + std::vector> map; + Game(int s) : size(s){ + std::vector row(size, fr); + map = std::vector>(size, row); + } + tile at(pos p) { + return map[p.y][p.x]; + } + bool valid(pos p) { + return p.x >= 0 && p.x < size && p.y >= 0 && p.y < size; + } + int place(pos p, tile t) { + if(!valid(p)) return 1; + if(at(p) != fr) return 2; + map[p.y][p.x] = t; + return 0; + } + bool checkWin(pos p) { + int win_count = size < 5 ? size : 5; + tile t0 = at(p); + if(t0 == fr) return false; + for(int vy = -1; vy <= 1; vy++) { + for(int vx = -1; vx <= 1; vx++) { + if(vy == 0 && vx == 0) continue;; + pos v = {vy,vx}; + bool win = true; + for(int n = 1; n < 5; n++) { + if(!valid(v*n+p) || at(v*n+p) != t0) { + win = false; + break; + } + } + if(win) { + won = t0; + return true; + } + } + } + return false; + } + void print() { + for(auto r : map) { + for(tile t : r) { + std::cout << ((t == fr) ? '.' : (t == p1) ? 'O' : 'X'); + } + std::cout << std::endl; + } + } +}; + +int main(int argc, char** argv) { + Game g(15); + pos p(0,0); + std::cout << "check\n"; + g.print(); + for(int t = 0; !g.checkWin(p); t++) { + tile ti = t%2 == 0 ? p1 : p2; + while(true){ + int y,x; std::cin >> y >> x; + pos pl(y,x); + if(!g.place(pl,ti)) { + p = pl; + break; + } + } + g.print(); + } + + return 0; +} diff --git a/recursive.cpp b/recursive.cpp new file mode 100644 index 0000000..3125793 --- /dev/null +++ b/recursive.cpp @@ -0,0 +1,311 @@ +#include +#include +#include +#include +#include +#include +#include + +using std::deque; +using std::string; +using std::array; +using std::vector; +using std::min; +using std::cin; +using std::cout; + +enum tile {fr = 0, p1 = 1, p2 = 2, tie = 3}; +tile act(int t) { return (t % 2) ? p2 : p1; } +tile pas(int t) { return (t % 2) ? p1 : p2; } +#define point(pos) {(float)pos.x, (float)pos.y} + +#define FPS 15 +#define SCREEN 800 +#define LINE_W 2 + +#define IMG_COUNT 2 +array textures; +void prepareTextures() { + const char* paths[] = {"img/circle.png", "img/cross.png"}; + for(int i = 0; i < IMG_COUNT; i++) { + Image img; + img = LoadImage(paths[i]); + textures[i] = LoadTextureFromImage(img); + } +} +void renderImage(tile t, Rectangle dst, Color color = WHITE) { + if(t == fr || t == tie) return; + Texture tex = textures[t-1]; + Rectangle src = {0, 0, (float)tex.width, (float)tex.height}; + DrawTexturePro(textures[t-1], src, dst, {0,0}, 0, color); +} + +struct pos { + int x, y; + pos() : x(-1), y(-1) {} + pos(int px, int py) : x(px), y(py) {} + pos(Vector2 v) : x(v.x), y(v.y) {} + pos normalize() { + if(x >= 3) x = 2; + else if(x < 0) x = 0; + if(y >= 3) y = 2; + else if(y < 0) y = 0; + return *this; + } + pos operator/(int a) {return {x/a, y/a};}; + pos operator%(int a) {return {x%a, y%a};}; + int to_int() { return 3*y + x; } + deque to_deque(int depth, int screenSize) { + deque r = {}; + pos pp = pos(x,y); + int pwr = 1; + for(int i = 1; i <= depth; i++) { + pwr *= 3; + pos ppos = (pp/(screenSize/pwr)); + if(ppos.x > 2 || ppos.y > 2) return {}; + r.push_back(ppos.to_int()); + pp = pp%(screenSize/pwr); + } + return r; + } +}; + +#define OKAY -1 +#define CHANGE -2 +struct Block { + tile t = fr; + bool leaf = false; + Rectangle target; + array sons; + + Block() {} + Block(int depth, Rectangle trg) { + target = trg; + int x = trg.x, y = trg.y, w = trg.width, h = trg.height; + if(depth == 0) leaf = true; + else + for(int i = 0; i < 9; i++) + sons[i] = new Block(depth-1, + {float(int(x + w/3 * (i%3))), float(int(y + h/3 * (i/3))), float(int(w/3)), float(int(h/3))}); + } + int change(tile pl) { + t = pl; + if(pl == fr) + return OKAY; + return CHANGE; + } + bool playable(deque v) { + if(leaf && t == fr) return true; + if(t != fr || v.size() == 0) return false; + int son = v.front(); + v.pop_front(); + return sons[son]->playable(v); + } + int play(deque v, tile pl) { + if(t != fr) return v.size(); + if(leaf) return change(pl); + if(v.size() == 0) return OKAY; + + int son = v.front(); + v.erase(v.begin()); + int rv = sons[son]->play(v, pl); + + if(rv == CHANGE) return change(check_win()); + return rv; + } + tile check_win() { + tile d1 = sons[0]->t, d2 = sons[2]->t; + for(int k = 0; k < 3; k++) { + tile row = sons[k*3]->t, col = sons[k%3]->t; + for(int i = 0; i < 3; i++) { + if(sons[k*3 + i]->t != row) row = fr; + if(sons[k%3 + i*3]->t != col) col = fr; + } + if(row != fr) return row; + if(col != fr) return col; + if(sons[k*4]->t != sons[0]->t) d1 = fr; + if(sons[(k+1)*2]->t != sons[2]->t) d2 = fr; + } + if(d1 != fr) return d1; + if(d2 != fr) return d2; + + bool is_tie = true; + for(Block* s : sons) + if(s->t == fr) is_tie = false; + if(is_tie) return tie; + + return fr; + } + void render(int depth) { + if(!leaf) DrawRectangleLinesEx(target, depth, BLACK); + renderImage(t, target); + if(leaf || (t != fr && t != tie)) return; + + for(int i = 0; i < 9; i++) + sons[i]->render(depth-1); + } + Rectangle getRect(deque v) { + if(v.size() == 0) return target; + else { + int index = v.front(); + v.pop_front(); + return sons[index]->getRect(v); + } + } + void updateRect(Rectangle trg) { + target = trg; + int x = trg.x, y = trg.y, w = trg.width, h = trg.height; + if(leaf) return; + for(int i = 0; i < 9; i++) + sons[i]->updateRect({ + float(int(x + w/3 * (i%3))), + float(int(y + h/3 * (i/3))), + float(int(w/3)), + float(int(h/3)) + }); + } + + void save(vector *r) { + if(leaf) r->push_back(t); + else + for(Block* son : sons) + son->save(r); + } + void load_state(vector state, int pos) { + if(leaf) t = state[pos]; + else { + for(int i = 0; i < 9; i++) + sons[i]->load_state(state, pos*9+i); + t = check_win(); + } + } + void undo(deque &prev) { + // TODO + } +}; + +void save_state(Block* root, int depth, int time, deque &turn) { + vector state = {}; + root->save(&state); + string filename; std::cin >> filename; + std::ofstream outfile("saves/" + filename); + outfile << depth << "\n" << time << "\n" << turn.size() << "\n"; + for(int play : turn) + outfile << play << std::endl; + for(tile t : state) + outfile << int(t) << std::endl; +} +void load_state(Block** root, deque &turn, int &depth, int &time, char* argv) { + depth = atoi(argv); + if(depth) + *root = new Block(depth, {0, 0, SCREEN, SCREEN}); + else { + string path = "saves/" + string(argv); + std::ifstream infile(path); + infile >> depth >> time; + int K; infile >> K; + for(int k = 0; k < K; k++) { + int play; infile >> play; + turn.push_back(play); + cout << play; + } + vector state = {}; + long long pw = 1; + for(int i = 0; i < depth; i++) pw *= 9; + for(int i = 0; i < pw; i++) { + int next; infile >> next; + state.push_back((tile)next); + } + *root = new Block(depth, {0, 0, SCREEN, SCREEN}); + (*root)->load_state(state, 0); + } +} + +void update(int &time, deque &turn, Block* root, Rectangle &dst) { + time++; + turn.erase(turn.begin()); + int rval_2 = root->play(turn, pas(time)); + for(int i = 0; i <= rval_2; i++) + turn.pop_back(); + dst = root->getRect(turn); +} +void undo(Block *root, deque &prev, Rectangle &dst, int &time) { + if(prev.size() == 0) return; + time--; + root->undo(prev); + // TODO +} +bool valid(Block* root, Rectangle &dst, deque &turn) { + return CheckCollisionRecs(root->getRect(turn), dst) && root->playable(turn); +} +void render_all(Block* root, int time, Rectangle dst, int depth, deque highlight = {}) { + BeginDrawing(); + ClearBackground(RAYWHITE); + root->render(depth); + if(valid(root, dst, highlight)) + renderImage(act(time), root->getRect(highlight), BLACK); + DrawRectangleLinesEx(dst, 3*LINE_W, act(time+1) == p2 ? BLUE : RED); + EndDrawing(); +} +void prepareScreen(Block* root, int time, Rectangle dst, int depth) { + SetConfigFlags(FLAG_WINDOW_RESIZABLE); + InitWindow(SCREEN, SCREEN, "Rekurze"); + SetTargetFPS(FPS); + prepareTextures(); + render_all(root, time, dst, depth); +} + + +int main(int argc, char** argv) { + deque turn = {}; + int time = 0, depth; + Block* root = nullptr; + + int screenSize = SCREEN; + + if(argc <= 1) { + cin >> depth; + root = new Block(depth, {0, 0, SCREEN, SCREEN}); + } + else load_state(&root, turn, depth, time, argv[1]); + + Rectangle dst = root->getRect(turn); + + prepareScreen(root, time, dst, depth); + + + bool end = false; + deque pturn = {}; + while(!WindowShouldClose()) { + // Update screen size + screenSize = min(GetScreenWidth(), GetScreenHeight()); + root->updateRect({0, 0, (float)screenSize, (float)screenSize}); + dst = root->getRect(pturn); + + // Move + Vector2 touch = GetMousePosition(); + turn = pos(touch).to_deque(depth, screenSize); + if(IsMouseButtonPressed(0) && CheckCollisionPointRec(touch, dst) && valid(root, dst, turn)) { + int rval = root->play(turn, act(time)); + if(rval == CHANGE) end = true; + else if(rval == OKAY) { + update(time, turn, root, dst); + pturn = turn; + } + } + + // Key presses + if(IsKeyPressed(KEY_X)) save_state(root, depth, time, turn), end = true; + else if(IsKeyPressed(KEY_Z)); //TODO undo + else if(IsKeyPressed(KEY_P)) TakeScreenshot("screenshot.png"); + + // Rendering + render_all(root, time, dst, depth, turn); + + if(end) break; + } + + WaitTime(10); + CloseWindow(); + return 0; +}