1 Востаннє редагувалося mamkin haker (24.01.2022 17:48:32)

Тема: погано написані консольні хрестики нулики С++

#include <iostream> 
#include <stdlib.h>

/*
 * CONFIG 
 */

#define SPACE ' ' //пустий символ, не трогайте :3
#define HOW_USERS 2 //кількість гравців
#define WIDTH 3 //висота
#define HEIGHT 3 //ширина

//кількість однакових символім в
//ряді/діагоналі/стовбці/оберненій діагоналі
#define LENGTH_WIN 3

//фігурки (хрестик, нолиік і тд) містяться у класі Game
//змінна "char symbols[HOW_USERS]" приватні поля

/*
 * END CONFIG 
 */

class User {
public:
    User(char figure) {
        this -> figure = figure;
    }

    int store = 0;
    char figure;
};

class Game {
public:
    Game() {
        this -> run();
    }

private:
    int   coord_1 = WIDTH;
    int   coord_2 = HEIGHT;
    int   player;
    char  fill[WIDTH][HEIGHT];
    char  symbols[HOW_USERS] = {'X', 'O'};
    User* users[HOW_USERS];

    User* createUser(int i) {
        return new User(symbols[i]);
    }

    void createUsers() {
        for (int i = 0; i < HOW_USERS; i++) {
            this -> users[i] = this -> createUser(i);
        }
    }

    void restartGame() {
        this -> player = 0;
        for (int i = 0; i < WIDTH; i++) {
            for (int j = 0; j < HEIGHT; j++) {
                this -> fill[i][j] = SPACE;
            }
        }
    }

    bool checkEndGames() {
        char symbol_check = this -> users[(player+1) % HOW_USERS] -> figure;
        int result = 0;

        //по рядам
        for (int i = 0; i < WIDTH; i++) {
            for (int j = 0; j < HEIGHT; j++) {
                if (this -> fill[i][j] == symbol_check) {
                    result++;
                }
                else {
                    result = 0;
                }

                if (result == LENGTH_WIN) {
                    return false;
                }
            }
        }

        //по стовпцям
        for (int i = 0; i < WIDTH; i++) {
            for (int j = 0; j < HEIGHT; j++) {
                if (this -> fill[j][i] == symbol_check) {
                    result++;
                }
                else {
                    result = 0;
                }

                if (result == LENGTH_WIN) {
                    return false;
                }
            }
        }

        //по всім діагоналям
        for (int k = 0; k < 2; k++) {
            for (int i = 0; i < WIDTH; i++) {
                for (int j = 0; j < HEIGHT; j++) {
                    if (k == 0) {
                        if (this -> fill[j+i][j] == symbol_check) {
                            result++;
                        }
                        else {
                            result = 0;
                        }
                    }

                    else {
                        if (this -> fill[j][j+i] == symbol_check) {
                            result++;
                        }
                        else {
                            result = 0;
                        }
                    }

                    if (result == LENGTH_WIN) {
                        return false;
                    }
                }
            }
        }

        //по всім оберненим діагоналям
        for (int k = 0; k < 2; k++) {
            for (int i = 0; i < WIDTH; i++) {
                for (int j = 0; j < HEIGHT; j++) {
                    if (k == 0) {
                        if (this -> fill[HEIGHT - j - i - 1][j] == symbol_check) {
                            result++;
                        }
                        else {
                            result = 0;
                        }
                    }

                    else {
                        if (this -> fill[j][HEIGHT - j - i - 1] == symbol_check) {
                            result++;
                        }
                        else {
                            result = 0;
                        }
                    }

                    if (result == LENGTH_WIN) {
                        return false;
                    }
                }
            }
        }

        return true;
    }

    void printGameFill() {
        for (int i = 0; i < WIDTH; i++) {
            std::cout << "[ ";
            for (int j = 0; j < HEIGHT; j++) {
                std::cout << this -> fill[i][j] << ' ';
            }
            std::cout << "]\n";
        }
        std::cout << std::endl;
    }

    void printStore() {
        std::cout << "--------------------------------";
        for (int i = 0; i < HOW_USERS; i++) {
            std::cout << "\nplayer: "  << i + 1
                      << " | store: "  << this -> users[i] -> store
                      << " | symbol: " << this -> users[i] -> figure;
        }
        std::cout << "\n--------------------------------\n\n";
    }

    void run() {
        this -> createUsers();

        while (true) {
            this -> restartGame();
            while (checkEndGames()) {
                this -> coord_1 = WIDTH;
                this -> coord_2 = HEIGHT;
                
                system("cls");

                this -> printStore();
                this -> printGameFill();

                std::cout << "player " << this -> player % HOW_USERS + 1 << " enter coords\n";
                
                std::cout << "coord 1 (row): ";
                std::cin >> this -> coord_1;

                std::cout << "coord 2 (col): ";
                std::cin >> this -> coord_2;

                if (!std::cin) {
                    while (!std::cin) {
                        std::cin.clear();
                        std::cin.ignore();
                    }
                    continue;
                }

                if (0 < this -> coord_1 > WIDTH || 0 < this -> coord_2 > HEIGHT) {
                    std::cout << this -> coord_1 << "   "
                              << this -> coord_2 << "\n";
                    continue;
                }
                
                if (this -> fill[this -> coord_1-1][this -> coord_2-1] == SPACE) {
                    this -> fill[this -> coord_1-1][this -> coord_2-1] =  this -> users[this -> player % HOW_USERS] -> figure;
                    this -> player++;
                }
            }

            this -> users[(player+1) % HOW_USERS] -> store++;
        }
        //виходу немає :D
    }
};

int main() {
    Game game = Game();
}
Подякували: P.Y., ch0r_t2