Development Topic: Text Game

Whether you're a newbie or an experienced programmer, any questions, help, or just talk of any language will be welcomed here.

Moderator: Coders of Rage

User avatar
Martijn
Chaos Rift Newbie
Chaos Rift Newbie
Posts: 22
Joined: Thu Jun 04, 2009 4:47 pm
Programming Language of Choice: C++

Development Topic: Text Game

Post by Martijn »

Hi thanks for reading.
"Development Topic: Text Game" it sounds fancy, but it's not.
I'm kinda stuck atm, because my program doesn't do what I want it to do.

Here is what I got so far;

Code: Select all

#include <iostream>

using namespace std;
//character
string nickname;  
string skills;
string ShowSkills;
string ShowItems;

string items;
int gold;

//game
string input; 
string direction; 
static string place_name = "Place Name"; // so it doesnt resets
string description;
string exits;

// pos
int x = 0;
int y = 0;

// static


//bool running = true;

void position();
void cityhall();

int main()
{
  
    cout << "What's your name adventurer? ";
    cin >> nickname;
    
    system("CLS");
    cout << "Welcome to the world of err... pizza....." << nickname << endl;
    cout << "start your journey now, type start to continue." << endl;
    
    cout << "\n\n" << endl; // spacer
    cin >> input;
        
    if (input == "start"){
       system("CLS");    
    }
    else
    {
        cout << "Error, please type start. " << endl;
        system("pause");
    }
    while(input != "exit") {
          
        position(); 
          
        cin >> input;
        if (input == "n" || input == "north"){ y += 1; }
        if (input == "e" || input == "east") { x += 1; }
        if (input == "s" || input == "south"){ y -= 1; }
        if (input == "w" || input == "west") { x -= 1; }

        if (input == "!skills") { ShowSkills; }
        if (input == "!items") { ShowItems; }                
                        }
                         }
void position()
{
     cout << "[[" << place_name << "]] <" << x << ", " << y << ">" << endl;
     cout << description << endl;
         cout << "\n\n" << endl; // spacer   
}


// City Hall
void cityhall()
{
     x = 0;
     y = 0;
     exits = "n";
     place_name = "City Hall";
     cout << "This is the central gathering room. The room is fairly " << endl;
     cout << "empty, except for a large table in center of the room." << endl;
     cout << "There is an exit to the north that leads out into town." << endl;
}
// Main Street
void mainstreet()
{ 
     x = 0;
     y = 1;
     exits = "w" "e";
     place_name =  "Main Street";
     cout << "This is the main street, there is a big statue of the king " << endl;
     cout << "in the middle of the street. The cobbeld pavement continues " << endl;
     cout << "to the east and west. " << endl;
}         

/*
// Stats and Skills
int Health = 100;
int Mana = 20;

int level = 1;
void ShowSkills()
{
     cout << "You've currently got:" << endl;
     cout << "You got: " << Health << " HP points." << endl;
     cout << "You got: " << Mana   << " MP points."<< endl;
     
     cout << "\n\n" << endl;
     cout << "You are currently level " << level << "." << endl;

}

void ShowItems()
{
     cout << "You got " << gold << " gold pieces." << endl; 
     cout << "You are carrying:" << endl;
     cout << items << endl;
}
*/

Please ignore the complete stats and skills part!
Well, I want the program to start and output

"[[City Hall]] <0, 0>"

but it outputs

"[[Place name]] <0, 0>"

when I "update" it (I press N) it does work, but not at the start!


It's hard to explain, but basically the just displays "position" while it should display "city hall" with the template of "position" (the [[name]] etc).
User avatar
programmerinprogress
Chaos Rift Devotee
Chaos Rift Devotee
Posts: 632
Joined: Wed Oct 29, 2008 7:31 am
Current Project: some crazy stuff, i'll tell soon :-)
Favorite Gaming Platforms: PC
Programming Language of Choice: C++!
Location: The UK
Contact:

Re: Development Topic: Text Game

Post by programmerinprogress »

either i'm going blind or you haven't called the CityHall() function, and just the position one, therefore it looks to me like you're not actually "telling" the program to assign the value "City Hall" to the string place_name

also, to simplify things, you could write the CityHall() and MainStreet() functions into one function like this:

Code: Select all

 SetLocation(int x, int y, string name, string message);
//and you could follow this by changing position to something like 
GetPosition() 
//to make things clearer


