Adventure Game (text based) in C++Producer/Consumer implementation using condition_variableSimple multithreading C projectText-based adventure gameThe Mysts of Altair - text-based adventure gameText-based adventure survival horror gameFirst text-based adventure gameText based adventure game navigationText-based Adventure-Game EngineJava text-based adventure gameA little C++ based 2D game engine I madeShort text-based adventure gameText-based adventure and combat game
Do I need to be arrogant to get ahead?
Is it true that good novels will automatically sell themselves on Amazon (and so on) and there is no need for one to waste time promoting?
Does multi-classing into Fighter give you heavy armor proficiency?
Probably overheated black color SMD pads
How is the partial sum of a geometric sequence calculated?
What is the English word for a graduation award?
What is the reasoning behind the choice of 2^256-2^32-977 for the prime on the secp256k1 curve?
Do people actually use the word "kaputt" in conversation?
Coworker is lying about having kids. What should I do?
Maths symbols and unicode-math input inside siunitx commands
Dropping this riddle here
Are dual Irish/British citizens bound by the 90/180 day rule when travelling in the EU after Brexit?
A Ri-diddley-iley Riddle
Can "few" be used as a subject? If so, what is the rule?
Right piano pedal is bright
If "dar" means "to give", what does "daros" mean?
Deletion of copy-ctor & copy-assignment - public, private or protected?
Have the tides ever turned twice on any open problem?
Turning a hard to access nut?
I seem to dance, I am not a dancer. Who am I?
Why is indicated airspeed rather than ground speed used during the takeoff roll?
What is name of this 1927 town in Missouri?
Practical application of matrices and determinants
Do US professors/group leaders only get a salary, but no group budget?
Adventure Game (text based) in C++
Producer/Consumer implementation using condition_variableSimple multithreading C projectText-based adventure gameThe Mysts of Altair - text-based adventure gameText-based adventure survival horror gameFirst text-based adventure gameText based adventure game navigationText-based Adventure-Game EngineJava text-based adventure gameA little C++ based 2D game engine I madeShort text-based adventure gameText-based adventure and combat game
$begingroup$
I'm working on a simple text based adventure game. I've just finished working on the character creation portion. The code works perfectly fine when run, but I would just like to get some feedback to ensure that it checks off from a professional and efficient standpoint.
The values of the materials, weapons, and spells are representing the amount of damage points each does for further and future calculations with the characters stats later in the game.
The code itself essentially allows you to input a characters name. Then, the strength, stamina, and intellect is randomly generated so that your character build is different at the beginning of each game. Then, once that has finished, the code takes into account the weapon type, the material of the weapon, the spell type and adds additional damage based on the players stats.
I would just like to know if there is a better way of writing my code to make it look cleaner, or if there possibly any concerns that might cause me issues down the road when I add more functionality to the game. Seeing as I am a beginner to C++, I am not incredibly great at determining whether my code is optimal or not.
#include <iostream>
#include <string>
#include <ctime>
using namespace std;
/* Materials Structure */
typedef struct materials
int wood = 1, oak = 2, maple = 3, ash = 4, bronze = 2, iron = 3, steel = 4, mithril = 5, dragon = 6;
;
/* Weapon Structure */
typedef struct weapons
int dagger = 2, sword = 3, axe = 4, mace = 5, bow = 3, arrows = 2;
weapons;
/* Spell Structure */
typedef struct spells
int fire = 4, frost = 6, dark = 8, chaos = 10;
spells;
/* Character Structure */
typedef struct character
string name;
int health = 100, mana = 100, strength, stamina, intellect, weaponAttack, spellAttack, souls = 0;
spells spell;
weapons weapon;
materials material;
character;
/* Function Declaration */
character characterCreation(string name);
void printInfo(character createChar);
/* Main Function */
int main()
string characterName;
cout << "Please input character name: ";
cin >> characterName;
srand(time(NULL));
character player = characterCreation(characterName);
printInfo(player);
system("pause");
return 0;
/* Function Definition */
character characterCreation(string name)
character createChar;
createChar.name = name;
createChar.strength = rand() % 5 + 5;
createChar.stamina = rand() % 5 + 5;
createChar.intellect = rand() % 5 + 5;
createChar.health += 2 * createChar.stamina;
createChar.mana += 3 * createChar.intellect;
createChar.weaponAttack = (createChar.weapon.dagger * createChar.material.bronze) + (2 * createChar.strength);
createChar.spellAttack = (createChar.spell.fire + (createChar.intellect * 2));
return createChar;
void printInfo(character createChar)
cout << createChar.name << endl;
cout << createChar.health << endl;
cout << createChar.mana << endl;
cout << createChar.strength << endl;
cout << createChar.stamina << endl;
cout << createChar.intellect << endl;
cout << createChar.weaponAttack << endl;
cout << createChar.spellAttack << endl;
cout << createChar.souls << endl;
c++ beginner game adventure-game
New contributor
$endgroup$
add a comment |
$begingroup$
I'm working on a simple text based adventure game. I've just finished working on the character creation portion. The code works perfectly fine when run, but I would just like to get some feedback to ensure that it checks off from a professional and efficient standpoint.
The values of the materials, weapons, and spells are representing the amount of damage points each does for further and future calculations with the characters stats later in the game.
The code itself essentially allows you to input a characters name. Then, the strength, stamina, and intellect is randomly generated so that your character build is different at the beginning of each game. Then, once that has finished, the code takes into account the weapon type, the material of the weapon, the spell type and adds additional damage based on the players stats.
I would just like to know if there is a better way of writing my code to make it look cleaner, or if there possibly any concerns that might cause me issues down the road when I add more functionality to the game. Seeing as I am a beginner to C++, I am not incredibly great at determining whether my code is optimal or not.
#include <iostream>
#include <string>
#include <ctime>
using namespace std;
/* Materials Structure */
typedef struct materials
int wood = 1, oak = 2, maple = 3, ash = 4, bronze = 2, iron = 3, steel = 4, mithril = 5, dragon = 6;
;
/* Weapon Structure */
typedef struct weapons
int dagger = 2, sword = 3, axe = 4, mace = 5, bow = 3, arrows = 2;
weapons;
/* Spell Structure */
typedef struct spells
int fire = 4, frost = 6, dark = 8, chaos = 10;
spells;
/* Character Structure */
typedef struct character
string name;
int health = 100, mana = 100, strength, stamina, intellect, weaponAttack, spellAttack, souls = 0;
spells spell;
weapons weapon;
materials material;
character;
/* Function Declaration */
character characterCreation(string name);
void printInfo(character createChar);
/* Main Function */
int main()
string characterName;
cout << "Please input character name: ";
cin >> characterName;
srand(time(NULL));
character player = characterCreation(characterName);
printInfo(player);
system("pause");
return 0;
/* Function Definition */
character characterCreation(string name)
character createChar;
createChar.name = name;
createChar.strength = rand() % 5 + 5;
createChar.stamina = rand() % 5 + 5;
createChar.intellect = rand() % 5 + 5;
createChar.health += 2 * createChar.stamina;
createChar.mana += 3 * createChar.intellect;
createChar.weaponAttack = (createChar.weapon.dagger * createChar.material.bronze) + (2 * createChar.strength);
createChar.spellAttack = (createChar.spell.fire + (createChar.intellect * 2));
return createChar;
void printInfo(character createChar)
cout << createChar.name << endl;
cout << createChar.health << endl;
cout << createChar.mana << endl;
cout << createChar.strength << endl;
cout << createChar.stamina << endl;
cout << createChar.intellect << endl;
cout << createChar.weaponAttack << endl;
cout << createChar.spellAttack << endl;
cout << createChar.souls << endl;
c++ beginner game adventure-game
New contributor
$endgroup$
$begingroup$
Take a look at "ncurses" library.
$endgroup$
– outoftime
yesterday
1
$begingroup$
If your goal is to write a text adventure (and not just a C++ exercise), have a look at the existing text adventure engines such as TADS and Inform 7. If you still decide to go with C++, understanding the architecture and feature sets in the existing engines will advise you in your own code's larger design.
$endgroup$
– user117529
yesterday
add a comment |
$begingroup$
I'm working on a simple text based adventure game. I've just finished working on the character creation portion. The code works perfectly fine when run, but I would just like to get some feedback to ensure that it checks off from a professional and efficient standpoint.
The values of the materials, weapons, and spells are representing the amount of damage points each does for further and future calculations with the characters stats later in the game.
The code itself essentially allows you to input a characters name. Then, the strength, stamina, and intellect is randomly generated so that your character build is different at the beginning of each game. Then, once that has finished, the code takes into account the weapon type, the material of the weapon, the spell type and adds additional damage based on the players stats.
I would just like to know if there is a better way of writing my code to make it look cleaner, or if there possibly any concerns that might cause me issues down the road when I add more functionality to the game. Seeing as I am a beginner to C++, I am not incredibly great at determining whether my code is optimal or not.
#include <iostream>
#include <string>
#include <ctime>
using namespace std;
/* Materials Structure */
typedef struct materials
int wood = 1, oak = 2, maple = 3, ash = 4, bronze = 2, iron = 3, steel = 4, mithril = 5, dragon = 6;
;
/* Weapon Structure */
typedef struct weapons
int dagger = 2, sword = 3, axe = 4, mace = 5, bow = 3, arrows = 2;
weapons;
/* Spell Structure */
typedef struct spells
int fire = 4, frost = 6, dark = 8, chaos = 10;
spells;
/* Character Structure */
typedef struct character
string name;
int health = 100, mana = 100, strength, stamina, intellect, weaponAttack, spellAttack, souls = 0;
spells spell;
weapons weapon;
materials material;
character;
/* Function Declaration */
character characterCreation(string name);
void printInfo(character createChar);
/* Main Function */
int main()
string characterName;
cout << "Please input character name: ";
cin >> characterName;
srand(time(NULL));
character player = characterCreation(characterName);
printInfo(player);
system("pause");
return 0;
/* Function Definition */
character characterCreation(string name)
character createChar;
createChar.name = name;
createChar.strength = rand() % 5 + 5;
createChar.stamina = rand() % 5 + 5;
createChar.intellect = rand() % 5 + 5;
createChar.health += 2 * createChar.stamina;
createChar.mana += 3 * createChar.intellect;
createChar.weaponAttack = (createChar.weapon.dagger * createChar.material.bronze) + (2 * createChar.strength);
createChar.spellAttack = (createChar.spell.fire + (createChar.intellect * 2));
return createChar;
void printInfo(character createChar)
cout << createChar.name << endl;
cout << createChar.health << endl;
cout << createChar.mana << endl;
cout << createChar.strength << endl;
cout << createChar.stamina << endl;
cout << createChar.intellect << endl;
cout << createChar.weaponAttack << endl;
cout << createChar.spellAttack << endl;
cout << createChar.souls << endl;
c++ beginner game adventure-game
New contributor
$endgroup$
I'm working on a simple text based adventure game. I've just finished working on the character creation portion. The code works perfectly fine when run, but I would just like to get some feedback to ensure that it checks off from a professional and efficient standpoint.
The values of the materials, weapons, and spells are representing the amount of damage points each does for further and future calculations with the characters stats later in the game.
The code itself essentially allows you to input a characters name. Then, the strength, stamina, and intellect is randomly generated so that your character build is different at the beginning of each game. Then, once that has finished, the code takes into account the weapon type, the material of the weapon, the spell type and adds additional damage based on the players stats.
I would just like to know if there is a better way of writing my code to make it look cleaner, or if there possibly any concerns that might cause me issues down the road when I add more functionality to the game. Seeing as I am a beginner to C++, I am not incredibly great at determining whether my code is optimal or not.
#include <iostream>
#include <string>
#include <ctime>
using namespace std;
/* Materials Structure */
typedef struct materials
int wood = 1, oak = 2, maple = 3, ash = 4, bronze = 2, iron = 3, steel = 4, mithril = 5, dragon = 6;
;
/* Weapon Structure */
typedef struct weapons
int dagger = 2, sword = 3, axe = 4, mace = 5, bow = 3, arrows = 2;
weapons;
/* Spell Structure */
typedef struct spells
int fire = 4, frost = 6, dark = 8, chaos = 10;
spells;
/* Character Structure */
typedef struct character
string name;
int health = 100, mana = 100, strength, stamina, intellect, weaponAttack, spellAttack, souls = 0;
spells spell;
weapons weapon;
materials material;
character;
/* Function Declaration */
character characterCreation(string name);
void printInfo(character createChar);
/* Main Function */
int main()
string characterName;
cout << "Please input character name: ";
cin >> characterName;
srand(time(NULL));
character player = characterCreation(characterName);
printInfo(player);
system("pause");
return 0;
/* Function Definition */
character characterCreation(string name)
character createChar;
createChar.name = name;
createChar.strength = rand() % 5 + 5;
createChar.stamina = rand() % 5 + 5;
createChar.intellect = rand() % 5 + 5;
createChar.health += 2 * createChar.stamina;
createChar.mana += 3 * createChar.intellect;
createChar.weaponAttack = (createChar.weapon.dagger * createChar.material.bronze) + (2 * createChar.strength);
createChar.spellAttack = (createChar.spell.fire + (createChar.intellect * 2));
return createChar;
void printInfo(character createChar)
cout << createChar.name << endl;
cout << createChar.health << endl;
cout << createChar.mana << endl;
cout << createChar.strength << endl;
cout << createChar.stamina << endl;
cout << createChar.intellect << endl;
cout << createChar.weaponAttack << endl;
cout << createChar.spellAttack << endl;
cout << createChar.souls << endl;
c++ beginner game adventure-game
c++ beginner game adventure-game
New contributor
New contributor
edited 2 days ago
Justin
New contributor
asked 2 days ago
JustinJustin
613
613
New contributor
New contributor
$begingroup$
Take a look at "ncurses" library.
$endgroup$
– outoftime
yesterday
1
$begingroup$
If your goal is to write a text adventure (and not just a C++ exercise), have a look at the existing text adventure engines such as TADS and Inform 7. If you still decide to go with C++, understanding the architecture and feature sets in the existing engines will advise you in your own code's larger design.
$endgroup$
– user117529
yesterday
add a comment |
$begingroup$
Take a look at "ncurses" library.
$endgroup$
– outoftime
yesterday
1
$begingroup$
If your goal is to write a text adventure (and not just a C++ exercise), have a look at the existing text adventure engines such as TADS and Inform 7. If you still decide to go with C++, understanding the architecture and feature sets in the existing engines will advise you in your own code's larger design.
$endgroup$
– user117529
yesterday
$begingroup$
Take a look at "ncurses" library.
$endgroup$
– outoftime
yesterday
$begingroup$
Take a look at "ncurses" library.
$endgroup$
– outoftime
yesterday
1
1
$begingroup$
If your goal is to write a text adventure (and not just a C++ exercise), have a look at the existing text adventure engines such as TADS and Inform 7. If you still decide to go with C++, understanding the architecture and feature sets in the existing engines will advise you in your own code's larger design.
$endgroup$
– user117529
yesterday
$begingroup$
If your goal is to write a text adventure (and not just a C++ exercise), have a look at the existing text adventure engines such as TADS and Inform 7. If you still decide to go with C++, understanding the architecture and feature sets in the existing engines will advise you in your own code's larger design.
$endgroup$
– user117529
yesterday
add a comment |
3 Answers
3
active
oldest
votes
$begingroup$
typedef struct weapons
int dagger = 2, sword = 3, axe = 4, mace = 5, bow = 3, arrows = 2;
weapons;
The typedef struct X ... X;
pattern is a C-ism; in C++ you don't need the typedef and can just write struct X ... ;
.
You're creating a struct type named weapons
with a bunch of per-instance member variables. This is almost certainly not what you meant to do. Probably what you meant was
enum class Weapon
dagger = 2,
sword = 3,
axe = 4,
mace = 5,
;
so that you could later write
Weapon w = Weapon::sword;
if (w == Weapon::axe) ...
What you actually wrote, unfortunately, is simply nonsense.
character characterCreation(string name);
Look up the C++ notion of "constructors" (and also destructors). What you have here would normally be spelled something like
Character::Character(const std::string& name)
this->name = name;
this->strength = rand() % 5 + 5;
and so on.
Also consider writing yourself a helper function
int randint(int lo, int hi)
return rand() % (hi - lo) + lo;
so that you can write simply
this->strength = randint(5, 10);
Ninety percent of what we call "programming" is just finding sources of repetition and eliminating them.
$endgroup$
$begingroup$
I apologize, I should have clarified what my code is doing and what my expectations were. My post is not a troll, I prefer not to waste peoples time if I do not have to. I will make edits to the question. The numbers on the materials, weapons, and spells simply represent the amount of damage.
$endgroup$
– Justin
2 days ago
$begingroup$
Thank you for the insight and helpful post though. I will take a look at more constructors and destructors. I used the struct with the hopes that I would be able to create a large combination of different weapon types/spells, being that my class has only just begun using structs I am not too familiar with constructors/destructors.
$endgroup$
– Justin
2 days ago
$begingroup$
randint(5,10)
, as written, only generates 5 to 9, inclusive. You’d wanthi - lo + 1
to get the full range.
$endgroup$
– AJNeufeld
2 days ago
3
$begingroup$
@AJNeufeld: Half-open ranges are the building blocks of C++ (as well as most other programming languages), and the sooner OP gets familiar with them, the better. See here and here for places I've used the phrase "half-open range" in previous reviews.
$endgroup$
– Quuxplusone
2 days ago
add a comment |
$begingroup$
- Don't use
using namespace std
- Your comments add nothing to the program so leave them out. In general comments should tell you why not what. You should try to write self-explaining code. I.e. choose good names for your variables and functions so comments become almost unnecessary.
system("pause");
is not portable and can only be used on Windows.- Unless you depend on the return code you can omit
return 0
frommain
. See http://c0x.coding-guidelines.com/5.1.2.2.3.html. - It is better to use
random
than relying onsrand/rand
. You're also missing the header for it (<cstdlib>
) and the qualifier (std::
). See also https://channel9.msdn.com/Events/GoingNative/2013/rand-Considered-Harmful. - Prefer using
n
overstd::endl
In general you should read more about the Language and Programming. Here are some links to get you started:
- C++ book list
- C++ Super-FAQ
- C++ Core Guidelines
- cppreference
$endgroup$
add a comment |
$begingroup$
First, try not to declare all your types in the global namespace. Make your "own" space. This limits the exposure to other code you might integrate with.
Your materials
, weapons
, and spells
seem to be enum
candidates as they are used as values. So use them as enum-values and define there size explicitly. In this case I'm not recommending scoped enums since you want to do calculations easily on there values.
Added a constructor to your character
.
characterCreation
function should take string by universal reference to avoid unnecessary copies.
Have you print method take and ostream
so you easily can change to the any stream of your choosing.
namespace YourNamespaceName
enum materials : int
wood = 1, oak = 2, maple = 3, ash = 4, bronze = 2, iron = 3, steel = 4, mithril = 5, dragon = 6
;
enum weapons : int
dagger = 2, sword = 3, axe = 4, mace = 5, bow = 3, arrows = 2
;
enum spells : int
fire = 4, frost = 6, dark = 8, chaos = 10
;
struct character
explicit character(std::string &&name)
: name(std::move(name)), strength(rand() % 5 + 5), stamina(rand() % 5 + 5), intellect(rand() % 5 + 5),
weaponAttack(weapons::dagger * materials::bronze + 2 * strength),
spellAttack(spells::fire + intellect * 2)
health += 2 * stamina;
mana += 3 * intellect;
std::string name;
int health = 100, mana = 100, strength, stamina, intellect, weaponAttack, spellAttack, souls = 0;
;
// Function Declaration
character characterCreation(std::string &&name);
std::ostream &printInfo(std::ostream &os, const character &createChar);
// close YourNamespaceName namespace
// Main Function
int main()
std::string characterName;
std::cout << "Please input character name: ";
std::cin >> characterName;
std::srand(std::time(nullptr));
auto player = YourNamespaceName::characterCreation(std::move(characterName));
YourNamespaceName::printInfo(std::cout, player);
system("pause");
return 0;
namespace YourNamespaceName
// Function Definition
character characterCreation(std::string &&name)
return character(std::move(name));
std::ostream &printInfo(std::ostream &os, const character &createChar)
return os << createChar.name << 'n'
<< createChar.health << 'n'
<< createChar.mana << 'n'
<< createChar.strength << 'n'
<< createChar.stamina << 'n'
<< createChar.intellect << 'n'
<< createChar.weaponAttack << 'n'
<< createChar.spellAttack << 'n'
<< createChar.souls << 'n';
// close YourNamespaceName namespace
$endgroup$
add a comment |
Your Answer
StackExchange.ifUsing("editor", function ()
return StackExchange.using("mathjaxEditing", function ()
StackExchange.MarkdownEditor.creationCallbacks.add(function (editor, postfix)
StackExchange.mathjaxEditing.prepareWmdForMathJax(editor, postfix, [["\$", "\$"]]);
);
);
, "mathjax-editing");
StackExchange.ifUsing("editor", function ()
StackExchange.using("externalEditor", function ()
StackExchange.using("snippets", function ()
StackExchange.snippets.init();
);
);
, "code-snippets");
StackExchange.ready(function()
var channelOptions =
tags: "".split(" "),
id: "196"
;
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function()
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled)
StackExchange.using("snippets", function()
createEditor();
);
else
createEditor();
);
function createEditor()
StackExchange.prepareEditor(
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: false,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: null,
bindNavPrevention: true,
postfix: "",
imageUploader:
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
,
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
);
);
Justin is a new contributor. Be nice, and check out our Code of Conduct.
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fcodereview.stackexchange.com%2fquestions%2f215542%2fadventure-game-text-based-in-c%23new-answer', 'question_page');
);
Post as a guest
Required, but never shown
3 Answers
3
active
oldest
votes
3 Answers
3
active
oldest
votes
active
oldest
votes
active
oldest
votes
$begingroup$
typedef struct weapons
int dagger = 2, sword = 3, axe = 4, mace = 5, bow = 3, arrows = 2;
weapons;
The typedef struct X ... X;
pattern is a C-ism; in C++ you don't need the typedef and can just write struct X ... ;
.
You're creating a struct type named weapons
with a bunch of per-instance member variables. This is almost certainly not what you meant to do. Probably what you meant was
enum class Weapon
dagger = 2,
sword = 3,
axe = 4,
mace = 5,
;
so that you could later write
Weapon w = Weapon::sword;
if (w == Weapon::axe) ...
What you actually wrote, unfortunately, is simply nonsense.
character characterCreation(string name);
Look up the C++ notion of "constructors" (and also destructors). What you have here would normally be spelled something like
Character::Character(const std::string& name)
this->name = name;
this->strength = rand() % 5 + 5;
and so on.
Also consider writing yourself a helper function
int randint(int lo, int hi)
return rand() % (hi - lo) + lo;
so that you can write simply
this->strength = randint(5, 10);
Ninety percent of what we call "programming" is just finding sources of repetition and eliminating them.
$endgroup$
$begingroup$
I apologize, I should have clarified what my code is doing and what my expectations were. My post is not a troll, I prefer not to waste peoples time if I do not have to. I will make edits to the question. The numbers on the materials, weapons, and spells simply represent the amount of damage.
$endgroup$
– Justin
2 days ago
$begingroup$
Thank you for the insight and helpful post though. I will take a look at more constructors and destructors. I used the struct with the hopes that I would be able to create a large combination of different weapon types/spells, being that my class has only just begun using structs I am not too familiar with constructors/destructors.
$endgroup$
– Justin
2 days ago
$begingroup$
randint(5,10)
, as written, only generates 5 to 9, inclusive. You’d wanthi - lo + 1
to get the full range.
$endgroup$
– AJNeufeld
2 days ago
3
$begingroup$
@AJNeufeld: Half-open ranges are the building blocks of C++ (as well as most other programming languages), and the sooner OP gets familiar with them, the better. See here and here for places I've used the phrase "half-open range" in previous reviews.
$endgroup$
– Quuxplusone
2 days ago
add a comment |
$begingroup$
typedef struct weapons
int dagger = 2, sword = 3, axe = 4, mace = 5, bow = 3, arrows = 2;
weapons;
The typedef struct X ... X;
pattern is a C-ism; in C++ you don't need the typedef and can just write struct X ... ;
.
You're creating a struct type named weapons
with a bunch of per-instance member variables. This is almost certainly not what you meant to do. Probably what you meant was
enum class Weapon
dagger = 2,
sword = 3,
axe = 4,
mace = 5,
;
so that you could later write
Weapon w = Weapon::sword;
if (w == Weapon::axe) ...
What you actually wrote, unfortunately, is simply nonsense.
character characterCreation(string name);
Look up the C++ notion of "constructors" (and also destructors). What you have here would normally be spelled something like
Character::Character(const std::string& name)
this->name = name;
this->strength = rand() % 5 + 5;
and so on.
Also consider writing yourself a helper function
int randint(int lo, int hi)
return rand() % (hi - lo) + lo;
so that you can write simply
this->strength = randint(5, 10);
Ninety percent of what we call "programming" is just finding sources of repetition and eliminating them.
$endgroup$
$begingroup$
I apologize, I should have clarified what my code is doing and what my expectations were. My post is not a troll, I prefer not to waste peoples time if I do not have to. I will make edits to the question. The numbers on the materials, weapons, and spells simply represent the amount of damage.
$endgroup$
– Justin
2 days ago
$begingroup$
Thank you for the insight and helpful post though. I will take a look at more constructors and destructors. I used the struct with the hopes that I would be able to create a large combination of different weapon types/spells, being that my class has only just begun using structs I am not too familiar with constructors/destructors.
$endgroup$
– Justin
2 days ago
$begingroup$
randint(5,10)
, as written, only generates 5 to 9, inclusive. You’d wanthi - lo + 1
to get the full range.
$endgroup$
– AJNeufeld
2 days ago
3
$begingroup$
@AJNeufeld: Half-open ranges are the building blocks of C++ (as well as most other programming languages), and the sooner OP gets familiar with them, the better. See here and here for places I've used the phrase "half-open range" in previous reviews.
$endgroup$
– Quuxplusone
2 days ago
add a comment |
$begingroup$
typedef struct weapons
int dagger = 2, sword = 3, axe = 4, mace = 5, bow = 3, arrows = 2;
weapons;
The typedef struct X ... X;
pattern is a C-ism; in C++ you don't need the typedef and can just write struct X ... ;
.
You're creating a struct type named weapons
with a bunch of per-instance member variables. This is almost certainly not what you meant to do. Probably what you meant was
enum class Weapon
dagger = 2,
sword = 3,
axe = 4,
mace = 5,
;
so that you could later write
Weapon w = Weapon::sword;
if (w == Weapon::axe) ...
What you actually wrote, unfortunately, is simply nonsense.
character characterCreation(string name);
Look up the C++ notion of "constructors" (and also destructors). What you have here would normally be spelled something like
Character::Character(const std::string& name)
this->name = name;
this->strength = rand() % 5 + 5;
and so on.
Also consider writing yourself a helper function
int randint(int lo, int hi)
return rand() % (hi - lo) + lo;
so that you can write simply
this->strength = randint(5, 10);
Ninety percent of what we call "programming" is just finding sources of repetition and eliminating them.
$endgroup$
typedef struct weapons
int dagger = 2, sword = 3, axe = 4, mace = 5, bow = 3, arrows = 2;
weapons;
The typedef struct X ... X;
pattern is a C-ism; in C++ you don't need the typedef and can just write struct X ... ;
.
You're creating a struct type named weapons
with a bunch of per-instance member variables. This is almost certainly not what you meant to do. Probably what you meant was
enum class Weapon
dagger = 2,
sword = 3,
axe = 4,
mace = 5,
;
so that you could later write
Weapon w = Weapon::sword;
if (w == Weapon::axe) ...
What you actually wrote, unfortunately, is simply nonsense.
character characterCreation(string name);
Look up the C++ notion of "constructors" (and also destructors). What you have here would normally be spelled something like
Character::Character(const std::string& name)
this->name = name;
this->strength = rand() % 5 + 5;
and so on.
Also consider writing yourself a helper function
int randint(int lo, int hi)
return rand() % (hi - lo) + lo;
so that you can write simply
this->strength = randint(5, 10);
Ninety percent of what we call "programming" is just finding sources of repetition and eliminating them.
edited yesterday
Vogel612♦
21.9k447130
21.9k447130
answered 2 days ago
QuuxplusoneQuuxplusone
12.6k12061
12.6k12061
$begingroup$
I apologize, I should have clarified what my code is doing and what my expectations were. My post is not a troll, I prefer not to waste peoples time if I do not have to. I will make edits to the question. The numbers on the materials, weapons, and spells simply represent the amount of damage.
$endgroup$
– Justin
2 days ago
$begingroup$
Thank you for the insight and helpful post though. I will take a look at more constructors and destructors. I used the struct with the hopes that I would be able to create a large combination of different weapon types/spells, being that my class has only just begun using structs I am not too familiar with constructors/destructors.
$endgroup$
– Justin
2 days ago
$begingroup$
randint(5,10)
, as written, only generates 5 to 9, inclusive. You’d wanthi - lo + 1
to get the full range.
$endgroup$
– AJNeufeld
2 days ago
3
$begingroup$
@AJNeufeld: Half-open ranges are the building blocks of C++ (as well as most other programming languages), and the sooner OP gets familiar with them, the better. See here and here for places I've used the phrase "half-open range" in previous reviews.
$endgroup$
– Quuxplusone
2 days ago
add a comment |
$begingroup$
I apologize, I should have clarified what my code is doing and what my expectations were. My post is not a troll, I prefer not to waste peoples time if I do not have to. I will make edits to the question. The numbers on the materials, weapons, and spells simply represent the amount of damage.
$endgroup$
– Justin
2 days ago
$begingroup$
Thank you for the insight and helpful post though. I will take a look at more constructors and destructors. I used the struct with the hopes that I would be able to create a large combination of different weapon types/spells, being that my class has only just begun using structs I am not too familiar with constructors/destructors.
$endgroup$
– Justin
2 days ago
$begingroup$
randint(5,10)
, as written, only generates 5 to 9, inclusive. You’d wanthi - lo + 1
to get the full range.
$endgroup$
– AJNeufeld
2 days ago
3
$begingroup$
@AJNeufeld: Half-open ranges are the building blocks of C++ (as well as most other programming languages), and the sooner OP gets familiar with them, the better. See here and here for places I've used the phrase "half-open range" in previous reviews.
$endgroup$
– Quuxplusone
2 days ago
$begingroup$
I apologize, I should have clarified what my code is doing and what my expectations were. My post is not a troll, I prefer not to waste peoples time if I do not have to. I will make edits to the question. The numbers on the materials, weapons, and spells simply represent the amount of damage.
$endgroup$
– Justin
2 days ago
$begingroup$
I apologize, I should have clarified what my code is doing and what my expectations were. My post is not a troll, I prefer not to waste peoples time if I do not have to. I will make edits to the question. The numbers on the materials, weapons, and spells simply represent the amount of damage.
$endgroup$
– Justin
2 days ago
$begingroup$
Thank you for the insight and helpful post though. I will take a look at more constructors and destructors. I used the struct with the hopes that I would be able to create a large combination of different weapon types/spells, being that my class has only just begun using structs I am not too familiar with constructors/destructors.
$endgroup$
– Justin
2 days ago
$begingroup$
Thank you for the insight and helpful post though. I will take a look at more constructors and destructors. I used the struct with the hopes that I would be able to create a large combination of different weapon types/spells, being that my class has only just begun using structs I am not too familiar with constructors/destructors.
$endgroup$
– Justin
2 days ago
$begingroup$
randint(5,10)
, as written, only generates 5 to 9, inclusive. You’d want hi - lo + 1
to get the full range.$endgroup$
– AJNeufeld
2 days ago
$begingroup$
randint(5,10)
, as written, only generates 5 to 9, inclusive. You’d want hi - lo + 1
to get the full range.$endgroup$
– AJNeufeld
2 days ago
3
3
$begingroup$
@AJNeufeld: Half-open ranges are the building blocks of C++ (as well as most other programming languages), and the sooner OP gets familiar with them, the better. See here and here for places I've used the phrase "half-open range" in previous reviews.
$endgroup$
– Quuxplusone
2 days ago
$begingroup$
@AJNeufeld: Half-open ranges are the building blocks of C++ (as well as most other programming languages), and the sooner OP gets familiar with them, the better. See here and here for places I've used the phrase "half-open range" in previous reviews.
$endgroup$
– Quuxplusone
2 days ago
add a comment |
$begingroup$
- Don't use
using namespace std
- Your comments add nothing to the program so leave them out. In general comments should tell you why not what. You should try to write self-explaining code. I.e. choose good names for your variables and functions so comments become almost unnecessary.
system("pause");
is not portable and can only be used on Windows.- Unless you depend on the return code you can omit
return 0
frommain
. See http://c0x.coding-guidelines.com/5.1.2.2.3.html. - It is better to use
random
than relying onsrand/rand
. You're also missing the header for it (<cstdlib>
) and the qualifier (std::
). See also https://channel9.msdn.com/Events/GoingNative/2013/rand-Considered-Harmful. - Prefer using
n
overstd::endl
In general you should read more about the Language and Programming. Here are some links to get you started:
- C++ book list
- C++ Super-FAQ
- C++ Core Guidelines
- cppreference
$endgroup$
add a comment |
$begingroup$
- Don't use
using namespace std
- Your comments add nothing to the program so leave them out. In general comments should tell you why not what. You should try to write self-explaining code. I.e. choose good names for your variables and functions so comments become almost unnecessary.
system("pause");
is not portable and can only be used on Windows.- Unless you depend on the return code you can omit
return 0
frommain
. See http://c0x.coding-guidelines.com/5.1.2.2.3.html. - It is better to use
random
than relying onsrand/rand
. You're also missing the header for it (<cstdlib>
) and the qualifier (std::
). See also https://channel9.msdn.com/Events/GoingNative/2013/rand-Considered-Harmful. - Prefer using
n
overstd::endl
In general you should read more about the Language and Programming. Here are some links to get you started:
- C++ book list
- C++ Super-FAQ
- C++ Core Guidelines
- cppreference
$endgroup$
add a comment |
$begingroup$
- Don't use
using namespace std
- Your comments add nothing to the program so leave them out. In general comments should tell you why not what. You should try to write self-explaining code. I.e. choose good names for your variables and functions so comments become almost unnecessary.
system("pause");
is not portable and can only be used on Windows.- Unless you depend on the return code you can omit
return 0
frommain
. See http://c0x.coding-guidelines.com/5.1.2.2.3.html. - It is better to use
random
than relying onsrand/rand
. You're also missing the header for it (<cstdlib>
) and the qualifier (std::
). See also https://channel9.msdn.com/Events/GoingNative/2013/rand-Considered-Harmful. - Prefer using
n
overstd::endl
In general you should read more about the Language and Programming. Here are some links to get you started:
- C++ book list
- C++ Super-FAQ
- C++ Core Guidelines
- cppreference
$endgroup$
- Don't use
using namespace std
- Your comments add nothing to the program so leave them out. In general comments should tell you why not what. You should try to write self-explaining code. I.e. choose good names for your variables and functions so comments become almost unnecessary.
system("pause");
is not portable and can only be used on Windows.- Unless you depend on the return code you can omit
return 0
frommain
. See http://c0x.coding-guidelines.com/5.1.2.2.3.html. - It is better to use
random
than relying onsrand/rand
. You're also missing the header for it (<cstdlib>
) and the qualifier (std::
). See also https://channel9.msdn.com/Events/GoingNative/2013/rand-Considered-Harmful. - Prefer using
n
overstd::endl
In general you should read more about the Language and Programming. Here are some links to get you started:
- C++ book list
- C++ Super-FAQ
- C++ Core Guidelines
- cppreference
answered yesterday
yuriyuri
3,63921034
3,63921034
add a comment |
add a comment |
$begingroup$
First, try not to declare all your types in the global namespace. Make your "own" space. This limits the exposure to other code you might integrate with.
Your materials
, weapons
, and spells
seem to be enum
candidates as they are used as values. So use them as enum-values and define there size explicitly. In this case I'm not recommending scoped enums since you want to do calculations easily on there values.
Added a constructor to your character
.
characterCreation
function should take string by universal reference to avoid unnecessary copies.
Have you print method take and ostream
so you easily can change to the any stream of your choosing.
namespace YourNamespaceName
enum materials : int
wood = 1, oak = 2, maple = 3, ash = 4, bronze = 2, iron = 3, steel = 4, mithril = 5, dragon = 6
;
enum weapons : int
dagger = 2, sword = 3, axe = 4, mace = 5, bow = 3, arrows = 2
;
enum spells : int
fire = 4, frost = 6, dark = 8, chaos = 10
;
struct character
explicit character(std::string &&name)
: name(std::move(name)), strength(rand() % 5 + 5), stamina(rand() % 5 + 5), intellect(rand() % 5 + 5),
weaponAttack(weapons::dagger * materials::bronze + 2 * strength),
spellAttack(spells::fire + intellect * 2)
health += 2 * stamina;
mana += 3 * intellect;
std::string name;
int health = 100, mana = 100, strength, stamina, intellect, weaponAttack, spellAttack, souls = 0;
;
// Function Declaration
character characterCreation(std::string &&name);
std::ostream &printInfo(std::ostream &os, const character &createChar);
// close YourNamespaceName namespace
// Main Function
int main()
std::string characterName;
std::cout << "Please input character name: ";
std::cin >> characterName;
std::srand(std::time(nullptr));
auto player = YourNamespaceName::characterCreation(std::move(characterName));
YourNamespaceName::printInfo(std::cout, player);
system("pause");
return 0;
namespace YourNamespaceName
// Function Definition
character characterCreation(std::string &&name)
return character(std::move(name));
std::ostream &printInfo(std::ostream &os, const character &createChar)
return os << createChar.name << 'n'
<< createChar.health << 'n'
<< createChar.mana << 'n'
<< createChar.strength << 'n'
<< createChar.stamina << 'n'
<< createChar.intellect << 'n'
<< createChar.weaponAttack << 'n'
<< createChar.spellAttack << 'n'
<< createChar.souls << 'n';
// close YourNamespaceName namespace
$endgroup$
add a comment |
$begingroup$
First, try not to declare all your types in the global namespace. Make your "own" space. This limits the exposure to other code you might integrate with.
Your materials
, weapons
, and spells
seem to be enum
candidates as they are used as values. So use them as enum-values and define there size explicitly. In this case I'm not recommending scoped enums since you want to do calculations easily on there values.
Added a constructor to your character
.
characterCreation
function should take string by universal reference to avoid unnecessary copies.
Have you print method take and ostream
so you easily can change to the any stream of your choosing.
namespace YourNamespaceName
enum materials : int
wood = 1, oak = 2, maple = 3, ash = 4, bronze = 2, iron = 3, steel = 4, mithril = 5, dragon = 6
;
enum weapons : int
dagger = 2, sword = 3, axe = 4, mace = 5, bow = 3, arrows = 2
;
enum spells : int
fire = 4, frost = 6, dark = 8, chaos = 10
;
struct character
explicit character(std::string &&name)
: name(std::move(name)), strength(rand() % 5 + 5), stamina(rand() % 5 + 5), intellect(rand() % 5 + 5),
weaponAttack(weapons::dagger * materials::bronze + 2 * strength),
spellAttack(spells::fire + intellect * 2)
health += 2 * stamina;
mana += 3 * intellect;
std::string name;
int health = 100, mana = 100, strength, stamina, intellect, weaponAttack, spellAttack, souls = 0;
;
// Function Declaration
character characterCreation(std::string &&name);
std::ostream &printInfo(std::ostream &os, const character &createChar);
// close YourNamespaceName namespace
// Main Function
int main()
std::string characterName;
std::cout << "Please input character name: ";
std::cin >> characterName;
std::srand(std::time(nullptr));
auto player = YourNamespaceName::characterCreation(std::move(characterName));
YourNamespaceName::printInfo(std::cout, player);
system("pause");
return 0;
namespace YourNamespaceName
// Function Definition
character characterCreation(std::string &&name)
return character(std::move(name));
std::ostream &printInfo(std::ostream &os, const character &createChar)
return os << createChar.name << 'n'
<< createChar.health << 'n'
<< createChar.mana << 'n'
<< createChar.strength << 'n'
<< createChar.stamina << 'n'
<< createChar.intellect << 'n'
<< createChar.weaponAttack << 'n'
<< createChar.spellAttack << 'n'
<< createChar.souls << 'n';
// close YourNamespaceName namespace
$endgroup$
add a comment |
$begingroup$
First, try not to declare all your types in the global namespace. Make your "own" space. This limits the exposure to other code you might integrate with.
Your materials
, weapons
, and spells
seem to be enum
candidates as they are used as values. So use them as enum-values and define there size explicitly. In this case I'm not recommending scoped enums since you want to do calculations easily on there values.
Added a constructor to your character
.
characterCreation
function should take string by universal reference to avoid unnecessary copies.
Have you print method take and ostream
so you easily can change to the any stream of your choosing.
namespace YourNamespaceName
enum materials : int
wood = 1, oak = 2, maple = 3, ash = 4, bronze = 2, iron = 3, steel = 4, mithril = 5, dragon = 6
;
enum weapons : int
dagger = 2, sword = 3, axe = 4, mace = 5, bow = 3, arrows = 2
;
enum spells : int
fire = 4, frost = 6, dark = 8, chaos = 10
;
struct character
explicit character(std::string &&name)
: name(std::move(name)), strength(rand() % 5 + 5), stamina(rand() % 5 + 5), intellect(rand() % 5 + 5),
weaponAttack(weapons::dagger * materials::bronze + 2 * strength),
spellAttack(spells::fire + intellect * 2)
health += 2 * stamina;
mana += 3 * intellect;
std::string name;
int health = 100, mana = 100, strength, stamina, intellect, weaponAttack, spellAttack, souls = 0;
;
// Function Declaration
character characterCreation(std::string &&name);
std::ostream &printInfo(std::ostream &os, const character &createChar);
// close YourNamespaceName namespace
// Main Function
int main()
std::string characterName;
std::cout << "Please input character name: ";
std::cin >> characterName;
std::srand(std::time(nullptr));
auto player = YourNamespaceName::characterCreation(std::move(characterName));
YourNamespaceName::printInfo(std::cout, player);
system("pause");
return 0;
namespace YourNamespaceName
// Function Definition
character characterCreation(std::string &&name)
return character(std::move(name));
std::ostream &printInfo(std::ostream &os, const character &createChar)
return os << createChar.name << 'n'
<< createChar.health << 'n'
<< createChar.mana << 'n'
<< createChar.strength << 'n'
<< createChar.stamina << 'n'
<< createChar.intellect << 'n'
<< createChar.weaponAttack << 'n'
<< createChar.spellAttack << 'n'
<< createChar.souls << 'n';
// close YourNamespaceName namespace
$endgroup$
First, try not to declare all your types in the global namespace. Make your "own" space. This limits the exposure to other code you might integrate with.
Your materials
, weapons
, and spells
seem to be enum
candidates as they are used as values. So use them as enum-values and define there size explicitly. In this case I'm not recommending scoped enums since you want to do calculations easily on there values.
Added a constructor to your character
.
characterCreation
function should take string by universal reference to avoid unnecessary copies.
Have you print method take and ostream
so you easily can change to the any stream of your choosing.
namespace YourNamespaceName
enum materials : int
wood = 1, oak = 2, maple = 3, ash = 4, bronze = 2, iron = 3, steel = 4, mithril = 5, dragon = 6
;
enum weapons : int
dagger = 2, sword = 3, axe = 4, mace = 5, bow = 3, arrows = 2
;
enum spells : int
fire = 4, frost = 6, dark = 8, chaos = 10
;
struct character
explicit character(std::string &&name)
: name(std::move(name)), strength(rand() % 5 + 5), stamina(rand() % 5 + 5), intellect(rand() % 5 + 5),
weaponAttack(weapons::dagger * materials::bronze + 2 * strength),
spellAttack(spells::fire + intellect * 2)
health += 2 * stamina;
mana += 3 * intellect;
std::string name;
int health = 100, mana = 100, strength, stamina, intellect, weaponAttack, spellAttack, souls = 0;
;
// Function Declaration
character characterCreation(std::string &&name);
std::ostream &printInfo(std::ostream &os, const character &createChar);
// close YourNamespaceName namespace
// Main Function
int main()
std::string characterName;
std::cout << "Please input character name: ";
std::cin >> characterName;
std::srand(std::time(nullptr));
auto player = YourNamespaceName::characterCreation(std::move(characterName));
YourNamespaceName::printInfo(std::cout, player);
system("pause");
return 0;
namespace YourNamespaceName
// Function Definition
character characterCreation(std::string &&name)
return character(std::move(name));
std::ostream &printInfo(std::ostream &os, const character &createChar)
return os << createChar.name << 'n'
<< createChar.health << 'n'
<< createChar.mana << 'n'
<< createChar.strength << 'n'
<< createChar.stamina << 'n'
<< createChar.intellect << 'n'
<< createChar.weaponAttack << 'n'
<< createChar.spellAttack << 'n'
<< createChar.souls << 'n';
// close YourNamespaceName namespace
answered yesterday
Bo RBo R
1611
1611
add a comment |
add a comment |
Justin is a new contributor. Be nice, and check out our Code of Conduct.
Justin is a new contributor. Be nice, and check out our Code of Conduct.
Justin is a new contributor. Be nice, and check out our Code of Conduct.
Justin is a new contributor. Be nice, and check out our Code of Conduct.
Thanks for contributing an answer to Code Review Stack Exchange!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
Use MathJax to format equations. MathJax reference.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fcodereview.stackexchange.com%2fquestions%2f215542%2fadventure-game-text-based-in-c%23new-answer', 'question_page');
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
$begingroup$
Take a look at "ncurses" library.
$endgroup$
– outoftime
yesterday
1
$begingroup$
If your goal is to write a text adventure (and not just a C++ exercise), have a look at the existing text adventure engines such as TADS and Inform 7. If you still decide to go with C++, understanding the architecture and feature sets in the existing engines will advise you in your own code's larger design.
$endgroup$
– user117529
yesterday