check_line works again

This commit is contained in:
DarthMooMancer
2025-11-06 20:12:16 -05:00
parent fccc07600a
commit ee6f003d31
4 changed files with 47 additions and 90 deletions
+37 -46
View File
@@ -22,20 +22,20 @@ Engine::~Engine() {
void Engine::run() {
while (exit_code() && process_input()) {
win->draw_display();
std::cout << "Current Player: " << state.temp->m_symbol << "\n";
std::cout << "Current Player: " << state.temp->id << "\n";
std::this_thread::sleep_for(std::chrono::milliseconds((int) (150))); // 1000 / fps; 200ms = 5fps
}
}
bool Engine::exit_code() {
int index = 0;
// if(state.player1.on_line()) {
// std::cout << "Game Over! Player 1 wins!" << std::endl;
// return false;
// } else if(state.player2.on_line()) {
// std::cout << "Game Over! Player 2 wins!" << std::endl;
// return false;
// }
if(check_line(state.player1.id)) {
std::cout << "Game Over! Player 1 wins!" << std::endl;
return false;
} else if(check_line(state.player2.id)) {
std::cout << "Game Over! Player 2 wins!" << std::endl;
return false;
}
for(auto &row : win->view) {
for(auto val : row) {
if(val != ' ') index++;
@@ -53,31 +53,31 @@ bool Engine::process_input() {
while((ch = getch()) != ERR) {
if(ch == 113) { return false; }
if(ch == 49) {
win->view[0][0] = state.temp->m_symbol;
win->view[0][0] = state.temp->id;
get_current_player();
} if(ch == 50) {
win->view[0][2] = state.temp->m_symbol;
win->view[0][2] = state.temp->id;
get_current_player();
} if(ch == 51) {
win->view[0][4] = state.temp->m_symbol;
win->view[0][4] = state.temp->id;
get_current_player();
} if(ch == 52) {
win->view[2][0] = state.temp->m_symbol;
win->view[2][0] = state.temp->id;
get_current_player();
} if(ch == 53) {
win->view[2][2] = state.temp->m_symbol;
win->view[2][2] = state.temp->id;
get_current_player();
} if(ch == 54) {
win->view[2][4] = state.temp->m_symbol;
win->view[2][4] = state.temp->id;
get_current_player();
} if(ch == 55) {
win->view[4][0] = state.temp->m_symbol;
win->view[4][0] = state.temp->id;
get_current_player();
} if(ch == 56) {
win->view[4][2] = state.temp->m_symbol;
win->view[4][2] = state.temp->id;
get_current_player();
} if(ch == 57) {
win->view[4][4] = state.temp->m_symbol;
win->view[4][4] = state.temp->id;
get_current_player();
}
}
@@ -85,34 +85,25 @@ bool Engine::process_input() {
}
void Engine::get_current_player() {
if(state.temp->m_symbol == 'x') { state.temp = &state.player2; }
else if(state.temp->m_symbol == 'o') { state.temp = &state.player1; }
if(state.temp->id == 'x') { state.temp = &state.player2; }
else if(state.temp->id == 'o') { state.temp = &state.player1; }
}
// bool Player::on_line(vec2** buffer) {
// for(int i = 0; i <= 6; i += 3) {
// if(buffer[i]->m_symbol == buffer[i+1]->m_symbol && buffer[i+1]->m_symbol == buffer[i+2]->m_symbol) {
// if(buffer[i]->m_symbol == m_symbol) {
// return true;
// }
// }
// }
// for(int i = 0; i < 3; i++) {
// if(buffer[i]->m_symbol == buffer[i+3]->m_symbol && buffer[i+3]->m_symbol == buffer[i+6]->m_symbol) {
// if(buffer[i]->m_symbol == m_symbol) {
// return true;
// }
// }
// }
// if(buffer[0]->m_symbol == buffer[4]->m_symbol && buffer[4]->m_symbol == buffer[8]->m_symbol) {
// if(buffer[0]->m_symbol == m_symbol) {
// return true;
// }
// }
// if(buffer[2]->m_symbol == buffer[4]->m_symbol && buffer[4]->m_symbol == buffer[6]->m_symbol) {
// if(buffer[2]->m_symbol == m_symbol) {
// return true;
// }
// }
// return false;
// }
bool Engine::check_line(char id) {
for(int i : std::ranges::views::iota(0, COL)) {
if(win->view[0][i] == id && win->view[2][i] == id && win->view[4][i] == id) {
return true;
}
}
for(int i : std::ranges::views::iota(0, ROW)) {
if(win->view[i][0] == id && win->view[i][2] == id && win->view[i][4] == id) {
return true;
}
}
auto same_symbol = [&](vec2 a, vec2 b) {
return win->view[a.y][a.x] == id &&
win->view[2][2] == id &&
win->view[b.y][b.x] == id;
};
return same_symbol({ 0, 0 }, { 4, 4 }) || same_symbol({ 4, 0 }, { 0, 4 });
}