But honestly, I don't see how the place_name would change at all, because I don't see an instance where you call it in the program, but correct me if i'm wrong.
Last edited by programmerinprogress on Sun Jun 07, 2009 9:22 am, edited 1 time in total.
---------------------------------------------------------------------------------------
I think I can program pretty well, it's my compiler that needs convincing!
---------------------------------------------------------------------------------------
And now a joke to lighten to mood :D

I wander what programming language anakin skywalker used to program C3-PO's AI back on tatooine? my guess is Jawa :P
Lucas
Chaos Rift Newbie
Chaos Rift Newbie
Posts: 16
Joined: Sun May 24, 2009 11:28 am
Favorite Gaming Platforms: PC, SNES, Dreamcast
Programming Language of Choice: C++
Location: UK

Re: Development Topic: Text Game

Post by Lucas »

Edit: beaten to it xD

The problem is that you aren't giving place_name a value until you call the cityHall() function, so you could either call the function before position() to set the place_name (But it will cout all of the other stuff in the function aswell) or you could always just try passing your position function an argument something like this.

Code: Select all

void position(string place_name);

int main() {
    //stuff
     position("City Hall");
    //stuff
}

void position(string place_name)
{
     cout << "[[" << place_name << "]] <" << x << ", " << y << ">" << endl;
     cout << description << endl;
     cout << "\n\n" << endl; // spacer
}
It's not the best way by far but it would solve your problem.
I don't see any invisible walls...
User avatar
programmerinprogress
Chaos Rift Devotee
Chaos Rift Devotee
Posts: 632
Joined: Wed Oct 29, 2008 7:31 am
Current Project: some crazy stuff, i'll tell soon :-)
Favorite Gaming Platforms: PC
Programming Language of Choice: C++!
Location: The UK
Contact:

Re: Development Topic: Text Game

Post by programmerinprogress »

static string place_name = "Place Name"; // so it doesnt resets
Just out of curiosity, why do you think you need to declare this static? I don't see any purpose for it...
---------------------------------------------------------------------------------------
I think I can program pretty well, it's my compiler that needs convincing!
---------------------------------------------------------------------------------------
And now a joke to lighten to mood :D

I wander what programming language anakin skywalker used to program C3-PO's AI back on tatooine? my guess is Jawa :P
User avatar
Martijn
Chaos Rift Newbie
Chaos Rift Newbie
Posts: 22
Joined: Thu Jun 04, 2009 4:47 pm
Programming Language of Choice: C++

Re: Development Topic: Text Game

Post by Martijn »

Wow thanks guys, that's a great idea! :O
I would have never thought of it, I want to test it out right away but my compiler is doing weird.
This the current code:

Code: Select all

#include <iostream>

using namespace std;

//character
int Health = 100;
int Mana = 20;

string nickname;  
string skills;
string ShowSkills;
string ShowItems;

string items;
int gold;

//game
string input; 
string direction; 
static string place_name = "Place Name"; // so it doesnt resets
string description;
string exits;

// pos
int x = 0;
int y = 0;

// static


//bool running = true;

void position(string place_name);
void cityhall();

int main()
{
  
    cout << "What's your name adventurer? ";
    cin >> nickname;
    
    system("CLS");
    cout << "Welcome to the world of err... pizza....." << nickname << endl;
    cout << "start your journey now, type start to continue." << endl;
    
    cout << "\n" << endl; // spacer
    cin >> input;
        
    if (input == "start"){
       system("CLS");    
    }
    else
    {
        cout << "Error, please type start. " << endl;
        system("pause");
    }
    while(input != "exit") {
          
        position("City Hall"); 
          
        cin >> input;
        if (input == "n" || input == "north"){ y += 1; }
        if (input == "e" || input == "east") { x += 1; }
        if (input == "s" || input == "south"){ y -= 1; }
        if (input == "w" || input == "west") { x -= 1; }

        if (input == "!skills") { ShowSkills; }
        if (input == "!items") { ShowItems; }                
                        }
                         }
void position(string place_name);
{
     cout << "[[" << place_name << "]] <" << x << ", " << y << ">" << endl;
     cout << description << endl;
         cout << "\n\n" << endl; // spacer 
     cout << "<" << Health << "hp " << Mana << "mp>" << endl;  
}


// City Hall
void cityhall()
{
     x = 0;
     y = 0;
     exits = "n";
     place_name = "City Hall";
     cout << "This is the central gathering room. The room is fairly " << endl;
     cout << "empty, except for a large table in center of the room." << endl;
     cout << "There is an exit to the north that leads out into town." << endl;
}
// Main Street
void mainstreet()
{ 
     x = 0;
     y = 1;
     exits = "w" "e";
     place_name =  "Main Street";
     cout << "This is the main street, there is a big statue of the king " << endl;
     cout << "in the middle of the street. The cobbeld pavement continues " << endl;
     cout << "to the east and west. " << endl;
}         


