Lesson Objectives
At the end of this lesson, you will know…
- How to use “if” statements
One of the most common things you’ll do in a program is use an “if” statement.
“If” some condition is true, then you want a certain section of code to run. If it isn’t true, you don’t want that section of code to run.
For example, during a battle, if the player’s hit points drops to zero, you’ll want to end the battle. If the player has more than zero hit points, you’ll want them to be able to continue fighting.
You can also create “if” statements that are more complex than just checking one value. Or, you may want to be able to handle more than two conditions for a value.
Here are code samples, and description, for four typical ways you’ll use an “if” statement.
The simple “if” statement
public bool IsPlayerStillAlive1(int currentHitPoints) { if(currentHitPoints > 0) { return true; } return false; }
Here, we check if the passed-in “currentHitPoints” is greater than zero. If it is, the computer will run the code between the curly braces after the “if” – in this case, lines 4 through 6. When it reaches line 5, it will stop processing the rest of the code in this function and return a value of “true”.
If “currentHitPoints” is equal, or less than, zero, the computer will continue going through this function. In this case, it will get to line 8 and return “false” to whatever called this function.
“If” with an “else”
public bool IsPlayerStillAlive2(int currentHitPoints) { if(currentHitPoints > 0) { return true; } else { return false; } }
This function does the same thing as the previous one. However, we explicitly have an “else” statement.
So, if the expression between the parentheses of the “if” statement is true, the code between the curly braces on lines 4 and 6 will be run. “Else”, the code between the next set of curly braces will be run.
This is a simple function, with just one line in each branch of the “if” statement (the “true” branch and the “false” branch). However, you could have more lines of code between the curly braces – as you’ll see in the lessons when we add the code to play the game.
Complex “if” conditions
public bool IsPlayerStillAlive3(int currentHitPoints, bool hasResurrectionRing) { if((currentHitPoints > 0) || ((currentHitPoints == 0) && hasResurrectionRing)) { return true; } else { return false; } }
You can check more than one condition in an “if” statement. You can also make it so all the conditions must be true (using “and”s), or, at least one of the conditions must be true (using “or”s).
This is a place where some people get a little confused – especially when the code has many conditions that it’s checking.
An important thing to remember is to look for parentheses around the conditions, and work your way from the inner-most sets of parentheses, to the outermost – just like in Algebra class (if you remember that).
Let’s say that this function is called with these parameters:
currentHitPoints = 5
hasResurrectionRing = false
If we replace the variables in the parentheses with the values, we end up with this:
if((5 > 0) || ((5 == 0) && false))
Which becomes:
if((true) || ((false) && false))
Now we can deal with the new symbols “||” and “&&”.
These are used when you want to work with Boolean values. “||” means, “or”. “&&” means “and”.
With “&&”, the value on both sides of it need to be true, for the whole comparison to be “true”.
Now we can reduce the “((false) && false)” to “(false)”, since the values on both sides are not equal to “true”. That gives us this:
if((true) || (false))
With “||”, if the value on either side of it is “true”, then the whole statement is “true”. If you look at the original “if” statement in English, you’d say it like this, “If the player’s current hit points is greater than zero, or the player’s current hit points is zero and they have a resurrection ring, then do this…”.
Since we have a “true” on one side of the “||” (or), the whole thing evaluates to “true”.
So, for these parameter values, the code between the first set of curly braces would be run.
If you passed in these parameters, the program would follow these steps to eventually figure out to run the “else” code:
currentHitPoints = 0
hasResurrectionRing = false
Makes the “if” look like this:
if((0 > 0) || ((0 == 0) && false))
To:
if((false) || ((true) && false))
To:
if((false) || (false))
To:
if(false)
So, the code between the curly braces after the “else” would be run.
“If” with “else if”
Sometimes you want to do multiple checks against something.
Here’s one way you might look at the player’s current experience points to determine their level:
public int ComputePlayerLevel(int experiencePoints) { if(experiencePoints < 100) { return 1; // Player is level 1 } else if(experiencePoints < 250) { return 2; // Player is level 2 } else if(experiencePoints < 500) { return 3; // Player is level 3 } else if(experiencePoints < 1000) { return 4; // Player is level 4 } return 5; // The maximum level is 5, in this sample }
In this case, if the experiencePoints parameter is less than 100, the function will return a value of one.
However, if it’s 100 or more, we still want to do some more comparisons in the “else”. So, we use an “else if” to connect our next “if” statement.
In this function, if the player had 672 experiencePoints, it would be false for the first “if” (where it checks to see if the value is less than 100), and go to the “else if” statement. Since 672 is not less than 250, it would go to the next “else if”. There, it’s also not less than 500, so it goes to the next “else if”. Finally, 672 is less than 1000, so the program runs the code to return a value of 4.
In case none of the “if” conditions were true, the program would have continued going through the function until it hit the line to return 5.
Summary
Now you see how you can run, or not run, sections of code based on conditions in the program.
When we add in the source code for the game logic (moving the player around to different locations, battling monsters, completing quests, etc.) you’ll see several “if” statements in action.
Note: With the “if” condition that used “||” and “&&”, I included lots of parentheses, so you’d know exactly how the comparison logic should be calculated. Be nice to yourself, or the next programmer who will look at your code, and do the same.
I could have written it as:
if(currentHitPoints > 0 || (currentHitPoints == 0 && hasResurrectionRing))
But I think that makes it a little harder to understand.
Source code for this lesson
There is no code for this lesson
Next lesson: Lesson 14.3 – Foreach loops
Previous lesson: Lesson 14.1 – Variables
All lessons: Learn C# by Building a Simple RPG Index
I don’t is it a mistake or not. In your examples :
((currentHitPoints == 0) && hasResurrectionRing))
or
”
(currentHitPoints == 0 && hasResurrectionRing))
You haven’t closed the parentheses around “hasResurrectionRing”, like that :
“(currentHitPoints == 0 && // ( // hasResurrectionRing))”
Where do you see that line? I only see these lines:
if((currentHitPoints > 0) || ((currentHitPoints == 0) && hasResurrectionRing))
and
if(currentHitPoints > 0 || (currentHitPoints == 0 && hasResurrectionRing))
It looks like the parentheses are balanced in those lines (four of each in the first line, two of each in the second line).
OHH now i see , thank you. i was confused because i forgot about the existence of parentheses on the left side from &&.
Spanish –> Gracias por tu ayuda oh Gran Scott Lilly. Por tu gran culpa hoy estoy aprendiendo c# – C sharp
De nada. Me alegra que puedo ayudarte. <- Espanol sin practicando por muchos anhos 🙂
The second example of the or/and line is definitely easier to read:
if(currentHitPoints > 0 || (currentHitPoints == 0 && hasResurrectionRing))
To many () and it gets really hard to follow them all. I go with the “Less is more” idea when coding (at least I try to).
Dear Scott Lilly:
I have done the ComputePlayerLevel if loop just as you have described. However, my player stays at level 1 no matter how many experience points I get. The Visual Studio is not picking up any errors. How do I fix this?
Can you upload your solution (including the directories under it, and all the files in those directories) to GitHub or Dropbox, so I can look at it?
https://github.com/dolly-kay/Game-Codes/tree/master/SuperAdventure
Here. I hope I did everything right.
Hi Kay,
GitHub has the solution files, but doesn’t have the files in the project folders (SuperAdventure and Engine). Can you see if you can upload the project directories and files too?
https://github.com/dolly-kay/Game-Codes/tree/master/SuperAdventure/Engine
Okay, here is the Engine file. I hope this helps. If not, then I am sorry, but I don’t know what to tell you.
Hi Kay,
I was able to build your program with those files and see the problem.
This lesson showed how to write a function to compute the player’s level, but does not show where to add it in to the code (we do make changes to compute the level in lesson 19.2). If you want to have the level change now, you would need to change your program to add the line below after the three locations in the Player class where you set/update the ExperiencePoints property (lines 21, 115, and 316 in your code).
LINE TO ADD
Level = ComputePlayerLevel(ExperiencePoints);
This will recalculate the Player’s Level after each change to ExperiencePoints. Or, you can wait until lesson 19.2 and do a cleaner way to update the Player’s Level.
Let me know if that doesn’t work, or if you have any other questions.
Hey,
How do we get the level system to work?
Thank you.
We do that in Lesson 19.2