|
You are mixing C and C++, which only adds to your confusion. C++ and ANSI C are two distinct languages.
Vaclav_ wrote: C++ has "type" bool but evaluates to something called "true " or "false" which in reality is "something / application/ os " or whatever dependent and hides the binary value ... No. The bool type in C++ is exactly that, a boolean type, and is part of the language, nothing to do with the operating system. A statement like
bool someVariable = true;
while (somevariable)
{
}
will continue until it encounters
someVariable = false;
But if you try
someVariable = 1;
the compiler may accept it byut you should not rely on it, as future compilers may well not accept it.
And conversely if you try the first two in C the compiler will not know what you are talking about. Decide which language you want to use and stick to it, it will save you a lot of confusion.
|
|
|
|
|
Richard,
why are you getting into your typical " blame the poster " mode?
I am not confused, just asked / posted a question and do not appreciate such comments.
"get off my lawn..."
|
|
|
|
|
Who is blaming? I merely mentioned out that you are confusing things by mixing two different languages. But as usual you get on your high horse as soon as anyone points out your mistakes.
|
|
|
|
|
Vaclav_ wrote: C still has no standard ( AKA what used to be defined in " ANSI C standard " ) "type" bool
Wrong. As of C99 (1999! 30+ Years ago!), the standard defined _Bool, and include <stdbool.h> which includes the macros
#define bool _Bool
#define true 1
#define false 0
In fact, in the comments to stdbool.h on my system I see
Vaclav_ wrote: C++ has "type" bool but evaluates to something called "true " or "false" which in reality is "something / application/ os " or whatever dependent and hides the binary value of these symbols. Hence no "standard" in sense of "ANSI C standard " again
Wrong again. The standard defines "true" and "false" as 0 and 1. Unless you use std::boolalpha, you normally get 0 or 1 when printing to an iostream (std::cout, etc).
Technically I think that the implementation is free to use whatever values "behind the scenes" to implement a bool, but its representation is as if it had a value of 0 and 1. The same is true for NULL . A given implementation may use any value it wishes to indicate a NULL pointer, but it has to act like a zero in certain contexts. I believe this was the case in the days when we had NEAR and FAR pointers. All the bits of a FAR NULL pointer might not be zero, as its segment selector might be set, but it would compare equal to zero, and equal to any other FAR NULL which had a different segment selector.
modified 21-Feb-20 12:03pm.
|
|
|
|
|
k5054 wrote: NEAR and FAR pointers. Oh the joys of the good old days. 
|
|
|
|
|
Fortunately, at that time I was working on unix on Motorola 68000s. I never had to face the horrors of NEAR/FAR. But I heard about it. And praised all the gods that I didn't have to deal with it.
|
|
|
|
|
I was also writing in assembler in those days so got used to near and far (and the pain it could cause).
|
|
|
|
|
Not to be an ass, but if we use
#define true 1
how can it be technically called "standard (language ) type"?
Then the language has something like
#define int ...
somewhere too?
(just kidding )
|
|
|
|
|
_Bool is the standard language type. When the standard was updated, it was realized that a lot of software had already created their own definitions of "bool" (either as a #define , or as a typedef ). Therefore the standards committee chose _Bool as least likely to collide with already written software (remember in C, identifiers starting with _ are reserved for the implementation, i.e. not to be used in user programs). The stdbool.h header file was mandated so that new programs could have a "sensible" bool, true and false. It should be pointed out that all the standard says about _Bool is that it be of unsigned integer type large enough to hold the values 0 and 1. In practice that means that a _Bool is a synonym for unsigned char . However, if an implementation was to give _Bool the equivalent of unsigned long int , that is perfectly acceptable. In general, the standard says what a conforming implementation must do, and guarantees it must meet, but does not state how it must do so. For example the standard says
sizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long) You can see this for yourself where in 32 bit land usually,
sizeof(int) = 4
sizeof(long) = 4
sizeof(long long) = 8 but in 64 bit land
sizeof(int) = 4
sizeof(long) = 8
sizeof(long long) = 8
In 16 bit land, it was often sizeof(short) == sizeof(int) == 2 . This difference in sizes has caught many developers off guard when moving from 32 bit to 64 compilers, where assumptions about the size of various basic types were hard-wired into the program. Indeed, the linux kernel and associated libs are still dealing with this in terms of time_t moving from a 32 bit value to 64. For example, the range of a 64 bit time_t is approximately +/- 2.9E11 years. That means converting a large value of time_t to a struct tm currently has problems since struct tm defines tm_year as an int, which jas a range of approx. +/- 2.1E9, which is smaller by a factor of ~100. That's probably not an issue I will ever need to deal with, but I would not be surprised if something, somewhere is making assumptions about converting time_t to struct tm that's going to produce unexpected results based on "max value" of a time_t.
|
|
|
|
|
As many have stated true = 1, false = 0 you had it wrong.
However reason for post is to advise you to read what has been stated from the standards group
<stdbool.h>[Link to standard]
Quote: FUTURE DIRECTIONS
The ability to undefine and redefine the macros bool, true, and false is an obsolescent feature and may be withdrawn in a future version.
So code using it's own definitions of true or false may drop dead in future versions of C standards and can not be compiled on compilers using the new standards ... you have been warned.
In vino veritas
|
|
|
|
|
Since coders - both C and C++ -cannot AGREE which way is up, I'll continue to evaluate MOST BINARY conditions explicitly to its binary values.
Problem solved.
Now let's solve Mac or Windows next.
Have s well day,ya'l.
|
|
|
|
|
Vaclav_ wrote: C and C++ -cannot AGREE