// Stats and Skills
/*
int level = 1;
void ShowSkills()
{
     cout << "You've currently got:" << endl;
     cout << "You got: " << Health << " HP points." << endl;
     cout << "You got: " << Mana   << " MP points."<< endl;
     
     cout << "\n\n" << endl;
     cout << "You are currently level " << level << "." << endl;

}

void ShowItems()
{
     cout << "You got " << gold << " gold pieces." << endl; 
     cout << "You are carrying:" << endl;
     cout << items << endl;
}
*/
And this, is the error:
C:\Documents and Settings\Admin\Bureaublad\text game\main.cpp:72: error: expected unqualified-id before '{' token
C:\Documents and Settings\Admin\Bureaublad\text game\main.cpp:72: error: expected `,' or `;' before '{' token
No matter how many ; I place (semi-colon, right?) it still doesn't compile.

Oh and I have been told by a friend to try and make it static, as he thought it would reset itself somehow.
Let me... just find the MSN log... there we go...
try to make the place_name static
so other funcs can reach it and the data doesn't reset
when you say its = "City hall" in the function. it will only be like that inside the function, and not outside
User avatar
programmerinprogress
Chaos Rift Devotee
Chaos Rift Devotee
Posts: 632
Joined: Wed Oct 29, 2008 7:31 am
Current Project: some crazy stuff, i'll tell soon :-)
Favorite Gaming Platforms: PC
Programming Language of Choice: C++!
Location: The UK
Contact:

Re: Development Topic: Text Game

Post by programmerinprogress »

You put a semicolon after the start of the definition of "position(string)" it will compile if you remove that.

Code: Select all

void position(string place_name);
{
     cout << "[[" << place_name << "]] <" << x << ", " << y << ">" << endl;
     cout << description << endl;
         cout << "\n\n" << endl; // spacer
     cout << "<" << Health << "hp " << Mana << "mp>" << endl;
}

needs to become 

void position(string place_name) // semicolon gone! compiles now :-)
{
     cout << "[[" << place_name << "]] <" << x << ", " << y << ">" << endl;
     cout << description << endl;
         cout << "\n\n" << endl; // spacer
     cout << "<" << Health << "hp " << Mana << "mp>" << endl;
}
Also, i'm going to say that the keyword static doesn't need to be there at all, anyone can correct me if i'm wrong, but I though the term static used with a non-class variable just stopped the variables from being accessed from code in other files, it controls scope as far as i'm aware.

*grabs big old C++ reference*
from book "Global Static variables: applying the specifier static to a global variable instructs the compiler to create a global variable only to the file in which you declared it"

as far as i'm aware, what you said only concerns local static variables, because it persits each time the function is called. (But global variables do that anyway!)
---------------------------------------------------------------------------------------
I think I can program pretty well, it's my compiler that needs convincing!
---------------------------------------------------------------------------------------
And now a joke to lighten to mood :D

I wander what programming language anakin skywalker used to program C3-PO's AI back on tatooine? my guess is Jawa :P
User avatar
Martijn
Chaos Rift Newbie
Chaos Rift Newbie
Posts: 22
Joined: Thu Jun 04, 2009 4:47 pm
Programming Language of Choice: C++

Re: Development Topic: Text Game

Post by Martijn »

Oh right! :D.
Sweet it works :).

Been messing with that for days really! Now, I'm going to try to make the walking work :p.
Wish me luck xD
User avatar
Martijn
Chaos Rift Newbie
Chaos Rift Newbie
Posts: 22
Joined: Thu Jun 04, 2009 4:47 pm
Programming Language of Choice: C++

Re: Development Topic: Text Game

Post by Martijn »

Still can't fix the map loading etc, can someone push me into the right direction... again?
Lucas
Chaos Rift Newbie
Chaos Rift Newbie
Posts: 16
Joined: Sun May 24, 2009 11:28 am
Favorite Gaming Platforms: PC, SNES, Dreamcast
Programming Language of Choice: C++
Location: UK

Re: Development Topic: Text Game

Post by Lucas »

