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

224
game.cpp
View File

@ -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<int>(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<int>(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;
}
}

4
game.h
View File

@ -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<int> lastPlayerMoves;
std::vector<std::pair<int, std::string>> timesAndQuadrants; // Store times and quadrants
bool lapFinished;
unsigned int lastRound = 0;

View File

@ -1,2 +1,3 @@
79725
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"
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;
}

View File

@ -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);

Binary file not shown.