|
|
|
|
|
Not only does he not realize that statement is incorrect what he plans to do is also going to give bugs.
He is going to test for the value of true by "== 1"
There is another subtlety that on compares with C/C++ any other value than 0 is true.
Windows and Linux both use that extensively especially on API call returns
They know a function hands back a register for a bool (not a bit) so they actively exploit it
Even consider normal things you see like
void* P = malloc(100);
if (p)
{
}
You can't write the true case simply ... the reality is the actual test is p != 0.
The moment you get MACROS you actually have no idea what the expansions are and he will end up doing things like
testing "p == 1" above ... which would be an amusing bug.
It's actually amusing how many problems you can create in some crazy attempt to fix a non existent problem based on total misunderstanding
In vino veritas
modified 23-Feb-20 11:41am.
|
|
|
|
|
Yes, but he doesn't like being told.
|
|
|
|
|
... with only one exception:
if someone agrees with him!
|
|
|
|
|
<blockquote class="quote"><div class="op">Quote:</div>Hello guys, I want to share with you my mini "project" which I managed to do so I can understand c++ better and decided to make mining game with if and while loops. I am in programming for awhile so this is reason why it is not that good.
There are things I would do different (I'm about to do it later). I want to hear your suggestions, opinions etc.. So let me know.
Code:
<pre lang="c++"><pre>
<h1>include <iostream></h1>
<h1>include <windows.h></h1>
using namespace std;
int main(){
bool start = true;
int startWay;
bool marketMine = true;
int marketWay;
bool trymarket = true;
static int copperGot = 2;
int copperNow = 0;
int balance = 0;
int shopWay;
int item;
bool market = true;
string errorInput = "Error, Again: ";
bool gearBuy = true;
int pickaxe;
while(start != false){
cout << "1. Start\n2. Credits\n>";
cin >> startWay;
if(startWay == 1){
cout << "You awake in old house, you dont have any money but your job is to mine.\nYou can make some money and buy gear and upgrades.\n";
Sleep(2000);
cout << "1. Mine\n2. Market\n>";
cin >> marketWay;
while(marketMine != false){
if(marketWay == 1){
cout << endl;
cout << "You are going mine..";
Sleep(800);
cout << "\nMining...." << endl;
Sleep(1000);
copperNow += copperGot;
cout << "You have got > " << copperGot << " copper and your copper is > " << copperNow << ". \n" << endl;
cout << "1. Mine\n2. Market\n>";
cin >> marketWay;
} else if(marketWay == 2){
Sleep(1000);
system("CLS");
cout << "Welcome on market. Here you can sell ores you have mined and buy better items\nfor more ores or money.\n\n";
Sleep(2000);
while(market != false){
cout << "1. Sell all copper.\n2. Balance\n3. Gear\n4. Pickaxe\n5. Mine\n>";
cin >> shopWay;
if(shopWay == 1){
Sleep(1000);
cout << "You have sold " << copperNow << " copper. You have gained " << copperNow * 2 << "$\n\n";
balance = copperNow * 2;
copperNow -= copperNow;
Sleep(2250);
system("CLS");
}else if(shopWay == 2){
cout << "Your balance is: " << balance << "$\n";
Sleep(3000);
system("CLS");
}else if(shopWay == 3){
Sleep(1000);
system("CLS");
cout << "Welcome, what do you want.\n\n1. Helm 250$\n2. Chestplate 500$\n3. Legs 400$\n4. Boots 200$\n5. Go back\n>";
cin >> item;
if(item == 1){
if(balance < 250){
cout << "Not enough balance. \n";
Sleep(2000);
system("CLS");
}else if(balance >= 250){
balance -= 250;
cout << "Here's your helm! you now get +1 ore. Your balance is > " << balance << "$ \n";
copperGot += 1;
Sleep(1500);
system("CLS");
}
}else if(item == 2){
if(balance < 500){
cout << "Not enough balance. \n";
Sleep(2000);
system("CLS");
}
else if(balance >= 500){
balance -= 500;
cout << "Here's your chestplate, now you get +1 ore. Your balance is > " << balance << "$ \n";
copperGot += 1;
Sleep(1500);
system("CLS");
}
}else if(item == 3){
if(balance < 400){
cout << "Not enough balance. \n";
Sleep(2000);
system("ClS");
}else if(balance >= 400){
balance -= 400;
cout << "Here are your legs, now you get +1 ore. Your balance is > " << balance << "$ \n";
copperGot += 1;
Sleep(1500);
system("CLS");
}
}else if(item == 4){
if(balance < 200){
cout << "Not enough balance. \n";
Sleep(2000);
system("CLS");
}else if(balance >= 200){
balance -= 200;
cout << "Here are your boots, you get now +0.5$ per ore. Your balance is > " << balance << "$ \n";
copperGot += 1;
Sleep(1500);
system("CLS");
}
}else if(item == 5){
cout << "Sending back.";
Sleep(1000);
system("CLS");
}else if(item != 1 || 2 || 3 || 4 || 5){
cout << errorInput;
cin >> item;
}
}else if(shopWay == 4){
Sleep(1500);
system("CLS");
cout << "Welcome, here, you can buy pickaxes, but these ones are much more cheaper than gear!\n\n";
cout << "1. Copper pickaxe 900$\n2. Silver pickaxe 1500$\n3. Gold pickaxe 2,250$\n4. Emerald pickaxe 3,200$\n5. Diamond pickaxe 5,000$\n>";
cin >> pickaxe;
if(pickaxe == 1){
if(balance < 900){
cout << "You don't have enough money!\n";
Sleep(2000);
system("CLS");
}else if(balance >= 900){
balance -= 900;
copperGot += 2;
cout << "Here's your pickaxe, now you get +2 ores! Your current balancse is > " << balance << "$ \n";
Sleep(2000);
system("CLS");
}
}else if(pickaxe == 2){
if(balance < 1500){
cout << "You don't have enough money!\n";
Sleep(2000);
system("CLS");
}else if(balance >= 1500){
balance -= 1500;
cout << "Here is your pickaxe, now you get +2 ores! Your current balance is > " << balance << "$ \n";
copperGot += 2;
Sleep(2000);
system("CLS");
}
}else if(pickaxe == 3){
if(balance < 2250){
cout << "You don't have enough money!\n";
Sleep(2000);
system("CLS");
}else if(balance >= 2250){
balance -= 2250;
cout << "Here's your pickaxe, now you get +2 ores! Your current balance is > " << balance << "$ \n";
copperGot += 2;
Sleep(2000);
system("CLS");
}
}else if(pickaxe == 4){
if(balance < 3200){
cout << "You don't have enough money!\n";
Sleep(2000);
system("CLS");
}else if(balance >= 3200){
balance -= 3200;
cout << "Here's your pickaxe, now you get +2 ores! Your current balance is > " << balance << "$ \n";
copperGot += 2;
Sleep(2000);
system("CLS");
}
}else if(pickaxe == 5){
if(balance < 5000){
cout << "You don't have enough money!\n";
Sleep(2000);
system("CLS");
}else if(balance >= 5000){
balance -= 5000;
cout << "Here's your pickaxe, now you get +2 ores! Your current balance is > " << balance << "$ \n";
copperGot += 2;
Sleep(2000);
system("CLS");
}
}
}else if(shopWay == 5){
cout << endl;
cout << "You are going mine..";
Sleep(800);
cout << "\nMining...." << endl;
Sleep(1000);
copperNow += copperGot;
cout << "You have got > " << copperGot << " copper and your copper is > " << copperNow << ". \n" << endl;
Sleep(2000);
system("CLS");
}else if(shopWay == 123456789){ //hidden help for money
balance += 60000;
system("CLS");
}
else if(startWay == 2){
cout << "All rights goes to: SM. (Inicials).\n";
}
else if(startWay != 1 || 2){
cout << "\nError, try again.\n\n";
}
} //while loop
}else if(marketWay != 1 || 2){
cout << "Error \n>";
cin >> marketWay;
}
} // while loop
}
}
}
|
|
|
|
|
The forum isn't a very good place to post large chunks of code, as the code formatting is a bit harder to get right.
That said, I skimmed over the code, and without checking it in detail, there are already a few things I would advise:
1. Don't declare all variables up front. In C++, you should go by the idiom RAII (Resource acquisition is initialization - Wikipedia[^] ). That is, declare the variable when you need it, and immediately initialise it with a meaningful value.
2. Don't put everything into a single function, and most certainly not into main. main() should only contain the main control loop of the game, e. g. a simple loop that checks whether you want to continue the current game, start a new game, or exit. Continuing the game should call a function to process the next step or do whatever else your game does until the next check. Then you obviously need some kind of input and output; these should also go into separate functions. And then you need the functions that process your input and change the state of your game.
3. I see an incredible amount of 'else if' statements trying to deal with different input options, but no 'else' statements. This means that while you check for every option, you may fail to check for invalid input (more precisely: for things you didn't check in your if statements). Moreover, you're micxing checks on different variables which makes your program flow extremely hard to follow (and likely incorrect). It is much easier to structure and read your code if you use the switch() statement instead, and provide a default case to catch invalid input.
4. Games like these lend themselves very well to object-oriented programming. You have a character, a shop, a mine, and probably a few other things that can (and probably should) be implemented as a class You seem to be playing as a character who has some gear and can perforem some actions. Equipment comes in different forms, but always have a price and a name; this can be encoded in a class, or a set of classes. E. g.:
class Equipment {
int price_;
string name_;
public:
Equipment(int price, string const& name) : price_(price), name_(name) {} virtual ~Equipment() {} virtual int price() const { return price_; }
virtual string name() const { return name_; }
};
class Helm : public Equipment {
public:
Helm() : Equipment(250, "Helm") {} virtual ~Helm() {}
};
class Pickaxe : public Equipment {
string type_;
public:
Pickaxe(int price_, string const& name) : type_(name), Equipment(price, " pickaxe") {}
virtual ~Pickaxe() {}
string name() const { return type + " " + Equipment::name(); }
};
class Miner {
int balance_;
vector<Equipment*> items_;
bool buy(Equipment const* item) {
if (item->price() > balance_) {
cout << "You only have " << balance_ << "$. You need "
<< item->price() << "$ to purchase a " << item->name() << endl;
delete item;
return false;
} else {
items_.push_back(item);
balance_ -= item->price();
}
return true;
}
public:
~Miner() {
for (auto item_it : items_) {
delete(*item_it);
}
}
void equipHelm() { buy(new Helm()); }
void equipPickaxe(int price, string const& type) { buy(new Pickaxe(price, type); }
};
Note how this design eliminates most of the repetitive parts in your code, and most functions are reduced to one-liners. Also, adding a new type of item now only requires a few lines of code: typically a simple class definition like the one for class Helm, and a new equip*() function in the Miner class.
GOTOs are a bit like wire coat hangers: they tend to breed in the darkness, such that where there once were few, eventually there are many, and the program's architecture collapses beneath them. (Fran Poretto)
modified 20-Feb-20 3:49am.
|
|
|
|
|
Not bad for start.
It is not that uncommon to start what my boss used to called "spaghetti code".
As long as your first code runs you can follow the flow and rearrange the actual code as you go.
The basic concept of the application is what is important.
You can identify the repetitive code and make classes or functions - as long as it continues to compile and run.
Personally I look at writing code and application separately.
And often I do not follow "top down " concept , but look at both application (tasks) and code as kind-off puzzle / mosaic.
Do not get discouraged by "code is too big, hard to follow..." comments.
I do understated that most folks just excpect to "cut and paste and run" posted code and if it does not they get frustrated.
You asked for comments on your coding style and you have received very good ones, if your posted does not compile / run is immaterial.
Now off the soap box and some real advise
When your declare a variable get into habit to initialize it and comment (what is) its purpose.
You are writing code to yourself , but do as is used to do in Chicago
"vote early and often "
comment and over comment what the code does - you will thank yourself later when it gets REALLY big !
Good luck
|
|
|
|
|
Alright, thank you for your reply and your opinion, you motivated me little bit As I mentioned in my topic, I am new to programming and have to learn many things, and as I was learning through I was getting too fast on it to learn new things, I should just stop at one thing and learn it as much as I can. Anyway, thanks for reply.
|
|
|
|
|
Chleba225 wrote: else if(startWay != 1 || 2){
cout << "\nError, try again.\n\n";
}
} //while loop
}else if(marketWay != 1 || 2){ I'm sure your intent was something closer to:
else if (startWay != 1 && startWay != 2)
...
else if (marketWay != 1 && marketWay != 2)
... Otherwise the OR part of the condition would evaluate to true and display the message.
Going one step further, since each of these if/else if pairs are only interested in the values 1 or 2, there's no need to check against those values at the end to determine if the message needs displaying. Just use an else by itself.
"One man's wage rise is another man's price increase." - Harold Wilson
"Fireproof doesn't mean the fire will never come. It means when the fire comes that you will be able to withstand it." - Michael Simmons
"You can easily judge the character of a man by how he treats those who can do nothing for him." - James D. Miles
modified 24-Feb-20 12:52pm.
|
|
|
|
|
I tried to build MicroSIP open source at VS 2017 and after solving some other issues, finaly got "Cannot open file 'hid.lib' in microsip".
Severity Code Description Project File Line Suppression State
Error LNK1104 cannot open file 'hid.lib' microsip E:\NybSys\0_Demo_All\MicroSIP\demo2\microsip-master\microsip-master\MicroSIP-3.19.17-src\LINK 1
I am stacked here more than 2 days. please help me.
|
|
|
|
|
|
My C++ compiler is not accepting string as a predefined class. No objects of string class could be created.
|
|
|
|
|
Do you mean the std::string?
Did you add the
#include <string>
|
|
|
|
|
Hello,
some more details would be helpful!
Do you mean std::string ? If this is the case did you include <string> ? :
#include <string>
then use std::string :
std::string astring("a string");
|
|
|
|
|