First "game" in C++

Started by
11 comments, last by markrodgers11 11 years, 6 months ago
I posted this in another thread, but I thought it'd be helpful here too.

This might be a bit more complex than what you are looking for, but here's a simple example I put together for the heck of it. There are 5 source files for this, and I'll list them here, but it's generic enough, it should handle a good, fun game. The only thing I would modify is better handling of SpecializedCheck() function. I think this should be integrated into the rooms as well.

// TItem.h Handles Items in a text Adventure Game
#ifndef TITEM_H
#define TITEM_H
#include <string>
class TItem
{
public:
TItem(std::string name, std::string description) :
Name(name),
Description(description),
HasBeenUsed(false) {}
~TItem() {}
bool IsUsable() { return !HasBeenUsed; }
void UseItem() { HasBeenUsed = true; }
std::string GetName() { return Name; }
std::string getDescription() { return Description; }
private:
std::string Name;
std::string Description;
bool HasBeenUsed;
};
#endif



// TRoom.h Handles Rooms in a text Adventure Game
#ifndef TROOM_H
#define TROOM_H
#include <string>
#include <vector>
#include "TItem.h"
#include "TPlayer.h"
class TRoom
{
public:
TRoom(std::string description, std::string name);
~TRoom() {}
// AddItem puts an item in the room to be displayed when looking, and get be picked up
// an "Item" (which can be carried in your inventory, used, and picked up) should
// probably be it's own class, and you would pass it to Add Item. it would have a name, and a description at least.
void AddItem(TItem item);
// SetExit set a room to move to when going that direction
void SetExit(std::string exitDirection, std::string roomConnection, bool enabled = true);
void EnableExit(std::string direction, bool enabled);
// Update handles the command given to it, like "look" will print the Description
// it returns the new room to move to
void TRoom::Update(std::string command, std::string& currentRoom, TPlayer &player);
std::string GetName();
std::string GetDescription();
// Allows you to change the description
void SetDescription(std::string description);
private:
// structure to store the exits
struct ExitInfo {
std::string Direction;
std::string RoomToMove;
bool IsEnabled;
};
std::string Name;
std::string Description;
std::vector<ExitInfo> RoomsToMove;
std::vector<TItem> Items;
};
#endif



// Player.h Handles Player in a text Adventure Game
#ifndef TPLAYER_H
#define TPLAYER_H
#include <string>
#include "TItem.h"
class TPlayer
{
public:
TPlayer(std::string name) :
Name(name) {}
~TPlayer() {}
void AddItem(TItem item)
{ Inventory.push_back(item); }
bool UseItem(std::string itemName)
{
for (int i = 0; i < Inventory.size(); i++) {
if (Inventory.GetName() == itemName &&
Inventory.IsUsable()) {
Inventory.UseItem();
return true;
}
}
return false;
}
void GetInventory(std::vector<TItem>& items)
{ items = Inventory; }
std::string GetName() { return Name; }
private:
std::string Name;
std::vector<TItem> Inventory;
};
#endif



// TRoom.cpp Handles Rooms in a text Adventure Game
#include "TRoom.h"
#include <iostream>
TRoom::TRoom(std::string description, std::string name)
{
Description = description;
Name = name;
}
void TRoom::AddItem(TItem item)
{
Items.push_back(item);
}
void TRoom::SetExit(std::string exitDirection, std::string roomConnection, bool enabled)
{
ExitInfo exitInfo;
exitInfo.Direction = exitDirection;
exitInfo.RoomToMove = roomConnection;
exitInfo.IsEnabled = enabled;
RoomsToMove.push_back(exitInfo);
}
void TRoom::EnableExit(std::string direction, bool enabled)
{
for (int i = 0; i < RoomsToMove.size(); i++) {
if (RoomsToMove.Direction == direction) {
RoomsToMove.IsEnabled = enabled;
break;
}
}
}
void TRoom::Update(std::string command, std::string& currentRoom,
TPlayer &player)
{
// Check for look first
if (command == "look" || command == "l") {
std::cout << Description << std::endl;
for (int i = 0; i < Items.size(); i++) {
std::cout << "You see a " << Items.GetName() << std::endl;
}

std::cout << "Valid Exits are:";
for (int i = 0; i < RoomsToMove.size(); i++) {
if (RoomsToMove.IsEnabled) {
std::cout << " " << RoomsToMove.Direction;
}
}
return;
}
if (command.compare(0, 4, "get ") == 0) {
// Someone typed "get <object>", see if we have the <object>

std::string object = command.substr(4);
for (int i = 0; i < Items.size(); i++) {
if (Items.GetName() == object) {
// we have the item, give it to the player
std::cout << "You pick up " << object << " and carry it with you.";
player.AddItem(Items);
// remove the item from our vector
Items.erase(Items.begin() + i);
return;
}
}
std::cout << "You cannot pickup " << object;
return;
}
// Check for a direction
for (int i = 0; i < RoomsToMove.size(); i++) {
if (command == RoomsToMove.Direction && RoomsToMove.IsEnabled) {
// Move to this room
currentRoom = RoomsToMove.RoomToMove;
return;
}
}
std::cout << "I do not understand " << command;
return;
}
std::string TRoom::GetDescription()
{
return Description;
}
void TRoom::SetDescription(std::string description)
{
Description = description;
}
std::string TRoom::GetName()
{
return Name;
}