Martijn wrote:Still can't fix the map loading etc, can someone push me into the right direction... again?
What exactly is your problem with "map loading etc"?
I don't see any invisible walls...
User avatar
Martijn
Chaos Rift Newbie
Chaos Rift Newbie
Posts: 22
Joined: Thu Jun 04, 2009 4:47 pm
Programming Language of Choice: C++

Re: Development Topic: Text Game

Post by Martijn »

Oh sorry, well I want to type "n" and then it should show the info of "Main Street" and have 2 exits to E and W, so you can "walk" also i would like to know how I can put the display 4 lines of code as "description" (eq:)

describtion = "
cout << "This is the main street, there is a big statue of the king " << endl;
cout << "in the middle of the street. The cobbeld pavement continues " << endl;
cout << "to the east and west. " << endl; "
User avatar
dandymcgee
ES Beta Backer
ES Beta Backer
Posts: 4709
Joined: Tue Apr 29, 2008 3:24 pm
Current Project: https://github.com/dbechrd/RicoTech
Favorite Gaming Platforms: NES, Sega Genesis, PS2, PC
Programming Language of Choice: C
Location: San Francisco
Contact:

Re: Development Topic: Text Game

Post by dandymcgee »

Martijn wrote:Oh sorry, well I want to type "n" and then it should show the info of "Main Street" and have 2 exits to E and W, so you can "walk" also i would like to know how I can put the display 4 lines of code as "description" (eq:)

describtion = "
cout << "This is the main street, there is a big statue of the king " << endl;
cout << "in the middle of the street. The cobbeld pavement continues " << endl;
cout << "to the east and west. " << endl; "
This code would be the single string equivalent:

Code: Select all

string description = "This is the main street, there is a big statue of the king \nin the middle of the street. The cobbeld pavement continues \nto the east and west. \n";
cout << description;
Where "\n" means newline character (does the same thing as " << endl << ").
Falco Girgis wrote:It is imperative that I can broadcast my narcissistic commit strings to the Twitter! Tweet Tweet, bitches! :twisted:
User avatar
MarauderIIC
Respected Programmer
Respected Programmer
Posts: 3406
Joined: Sat Jul 10, 2004 3:05 pm
Location: Maryland, USA

Re: Development Topic: Text Game

Post by MarauderIIC »

