This commit is contained in:
thatscringebro 2023-10-11 16:09:30 -04:00
parent 52342fc91d
commit 151877b298
7 changed files with 2145 additions and 89 deletions

214
game.cpp
View File

@ -4,7 +4,7 @@
Game::Game() Game::Game()
:max_x(1000), max_y(800), direction(0), window(sf::VideoMode(max_x, max_y), "ASCII RACER"), :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")) { if (!font.loadFromFile("cascaydia.otf")) {
std::cerr << "Failed to load font" << std::endl; std::cerr << "Failed to load font" << std::endl;
exit(1); exit(1);
@ -39,6 +39,9 @@ Game::Game()
racecar.setPosition(1000, 80); // Set initial position for the racecar racecar.setPosition(1000, 80); // Set initial position for the racecar
racecar.setRotation(180); racecar.setRotation(180);
bot.setPosition(1000, 80); // Set initial position for the bot
bot.setRotation(180);
// Initialize the times and quadrants data structure // Initialize the times and quadrants data structure
timesAndQuadrants.push_back(std::make_pair(1, "00:00:000")); timesAndQuadrants.push_back(std::make_pair(1, "00:00:000"));
} }
@ -46,6 +49,8 @@ Game::Game()
void Game::run() { void Game::run() {
sf::Clock clock; sf::Clock clock;
loadPlayerMovesFromFile("player_moves.txt");
// Create a view that will follow the racecar // Create a view that will follow the racecar
view = sf::View(sf::FloatRect(0, 0, max_x, max_y)); view = sf::View(sf::FloatRect(0, 0, max_x, max_y));
view.setCenter(racecar.getX(), racecar.getY()); // Center the view on the racecar view.setCenter(racecar.getX(), racecar.getY()); // Center the view on the racecar
@ -53,11 +58,15 @@ void Game::run() {
backgroundMusic.setLoop(true); backgroundMusic.setLoop(true);
int currentMove = 0;
while (window.isOpen()) { while (window.isOpen()) {
float dt = clock.restart().asSeconds(); float dt = clock.restart().asSeconds();
if(lapPoints.size() < 3) { if(lapPoints.size() < 3) {
botMove(currentMove, dt);
currentMove++;
// Update game time // Update game time
sf::Time gameTime = gameTimeClock.getElapsedTime(); sf::Time gameTime = gameTimeClock.getElapsedTime();
@ -94,24 +103,42 @@ void Game::run() {
} }
if(lapPoints.size() < 3) { if(lapPoints.size() < 3) {
if (sf::Keyboard::isKeyPressed(sf::Keyboard::LShift)) { if (sf::Keyboard::isKeyPressed(sf::Keyboard::LShift)) {
if(nitro > 0) { if(nitro > 0) {
nitro--; nitro--;
float newX = racecar.getX() + ((racecar.getSpeed() + 1.1) * dt * cos(racecar.getRotation())); float newX = racecar.getX() + ((racecar.getSpeed() + 1.1) * dt * cos(racecar.getRotation()));
float newY = racecar.getY() + ((racecar.getSpeed() + 1.1) * dt * sin(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; //std::cout << "New: " << newX << "," << newY << " Old: " << racecar.getX() << "," << racecar.getY() << std::endl;
if (!isTrackCollision(newX, newY)) { if (!isTrackCollision(newX, newY)) {
racecar.boost(dt); racecar.boost(dt);
//std::cout << nitro << std::endl; //std::cout << nitro << std::endl;
mapText.setOutlineThickness(0); mapText.setOutlineThickness(0);
} else { } else {
//racecar.stop(); //racecar.stop();
racecar.boost(dt); racecar.boost(dt);
modifier += 0.01; modifier += 0.01;
mapText.setOutlineThickness(6); 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) { if (racecar.getSpeed() < 0) {
racecar.brake(dt); racecar.brake(dt);
} else { } else {
@ -128,84 +155,68 @@ void Game::run() {
mapText.setOutlineThickness(6); mapText.setOutlineThickness(6);
} }
} }
} } else if (sf::Keyboard::isKeyPressed(sf::Keyboard::Down)) {
} else if (sf::Keyboard::isKeyPressed(sf::Keyboard::Up)) { if (racecar.getSpeed() > 0) {
if (racecar.getSpeed() < 0) { racecar.brake(dt);
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 { } else {
//racecar.stop(); float newX = racecar.getX() + ((racecar.getSpeed() + 1.1) * dt * cos(racecar.getRotation()));
modifier += 0.01; float newY = racecar.getY() + ((racecar.getSpeed() + 1.1) * dt * sin(racecar.getRotation()));
mapText.setOutlineThickness(6); //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 { } else {
float newX = racecar.getX() + ((racecar.getSpeed() + 1.1) * dt * cos(racecar.getRotation())); racecar.decelerate(dt);
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 {
racecar.decelerate(dt);
}
if (sf::Keyboard::isKeyPressed(sf::Keyboard::Left)) { if (sf::Keyboard::isKeyPressed(sf::Keyboard::Left)) {
racecar.steer(dt, -1.0f); // Steer left racecar.steer(dt, -1.0f); // Steer left
} else if (sf::Keyboard::isKeyPressed(sf::Keyboard::Right)) { } else if (sf::Keyboard::isKeyPressed(sf::Keyboard::Right)) {
racecar.steer(dt, 1.0f); // Steer right racecar.steer(dt, 1.0f); // Steer right
} }
racecar.update(dt); racecar.update(dt);
bot.update(dt);
nitroText.setString("Nitro: " + std::to_string(nitro)); nitroText.setString("Nitro: " + std::to_string(nitro));
nitroText.setCharacterSize(24); nitroText.setCharacterSize(24);
nitroText.setFillColor(sf::Color::White); nitroText.setFillColor(sf::Color::White);
nitroText.setPosition(racecar.getX() - 475, racecar.getY() + 300); nitroText.setPosition(racecar.getX() - 475, racecar.getY() + 300);
speedText.setString(std::to_string(static_cast<int>(racecar.getSpeed())) + " km/h"); speedText.setString(std::to_string(static_cast<int>(racecar.getSpeed())) + " km/h");
speedText.setCharacterSize(24); speedText.setCharacterSize(24);
speedText.setFillColor(sf::Color::Green); speedText.setFillColor(sf::Color::Green);
speedText.setPosition(racecar.getX() - 475, racecar.getY() + 350); speedText.setPosition(racecar.getX() - 475, racecar.getY() + 350);
if(racecar.getSpeed() < 0){ if(racecar.getSpeed() < 0){
speedText.setFillColor(sf::Color::Blue); speedText.setFillColor(sf::Color::Blue);
} }
if(racecar.getSpeed() >= 250){ if(racecar.getSpeed() >= 250){
speedText.setCharacterSize(27); speedText.setCharacterSize(27);
speedText.setFillColor(sf::Color::Yellow); speedText.setFillColor(sf::Color::Yellow);
} }
if(racecar.getSpeed() >= 360){ if(racecar.getSpeed() >= 360){
speedText.setCharacterSize(30); speedText.setCharacterSize(30);
speedText.setFillColor(sf::Color::Red); speedText.setFillColor(sf::Color::Red);
} }
timerText.setPosition(racecar.getX() - 80, racecar.getY() - 350); timerText.setPosition(racecar.getX() - 80, racecar.getY() - 350);
// Update the view to follow the racecar // Update the view to follow the racecar
view.setCenter(racecar.getX(), racecar.getY()); view.setCenter(racecar.getX(), racecar.getY());
window.setView(view); window.setView(view);
} }
window.clear(); window.clear();
mapText.setString(asciiMap); mapText.setString(asciiMap);
window.draw(mapText); window.draw(mapText);
window.draw(racecar.getDrawable()); window.draw(racecar.getDrawable());
window.draw(bot.getDrawable());
window.draw(speedText); window.draw(speedText);
window.draw(nitroText); 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;
}
}

4
game.h
View File

@ -20,6 +20,8 @@ public:
void displayEndGame(); void displayEndGame();
void loadHighScores(); void loadHighScores();
void writeHighScores(); void writeHighScores();
void loadPlayerMovesFromFile(const std::string& filename);
void botMove(int i, float dt);
private: private:
int max_x; int max_x;
@ -34,6 +36,8 @@ private:
sf::Clock gameTimeClock; sf::Clock gameTimeClock;
sf::View view; sf::View view;
Racecar racecar; Racecar racecar;
Racecar bot;
std::vector<int> lastPlayerMoves;
std::vector<std::pair<int, std::string>> timesAndQuadrants; // Store times and quadrants std::vector<std::pair<int, std::string>> timesAndQuadrants; // Store times and quadrants
bool lapFinished; bool lapFinished;
unsigned int lastRound = 0; unsigned int lastRound = 0;

View File

@ -1,2 +1,3 @@
79725 79725
79512 79512
78055

1999
player_moves.txt Normal file

File diff suppressed because it is too large Load Diff

View File

@ -1,6 +1,6 @@
#include "racecar.h" #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) { : maxSpeed(maxSpeed), acceleration(acceleration), steerSpeed(steerSpeed), dx(0), dy(0), steeringAngle(3.13) {
if (!font.loadFromFile("cascaydia.otf")) { if (!font.loadFromFile("cascaydia.otf")) {
std::cerr << "Failed to load font" << std::endl; 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.setString("|:=:>"); // Replace "o" with a racecar emoji or any desired character
carText.setFont(font); carText.setFont(font);
carText.setCharacterSize(12); carText.setCharacterSize(12);
carText.setFillColor(sf::Color::White); carText.setFillColor(color);
speed = 0; speed = 0;
} }

View File

@ -7,7 +7,7 @@
class Racecar { class Racecar {
public: public:
Racecar(float maxSpeed, float acceleration, float steerSpeed); Racecar(float maxSpeed, float acceleration, float steerSpeed, sf::Color color);
void update(float dt); void update(float dt);
void accelerate(float dt); void accelerate(float dt);
void boost(float dt); void boost(float dt);

Binary file not shown.