Compare commits
No commits in common. "81d3dd970aa26740bf9722a5e594c7a9d2e27c4e" and "6a83e9472d50e7687005920caf8bff22b399cb4b" have entirely different histories.
81d3dd970a
...
6a83e9472d
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
||||
.vscode/
|
249
Dungeon.cpp
Normal file
249
Dungeon.cpp
Normal file
@ -0,0 +1,249 @@
|
||||
#include <iostream>
|
||||
|
||||
#include "Dungeon.h"
|
||||
|
||||
using namespace std;
|
||||
|
||||
Dungeon::Dungeon(Player p) {
|
||||
player = p;
|
||||
}
|
||||
|
||||
void Dungeon::printActions(int numActions, string actions[]) {
|
||||
cout << "\nChoose an action:\n";
|
||||
|
||||
for (int i = 0; i < numActions; i++) {
|
||||
cout << actions[i] << "\n";
|
||||
}
|
||||
}
|
||||
|
||||
void Dungeon::handleLootActions(Room *room) {
|
||||
vector<Item> items = room->items;
|
||||
int size = room->items.size();
|
||||
|
||||
player.lootRoom(room);
|
||||
room->clearLoot();
|
||||
|
||||
for (int i = 0; i < size; i++) {
|
||||
cout << "You open the chest and find a " << items[i].name << "\n";
|
||||
cout << "Your health is now " << player.currentHealth << ", your attack is now " << player.attack << ", your defense is now " << player.defense << "\n";
|
||||
}
|
||||
}
|
||||
|
||||
void Dungeon::handleFightActions(GameCharacter *enemy) {
|
||||
string actions[] = {"a. Attack", "b. Retreat"};
|
||||
|
||||
while (true) {
|
||||
printActions(2, actions);
|
||||
|
||||
string input;
|
||||
cin >> input;
|
||||
|
||||
if (input == "a") {
|
||||
int damage = enemy->takeDamage(player.attack);
|
||||
cout << "Your attack does " << damage << " damage.\n";
|
||||
} else if (input == "b") {
|
||||
player.changeRooms(player.previousRoom);
|
||||
enterRoom(player.currentRoom);
|
||||
return;
|
||||
} else {
|
||||
cout << "Incorrect choice. Please try again.\n";
|
||||
}
|
||||
|
||||
if (enemy->isDead()) {
|
||||
cout << "You win! You have defeated the enemy " << enemy->name << ".\n";
|
||||
player.increaseStats(10, 5, 5);
|
||||
player.currentRoom->clearEnemies();
|
||||
return;
|
||||
}
|
||||
|
||||
int damage = player.takeDamage(enemy->attack);
|
||||
cout << "The " << enemy->name << " attacked and you took " << damage << " damage.\n";
|
||||
cout << "You now have " << player.currentHealth << " health.\n";
|
||||
|
||||
if (player.isDead()) {
|
||||
cout << "You have been defeated...";
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void Dungeon::handleEmptyRoom(Room *room) {
|
||||
cout << "You enter the room but it is empty.\n";
|
||||
string actions[] = {"a. Move to another room"};
|
||||
while (true) {
|
||||
printActions(1, actions);
|
||||
|
||||
string input;
|
||||
cin >> input;
|
||||
|
||||
if (input == "a") {
|
||||
return;
|
||||
} else {
|
||||
cout << "Incorrect choice. Please try again.\n";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void Dungeon::handleRoomWithChest(Room *room) {
|
||||
cout << "You enter the room and see a large chest in the middle.\n";
|
||||
string actions[] = {"a. Loot the chest", "b. Move to another room"};
|
||||
while (true) {
|
||||
printActions(2, actions);
|
||||
|
||||
string input;
|
||||
cin >> input;
|
||||
|
||||
if (input == "a") {
|
||||
handleLootActions(room);
|
||||
return;
|
||||
} else if (input == "b") {
|
||||
return;
|
||||
} else {
|
||||
cout << "Incorrect choice. Please try again.\n";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void Dungeon::handleRoomWithEnemy(Room *room) {
|
||||
GameCharacter enemy = room->enemies.front();
|
||||
cout << "You enter the room and see a " << enemy.name << " in the middle.\n";
|
||||
string actions[] = {"a. Fight the " + enemy.name, "b. Go back to previous room"};
|
||||
while (true) {
|
||||
printActions(2, actions);
|
||||
|
||||
string input;
|
||||
cin >> input;
|
||||
|
||||
if (input == "a") {
|
||||
handleFightActions(&enemy);
|
||||
return;
|
||||
} else if (input == "b") {
|
||||
player.changeRooms(player.previousRoom);
|
||||
enterRoom(player.currentRoom);
|
||||
return;
|
||||
} else {
|
||||
cout << "Incorrect choice. Please try again.\n";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void Dungeon::enterRoom(Room *room) {
|
||||
if (room->enemies.size() > 0) {
|
||||
handleRoomWithEnemy(room);
|
||||
} else if (room->items.size() > 0) {
|
||||
handleRoomWithChest(room);
|
||||
} else {
|
||||
handleEmptyRoom(room);
|
||||
}
|
||||
}
|
||||
|
||||
void Dungeon::handleMovementActions(Room *room) {
|
||||
while (true){
|
||||
if (room->position == 0) {
|
||||
string actions[] = {"a. Move right", "b. Move down"};
|
||||
printActions(2, actions);
|
||||
|
||||
string input;
|
||||
cin >> input;
|
||||
|
||||
if (input == "a") {
|
||||
player.changeRooms(&rooms[1]);
|
||||
return;
|
||||
} else if (input == "b") {
|
||||
player.changeRooms(&rooms[2]);
|
||||
return;
|
||||
} else {
|
||||
cout << "Incorrect choice. Please try again.\n";
|
||||
}
|
||||
}
|
||||
else if (room->position == 1) {
|
||||
string actions[] = {"a. Move left"};
|
||||
printActions(1, actions);
|
||||
|
||||
string input;
|
||||
cin >> input;
|
||||
|
||||
if (input == "a") {
|
||||
player.changeRooms(&rooms[0]);
|
||||
return;
|
||||
} else {
|
||||
cout << "Incorrect choice. Please try again.\n";
|
||||
}
|
||||
}
|
||||
else if (room->position == 2) {
|
||||
string actions[] = {"a. Move up", "b. Move right"};
|
||||
printActions(2, actions);
|
||||
|
||||
string input;
|
||||
cin >> input;
|
||||
|
||||
if (input == "a") {
|
||||
player.changeRooms(&rooms[0]);
|
||||
return;
|
||||
} else if (input == "b") {
|
||||
player.changeRooms(&rooms[3]);
|
||||
return;
|
||||
} else {
|
||||
cout << "Incorrect choice. Please try again.\n";
|
||||
}
|
||||
}
|
||||
else {
|
||||
string actions[] = {"a. Move left"};
|
||||
printActions(1, actions);
|
||||
|
||||
string input;
|
||||
cin >> input;
|
||||
|
||||
if (input == "a") {
|
||||
player.changeRooms(&rooms[2]);
|
||||
return;
|
||||
} else {
|
||||
cout << "Incorrect choice. Please try again.\n";
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int Dungeon::performEndGameLogic() {
|
||||
while (true) {
|
||||
string actions[] = {"a. Yes", "b. No"};
|
||||
printActions(2, actions);
|
||||
|
||||
string input;
|
||||
cin >> input;
|
||||
|
||||
if (input == "a") {
|
||||
return 1;
|
||||
} else if (input == "b") {
|
||||
return 0;
|
||||
} else {
|
||||
cout << "Incorrect choice. Please try again.\n";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int Dungeon::runDungeon() {
|
||||
cout << "Welcome to the dungeon! Inside you will find treasure but also enemies. Enter at your peril!\n";
|
||||
|
||||
player.currentRoom = &rooms[0];
|
||||
player.previousRoom = &rooms[0];
|
||||
|
||||
while (true) {
|
||||
enterRoom(player.currentRoom);
|
||||
|
||||
if (player.isDead()) {
|
||||
cout << "Game over! Try again?\n";
|
||||
return performEndGameLogic();
|
||||
} else {
|
||||
if (player.currentRoom->isExit) {
|
||||
if (player.currentRoom->enemies.size() <= 0) {
|
||||
cout << "You win! Play again?\n";
|
||||
return performEndGameLogic();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
handleMovementActions(player.currentRoom);
|
||||
}
|
||||
}
|
26
Dungeon.h
Normal file
26
Dungeon.h
Normal file
@ -0,0 +1,26 @@
|
||||
#include "Player.h"
|
||||
|
||||
#ifndef DUNGEON_H
|
||||
#define DUNGEON_H
|
||||
|
||||
class Dungeon{
|
||||
public:
|
||||
Player player;
|
||||
Room rooms[4];
|
||||
Dungeon(Player);
|
||||
|
||||
int runDungeon();
|
||||
void enterRoom(Room *);
|
||||
void handleEmptyRoom(Room *);
|
||||
void handleRoomWithChest(Room *);
|
||||
void handleRoomWithEnemy(Room *);
|
||||
|
||||
void handleLootActions(Room *);
|
||||
void handleFightActions(GameCharacter *);
|
||||
void handleMovementActions(Room *);
|
||||
|
||||
void printActions(int, string[]);
|
||||
int performEndGameLogic();
|
||||
};
|
||||
|
||||
#endif
|
24
GameCharacter.cpp
Normal file
24
GameCharacter.cpp
Normal file
@ -0,0 +1,24 @@
|
||||
#include "GameCharacter.h"
|
||||
|
||||
GameCharacter::GameCharacter(string n, int h, int a, int d) {
|
||||
name = n;
|
||||
maxHealth = h;
|
||||
currentHealth = h;
|
||||
attack = a;
|
||||
defense = d;
|
||||
}
|
||||
|
||||
int GameCharacter::takeDamage(int amount) {
|
||||
int damage = amount - defense;
|
||||
|
||||
if (damage < 0) {
|
||||
damage = 0;
|
||||
}
|
||||
|
||||
currentHealth -= damage;
|
||||
return damage;
|
||||
}
|
||||
|
||||
bool GameCharacter::isDead() {
|
||||
return currentHealth <= 0;
|
||||
}
|
18
GameCharacter.h
Normal file
18
GameCharacter.h
Normal file
@ -0,0 +1,18 @@
|
||||
#include <string>
|
||||
|
||||
#ifndef GAMECHARACTER_H
|
||||
#define GAMECHARACTER_H
|
||||
|
||||
using namespace std;
|
||||
|
||||
class GameCharacter{
|
||||
public:
|
||||
string name;
|
||||
int maxHealth, currentHealth, attack, defense;
|
||||
GameCharacter(string, int, int, int);
|
||||
|
||||
int takeDamage(int);
|
||||
bool isDead();
|
||||
};
|
||||
|
||||
#endif
|
8
Item.cpp
Normal file
8
Item.cpp
Normal file
@ -0,0 +1,8 @@
|
||||
#include "Item.h"
|
||||
|
||||
Item::Item(string n, int h, int a, int d) {
|
||||
name = n;
|
||||
health = h;
|
||||
attack = a;
|
||||
defense = d;
|
||||
}
|
15
Item.h
Normal file
15
Item.h
Normal file
@ -0,0 +1,15 @@
|
||||
#include <string>
|
||||
|
||||
#ifndef ITEM_H
|
||||
#define ITEM_H
|
||||
|
||||
using namespace std;
|
||||
|
||||
class Item {
|
||||
public:
|
||||
string name;
|
||||
int health, attack, defense;
|
||||
Item(string, int, int, int);
|
||||
};
|
||||
|
||||
#endif
|
31
Player.cpp
Normal file
31
Player.cpp
Normal file
@ -0,0 +1,31 @@
|
||||
#include "Player.h"
|
||||
|
||||
Player::Player(string n, int h, int a, int d): GameCharacter(n, h, a, d) {
|
||||
Item dagger = Item("Dagger", 0, 5, 0);
|
||||
addItem(dagger);
|
||||
}
|
||||
|
||||
void Player::addItem(Item item) {
|
||||
inventory.push_back(item);
|
||||
increaseStats(item.health, item.attack, item.defense);
|
||||
}
|
||||
|
||||
void Player::increaseStats(int h, int a, int d) {
|
||||
currentHealth += h;
|
||||
maxHealth += h;
|
||||
attack += a;
|
||||
defense += d;
|
||||
}
|
||||
|
||||
void Player::lootRoom(Room * room) {
|
||||
vector<Item> items = room->items;
|
||||
|
||||
for (int i = 0; i < items.size(); i++) {
|
||||
addItem(items[i]);
|
||||
}
|
||||
}
|
||||
|
||||
void Player::changeRooms(Room * newRoom) {
|
||||
previousRoom = currentRoom;
|
||||
currentRoom = newRoom;
|
||||
}
|
19
Player.h
Normal file
19
Player.h
Normal file
@ -0,0 +1,19 @@
|
||||
#include "Room.h"
|
||||
|
||||
#ifndef PLAYER_H
|
||||
#define PLAYER_H
|
||||
|
||||
class Player: public GameCharacter {
|
||||
public:
|
||||
Room *currentRoom, *previousRoom;
|
||||
vector<Item> inventory;
|
||||
Player(string = "", int = 0, int = 0, int = 0);
|
||||
|
||||
void addItem(Item);
|
||||
void increaseStats(int, int, int);
|
||||
void lootRoom(Room*);
|
||||
void changeRooms(Room*);
|
||||
};
|
||||
|
||||
#endif
|
||||
|
16
Room.cpp
Normal file
16
Room.cpp
Normal file
@ -0,0 +1,16 @@
|
||||
#include "Room.h"
|
||||
|
||||
Room::Room(int p, bool ie, vector<Item> is, vector<GameCharacter> gcs) {
|
||||
position = p;
|
||||
isExit = ie;
|
||||
items = is;
|
||||
enemies = gcs;
|
||||
}
|
||||
|
||||
void Room::clearLoot() {
|
||||
items.clear();
|
||||
}
|
||||
|
||||
void Room::clearEnemies() {
|
||||
enemies.clear();
|
||||
}
|
21
Room.h
Normal file
21
Room.h
Normal file
@ -0,0 +1,21 @@
|
||||
#include <vector>
|
||||
|
||||
#include "Item.h"
|
||||
#include "GameCharacter.h"
|
||||
|
||||
#ifndef ROOM_H
|
||||
#define ROOM_H
|
||||
|
||||
class Room {
|
||||
public:
|
||||
int position;
|
||||
bool isExit;
|
||||
vector<Item> items;
|
||||
vector<GameCharacter> enemies;
|
||||
Room(int = 0, bool = false, vector<Item> = vector<Item>(), vector<GameCharacter> = vector<GameCharacter>());
|
||||
|
||||
void clearLoot();
|
||||
void clearEnemies();
|
||||
};
|
||||
|
||||
#endif
|
42
main.cpp
Normal file
42
main.cpp
Normal file
@ -0,0 +1,42 @@
|
||||
#include <iostream>
|
||||
|
||||
#include "Dungeon.cpp"
|
||||
#include "GameCharacter.cpp"
|
||||
#include "Player.cpp"
|
||||
#include "Item.cpp"
|
||||
#include "Room.cpp"
|
||||
|
||||
using namespace std;
|
||||
|
||||
int main() {
|
||||
cout << "Welcome to our dungeon crawler! What is your name?\n";
|
||||
string name;
|
||||
cin >> name;
|
||||
|
||||
Player player = Player(name, 100, 30, 5);
|
||||
|
||||
Item sword = Item("Sword", 0, 50, 0);
|
||||
GameCharacter smallEnemy = GameCharacter("Pilon", 30, 10, 5);
|
||||
GameCharacter bigEnemy = GameCharacter("Grand Pilon", 75, 60, 25);
|
||||
|
||||
Room rooms[] = {
|
||||
Room(0, false, vector<Item>(), vector<GameCharacter>()),
|
||||
Room(1, false, vector<Item>({ sword }), vector<GameCharacter>()),
|
||||
Room(2, false, vector<Item>(), vector<GameCharacter>({ smallEnemy })),
|
||||
Room(3, true, vector<Item>(), vector<GameCharacter>({ bigEnemy})),
|
||||
};
|
||||
|
||||
Dungeon dungeon = Dungeon(player);
|
||||
dungeon.rooms[0] = rooms[0];
|
||||
dungeon.rooms[1] = rooms[1];
|
||||
dungeon.rooms[2] = rooms[2];
|
||||
dungeon.rooms[3] = rooms[3];
|
||||
|
||||
while (true) {
|
||||
int result = dungeon.runDungeon();
|
||||
if (result == 0) {
|
||||
cout << "Goodbye!";
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user