// // Created by nositelshtanov on 11/11/2023. // #include "ttt_meta_session.h" void ttt_meta_session::play() { draw_map(); while (!game.is_game_end()) { size_t x, y; auto whose_step = game.get_whose_step(); auto map_number = game.get_next_map_number(); try { if (map_number == ttt_meta::any_map) { std::cout << (whose_step == mark::zero ? META_O_INVITATION_TWO_PARAMS : META_X_INVITATION_TWO_PARAMS); std::cin >> x >> y; game.step(x, y); } else { std::cout << (whose_step == mark::zero ? META_O_INVITATION_ONE_PARAM : META_X_INVITATION_ONE_PARAM); std::cin >> x; game.step(game.get_next_map_number(), x); } } catch (const invalid_coords_error&) { std::cout << META_INVALID_COORS_HNDL << std::endl; continue; } catch (const step_error& err) { if (err.get_reason() == step_error::Reason::the_field_is_occupied) { std::cout << META_FIELD_IS_OCCUPIED_HNDL << std::endl; } else { throw; } } draw_map(); } auto winner = game.get_winner(); if (winner == mark::nothing) { std::cout << META_DRAW << std::endl; } else if (winner == mark::cross) { std::cout << META_CROSS_WIN << std::endl; } else { std::cout << META_ZERO_WIN << std::endl; } } void ttt_meta_session::draw_map() { std::size_t i = 0; print_devider(); while (i < ttt_meta::map_size) { print_ln(i); if ((i + 1) % 3 == 0) { print_devider(); } ++i; } } void ttt_meta_session::print_ln(std::size_t fields_row) { const auto mapIdxStart = 3 * (fields_row / 3); const auto mapIdxEnd = mapIdxStart + 3; const auto fieldIdxStart = (3 * fields_row) % 9; const auto fieldIdxEnd = fieldIdxStart + 3; std::cout << META_MAP_BORDER; // no reason for avoid a nested loop for (std::size_t i{ mapIdxStart }; i < mapIdxEnd; ++i) { for (std::size_t j{ fieldIdxStart }; j < fieldIdxEnd; ++j) { auto cur_mark = game.get_mark(i, j); auto winner = game.get_mark(i).get_winner(); if (winner == mark::nothing) { std::cout << ( cur_mark == mark::cross ? META_MAP_CROSS : cur_mark == mark::zero ? META_MAP_ZERO : i == game.get_next_map_number() || game.get_next_map_number() == ttt_meta::any_map ? META_MAP_MAY_SELECT: META_MAP_NOTHING ); } else if (winner == mark::cross) { std::cout << META_CROSS_FILL; } else { std::cout << META_ZERO_FILL; } } std::cout << META_MAP_BORDER; } std::cout << std::endl; }