A simple game that keeps track of the number of questions askedConsole user main menuRock-Paper-Scissors-Lizard-Spock ChallengeSprite animation handlerSimple console snake game in PythonCard-fighting gameA simple Mastermind game in CPython: Pawn raceNAQ 2018 Problem D FroggieGuess-the-number game by a Python beginnerRobot game in C++
What is the meaning of word 'crack' in chapter 33 of A Game of Thrones?
Performance for simple code that converts a RGB tuple to hex string
How to manage expenditure when billing cycles and paycheck cycles are not aligned?
Why did UK NHS pay for homeopathic treatments?
Does "as soon as" imply simultaneity?
How can an attacker use robots.txt?
Why are there two fundamental laws of logic?
Why is (inf + 0j)*1 == inf + nanj?
What do you do if you have developments on your paper during the long peer review process?
How can this Stack Exchange site have an animated favicon?
How to deal with a Homophobic PC
Is there any iPhone SE out there with 3D Touch?
Can I take NEW (still in their boxes) PC PARTS in my checked in luggage?
How to discover (standard) function names?
Does wetting a beer glass change the foam characteristics?
What is the difference between an astronaut in the ISS and a freediver in perfect neutral buoyancy?
How do you use the interjection for snorting?
My Project Manager does not accept carry-over in Scrum, Is that normal?
1, 2, 4, 8, 16, ... 33?
Should the average user with no special access rights be worried about SMS-based 2FA being theoretically interceptable?
Is it really necessary to have a four hour meeting in Sprint planning?
Two trains move towards each other, a bird moves between them. How many trips can the bird make?
How to deal with my team leader who keeps calling me about project updates even though I am on leave for personal reasons?
Which place in our solar system is the most fit for terraforming?
A simple game that keeps track of the number of questions asked
Console user main menuRock-Paper-Scissors-Lizard-Spock ChallengeSprite animation handlerSimple console snake game in PythonCard-fighting gameA simple Mastermind game in CPython: Pawn raceNAQ 2018 Problem D FroggieGuess-the-number game by a Python beginnerRobot game in C++
.everyoneloves__top-leaderboard:empty,.everyoneloves__mid-leaderboard:empty,.everyoneloves__bot-mid-leaderboard:empty margin-bottom:0;
$begingroup$
This is just a simple counter, i was able to code it in two different ways but i want to know which way is more efficient and which way is more readable.
and which set of code is more "correct" in broad-manner of speaking.
and if there is another entirely different set of code that does the same function ?
Game Rules
This is a simple game , at first it asks the user if they want to go
right or left . if the user picks left ; the program ends and it
displays the "You Win!" message. however if the user picks anything
else other than left ( for example : right ) the program will start a
counter 'z' and it will display a different message for each time the
user chooses the wrong direction or input. i have set it to 4
different messages and then one last message that keeps playing on
repeat until the user picks the correct direction.
however i feel like that there must be better code to do this.
can you please help?
the first set of code :
#This is a simple game where if you pick left you win,
#but if you pick right you keep going through 4 different levels of
#'you lose' messages and then a last one keeps repeating in a loop.
z = 0
n = input ( "Go left or right? n" )
while n not in ["left", "Left"]:
if z == 0 :
print ("You lose * 0 ")
z = z+1
n = input ( "Go left or right? n" )
elif z == 1 :
print ("You lose * 1 ")
z = z+1
n = input ( "Go left or right? n" )
elif z == 2 :
print ("You lose * 2 ")
z = z+1
n = input ( "Go left or right? n" )
elif z == 3 :
print ("You lose * 3 ")
z = " "
n = input ( "Go left or right? n" )
else :
while n not in ["left", "Left" ] :
print ( "You Lose * Infinite" )
n = input ( "Go left or right? n" )
print ( "nYou Win!" )
Second set of code :
#This is a simple game where if you pick left you win,
#but if you pick right you keep going through 4 diffrent levels of
#'you lose' messegses and then a last one keeps repeating on a loop.
v = 0
z = 0
u = 0
x = 0
n = 0
while x == 0 :
n = input ("Go Left or Right?")
while n not in ["left", "Left"] and u == 0 :
if z == 0:
print ( " You lose * 0 ")
elif z == 1:
print ( " You lose * 1 ")
elif z == 2:
print ( " You lose * 2 ")
elif z == 3:
print ( " You lose * 3 ")
else :
print ( " You lose * Infinite " )
u = " "
while z < 4 and v == 0 :
z = z + 1
v = " "
u = 0
v = 0
if n == "left" or n == "Left":
x=" "
print ( " You Win! ")
```
python game comparative-review
New contributor
$endgroup$
add a comment
|
$begingroup$
This is just a simple counter, i was able to code it in two different ways but i want to know which way is more efficient and which way is more readable.
and which set of code is more "correct" in broad-manner of speaking.
and if there is another entirely different set of code that does the same function ?
Game Rules
This is a simple game , at first it asks the user if they want to go
right or left . if the user picks left ; the program ends and it
displays the "You Win!" message. however if the user picks anything
else other than left ( for example : right ) the program will start a
counter 'z' and it will display a different message for each time the
user chooses the wrong direction or input. i have set it to 4
different messages and then one last message that keeps playing on
repeat until the user picks the correct direction.
however i feel like that there must be better code to do this.
can you please help?
the first set of code :
#This is a simple game where if you pick left you win,
#but if you pick right you keep going through 4 different levels of
#'you lose' messages and then a last one keeps repeating in a loop.
z = 0
n = input ( "Go left or right? n" )
while n not in ["left", "Left"]:
if z == 0 :
print ("You lose * 0 ")
z = z+1
n = input ( "Go left or right? n" )
elif z == 1 :
print ("You lose * 1 ")
z = z+1
n = input ( "Go left or right? n" )
elif z == 2 :
print ("You lose * 2 ")
z = z+1
n = input ( "Go left or right? n" )
elif z == 3 :
print ("You lose * 3 ")
z = " "
n = input ( "Go left or right? n" )
else :
while n not in ["left", "Left" ] :
print ( "You Lose * Infinite" )
n = input ( "Go left or right? n" )
print ( "nYou Win!" )
Second set of code :
#This is a simple game where if you pick left you win,
#but if you pick right you keep going through 4 diffrent levels of
#'you lose' messegses and then a last one keeps repeating on a loop.
v = 0
z = 0
u = 0
x = 0
n = 0
while x == 0 :
n = input ("Go Left or Right?")
while n not in ["left", "Left"] and u == 0 :
if z == 0:
print ( " You lose * 0 ")
elif z == 1:
print ( " You lose * 1 ")
elif z == 2:
print ( " You lose * 2 ")
elif z == 3:
print ( " You lose * 3 ")
else :
print ( " You lose * Infinite " )
u = " "
while z < 4 and v == 0 :
z = z + 1
v = " "
u = 0
v = 0
if n == "left" or n == "Left":
x=" "
print ( " You Win! ")
```
python game comparative-review
New contributor
$endgroup$
2
$begingroup$
Welcome to Code Review! The current question title, which states your concerns about the code, is too general to be useful here. Please edit to the site standard, which is for the title to simply state the task accomplished by the code. Please see How to get the best value out of Code Review: Asking Questions for guidance on writing good question titles.
$endgroup$
– Toby Speight
10 hours ago
$begingroup$
@200_success I believe rules have been described now.
$endgroup$
– dfhwze
8 hours ago
$begingroup$
@TobySpeight The title has been fixed.
$endgroup$
– dfhwze
8 hours ago
add a comment
|
$begingroup$
This is just a simple counter, i was able to code it in two different ways but i want to know which way is more efficient and which way is more readable.
and which set of code is more "correct" in broad-manner of speaking.
and if there is another entirely different set of code that does the same function ?
Game Rules
This is a simple game , at first it asks the user if they want to go
right or left . if the user picks left ; the program ends and it
displays the "You Win!" message. however if the user picks anything
else other than left ( for example : right ) the program will start a
counter 'z' and it will display a different message for each time the
user chooses the wrong direction or input. i have set it to 4
different messages and then one last message that keeps playing on
repeat until the user picks the correct direction.
however i feel like that there must be better code to do this.
can you please help?
the first set of code :
#This is a simple game where if you pick left you win,
#but if you pick right you keep going through 4 different levels of
#'you lose' messages and then a last one keeps repeating in a loop.
z = 0
n = input ( "Go left or right? n" )
while n not in ["left", "Left"]:
if z == 0 :
print ("You lose * 0 ")
z = z+1
n = input ( "Go left or right? n" )
elif z == 1 :
print ("You lose * 1 ")
z = z+1
n = input ( "Go left or right? n" )
elif z == 2 :
print ("You lose * 2 ")
z = z+1
n = input ( "Go left or right? n" )
elif z == 3 :
print ("You lose * 3 ")
z = " "
n = input ( "Go left or right? n" )
else :
while n not in ["left", "Left" ] :
print ( "You Lose * Infinite" )
n = input ( "Go left or right? n" )
print ( "nYou Win!" )
Second set of code :
#This is a simple game where if you pick left you win,
#but if you pick right you keep going through 4 diffrent levels of
#'you lose' messegses and then a last one keeps repeating on a loop.
v = 0
z = 0
u = 0
x = 0
n = 0
while x == 0 :
n = input ("Go Left or Right?")
while n not in ["left", "Left"] and u == 0 :
if z == 0:
print ( " You lose * 0 ")
elif z == 1:
print ( " You lose * 1 ")
elif z == 2:
print ( " You lose * 2 ")
elif z == 3:
print ( " You lose * 3 ")
else :
print ( " You lose * Infinite " )
u = " "
while z < 4 and v == 0 :
z = z + 1
v = " "
u = 0
v = 0
if n == "left" or n == "Left":
x=" "
print ( " You Win! ")
```
python game comparative-review
New contributor
$endgroup$
This is just a simple counter, i was able to code it in two different ways but i want to know which way is more efficient and which way is more readable.
and which set of code is more "correct" in broad-manner of speaking.
and if there is another entirely different set of code that does the same function ?
Game Rules
This is a simple game , at first it asks the user if they want to go
right or left . if the user picks left ; the program ends and it
displays the "You Win!" message. however if the user picks anything
else other than left ( for example : right ) the program will start a
counter 'z' and it will display a different message for each time the
user chooses the wrong direction or input. i have set it to 4
different messages and then one last message that keeps playing on
repeat until the user picks the correct direction.
however i feel like that there must be better code to do this.
can you please help?
the first set of code :
#This is a simple game where if you pick left you win,
#but if you pick right you keep going through 4 different levels of
#'you lose' messages and then a last one keeps repeating in a loop.
z = 0
n = input ( "Go left or right? n" )
while n not in ["left", "Left"]:
if z == 0 :
print ("You lose * 0 ")
z = z+1
n = input ( "Go left or right? n" )
elif z == 1 :
print ("You lose * 1 ")
z = z+1
n = input ( "Go left or right? n" )
elif z == 2 :
print ("You lose * 2 ")
z = z+1
n = input ( "Go left or right? n" )
elif z == 3 :
print ("You lose * 3 ")
z = " "
n = input ( "Go left or right? n" )
else :
while n not in ["left", "Left" ] :
print ( "You Lose * Infinite" )
n = input ( "Go left or right? n" )
print ( "nYou Win!" )
Second set of code :
#This is a simple game where if you pick left you win,
#but if you pick right you keep going through 4 diffrent levels of
#'you lose' messegses and then a last one keeps repeating on a loop.
v = 0
z = 0
u = 0
x = 0
n = 0
while x == 0 :
n = input ("Go Left or Right?")
while n not in ["left", "Left"] and u == 0 :
if z == 0:
print ( " You lose * 0 ")
elif z == 1:
print ( " You lose * 1 ")
elif z == 2:
print ( " You lose * 2 ")
elif z == 3:
print ( " You lose * 3 ")
else :
print ( " You lose * Infinite " )
u = " "
while z < 4 and v == 0 :
z = z + 1
v = " "
u = 0
v = 0
if n == "left" or n == "Left":
x=" "
print ( " You Win! ")
```
python game comparative-review
python game comparative-review
New contributor
New contributor
edited 8 hours ago
dfhwze
12.3k2 gold badges22 silver badges84 bronze badges
12.3k2 gold badges22 silver badges84 bronze badges
New contributor
asked 10 hours ago
ElbaselElbasel
263 bronze badges
263 bronze badges
New contributor
New contributor
2
$begingroup$
Welcome to Code Review! The current question title, which states your concerns about the code, is too general to be useful here. Please edit to the site standard, which is for the title to simply state the task accomplished by the code. Please see How to get the best value out of Code Review: Asking Questions for guidance on writing good question titles.
$endgroup$
– Toby Speight
10 hours ago
$begingroup$
@200_success I believe rules have been described now.
$endgroup$
– dfhwze
8 hours ago
$begingroup$
@TobySpeight The title has been fixed.
$endgroup$
– dfhwze
8 hours ago
add a comment
|
2
$begingroup$
Welcome to Code Review! The current question title, which states your concerns about the code, is too general to be useful here. Please edit to the site standard, which is for the title to simply state the task accomplished by the code. Please see How to get the best value out of Code Review: Asking Questions for guidance on writing good question titles.
$endgroup$
– Toby Speight
10 hours ago
$begingroup$
@200_success I believe rules have been described now.
$endgroup$
– dfhwze
8 hours ago
$begingroup$
@TobySpeight The title has been fixed.
$endgroup$
– dfhwze
8 hours ago
2
2
$begingroup$
Welcome to Code Review! The current question title, which states your concerns about the code, is too general to be useful here. Please edit to the site standard, which is for the title to simply state the task accomplished by the code. Please see How to get the best value out of Code Review: Asking Questions for guidance on writing good question titles.
$endgroup$
– Toby Speight
10 hours ago
$begingroup$
Welcome to Code Review! The current question title, which states your concerns about the code, is too general to be useful here. Please edit to the site standard, which is for the title to simply state the task accomplished by the code. Please see How to get the best value out of Code Review: Asking Questions for guidance on writing good question titles.
$endgroup$
– Toby Speight
10 hours ago
$begingroup$
@200_success I believe rules have been described now.
$endgroup$
– dfhwze
8 hours ago
$begingroup$
@200_success I believe rules have been described now.
$endgroup$
– dfhwze
8 hours ago
$begingroup$
@TobySpeight The title has been fixed.
$endgroup$
– dfhwze
8 hours ago
$begingroup$
@TobySpeight The title has been fixed.
$endgroup$
– dfhwze
8 hours ago
add a comment
|
1 Answer
1
active
oldest
votes
$begingroup$
You're doing some weird things with the scripts. I consider the first to be better, since especially in the second one, you're doing a lot of things with variables which we have better ways to do. I'll point those out separately - lets first have a look at your first script.
Your first script
Code Duplication
If you find yourself typing the same thing a lot, you're probably doing something wrong. Examples of this are incrementing z and printing the message.
Variable Names
Variables should have short but meaningful names. That means that if you find yourself using variables like z or n, you're probably doing something wrong somewhere.
Loops and termination
We have a really nice command named break
in python. It will terminate the inner-most loop. Using this will obsolete all nested loops your currently have.
I'll keep using while loops here, but you might also want to try the following instead:
from itertools import count
for iteration in count(1):
# do stuff...
if we_are_done():
break
this function is basically an infinity list - it's doing exactly the same as:
iteration = 0
while True:
iteration += 1
# do stuff....
if we_are_done():
break
Which we'll be doing all the time here.
Keeping that all in mind....
iteration = 0
while True:
command = input("Go Left or Right?")
if "left" in command.lower(): # Transforms the input to all lowercase. This makes it case-insensitive.
# We also use "in" as membership test, so that whitespace is ignored, and even an command like
# "go left" will be considered valid.
break # Terminates the loop.
iteration += 1
print(f"You lose * iteration if iteration < 4 else 'infinity'")
print("nYou Win!")
This will do the same as your first script. In the loop, we get the input. We decide if we have won yet, and if we do, we break out. Then we increment the iteration variable. Then we print how often we've moved wrong before, or if it's more than 3 times, we instead print we lost * infinity.
If you're confused by the way we put our variable in that string, you should read up on f-strings. If you're confused by how we print that number, read up on ternary expressions. A good python programmer will know both. If the python version allows it, (s)he'll probably also use both.
Now lets dissect your second function...
I'll ignore everything I've already said something about regarding the first script.
Variable instantiation - don't do it unless you have to
v = 0
z = 0
u = 0
x = 0
n = 0
If you find yourself writing something like this, you should ask yourself if you really need all those. Generally, you'll only instantiate variables in python when you need them, and leave them undefined as long as you don't. IF, and this is a big if, you really need them, you'd write it like this:
v = z = u = x = n = 0
How not to loop
Your outer loop should of course be either with count()
or while True:
. But the first inner loop is just obsolete alltogether. It cannot run more than once, since there's an u == 0
requirement for it to run, and at the end of the loop you unconditionally set it to " "
, which is a totally different something. Your second inner loop does the exact same thing, but with v
. In both cases, you can just delete your loops and unindent your code. And at the end, of course, you should break.
Do it just once if you can.
You check for n not in ["left", "Left"]
twice. Of course, the first time is to guard against the printing, and the second is to break
out of your loop. If you just break
at the top, you'll have avoided having to do it twice.
$endgroup$
add a comment
|
Your Answer
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/4.0/"u003ecc by-sa 4.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
);
);
Elbasel 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%2f229381%2fa-simple-game-that-keeps-track-of-the-number-of-questions-asked%23new-answer', 'question_page');
);
Post as a guest
Required, but never shown
1 Answer
1
active
oldest
votes
1 Answer
1
active
oldest
votes
active
oldest
votes
active
oldest
votes
$begingroup$
You're doing some weird things with the scripts. I consider the first to be better, since especially in the second one, you're doing a lot of things with variables which we have better ways to do. I'll point those out separately - lets first have a look at your first script.
Your first script
Code Duplication
If you find yourself typing the same thing a lot, you're probably doing something wrong. Examples of this are incrementing z and printing the message.
Variable Names
Variables should have short but meaningful names. That means that if you find yourself using variables like z or n, you're probably doing something wrong somewhere.
Loops and termination
We have a really nice command named break
in python. It will terminate the inner-most loop. Using this will obsolete all nested loops your currently have.
I'll keep using while loops here, but you might also want to try the following instead:
from itertools import count
for iteration in count(1):
# do stuff...
if we_are_done():
break
this function is basically an infinity list - it's doing exactly the same as:
iteration = 0
while True:
iteration += 1
# do stuff....
if we_are_done():
break
Which we'll be doing all the time here.
Keeping that all in mind....
iteration = 0
while True:
command = input("Go Left or Right?")
if "left" in command.lower(): # Transforms the input to all lowercase. This makes it case-insensitive.
# We also use "in" as membership test, so that whitespace is ignored, and even an command like
# "go left" will be considered valid.
break # Terminates the loop.
iteration += 1
print(f"You lose * iteration if iteration < 4 else 'infinity'")
print("nYou Win!")
This will do the same as your first script. In the loop, we get the input. We decide if we have won yet, and if we do, we break out. Then we increment the iteration variable. Then we print how often we've moved wrong before, or if it's more than 3 times, we instead print we lost * infinity.
If you're confused by the way we put our variable in that string, you should read up on f-strings. If you're confused by how we print that number, read up on ternary expressions. A good python programmer will know both. If the python version allows it, (s)he'll probably also use both.
Now lets dissect your second function...
I'll ignore everything I've already said something about regarding the first script.
Variable instantiation - don't do it unless you have to
v = 0
z = 0
u = 0
x = 0
n = 0
If you find yourself writing something like this, you should ask yourself if you really need all those. Generally, you'll only instantiate variables in python when you need them, and leave them undefined as long as you don't. IF, and this is a big if, you really need them, you'd write it like this:
v = z = u = x = n = 0
How not to loop
Your outer loop should of course be either with count()
or while True:
. But the first inner loop is just obsolete alltogether. It cannot run more than once, since there's an u == 0
requirement for it to run, and at the end of the loop you unconditionally set it to " "
, which is a totally different something. Your second inner loop does the exact same thing, but with v
. In both cases, you can just delete your loops and unindent your code. And at the end, of course, you should break.
Do it just once if you can.
You check for n not in ["left", "Left"]
twice. Of course, the first time is to guard against the printing, and the second is to break
out of your loop. If you just break
at the top, you'll have avoided having to do it twice.
$endgroup$
add a comment
|
$begingroup$
You're doing some weird things with the scripts. I consider the first to be better, since especially in the second one, you're doing a lot of things with variables which we have better ways to do. I'll point those out separately - lets first have a look at your first script.
Your first script
Code Duplication
If you find yourself typing the same thing a lot, you're probably doing something wrong. Examples of this are incrementing z and printing the message.
Variable Names
Variables should have short but meaningful names. That means that if you find yourself using variables like z or n, you're probably doing something wrong somewhere.
Loops and termination
We have a really nice command named break
in python. It will terminate the inner-most loop. Using this will obsolete all nested loops your currently have.
I'll keep using while loops here, but you might also want to try the following instead:
from itertools import count
for iteration in count(1):
# do stuff...
if we_are_done():
break
this function is basically an infinity list - it's doing exactly the same as:
iteration = 0
while True:
iteration += 1
# do stuff....
if we_are_done():
break
Which we'll be doing all the time here.
Keeping that all in mind....
iteration = 0
while True:
command = input("Go Left or Right?")
if "left" in command.lower(): # Transforms the input to all lowercase. This makes it case-insensitive.
# We also use "in" as membership test, so that whitespace is ignored, and even an command like
# "go left" will be considered valid.
break # Terminates the loop.
iteration += 1
print(f"You lose * iteration if iteration < 4 else 'infinity'")
print("nYou Win!")
This will do the same as your first script. In the loop, we get the input. We decide if we have won yet, and if we do, we break out. Then we increment the iteration variable. Then we print how often we've moved wrong before, or if it's more than 3 times, we instead print we lost * infinity.
If you're confused by the way we put our variable in that string, you should read up on f-strings. If you're confused by how we print that number, read up on ternary expressions. A good python programmer will know both. If the python version allows it, (s)he'll probably also use both.
Now lets dissect your second function...
I'll ignore everything I've already said something about regarding the first script.
Variable instantiation - don't do it unless you have to
v = 0
z = 0
u = 0
x = 0
n = 0
If you find yourself writing something like this, you should ask yourself if you really need all those. Generally, you'll only instantiate variables in python when you need them, and leave them undefined as long as you don't. IF, and this is a big if, you really need them, you'd write it like this:
v = z = u = x = n = 0
How not to loop
Your outer loop should of course be either with count()
or while True:
. But the first inner loop is just obsolete alltogether. It cannot run more than once, since there's an u == 0
requirement for it to run, and at the end of the loop you unconditionally set it to " "
, which is a totally different something. Your second inner loop does the exact same thing, but with v
. In both cases, you can just delete your loops and unindent your code. And at the end, of course, you should break.
Do it just once if you can.
You check for n not in ["left", "Left"]
twice. Of course, the first time is to guard against the printing, and the second is to break
out of your loop. If you just break
at the top, you'll have avoided having to do it twice.
$endgroup$
add a comment
|
$begingroup$
You're doing some weird things with the scripts. I consider the first to be better, since especially in the second one, you're doing a lot of things with variables which we have better ways to do. I'll point those out separately - lets first have a look at your first script.
Your first script
Code Duplication
If you find yourself typing the same thing a lot, you're probably doing something wrong. Examples of this are incrementing z and printing the message.
Variable Names
Variables should have short but meaningful names. That means that if you find yourself using variables like z or n, you're probably doing something wrong somewhere.
Loops and termination
We have a really nice command named break
in python. It will terminate the inner-most loop. Using this will obsolete all nested loops your currently have.
I'll keep using while loops here, but you might also want to try the following instead:
from itertools import count
for iteration in count(1):
# do stuff...
if we_are_done():
break
this function is basically an infinity list - it's doing exactly the same as:
iteration = 0
while True:
iteration += 1
# do stuff....
if we_are_done():
break
Which we'll be doing all the time here.
Keeping that all in mind....
iteration = 0
while True:
command = input("Go Left or Right?")
if "left" in command.lower(): # Transforms the input to all lowercase. This makes it case-insensitive.
# We also use "in" as membership test, so that whitespace is ignored, and even an command like
# "go left" will be considered valid.
break # Terminates the loop.
iteration += 1
print(f"You lose * iteration if iteration < 4 else 'infinity'")
print("nYou Win!")
This will do the same as your first script. In the loop, we get the input. We decide if we have won yet, and if we do, we break out. Then we increment the iteration variable. Then we print how often we've moved wrong before, or if it's more than 3 times, we instead print we lost * infinity.
If you're confused by the way we put our variable in that string, you should read up on f-strings. If you're confused by how we print that number, read up on ternary expressions. A good python programmer will know both. If the python version allows it, (s)he'll probably also use both.
Now lets dissect your second function...
I'll ignore everything I've already said something about regarding the first script.
Variable instantiation - don't do it unless you have to
v = 0
z = 0
u = 0
x = 0
n = 0
If you find yourself writing something like this, you should ask yourself if you really need all those. Generally, you'll only instantiate variables in python when you need them, and leave them undefined as long as you don't. IF, and this is a big if, you really need them, you'd write it like this:
v = z = u = x = n = 0
How not to loop
Your outer loop should of course be either with count()
or while True:
. But the first inner loop is just obsolete alltogether. It cannot run more than once, since there's an u == 0
requirement for it to run, and at the end of the loop you unconditionally set it to " "
, which is a totally different something. Your second inner loop does the exact same thing, but with v
. In both cases, you can just delete your loops and unindent your code. And at the end, of course, you should break.
Do it just once if you can.
You check for n not in ["left", "Left"]
twice. Of course, the first time is to guard against the printing, and the second is to break
out of your loop. If you just break
at the top, you'll have avoided having to do it twice.
$endgroup$
You're doing some weird things with the scripts. I consider the first to be better, since especially in the second one, you're doing a lot of things with variables which we have better ways to do. I'll point those out separately - lets first have a look at your first script.
Your first script
Code Duplication
If you find yourself typing the same thing a lot, you're probably doing something wrong. Examples of this are incrementing z and printing the message.
Variable Names
Variables should have short but meaningful names. That means that if you find yourself using variables like z or n, you're probably doing something wrong somewhere.
Loops and termination
We have a really nice command named break
in python. It will terminate the inner-most loop. Using this will obsolete all nested loops your currently have.
I'll keep using while loops here, but you might also want to try the following instead:
from itertools import count
for iteration in count(1):
# do stuff...
if we_are_done():
break
this function is basically an infinity list - it's doing exactly the same as:
iteration = 0
while True:
iteration += 1
# do stuff....
if we_are_done():
break
Which we'll be doing all the time here.
Keeping that all in mind....
iteration = 0
while True:
command = input("Go Left or Right?")
if "left" in command.lower(): # Transforms the input to all lowercase. This makes it case-insensitive.
# We also use "in" as membership test, so that whitespace is ignored, and even an command like
# "go left" will be considered valid.
break # Terminates the loop.
iteration += 1
print(f"You lose * iteration if iteration < 4 else 'infinity'")
print("nYou Win!")
This will do the same as your first script. In the loop, we get the input. We decide if we have won yet, and if we do, we break out. Then we increment the iteration variable. Then we print how often we've moved wrong before, or if it's more than 3 times, we instead print we lost * infinity.
If you're confused by the way we put our variable in that string, you should read up on f-strings. If you're confused by how we print that number, read up on ternary expressions. A good python programmer will know both. If the python version allows it, (s)he'll probably also use both.
Now lets dissect your second function...
I'll ignore everything I've already said something about regarding the first script.
Variable instantiation - don't do it unless you have to
v = 0
z = 0
u = 0
x = 0
n = 0
If you find yourself writing something like this, you should ask yourself if you really need all those. Generally, you'll only instantiate variables in python when you need them, and leave them undefined as long as you don't. IF, and this is a big if, you really need them, you'd write it like this:
v = z = u = x = n = 0
How not to loop
Your outer loop should of course be either with count()
or while True:
. But the first inner loop is just obsolete alltogether. It cannot run more than once, since there's an u == 0
requirement for it to run, and at the end of the loop you unconditionally set it to " "
, which is a totally different something. Your second inner loop does the exact same thing, but with v
. In both cases, you can just delete your loops and unindent your code. And at the end, of course, you should break.
Do it just once if you can.
You check for n not in ["left", "Left"]
twice. Of course, the first time is to guard against the printing, and the second is to break
out of your loop. If you just break
at the top, you'll have avoided having to do it twice.
answered 8 hours ago
GloweyeGloweye
4115 bronze badges
4115 bronze badges
add a comment
|
add a comment
|
Elbasel is a new contributor. Be nice, and check out our Code of Conduct.
Elbasel is a new contributor. Be nice, and check out our Code of Conduct.
Elbasel is a new contributor. Be nice, and check out our Code of Conduct.
Elbasel 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%2f229381%2fa-simple-game-that-keeps-track-of-the-number-of-questions-asked%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
2
$begingroup$
Welcome to Code Review! The current question title, which states your concerns about the code, is too general to be useful here. Please edit to the site standard, which is for the title to simply state the task accomplished by the code. Please see How to get the best value out of Code Review: Asking Questions for guidance on writing good question titles.
$endgroup$
– Toby Speight
10 hours ago
$begingroup$
@200_success I believe rules have been described now.
$endgroup$
– dfhwze
8 hours ago
$begingroup$
@TobySpeight The title has been fixed.
$endgroup$
– dfhwze
8 hours ago