diff --git a/CMakeLists.txt b/CMakeLists.txt index 9ec1280..5b08d61 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -18,6 +18,8 @@ add_executable(hang_man src/main.cpp src/words.hpp src/words.cpp src/utils.hpp + src/GuessCorrector.cpp + src/GuessCorrector.hpp ) target_link_libraries(hang_man PRIVATE diff --git a/src/Game.cpp b/src/Game.cpp index 9627281..09c1bda 100644 --- a/src/Game.cpp +++ b/src/Game.cpp @@ -59,7 +59,7 @@ void Game::Run() { SDL_Quit(); } -Game::Game() : guessed() { +Game::Game() { std::random_device random_device{}; std::mt19937 rng(random_device()); @@ -71,6 +71,7 @@ Game::Game() : guessed() { std::shuffle(all_words.begin(), all_words.end(), rng); word = all_words.back(); all_words.pop_back(); + guess_corrector = GuessCorrector(word); } void Game::handle_key(SDL_Keycode event) { diff --git a/src/Game.hpp b/src/Game.hpp index 39c3529..6036eb1 100644 --- a/src/Game.hpp +++ b/src/Game.hpp @@ -4,13 +4,14 @@ #include #include #include +#include "GuessCorrector.hpp" const SDL_Point SCREEN_SIZE{800, 800}; class Game { private: std::vector all_words; - std::vector> guessed; + GuessCorrector guess_corrector; const char *word; public: diff --git a/src/GuessCorrector.cpp b/src/GuessCorrector.cpp new file mode 100644 index 0000000..2cb4c01 --- /dev/null +++ b/src/GuessCorrector.cpp @@ -0,0 +1,44 @@ +#include +#include "GuessCorrector.hpp" + +GuessCorrector::GuessCorrector(const char *word) + : m_word(word), + m_word_length(strlen(word)), + m_parts_guessed(std::make_unique[]>(m_word_length)) { + for (size_t i = 0; i < m_word_length; i++) { + m_parts_guessed[i] = std::nullopt; + } +} + +bool GuessCorrector::has_char(const char to_check) const { + for (int i = 0; i < m_word_length; ++i) { + char c = m_word[i]; + if (c == to_check) + return true; + } + + return false; +} + +void GuessCorrector::add(const char to_add) { + for (int i = 0; i < m_word_length; i++) { + char c = m_word[i]; + if (c == to_add) + m_parts_guessed[i] = to_add; + } +} + +bool GuessCorrector::is_filled_out() const { + for (int i = 0; i < m_word_length; i++) + if (m_parts_guessed[i] == std::nullopt) + return false; + + return true; +} + +std::weak_ptr[]> GuessCorrector::guessed() const { + m_parts_guessed; +} + + + diff --git a/src/GuessCorrector.hpp b/src/GuessCorrector.hpp new file mode 100644 index 0000000..8a9d3b4 --- /dev/null +++ b/src/GuessCorrector.hpp @@ -0,0 +1,23 @@ +#pragma once + +#include +#include + +class GuessCorrector { + const char *m_word; + size_t m_word_length; + std::unique_ptr[]> m_parts_guessed; + +public: + GuessCorrector(const char *word); + + GuessCorrector() = default; + + [[nodiscard]] bool has_char(char to_check) const; + + void add(char to_add); + + [[nodiscard]] bool is_filled_out() const; + + [[nodiscard]] std::weak_ptr[]> guessed() const; +}; diff --git a/src/main.cpp b/src/main.cpp index bc8f460..585d174 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,6 +1,6 @@ #include +#include "Game.hpp" int main() { - std::cout << "Hello, World!" << std::endl; - return 0; + Game::Run(); }