Python - Fishing Simulator
.everyoneloves__top-leaderboard:empty,.everyoneloves__mid-leaderboard:empty,.everyoneloves__bot-mid-leaderboard:empty{ margin-bottom:0;
}
$begingroup$
I'm new to Python, for a school project I created a "fishing simulator". Basically, use of random. I know that my code is repetitive towards the end but I don't know how to simplify it.
import time
import random
fishing = True
a = b = c = d = e = 0 #define multiple variables as same thing
print ("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~")
print ("Welcome to Lake Tocowaga")
print ("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~")
time.sleep(1)
name = input("What is your name fisherman?")
answer = input("Would you like to go fishing, " + name + "?")
if answer.lower() == "no":
fishing == False
while fishing == True:
time.sleep(1)
answer = input("Throw out your line, or go home?")
if answer == "go home":
fishing = False
er = float(e / (a + b + c + d))
print("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~")
print("Thanks for playing " + name + "!")
print("You caught:", str(a), "cod, ", str(b), "salmon, ", str(c), "shark, ", str(d), "wildfish. nEfficiency Rate: ", str(er), ".")
else:
t = random.randrange(1, 7)
if t == 1:
a += 1
print("You caught a cod!")
elif t == 2:
b += 1
print("You caught a salmon!")
elif t == 3:
c += 1
print("You caught a shark!")
elif t == 4:
d += 1
print("You caught a wildfish!")
elif t >= 5:
e += 1
print("You caught nothing!")
python beginner python-3.x
New contributor
$endgroup$
add a comment |
$begingroup$
I'm new to Python, for a school project I created a "fishing simulator". Basically, use of random. I know that my code is repetitive towards the end but I don't know how to simplify it.
import time
import random
fishing = True
a = b = c = d = e = 0 #define multiple variables as same thing
print ("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~")
print ("Welcome to Lake Tocowaga")
print ("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~")
time.sleep(1)
name = input("What is your name fisherman?")
answer = input("Would you like to go fishing, " + name + "?")
if answer.lower() == "no":
fishing == False
while fishing == True:
time.sleep(1)
answer = input("Throw out your line, or go home?")
if answer == "go home":
fishing = False
er = float(e / (a + b + c + d))
print("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~")
print("Thanks for playing " + name + "!")
print("You caught:", str(a), "cod, ", str(b), "salmon, ", str(c), "shark, ", str(d), "wildfish. nEfficiency Rate: ", str(er), ".")
else:
t = random.randrange(1, 7)
if t == 1:
a += 1
print("You caught a cod!")
elif t == 2:
b += 1
print("You caught a salmon!")
elif t == 3:
c += 1
print("You caught a shark!")
elif t == 4:
d += 1
print("You caught a wildfish!")
elif t >= 5:
e += 1
print("You caught nothing!")
python beginner python-3.x
New contributor
$endgroup$
$begingroup$
Why did you tag this question as python-2.x? I'm not convinced that it would work correctly in Python 2.
$endgroup$
– 200_success
3 hours ago
$begingroup$
One other thing not in either of the answers so far, would be to consider using a dictionary for yourfishes
, eg.fishes = {'cod': 0, 'salmon': 0,...}
, then it becomes far more readable when adding (fishes['cod'] += 1
) and dumping (for fish, count in fishes.items():nt print("{fish} -> {count}".format(**{'fish': fish, 'count': count}))
) values related fish caught.
$endgroup$
– S0AndS0
2 hours ago
add a comment |
$begingroup$
I'm new to Python, for a school project I created a "fishing simulator". Basically, use of random. I know that my code is repetitive towards the end but I don't know how to simplify it.
import time
import random
fishing = True
a = b = c = d = e = 0 #define multiple variables as same thing
print ("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~")
print ("Welcome to Lake Tocowaga")
print ("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~")
time.sleep(1)
name = input("What is your name fisherman?")
answer = input("Would you like to go fishing, " + name + "?")
if answer.lower() == "no":
fishing == False
while fishing == True:
time.sleep(1)
answer = input("Throw out your line, or go home?")
if answer == "go home":
fishing = False
er = float(e / (a + b + c + d))
print("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~")
print("Thanks for playing " + name + "!")
print("You caught:", str(a), "cod, ", str(b), "salmon, ", str(c), "shark, ", str(d), "wildfish. nEfficiency Rate: ", str(er), ".")
else:
t = random.randrange(1, 7)
if t == 1:
a += 1
print("You caught a cod!")
elif t == 2:
b += 1
print("You caught a salmon!")
elif t == 3:
c += 1
print("You caught a shark!")
elif t == 4:
d += 1
print("You caught a wildfish!")
elif t >= 5:
e += 1
print("You caught nothing!")
python beginner python-3.x
New contributor
$endgroup$
I'm new to Python, for a school project I created a "fishing simulator". Basically, use of random. I know that my code is repetitive towards the end but I don't know how to simplify it.
import time
import random
fishing = True
a = b = c = d = e = 0 #define multiple variables as same thing
print ("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~")
print ("Welcome to Lake Tocowaga")
print ("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~")
time.sleep(1)
name = input("What is your name fisherman?")
answer = input("Would you like to go fishing, " + name + "?")
if answer.lower() == "no":
fishing == False
while fishing == True:
time.sleep(1)
answer = input("Throw out your line, or go home?")
if answer == "go home":
fishing = False
er = float(e / (a + b + c + d))
print("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~")
print("Thanks for playing " + name + "!")
print("You caught:", str(a), "cod, ", str(b), "salmon, ", str(c), "shark, ", str(d), "wildfish. nEfficiency Rate: ", str(er), ".")
else:
t = random.randrange(1, 7)
if t == 1:
a += 1
print("You caught a cod!")
elif t == 2:
b += 1
print("You caught a salmon!")
elif t == 3:
c += 1
print("You caught a shark!")
elif t == 4:
d += 1
print("You caught a wildfish!")
elif t >= 5:
e += 1
print("You caught nothing!")
python beginner python-3.x
python beginner python-3.x
New contributor
New contributor
edited 2 hours ago
Austin Hastings
7,7771236
7,7771236
New contributor
asked 4 hours ago
MattthecommieMattthecommie
464
464
New contributor
New contributor
$begingroup$
Why did you tag this question as python-2.x? I'm not convinced that it would work correctly in Python 2.
$endgroup$
– 200_success
3 hours ago
$begingroup$
One other thing not in either of the answers so far, would be to consider using a dictionary for yourfishes
, eg.fishes = {'cod': 0, 'salmon': 0,...}
, then it becomes far more readable when adding (fishes['cod'] += 1
) and dumping (for fish, count in fishes.items():nt print("{fish} -> {count}".format(**{'fish': fish, 'count': count}))
) values related fish caught.
$endgroup$
– S0AndS0
2 hours ago
add a comment |
$begingroup$
Why did you tag this question as python-2.x? I'm not convinced that it would work correctly in Python 2.
$endgroup$
– 200_success
3 hours ago
$begingroup$
One other thing not in either of the answers so far, would be to consider using a dictionary for yourfishes
, eg.fishes = {'cod': 0, 'salmon': 0,...}
, then it becomes far more readable when adding (fishes['cod'] += 1
) and dumping (for fish, count in fishes.items():nt print("{fish} -> {count}".format(**{'fish': fish, 'count': count}))
) values related fish caught.
$endgroup$
– S0AndS0
2 hours ago
$begingroup$
Why did you tag this question as python-2.x? I'm not convinced that it would work correctly in Python 2.
$endgroup$
– 200_success
3 hours ago
$begingroup$
Why did you tag this question as python-2.x? I'm not convinced that it would work correctly in Python 2.
$endgroup$
– 200_success
3 hours ago
$begingroup$
One other thing not in either of the answers so far, would be to consider using a dictionary for your
fishes
, eg. fishes = {'cod': 0, 'salmon': 0,...}
, then it becomes far more readable when adding (fishes['cod'] += 1
) and dumping (for fish, count in fishes.items():nt print("{fish} -> {count}".format(**{'fish': fish, 'count': count}))
) values related fish caught.$endgroup$
– S0AndS0
2 hours ago
$begingroup$
One other thing not in either of the answers so far, would be to consider using a dictionary for your
fishes
, eg. fishes = {'cod': 0, 'salmon': 0,...}
, then it becomes far more readable when adding (fishes['cod'] += 1
) and dumping (for fish, count in fishes.items():nt print("{fish} -> {count}".format(**{'fish': fish, 'count': count}))
) values related fish caught.$endgroup$
– S0AndS0
2 hours ago
add a comment |
2 Answers
2
active
oldest
votes
$begingroup$
A few simple things.
a = b = c = d = e = 0
This is bad for two reasons:
Those are all non-descriptive, overly simple names. There's no way to tell what they represent just by looking at them.
You're shoving their declarations/definitions all on one line. This is generally regarded as poor practice. Say I'm looking for where
c
is defined. It's much easier to find it when I can be sure that I'm looking for exactlyc = ...
somewhere. It's harder to find though when it's declared half way through a line.
In both cases, you're sacrificing readability for brevity. Avoid doing this unless you're code golfing. Readability take precedence over nearly everything else.
fishing = True
is the third line in your file, yet you don't use it until later. Unless it's a constant, it's better to declare variables near where they're first used in many cases. When someone's reading your code and want to see the definition of fishing
, it's more efficient if they only have to look up a line or two instead of needing to scroll to the top of the file.
while fishing == True:
can simply be written as while fishing:
, which reads nicer anyways.
You actually have a bug. fishing == False
should be fishing = False
.
if answer.lower() == "no":
could be written to be more "tolerant" (but less exact) by only checking the first letter:
if answer.lower()[0] == "n":
Now input like "nope" will work as well. Whether or not you want this behavior is another story. If you had other answers that require "n" as the first letter, obviously this would break things.
$endgroup$
add a comment |
$begingroup$
Welcome to CodeReview. It's never too early to develop good coding habits, and reviewing your code is about the best way to do so.
First, congratulations on writing a clean, straightforward program. While you do have some issues (below), they're not major, and your program seems appropriate for its level.
Now, for the issues ;-)
Use whitespace
Python requires you to use horizontal whitespace. But you should also use vertical whitespace (aka "blank lines") to organize the different parts of your code into paragraphs.
This huge block:
import time
import random
fishing = True
a = b = c = d = e = 0 #define multiple variables as same thing
print ("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~")
print ("Welcome to Lake Tocowaga")
print ("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~")
time.sleep(1)
name = input("What is your name fisherman?")
answer = input("Would you like to go fishing, " + name + "?")
if answer.lower() == "no":
fishing == False
while fishing == True:
would read better if it were broken up like so:
import time
import random
fishing = True
a = b = c = d = e = 0 #define multiple variables as same thing
print ("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~")
print ("Welcome to Lake Tocowaga")
print ("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~")
time.sleep(1)
name = input("What is your name fisherman?")
answer = input("Would you like to go fishing, " + name + "?")
if answer.lower() == "no":
fishing == False
while fishing == True:
All I did was add a few blank lines, but I was trying to show that "these things go together" and "these things are in sequence but not related".
Use meaningful names:
Which one of these is the shark?
a = b = c = d = e = 0
I have no idea. But if you named them appropriately:
cod = shark = wildfish = salmon = nothing = 0
I would know for sure!
Use named constants
This line appears three times:
print ("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~")
It's probably hard to get the right number of tilde characters, unless you are copy/pasting it. And if you're doing that, it's probably a pain. Instead, create a name for the tildes. By convention, constants are spelled in uppercase. (It's not really a constant, but since constants are spelled in upper case, if you name it in upper case you'll know not to modify it.)
H_LINE = "~" * 32
print(H_LINE)
print("Welcome to Lake Tocowaga")
print(H_LINE)
Put last things last
There's a place for everything. And everything should be in its place. The place for printing a summary would be at the bottom.
You had a good idea with your while fishing:
loop. But instead of immediately printing the summary when you respond to the user input, just change the variable and let the loop fail, then print the summary at the bottom. It's more "natural" (and it makes your loops easier to read!).
while fishing == True:
time.sleep(1)
answer = input("Throw out your line, or go home?")
if answer == "go home":
fishing = False
er = float(e / (a + b + c + d))
print("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~")
print("Thanks for playing " + name + "!")
print("You caught:", str(a), "cod, ", str(b), "salmon, ", str(c), "shark, ", str(d), "wildfish. nEfficiency Rate: ", str(er), ".")
else:
...
Becomes:
while fishing == True:
time.sleep(1)
answer = input("Throw out your line, or go home?")
if answer == "go home":
fishing = False
else:
...
er = float(e / (a + b + c + d))
print(H_LINE)
print("Thanks for playing " + name + "!")
print("You caught:", str(a), "cod, ", str(b), "salmon, ", str(c), "shark, ", str(d), "wildfish. nEfficiency Rate: ", str(er), ".")
Let the built-in functions do their job
You are calling functions that you don't need to call. The result of "true" division between integers is a float. You don't need to call float(e / (a + b + c + d))
. And if you did need to call it, you'd be calling it too late!
Likewise, print
knows how to handle integers and floating point numbers. You don't need to print(..., str(a), ...)
when you can just do: print(..., a, ...)
.
$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/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
});
}
});
Mattthecommie 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%2f217357%2fpython-fishing-simulator%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
2 Answers
2
active
oldest
votes
2 Answers
2
active
oldest
votes
active
oldest
votes
active
oldest
votes
$begingroup$
A few simple things.
a = b = c = d = e = 0
This is bad for two reasons:
Those are all non-descriptive, overly simple names. There's no way to tell what they represent just by looking at them.
You're shoving their declarations/definitions all on one line. This is generally regarded as poor practice. Say I'm looking for where
c
is defined. It's much easier to find it when I can be sure that I'm looking for exactlyc = ...
somewhere. It's harder to find though when it's declared half way through a line.
In both cases, you're sacrificing readability for brevity. Avoid doing this unless you're code golfing. Readability take precedence over nearly everything else.
fishing = True
is the third line in your file, yet you don't use it until later. Unless it's a constant, it's better to declare variables near where they're first used in many cases. When someone's reading your code and want to see the definition of fishing
, it's more efficient if they only have to look up a line or two instead of needing to scroll to the top of the file.
while fishing == True:
can simply be written as while fishing:
, which reads nicer anyways.
You actually have a bug. fishing == False
should be fishing = False
.
if answer.lower() == "no":
could be written to be more "tolerant" (but less exact) by only checking the first letter:
if answer.lower()[0] == "n":
Now input like "nope" will work as well. Whether or not you want this behavior is another story. If you had other answers that require "n" as the first letter, obviously this would break things.
$endgroup$
add a comment |
$begingroup$
A few simple things.
a = b = c = d = e = 0
This is bad for two reasons:
Those are all non-descriptive, overly simple names. There's no way to tell what they represent just by looking at them.
You're shoving their declarations/definitions all on one line. This is generally regarded as poor practice. Say I'm looking for where
c
is defined. It's much easier to find it when I can be sure that I'm looking for exactlyc = ...
somewhere. It's harder to find though when it's declared half way through a line.
In both cases, you're sacrificing readability for brevity. Avoid doing this unless you're code golfing. Readability take precedence over nearly everything else.
fishing = True
is the third line in your file, yet you don't use it until later. Unless it's a constant, it's better to declare variables near where they're first used in many cases. When someone's reading your code and want to see the definition of fishing
, it's more efficient if they only have to look up a line or two instead of needing to scroll to the top of the file.
while fishing == True:
can simply be written as while fishing:
, which reads nicer anyways.
You actually have a bug. fishing == False
should be fishing = False
.
if answer.lower() == "no":
could be written to be more "tolerant" (but less exact) by only checking the first letter:
if answer.lower()[0] == "n":
Now input like "nope" will work as well. Whether or not you want this behavior is another story. If you had other answers that require "n" as the first letter, obviously this would break things.
$endgroup$
add a comment |
$begingroup$
A few simple things.
a = b = c = d = e = 0
This is bad for two reasons:
Those are all non-descriptive, overly simple names. There's no way to tell what they represent just by looking at them.
You're shoving their declarations/definitions all on one line. This is generally regarded as poor practice. Say I'm looking for where
c
is defined. It's much easier to find it when I can be sure that I'm looking for exactlyc = ...
somewhere. It's harder to find though when it's declared half way through a line.
In both cases, you're sacrificing readability for brevity. Avoid doing this unless you're code golfing. Readability take precedence over nearly everything else.
fishing = True
is the third line in your file, yet you don't use it until later. Unless it's a constant, it's better to declare variables near where they're first used in many cases. When someone's reading your code and want to see the definition of fishing
, it's more efficient if they only have to look up a line or two instead of needing to scroll to the top of the file.
while fishing == True:
can simply be written as while fishing:
, which reads nicer anyways.
You actually have a bug. fishing == False
should be fishing = False
.
if answer.lower() == "no":
could be written to be more "tolerant" (but less exact) by only checking the first letter:
if answer.lower()[0] == "n":
Now input like "nope" will work as well. Whether or not you want this behavior is another story. If you had other answers that require "n" as the first letter, obviously this would break things.
$endgroup$
A few simple things.
a = b = c = d = e = 0
This is bad for two reasons:
Those are all non-descriptive, overly simple names. There's no way to tell what they represent just by looking at them.
You're shoving their declarations/definitions all on one line. This is generally regarded as poor practice. Say I'm looking for where
c
is defined. It's much easier to find it when I can be sure that I'm looking for exactlyc = ...
somewhere. It's harder to find though when it's declared half way through a line.
In both cases, you're sacrificing readability for brevity. Avoid doing this unless you're code golfing. Readability take precedence over nearly everything else.
fishing = True
is the third line in your file, yet you don't use it until later. Unless it's a constant, it's better to declare variables near where they're first used in many cases. When someone's reading your code and want to see the definition of fishing
, it's more efficient if they only have to look up a line or two instead of needing to scroll to the top of the file.
while fishing == True:
can simply be written as while fishing:
, which reads nicer anyways.
You actually have a bug. fishing == False
should be fishing = False
.
if answer.lower() == "no":
could be written to be more "tolerant" (but less exact) by only checking the first letter:
if answer.lower()[0] == "n":
Now input like "nope" will work as well. Whether or not you want this behavior is another story. If you had other answers that require "n" as the first letter, obviously this would break things.
edited 2 hours ago
answered 2 hours ago
CarcigenicateCarcigenicate
4,11411633
4,11411633
add a comment |
add a comment |
$begingroup$
Welcome to CodeReview. It's never too early to develop good coding habits, and reviewing your code is about the best way to do so.
First, congratulations on writing a clean, straightforward program. While you do have some issues (below), they're not major, and your program seems appropriate for its level.
Now, for the issues ;-)
Use whitespace
Python requires you to use horizontal whitespace. But you should also use vertical whitespace (aka "blank lines") to organize the different parts of your code into paragraphs.
This huge block:
import time
import random
fishing = True
a = b = c = d = e = 0 #define multiple variables as same thing
print ("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~")
print ("Welcome to Lake Tocowaga")
print ("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~")
time.sleep(1)
name = input("What is your name fisherman?")
answer = input("Would you like to go fishing, " + name + "?")
if answer.lower() == "no":
fishing == False
while fishing == True:
would read better if it were broken up like so:
import time
import random
fishing = True
a = b = c = d = e = 0 #define multiple variables as same thing
print ("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~")
print ("Welcome to Lake Tocowaga")
print ("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~")
time.sleep(1)
name = input("What is your name fisherman?")
answer = input("Would you like to go fishing, " + name + "?")
if answer.lower() == "no":
fishing == False
while fishing == True:
All I did was add a few blank lines, but I was trying to show that "these things go together" and "these things are in sequence but not related".
Use meaningful names:
Which one of these is the shark?
a = b = c = d = e = 0
I have no idea. But if you named them appropriately:
cod = shark = wildfish = salmon = nothing = 0
I would know for sure!
Use named constants
This line appears three times:
print ("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~")
It's probably hard to get the right number of tilde characters, unless you are copy/pasting it. And if you're doing that, it's probably a pain. Instead, create a name for the tildes. By convention, constants are spelled in uppercase. (It's not really a constant, but since constants are spelled in upper case, if you name it in upper case you'll know not to modify it.)
H_LINE = "~" * 32
print(H_LINE)
print("Welcome to Lake Tocowaga")
print(H_LINE)
Put last things last
There's a place for everything. And everything should be in its place. The place for printing a summary would be at the bottom.
You had a good idea with your while fishing:
loop. But instead of immediately printing the summary when you respond to the user input, just change the variable and let the loop fail, then print the summary at the bottom. It's more "natural" (and it makes your loops easier to read!).
while fishing == True:
time.sleep(1)
answer = input("Throw out your line, or go home?")
if answer == "go home":
fishing = False
er = float(e / (a + b + c + d))
print("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~")
print("Thanks for playing " + name + "!")
print("You caught:", str(a), "cod, ", str(b), "salmon, ", str(c), "shark, ", str(d), "wildfish. nEfficiency Rate: ", str(er), ".")
else:
...
Becomes:
while fishing == True:
time.sleep(1)
answer = input("Throw out your line, or go home?")
if answer == "go home":
fishing = False
else:
...
er = float(e / (a + b + c + d))
print(H_LINE)
print("Thanks for playing " + name + "!")
print("You caught:", str(a), "cod, ", str(b), "salmon, ", str(c), "shark, ", str(d), "wildfish. nEfficiency Rate: ", str(er), ".")
Let the built-in functions do their job
You are calling functions that you don't need to call. The result of "true" division between integers is a float. You don't need to call float(e / (a + b + c + d))
. And if you did need to call it, you'd be calling it too late!
Likewise, print
knows how to handle integers and floating point numbers. You don't need to print(..., str(a), ...)
when you can just do: print(..., a, ...)
.
$endgroup$
add a comment |
$begingroup$
Welcome to CodeReview. It's never too early to develop good coding habits, and reviewing your code is about the best way to do so.
First, congratulations on writing a clean, straightforward program. While you do have some issues (below), they're not major, and your program seems appropriate for its level.
Now, for the issues ;-)
Use whitespace
Python requires you to use horizontal whitespace. But you should also use vertical whitespace (aka "blank lines") to organize the different parts of your code into paragraphs.
This huge block:
import time
import random
fishing = True
a = b = c = d = e = 0 #define multiple variables as same thing
print ("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~")
print ("Welcome to Lake Tocowaga")
print ("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~")
time.sleep(1)
name = input("What is your name fisherman?")
answer = input("Would you like to go fishing, " + name + "?")
if answer.lower() == "no":
fishing == False
while fishing == True:
would read better if it were broken up like so:
import time
import random
fishing = True
a = b = c = d = e = 0 #define multiple variables as same thing
print ("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~")
print ("Welcome to Lake Tocowaga")
print ("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~")
time.sleep(1)
name = input("What is your name fisherman?")
answer = input("Would you like to go fishing, " + name + "?")
if answer.lower() == "no":
fishing == False
while fishing == True:
All I did was add a few blank lines, but I was trying to show that "these things go together" and "these things are in sequence but not related".
Use meaningful names:
Which one of these is the shark?
a = b = c = d = e = 0
I have no idea. But if you named them appropriately:
cod = shark = wildfish = salmon = nothing = 0
I would know for sure!
Use named constants
This line appears three times:
print ("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~")
It's probably hard to get the right number of tilde characters, unless you are copy/pasting it. And if you're doing that, it's probably a pain. Instead, create a name for the tildes. By convention, constants are spelled in uppercase. (It's not really a constant, but since constants are spelled in upper case, if you name it in upper case you'll know not to modify it.)
H_LINE = "~" * 32
print(H_LINE)
print("Welcome to Lake Tocowaga")
print(H_LINE)
Put last things last
There's a place for everything. And everything should be in its place. The place for printing a summary would be at the bottom.
You had a good idea with your while fishing:
loop. But instead of immediately printing the summary when you respond to the user input, just change the variable and let the loop fail, then print the summary at the bottom. It's more "natural" (and it makes your loops easier to read!).
while fishing == True:
time.sleep(1)
answer = input("Throw out your line, or go home?")
if answer == "go home":
fishing = False
er = float(e / (a + b + c + d))
print("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~")
print("Thanks for playing " + name + "!")
print("You caught:", str(a), "cod, ", str(b), "salmon, ", str(c), "shark, ", str(d), "wildfish. nEfficiency Rate: ", str(er), ".")
else:
...
Becomes:
while fishing == True:
time.sleep(1)
answer = input("Throw out your line, or go home?")
if answer == "go home":
fishing = False
else:
...
er = float(e / (a + b + c + d))
print(H_LINE)
print("Thanks for playing " + name + "!")
print("You caught:", str(a), "cod, ", str(b), "salmon, ", str(c), "shark, ", str(d), "wildfish. nEfficiency Rate: ", str(er), ".")
Let the built-in functions do their job
You are calling functions that you don't need to call. The result of "true" division between integers is a float. You don't need to call float(e / (a + b + c + d))
. And if you did need to call it, you'd be calling it too late!
Likewise, print
knows how to handle integers and floating point numbers. You don't need to print(..., str(a), ...)
when you can just do: print(..., a, ...)
.
$endgroup$
add a comment |
$begingroup$
Welcome to CodeReview. It's never too early to develop good coding habits, and reviewing your code is about the best way to do so.
First, congratulations on writing a clean, straightforward program. While you do have some issues (below), they're not major, and your program seems appropriate for its level.
Now, for the issues ;-)
Use whitespace
Python requires you to use horizontal whitespace. But you should also use vertical whitespace (aka "blank lines") to organize the different parts of your code into paragraphs.
This huge block:
import time
import random
fishing = True
a = b = c = d = e = 0 #define multiple variables as same thing
print ("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~")
print ("Welcome to Lake Tocowaga")
print ("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~")
time.sleep(1)
name = input("What is your name fisherman?")
answer = input("Would you like to go fishing, " + name + "?")
if answer.lower() == "no":
fishing == False
while fishing == True:
would read better if it were broken up like so:
import time
import random
fishing = True
a = b = c = d = e = 0 #define multiple variables as same thing
print ("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~")
print ("Welcome to Lake Tocowaga")
print ("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~")
time.sleep(1)
name = input("What is your name fisherman?")
answer = input("Would you like to go fishing, " + name + "?")
if answer.lower() == "no":
fishing == False
while fishing == True:
All I did was add a few blank lines, but I was trying to show that "these things go together" and "these things are in sequence but not related".
Use meaningful names:
Which one of these is the shark?
a = b = c = d = e = 0
I have no idea. But if you named them appropriately:
cod = shark = wildfish = salmon = nothing = 0
I would know for sure!
Use named constants
This line appears three times:
print ("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~")
It's probably hard to get the right number of tilde characters, unless you are copy/pasting it. And if you're doing that, it's probably a pain. Instead, create a name for the tildes. By convention, constants are spelled in uppercase. (It's not really a constant, but since constants are spelled in upper case, if you name it in upper case you'll know not to modify it.)
H_LINE = "~" * 32
print(H_LINE)
print("Welcome to Lake Tocowaga")
print(H_LINE)
Put last things last
There's a place for everything. And everything should be in its place. The place for printing a summary would be at the bottom.
You had a good idea with your while fishing:
loop. But instead of immediately printing the summary when you respond to the user input, just change the variable and let the loop fail, then print the summary at the bottom. It's more "natural" (and it makes your loops easier to read!).
while fishing == True:
time.sleep(1)
answer = input("Throw out your line, or go home?")
if answer == "go home":
fishing = False
er = float(e / (a + b + c + d))
print("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~")
print("Thanks for playing " + name + "!")
print("You caught:", str(a), "cod, ", str(b), "salmon, ", str(c), "shark, ", str(d), "wildfish. nEfficiency Rate: ", str(er), ".")
else:
...
Becomes:
while fishing == True:
time.sleep(1)
answer = input("Throw out your line, or go home?")
if answer == "go home":
fishing = False
else:
...
er = float(e / (a + b + c + d))
print(H_LINE)
print("Thanks for playing " + name + "!")
print("You caught:", str(a), "cod, ", str(b), "salmon, ", str(c), "shark, ", str(d), "wildfish. nEfficiency Rate: ", str(er), ".")
Let the built-in functions do their job
You are calling functions that you don't need to call. The result of "true" division between integers is a float. You don't need to call float(e / (a + b + c + d))
. And if you did need to call it, you'd be calling it too late!
Likewise, print
knows how to handle integers and floating point numbers. You don't need to print(..., str(a), ...)
when you can just do: print(..., a, ...)
.
$endgroup$
Welcome to CodeReview. It's never too early to develop good coding habits, and reviewing your code is about the best way to do so.
First, congratulations on writing a clean, straightforward program. While you do have some issues (below), they're not major, and your program seems appropriate for its level.
Now, for the issues ;-)
Use whitespace
Python requires you to use horizontal whitespace. But you should also use vertical whitespace (aka "blank lines") to organize the different parts of your code into paragraphs.
This huge block:
import time
import random
fishing = True
a = b = c = d = e = 0 #define multiple variables as same thing
print ("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~")
print ("Welcome to Lake Tocowaga")
print ("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~")
time.sleep(1)
name = input("What is your name fisherman?")
answer = input("Would you like to go fishing, " + name + "?")
if answer.lower() == "no":
fishing == False
while fishing == True:
would read better if it were broken up like so:
import time
import random
fishing = True
a = b = c = d = e = 0 #define multiple variables as same thing
print ("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~")
print ("Welcome to Lake Tocowaga")
print ("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~")
time.sleep(1)
name = input("What is your name fisherman?")
answer = input("Would you like to go fishing, " + name + "?")
if answer.lower() == "no":
fishing == False
while fishing == True:
All I did was add a few blank lines, but I was trying to show that "these things go together" and "these things are in sequence but not related".
Use meaningful names:
Which one of these is the shark?
a = b = c = d = e = 0
I have no idea. But if you named them appropriately:
cod = shark = wildfish = salmon = nothing = 0
I would know for sure!
Use named constants
This line appears three times:
print ("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~")
It's probably hard to get the right number of tilde characters, unless you are copy/pasting it. And if you're doing that, it's probably a pain. Instead, create a name for the tildes. By convention, constants are spelled in uppercase. (It's not really a constant, but since constants are spelled in upper case, if you name it in upper case you'll know not to modify it.)
H_LINE = "~" * 32
print(H_LINE)
print("Welcome to Lake Tocowaga")
print(H_LINE)
Put last things last
There's a place for everything. And everything should be in its place. The place for printing a summary would be at the bottom.
You had a good idea with your while fishing:
loop. But instead of immediately printing the summary when you respond to the user input, just change the variable and let the loop fail, then print the summary at the bottom. It's more "natural" (and it makes your loops easier to read!).
while fishing == True:
time.sleep(1)
answer = input("Throw out your line, or go home?")
if answer == "go home":
fishing = False
er = float(e / (a + b + c + d))
print("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~")
print("Thanks for playing " + name + "!")
print("You caught:", str(a), "cod, ", str(b), "salmon, ", str(c), "shark, ", str(d), "wildfish. nEfficiency Rate: ", str(er), ".")
else:
...
Becomes:
while fishing == True:
time.sleep(1)
answer = input("Throw out your line, or go home?")
if answer == "go home":
fishing = False
else:
...
er = float(e / (a + b + c + d))
print(H_LINE)
print("Thanks for playing " + name + "!")
print("You caught:", str(a), "cod, ", str(b), "salmon, ", str(c), "shark, ", str(d), "wildfish. nEfficiency Rate: ", str(er), ".")
Let the built-in functions do their job
You are calling functions that you don't need to call. The result of "true" division between integers is a float. You don't need to call float(e / (a + b + c + d))
. And if you did need to call it, you'd be calling it too late!
Likewise, print
knows how to handle integers and floating point numbers. You don't need to print(..., str(a), ...)
when you can just do: print(..., a, ...)
.
answered 2 hours ago
Austin HastingsAustin Hastings
7,7771236
7,7771236
add a comment |
add a comment |
Mattthecommie is a new contributor. Be nice, and check out our Code of Conduct.
Mattthecommie is a new contributor. Be nice, and check out our Code of Conduct.
Mattthecommie is a new contributor. Be nice, and check out our Code of Conduct.
Mattthecommie 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%2f217357%2fpython-fishing-simulator%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$
Why did you tag this question as python-2.x? I'm not convinced that it would work correctly in Python 2.
$endgroup$
– 200_success
3 hours ago
$begingroup$
One other thing not in either of the answers so far, would be to consider using a dictionary for your
fishes
, eg.fishes = {'cod': 0, 'salmon': 0,...}
, then it becomes far more readable when adding (fishes['cod'] += 1
) and dumping (for fish, count in fishes.items():nt print("{fish} -> {count}".format(**{'fish': fish, 'count': count}))
) values related fish caught.$endgroup$
– S0AndS0
2 hours ago