From 151877b298d364342be0f0926a56ebafcc05e06f Mon Sep 17 00:00:00 2001 From: thatscringebro Date: Wed, 11 Oct 2023 16:09:30 -0400 Subject: [PATCH] bot --- game.cpp | 224 ++++-- game.h | 4 + high_scores.txt | 1 + player_moves.txt | 1999 ++++++++++++++++++++++++++++++++++++++++++++++ racecar.cpp | 4 +- racecar.h | 2 +- terminal_racer | Bin 145488 -> 145712 bytes 7 files changed, 2145 insertions(+), 89 deletions(-) create mode 100644 player_moves.txt diff --git a/game.cpp b/game.cpp index 0458017..4f43794 100644 --- a/game.cpp +++ b/game.cpp @@ -4,7 +4,7 @@ Game::Game() :max_x(1000), max_y(800), direction(0), window(sf::VideoMode(max_x, max_y), "ASCII RACER"), - racecar(400.0f, 30.0f, 1.7f) { // maxSpeed, acceleration, and steerSpeed values + racecar(400.0f, 30.0f, 1.7f, sf::Color::Red), bot(400.0f, 30.0f, 1.7f, sf::Color::Green) { // maxSpeed, acceleration, and steerSpeed values if (!font.loadFromFile("cascaydia.otf")) { std::cerr << "Failed to load font" << std::endl; exit(1); @@ -39,6 +39,9 @@ Game::Game() racecar.setPosition(1000, 80); // Set initial position for the racecar racecar.setRotation(180); + bot.setPosition(1000, 80); // Set initial position for the bot + bot.setRotation(180); + // Initialize the times and quadrants data structure timesAndQuadrants.push_back(std::make_pair(1, "00:00:000")); } @@ -46,18 +49,24 @@ Game::Game() void Game::run() { sf::Clock clock; + loadPlayerMovesFromFile("player_moves.txt"); + // Create a view that will follow the racecar view = sf::View(sf::FloatRect(0, 0, max_x, max_y)); view.setCenter(racecar.getX(), racecar.getY()); // Center the view on the racecar window.setView(view); backgroundMusic.setLoop(true); + + int currentMove = 0; while (window.isOpen()) { float dt = clock.restart().asSeconds(); if(lapPoints.size() < 3) { + botMove(currentMove, dt); + currentMove++; // Update game time sf::Time gameTime = gameTimeClock.getElapsedTime(); @@ -94,24 +103,42 @@ void Game::run() { } if(lapPoints.size() < 3) { - if (sf::Keyboard::isKeyPressed(sf::Keyboard::LShift)) { - if(nitro > 0) { - nitro--; - float newX = racecar.getX() + ((racecar.getSpeed() + 1.1) * dt * cos(racecar.getRotation())); - float newY = racecar.getY() + ((racecar.getSpeed() + 1.1) * dt * sin(racecar.getRotation())); - //std::cout << "New: " << newX << "," << newY << " Old: " << racecar.getX() << "," << racecar.getY() << std::endl; - if (!isTrackCollision(newX, newY)) { - racecar.boost(dt); - //std::cout << nitro << std::endl; - mapText.setOutlineThickness(0); - } else { - //racecar.stop(); - racecar.boost(dt); - modifier += 0.01; - mapText.setOutlineThickness(6); + if (sf::Keyboard::isKeyPressed(sf::Keyboard::LShift)) { + if(nitro > 0) { + nitro--; + float newX = racecar.getX() + ((racecar.getSpeed() + 1.1) * dt * cos(racecar.getRotation())); + float newY = racecar.getY() + ((racecar.getSpeed() + 1.1) * dt * sin(racecar.getRotation())); + //std::cout << "New: " << newX << "," << newY << " Old: " << racecar.getX() << "," << racecar.getY() << std::endl; + if (!isTrackCollision(newX, newY)) { + racecar.boost(dt); + //std::cout << nitro << std::endl; + mapText.setOutlineThickness(0); + } else { + //racecar.stop(); + racecar.boost(dt); + modifier += 0.01; + mapText.setOutlineThickness(6); + } } - } - else { + else { + if (racecar.getSpeed() < 0) { + racecar.brake(dt); + } else { + float newX = racecar.getX() + ((racecar.getSpeed() + 1.1) * dt * cos(racecar.getRotation())); + float newY = racecar.getY() + ((racecar.getSpeed() + 1.1) * dt * sin(racecar.getRotation())); + //std::cout << "New: " << newX << "," << newY << " Old: " << racecar.getX() << "," << racecar.getY() << std::endl; + + if (!isTrackCollision(newX, newY)) { + racecar.accelerate(dt); + mapText.setOutlineThickness(0); + } else { + //racecar.stop(); + modifier += 0.01; + mapText.setOutlineThickness(6); + } + } + } + } else if (sf::Keyboard::isKeyPressed(sf::Keyboard::Up)) { if (racecar.getSpeed() < 0) { racecar.brake(dt); } else { @@ -128,84 +155,68 @@ void Game::run() { mapText.setOutlineThickness(6); } } - } - } else if (sf::Keyboard::isKeyPressed(sf::Keyboard::Up)) { - if (racecar.getSpeed() < 0) { - racecar.brake(dt); - } else { - float newX = racecar.getX() + ((racecar.getSpeed() + 1.1) * dt * cos(racecar.getRotation())); - float newY = racecar.getY() + ((racecar.getSpeed() + 1.1) * dt * sin(racecar.getRotation())); - //std::cout << "New: " << newX << "," << newY << " Old: " << racecar.getX() << "," << racecar.getY() << std::endl; - - if (!isTrackCollision(newX, newY)) { - racecar.accelerate(dt); - mapText.setOutlineThickness(0); + } else if (sf::Keyboard::isKeyPressed(sf::Keyboard::Down)) { + if (racecar.getSpeed() > 0) { + racecar.brake(dt); } else { - //racecar.stop(); - modifier += 0.01; - mapText.setOutlineThickness(6); + float newX = racecar.getX() + ((racecar.getSpeed() + 1.1) * dt * cos(racecar.getRotation())); + float newY = racecar.getY() + ((racecar.getSpeed() + 1.1) * dt * sin(racecar.getRotation())); + //std::cout << "New: " << newX << "," << newY << " Old: " << racecar.getX() << "," << racecar.getY() << std::endl; + + if (!isTrackCollision(newX, newY)) { + racecar.reverse(dt); + mapText.setOutlineThickness(0); + } else { + //racecar.stop(); + modifier += 0.01; + mapText.setOutlineThickness(6); + } } - } - } else if (sf::Keyboard::isKeyPressed(sf::Keyboard::Down)) { - if (racecar.getSpeed() > 0) { - racecar.brake(dt); } else { - float newX = racecar.getX() + ((racecar.getSpeed() + 1.1) * dt * cos(racecar.getRotation())); - float newY = racecar.getY() + ((racecar.getSpeed() + 1.1) * dt * sin(racecar.getRotation())); - //std::cout << "New: " << newX << "," << newY << " Old: " << racecar.getX() << "," << racecar.getY() << std::endl; - - if (!isTrackCollision(newX, newY)) { - racecar.reverse(dt); - mapText.setOutlineThickness(0); - } else { - //racecar.stop(); - modifier += 0.01; - mapText.setOutlineThickness(6); - } + racecar.decelerate(dt); } - } else { - racecar.decelerate(dt); - } - - if (sf::Keyboard::isKeyPressed(sf::Keyboard::Left)) { - racecar.steer(dt, -1.0f); // Steer left - } else if (sf::Keyboard::isKeyPressed(sf::Keyboard::Right)) { - racecar.steer(dt, 1.0f); // Steer right - } - - racecar.update(dt); - - nitroText.setString("Nitro: " + std::to_string(nitro)); - nitroText.setCharacterSize(24); - nitroText.setFillColor(sf::Color::White); - nitroText.setPosition(racecar.getX() - 475, racecar.getY() + 300); - - speedText.setString(std::to_string(static_cast(racecar.getSpeed())) + " km/h"); - speedText.setCharacterSize(24); - speedText.setFillColor(sf::Color::Green); - speedText.setPosition(racecar.getX() - 475, racecar.getY() + 350); - if(racecar.getSpeed() < 0){ - speedText.setFillColor(sf::Color::Blue); - } - if(racecar.getSpeed() >= 250){ - speedText.setCharacterSize(27); - speedText.setFillColor(sf::Color::Yellow); - } - if(racecar.getSpeed() >= 360){ - speedText.setCharacterSize(30); - speedText.setFillColor(sf::Color::Red); - } - timerText.setPosition(racecar.getX() - 80, racecar.getY() - 350); - - // Update the view to follow the racecar - view.setCenter(racecar.getX(), racecar.getY()); - window.setView(view); + + if (sf::Keyboard::isKeyPressed(sf::Keyboard::Left)) { + racecar.steer(dt, -1.0f); // Steer left + } else if (sf::Keyboard::isKeyPressed(sf::Keyboard::Right)) { + racecar.steer(dt, 1.0f); // Steer right + } + + racecar.update(dt); + bot.update(dt); + + nitroText.setString("Nitro: " + std::to_string(nitro)); + nitroText.setCharacterSize(24); + nitroText.setFillColor(sf::Color::White); + nitroText.setPosition(racecar.getX() - 475, racecar.getY() + 300); + + speedText.setString(std::to_string(static_cast(racecar.getSpeed())) + " km/h"); + speedText.setCharacterSize(24); + speedText.setFillColor(sf::Color::Green); + speedText.setPosition(racecar.getX() - 475, racecar.getY() + 350); + if(racecar.getSpeed() < 0){ + speedText.setFillColor(sf::Color::Blue); + } + if(racecar.getSpeed() >= 250){ + speedText.setCharacterSize(27); + speedText.setFillColor(sf::Color::Yellow); + } + if(racecar.getSpeed() >= 360){ + speedText.setCharacterSize(30); + speedText.setFillColor(sf::Color::Red); + } + timerText.setPosition(racecar.getX() - 80, racecar.getY() - 350); + + // Update the view to follow the racecar + view.setCenter(racecar.getX(), racecar.getY()); + window.setView(view); } window.clear(); mapText.setString(asciiMap); window.draw(mapText); window.draw(racecar.getDrawable()); + window.draw(bot.getDrawable()); window.draw(speedText); window.draw(nitroText); @@ -400,3 +411,44 @@ void Game::writeHighScores() { } } +void Game::loadPlayerMovesFromFile(const std::string& filename) { + std::ifstream file(filename); + if (file.is_open()) { + int move; + while (file >> move) { + lastPlayerMoves.push_back(move); + } + file.close(); + } +} + +void Game::botMove(int i, float dt) { + int move = lastPlayerMoves[i]; + switch (move) { + case 0: + bot.brake(dt); + break; + case 1: + bot.accelerate(dt); + break; + case 2: + bot.decelerate(dt); + break; + case 3: + bot.decelerate(dt); + bot.steer(dt, -1.0f); + break; + case 4: + bot.decelerate(dt); + bot.steer(dt, 1.0f); + break; + case 5: + bot.accelerate(dt); + bot.steer(dt, -1.0f); + break; + case 6: + bot.accelerate(dt); + bot.steer(dt, 1.0f); + break; + } +} diff --git a/game.h b/game.h index e3ff23e..4faf1ac 100644 --- a/game.h +++ b/game.h @@ -20,6 +20,8 @@ public: void displayEndGame(); void loadHighScores(); void writeHighScores(); + void loadPlayerMovesFromFile(const std::string& filename); + void botMove(int i, float dt); private: int max_x; @@ -34,6 +36,8 @@ private: sf::Clock gameTimeClock; sf::View view; Racecar racecar; + Racecar bot; + std::vector lastPlayerMoves; std::vector> timesAndQuadrants; // Store times and quadrants bool lapFinished; unsigned int lastRound = 0; diff --git a/high_scores.txt b/high_scores.txt index df558a3..33c6c47 100644 --- a/high_scores.txt +++ b/high_scores.txt @@ -1,2 +1,3 @@ 79725 79512 +78055 diff --git a/player_moves.txt b/player_moves.txt new file mode 100644 index 0000000..a70b7b9 --- /dev/null +++ b/player_moves.txt @@ -0,0 +1,1999 @@ +2 +2 +2 +2 +2 +2 +2 +2 +2 +2 +2 +2 +2 +2 +2 +2 +2 +2 +2 +2 +2 +2 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +1 +1 +1 +1 +1 +5 +5 +5 +1 +1 +1 +1 +5 +5 +5 +5 +1 +1 +1 +1 +1 +1 +5 +5 +5 +1 +1 +1 +1 +5 +5 +5 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +5 +5 +5 +5 +5 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +5 +5 +5 +5 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +6 +6 +6 +6 +1 +1 +1 +1 +1 +1 +1 +6 +6 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +6 +6 +6 +6 +6 +6 +1 +1 +1 +1 +6 +6 +6 +6 +6 +6 +6 +6 +6 +6 +6 +6 +6 +6 +6 +6 +6 +6 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +6 +6 +6 +1 +1 +1 +1 +1 +1 +1 +6 +6 +6 +6 +6 +6 +1 +1 +1 +1 +6 +6 +6 +6 +6 +6 +6 +6 +6 +6 +6 +6 +6 +6 +6 +6 +6 +6 +6 +6 +6 +6 +6 +6 +6 +6 +1 +1 +1 +1 +1 +1 +1 +1 +1 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +1 +1 +1 +1 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +5 +5 +5 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +6 +6 +6 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +5 +5 +5 +5 +5 +5 +1 +1 +5 +5 +5 +5 +5 +1 +1 +1 +1 +5 +5 +5 +5 +5 +5 +1 +1 +1 +1 +1 +1 +5 +5 +5 +1 +1 +1 +1 +5 +5 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +5 +5 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +5 +5 +5 +5 +5 +5 +5 +1 +1 +1 +6 +6 +6 +6 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +6 +6 +6 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +5 +5 +5 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +6 +6 +6 +1 +1 +1 +1 +1 +1 +1 +1 +5 +5 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +6 +6 +6 +6 +1 +1 +1 +1 +1 +1 +5 +5 +5 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +5 +5 +5 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +1 +1 +1 +1 +1 +5 +5 +5 +1 +1 +1 +1 +1 +1 +5 +5 +5 +1 +1 +1 +1 +1 +1 +5 +5 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +5 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +6 +6 +6 +6 +1 +1 +1 +1 +6 +6 +6 +6 +6 +6 +6 +6 +6 +6 +6 +6 +6 +6 +6 +6 +6 +6 +6 +6 +6 +6 +6 +6 +6 +6 +6 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +6 +6 +6 +6 +6 +6 +6 +6 +6 +6 +6 +6 +6 +6 +6 +6 +6 +6 +6 +6 +6 +6 +6 +6 +6 +6 +6 +6 +6 +6 +6 +6 +6 +6 +1 +1 +1 +1 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +6 +6 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +6 +6 +6 +6 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +5 +5 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +5 +5 +5 +5 +5 +5 +5 +5 +1 +1 +1 +1 +1 +5 +5 +5 +5 +5 +5 +5 +5 +5 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +5 +5 +5 +1 +1 +1 +1 +1 +6 +6 +6 +6 +6 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +6 +6 +6 +1 +1 +1 +1 +1 +1 +1 +1 +5 +5 +5 +1 +1 +1 +1 +1 +1 +1 +6 +6 +6 +1 +1 +1 +1 +1 +1 +5 +5 +5 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +6 +6 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +5 +5 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +1 +1 +1 +1 +1 +1 +1 +6 +6 +6 +5 +5 +5 +5 +5 +5 +5 +1 +1 +1 +1 +1 +1 +1 +2 +2 +2 +2 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +1 +1 +1 +1 +1 +1 +1 +1 +6 +6 +1 +1 +1 +6 +6 +6 +6 +6 +1 +1 +1 +6 +6 +6 +6 +6 +6 +6 +6 +6 +6 +6 +6 +6 +6 +6 +6 +6 +6 +6 +6 +6 +6 +6 +6 +6 +6 +6 +6 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +6 +6 +6 +6 +6 +6 +6 +6 +6 +6 +6 +6 +6 +6 +6 +6 +6 +6 +6 +6 +6 +6 +6 +6 +6 +6 +6 +6 +6 +6 +6 +6 +6 +6 +1 +1 +5 +5 +5 +5 +5 +5 +1 +1 +1 +1 +1 +1 +1 +1 +1 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +6 +6 +6 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +5 +5 +5 +1 +1 +1 +1 +1 +1 +1 +1 +6 +6 +6 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +5 +5 +5 +5 +5 +5 +5 +5 +1 +1 +1 +1 +1 +5 +5 +5 +5 +5 +5 +5 +1 +1 +1 +1 +1 +1 +1 +5 +5 +5 +5 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +1 +1 +1 +1 +1 +1 +1 +1 +6 +6 +6 +6 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 diff --git a/racecar.cpp b/racecar.cpp index 4de66d8..d724720 100644 --- a/racecar.cpp +++ b/racecar.cpp @@ -1,6 +1,6 @@ #include "racecar.h" -Racecar::Racecar(float maxSpeed, float acceleration, float steerSpeed) +Racecar::Racecar(float maxSpeed, float acceleration, float steerSpeed, sf::Color color) : maxSpeed(maxSpeed), acceleration(acceleration), steerSpeed(steerSpeed), dx(0), dy(0), steeringAngle(3.13) { if (!font.loadFromFile("cascaydia.otf")) { std::cerr << "Failed to load font" << std::endl; @@ -10,7 +10,7 @@ Racecar::Racecar(float maxSpeed, float acceleration, float steerSpeed) carText.setString("|:=:>"); // Replace "o" with a racecar emoji or any desired character carText.setFont(font); carText.setCharacterSize(12); - carText.setFillColor(sf::Color::White); + carText.setFillColor(color); speed = 0; } diff --git a/racecar.h b/racecar.h index bc310e8..c9b0c6b 100644 --- a/racecar.h +++ b/racecar.h @@ -7,7 +7,7 @@ class Racecar { public: - Racecar(float maxSpeed, float acceleration, float steerSpeed); + Racecar(float maxSpeed, float acceleration, float steerSpeed, sf::Color color); void update(float dt); void accelerate(float dt); void boost(float dt); diff --git a/terminal_racer b/terminal_racer index e871b25f3a90d277f98c3649ad1671ef9506371b..81be4bc947515f83c2448583fce15582fb6af43b 100755 GIT binary patch delta 37715 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