// GameMain.cpp Handles The mian loop in a text Adventure Game
#include "TRoom.h"
#include "TPlayer.h"
#include <iostream>
void LoadRooms();
bool CheckStandardInput(std::string input, bool &bRunning);
bool SpecializedCheck(std::string input, TPlayer &player,
TRoom &currentRoom, bool &bRunning);
// The vector holding all the rooms
std::vector<TRoom> Rooms;
int main(int argc, char *argv[])
{
LoadRooms();
TPlayer Player("Mark");
std::cout << "Hello " << Player.GetName() << " Welcome to My test Adventure Game.";
bool bRunning = true;
TRoom &CurrentRoom = Rooms.front();
// Print the first room's description
std::string temp;
CurrentRoom.Update("l", temp, Player);
while(bRunning) {
std::string input;
std::cout << std::endl << "> ";
getline( std::cin, input, '\n' );
//std::cin >> input;

if (!CheckStandardInput(input, bRunning)) {
// Perform Specialized check (for specific things)
if (!SpecializedCheck(input, Player, CurrentRoom, bRunning)) {
std::string roomName = CurrentRoom.GetName();
CurrentRoom.Update(input, roomName, Player);
// Change rooms
if (roomName != CurrentRoom.GetName()) {
for (int i = 0; i < Rooms.size(); i++) {
if (Rooms.GetName() == roomName) {
CurrentRoom = Rooms;

// Print new rooms description
CurrentRoom.Update("l", roomName, Player);
break;
}
}
}
}
}
}
std::cout << "Thanks for Playing!";
}
void LoadRooms()
{
// Typically, you would load the rooms from a file here, but I'll hard code it for now
// We create the rooms then link them togetehr After
TRoom Closest("You Are in a Large Closest. There is an Exit to the North.", "Closest");
// This room has a broom
TItem Broom("broom", "It's an old Broom.");
Closest.AddItem(Broom);
// The Closest is linked to a kitchen
TRoom Kitchen("This is an old kitchen, With a Dirty Floor. There is an exit to the south.", "Kitchen");
// No Item, but if you use Broom, it will show a trap door leading down
TRoom TreasureRoom("You've Found a Treasure Room with chests filled with Gold! You can retire rich now. Congratulations!", "TreasureRoom");
// now set the exits; Trap door going down not set yet, so make usable false
Closest.SetExit("n", Kitchen.GetName());
Kitchen.SetExit("s", Closest.GetName());
Kitchen.SetExit("d", TreasureRoom.GetName(), false);
TreasureRoom.SetExit("u", Kitchen.GetName());
Rooms.push_back(Closest);
Rooms.push_back(Kitchen);
Rooms.push_back(TreasureRoom);
}
bool CheckStandardInput(std::string input, bool &bRunning)
{
if (input == "q" || input == "quit") {
bRunning = false;
return true;
}
if (input == "h" || input == "help") {
std::cout << "Commands are: get, use, n, s, e, w, u, and d";
return true;
}
return false;
}
bool SpecializedCheck(std::string input, TPlayer &player,
TRoom &currentRoom, bool &bRunning)
{
// only special command is "use broom" if the player has the broom and he's in the kitchen
if (input == "use broom") {
// UseItem() will only wirk if player has it and it hasn't been used
if (currentRoom.GetName() == "Kitchen" && player.UseItem("broom")) {
std::cout << "You sweep the floor, and find a trap door leading Down!";

// Change the room's description and set exit usable
currentRoom.SetDescription("This is an old kitchen. There is an exit to the south. You've uncovered a trap door leading down.");
currentRoom.EnableExit("d", true);
return true;
}
}
return false;
}

My Gamedev Journal: 2D Game Making, the Easy Way

---(Old Blog, still has good info): 2dGameMaking
-----
"No one ever posts on that message board; it's too crowded." - Yoga Berra (sorta)

Advertisement
Oops, there's a little bug in my code. I was assigning a separate TRoom CurrentRoom from the Rooms vector, but that wasn't holding the changes to the actual rooms themselves. Here's the updated main() function:



int main(int argc, char *argv[])
{
LoadRooms();
TPlayer Player("Mark");
std::cout << "Hello " << Player.GetName() << " Welcome to My test Adventure Game.";
bool bRunning = true;
int currentRoom = 0;
// Print the first room's description
std::string temp;
Rooms[currentRoom].Update("l", temp, Player);
while(bRunning) {
std::string input;
std::cout << std::endl << "> ";
getline( std::cin, input, '\n' );
//std::cin >> input;

if (!CheckStandardInput(input, bRunning)) {
// Perform Specialized check (for specific things)
if (!SpecializedCheck(input, Player, Rooms[currentRoom], bRunning)) {
std::string roomName = Rooms[currentRoom].GetName();
Rooms[currentRoom].Update(input, roomName, Player);
// Change rooms
if (roomName != Rooms[currentRoom].GetName()) {
for (int i = 0; i < Rooms.size(); i++) {
if (Rooms.GetName() == roomName) {
currentRoom = i;

// Print new rooms description
Rooms[currentRoom].Update("l", roomName, Player);
break;
}
}
}
}
}
}
std::cout << "Thanks for Playing!";
}

My Gamedev Journal: 2D Game Making, the Easy Way

---(Old Blog, still has good info): 2dGameMaking
-----
"No one ever posts on that message board; it's too crowded." - Yoga Berra (sorta)

wow thanks for the release in the source, once I find the time I will definitely setup a project and paste all your code it, study it, modify it to learn new things, etc!
Love looking at other people's source code, I find it a good way to study it, unless you have no idea what any of it is then its just like trying to read Chinese ;p

This topic is closed to new replies.

Advertisement