dandymcgee wrote:Where "\n" means newline character (does the same thing as " << endl << ").
Technically no. endl forces the output buffer to be written to the screen, \n does not. So if you use endl at the end of every line and your CPU is at like 100%, you'll see one line printed at a time. If you use \n and then endl or cout.flush() on the last line, you'll see all the lines written to the screen at once. In both of these scenarios, you might get part of a line printed as the system flushes the output buffer on its own. As a side effect, endl is "slower" -- this might be most noticeable during file I/O (that's something I just now thought of :P)
I realized the moment I fell into the fissure that the book would not be destroyed as I had planned.
User avatar
dandymcgee
ES Beta Backer
ES Beta Backer
Posts: 4709
Joined: Tue Apr 29, 2008 3:24 pm
Current Project: https://github.com/dbechrd/RicoTech
Favorite Gaming Platforms: NES, Sega Genesis, PS2, PC
Programming Language of Choice: C
Location: San Francisco
Contact:

Re: Development Topic: Text Game

Post by dandymcgee »

MarauderIIC wrote:
dandymcgee wrote:Where "\n" means newline character (does the same thing as " << endl << ").
Technically no. endl forces the output buffer to be written to the screen, \n does not. So if you use endl at the end of every line and your CPU is at like 100%, you'll see one line printed at a time. If you use \n and then endl or cout.flush() on the last line, you'll see all the lines written to the screen at once. In both of these scenarios, you might get part of a line printed as the system flushes the output buffer on its own. As a side effect, endl is "slower" -- this might be most noticeable during file I/O (that's something I just now thought of :P)
Thanks for that correction. In a beginner's eyes they still cause the same end result (wrapping text), but you're absolutely right in saying using \n does not cause anything to be written at the moment it is read.
Falco Girgis wrote:It is imperative that I can broadcast my narcissistic commit strings to the Twitter! Tweet Tweet, bitches! :twisted:
User avatar
Martijn
Chaos Rift Newbie
Chaos Rift Newbie
Posts: 22
Joined: Thu Jun 04, 2009 4:47 pm
Programming Language of Choice: C++

Re: Development Topic: Text Game

Post by Martijn »

Argh this is driving me nuts :(.

Code: Select all

#include <iostream>

using namespace std;

//character
int Health = 100;
int Mana = 20;

string nickname;  
string skills;
string ShowSkills;
string ShowItems;

string items;
int gold;

//game
string input; 
string direction; 
static string place_name = "Place Name"; // so it doesnt resets
string description;
string exits;

// pos
int x = 0;
int y = 0;

// static


//bool running = true;

void position(string place_name);
void cityhall();

int main()
{
  
    cout << "What's your name adventurer? ";
    cin >> nickname;
    
    system("CLS");
    cout << "Welcome to the world of err... pizza....." << nickname << endl;
    cout << "start your journey now, type start to continue." << endl;
    
    cout << "\n" << endl; // spacer
    cin >> input;
        
    if (input == "start"){
       system("CLS");    
    }
    else
    {
        cout << "Error, please type start. " << endl;
        system("pause");
    }
    while(input != "exit") {
          
        position("City Hall"); 
          
        cin >> input;
        if (input == "n" || input == "north"){ y += 1; }
        if (input == "e" || input == "east") { x += 1; }
        if (input == "s" || input == "south"){ y -= 1; }
        if (input == "w" || input == "west") { x -= 1; }

        if (input == "!skills") { ShowSkills; }
        if (input == "!items") { ShowItems; }                
                        }
                         }
void position(string place_name)
{
     cout << "[[" << place_name << "]] <" << x << ", " << y << ">" << endl;
     cout << description << endl;
         cout << "\n\n" << endl; // spacer 
     cout << "<" << Health << "hp " << Mana << "mp>" << endl; 
}


// City Hall
void cityhall()
{
     x = 0;
     y = 0;
     exits = "n";
     place_name = "City Hall";
     description = "This is the central gathering room. The room is fairly \n";
     "empty, except for a large table in center of the room.\n";
     "There is an exit to the north that leads out into town.\n";
}
// Main Street
void mainstreet()
{ 
     x = 0;
     y = 1;
     exits = "w" "e";
     place_name  =  "Main Street";
     description = "This is the main street, there is a big statue of the king \n" ;
     "in the middle of the street. The cobbeld pavement continues \n";
     "to the east and west. \n";
}         


// Stats and Skills
/* comment for now
int level = 1;
void ShowSkills()
{
     cout << "You've currently got:" << endl;
     cout << "You got: " << Health << " HP points." << endl;
     cout << "You got: " << Mana   << " MP points."<< endl;
     
     cout << "\n\n" << endl;
     cout << "You are currently level " << level << "." << endl;

}

void ShowItems()
{
     cout << "You got " << gold << " gold pieces." << endl; 
     cout << "You are carrying:" << endl;
     cout << items << endl;
}
*/
I don't understand why it just doesn't output description, and if I type north output mainstreet :/.
Lucas
Chaos Rift Newbie
Chaos Rift Newbie
Posts: 16
Joined: Sun May 24, 2009 11:28 am
Favorite Gaming Platforms: PC, SNES, Dreamcast
Programming Language of Choice: C++
Location: UK

Re: Development Topic: Text Game

Post by Lucas »

I'm not quite sure which part of your code calls the functions to display this information anyway.
The only thing I can think of is that you are expecting your function to check the x, y variables when you change them by typing N or North, but it just doesn't work like that.

You need to do some additional checks after you have updated your x, y variables.

Again this isn't by far the best way to do things but it would once again solve your problem and hopefully you will see where you are going wrong.

Code: Select all

position("City Hall");  //We're putting this function before the game loop otherwise every time you loop back to the beginning it will display the original message
while(input != "exit") {
	cin >> input;
	
	//Check player input
	if (input == "n" || input == "north") { y += 1; }
	if (input == "e" || input == "east") { x += 1; }
	if (input == "s" || input == "south") { y -= 1; }
	if (input == "w" || input == "west") { x -= 1; }
	if (input == "!skills") { ShowSkills; }
	if (input == "!items") { ShowItems; }
	
	//Check our new co-ordinates
	if(x == 0 && y == 0) {
		cityhall();
	}
	else if(x == 0 && y == 1) {
		mainstreet();
	}
	else {
		cout << "You new co-ordinates are: " << x << ", " << y << endl;
	}
}
This also makes the x, y variables in the functions completely redundant so you may as well get rid of them.

Basically within a game loop you need to check all of the logic otherwise nothing will happen.
You checked for the players input but after that you didn't do anything to check the position or do anything with it, so the function mainstreet() was never called.

I didn't test the above code since I am at work so hopefully I haven't made any syntax mistakes and things.
I don't see any invisible walls...
Post Reply