Julio Biason
3 years ago
7 changed files with 345 additions and 0 deletions
@ -0,0 +1,13 @@
|
||||
{ |
||||
"blurb": "Learn about bools by setting up the rules for the Ghost Gobble arcade game.", |
||||
"icon": "matching-brackets", |
||||
"authors": ["neenjaw"], |
||||
"contributors": ["cmccandless", "bethanyg"], |
||||
"files": { |
||||
"solution": ["arcade_game.py"], |
||||
"test": ["arcade_game_test.py"], |
||||
"exemplar": [".meta/exemplar.py"] |
||||
}, |
||||
"forked_from": ["elixir/pacman-rules"], |
||||
"language_versions": ">=3.5" |
||||
} |
@ -0,0 +1 @@
|
||||
{"track":"python","exercise":"ghost-gobble-arcade-game","id":"385d5eaa65f84688899828686d1f0366","url":"https://exercism.org/tracks/python/exercises/ghost-gobble-arcade-game","handle":"JBiason","is_requester":true,"auto_approve":false} |
@ -0,0 +1,63 @@
|
||||
# Help |
||||
|
||||
## Running the tests |
||||
|
||||
You can run the included tests by typing `pytest <exercisename>_test.py` on the command line from within the exercise's directory. |
||||
|
||||
You can also tell Python to run the pytest module on the command line from either within the exercise directory or with a path to the exercise directory. |
||||
`python -m pytest <exercisename>_test.py` from within the exercise directory. |
||||
|
||||
`python -m pytest /fully/qualified/path/to/<exercisename>/` OR `python -m pytest realtive/path/to/<exercisename>` from a non-exercise directory. |
||||
|
||||
Many IDE's and code editors also have built-in support for using PyTest to run tests. |
||||
|
||||
- [Visual Studio Code](https://code.visualstudio.com/docs/python/testing) |
||||
- [PyCharm Professional & Community Editions](https://www.jetbrains.com/help/pycharm/pytest.html#create-pytest-test) |
||||
- [Atom](https://atom.io/packages/atom-python-test) |
||||
- [Spyder](https://www.spyder-ide.org/blog/introducing-unittest-plugin/) |
||||
- [Sublime](https://github.com/kaste/PyTest) |
||||
- [vim-test](https://github.com/vim-test/vim-test) |
||||
|
||||
See the [Python tests page](https://github.com/exercism/python/blob/main/docs/TESTS.md) for more information. |
||||
|
||||
### Common `pytest` options |
||||
|
||||
- `-v` : enable verbose output. |
||||
- `-x` : stop running tests on first failure. |
||||
- `--ff` : run failures from previous test before running other test cases. |
||||
|
||||
For other options, see `python -m pytest -h`. PyTest documentation can be found [here](https://docs.pytest.org/en/latest/getting-started.html). |
||||
|
||||
## Submitting your solution |
||||
|
||||
You can submit your solution using the `exercism submit arcade_game.py` command. |
||||
This command will upload your solution to the Exercism website and print the solution page's URL. |
||||
|
||||
It's possible to submit an incomplete solution which allows you to: |
||||
|
||||
- See how others have completed the exercise |
||||
- Request help from a mentor |
||||
|
||||
## Need to get help? |
||||
|
||||
If you'd like help solving the exercise, check the following pages: |
||||
|
||||
- The [Python track's documentation](https://exercism.org/docs/tracks/python) |
||||
- [Exercism's support channel on gitter](https://gitter.im/exercism/support) |
||||
- The [Frequently Asked Questions](https://exercism.org/docs/using/faqs) |
||||
|
||||
Should those resources not suffice, you could submit your (incomplete) solution to request mentoring. |
||||
|
||||
Below are some resources for getting help if you run into trouble: |
||||
|
||||
- [The PSF](https://www.python.org) hosts Python downloads, documentation, and community resources. |
||||
- [Python Community on Discord](https://pythondiscord.com/) is a very helpful and active community. |
||||
- [#python on Libera.chat](https://www.python.org/community/irc/) this is where the cored developers for the language hang out and get work done. |
||||
- [Exercism on Gitter](https://gitter.im/exercism/home) join the Python room for Python-related questions or problems. |
||||
- [/r/learnpython/](https://www.reddit.com/r/learnpython/) is a subreddit designed for Python learners. |
||||
- [Python Community Forums](https://discuss.python.org/) |
||||
- [Pythontutor](http://pythontutor.com/) for stepping through small code snippets visually. |
||||
|
||||
|
||||
Additionally, [StackOverflow](http://stackoverflow.com/questions/tagged/python) is a good spot to search for your problem/question to see if it has been answered already. |
||||
If not - you can always [ask](https://stackoverflow.com/help/how-to-ask) or [answer](https://stackoverflow.com/help/how-to-answer) someone else's question. |
@ -0,0 +1,24 @@
|
||||
# Hints |
||||
|
||||
## General |
||||
|
||||
- Don't worry about how the arguments are _derived_, focus on combining the arguments to return the intended result. |
||||
|
||||
## 1. Define if Pac-Man can eat a ghost |
||||
|
||||
- You can use the [Boolean][boolean] [operators][Boolean-operators] to combine arguments for a result. |
||||
|
||||
## 2. Define if Pac-Man scores |
||||
|
||||
- You can use the [Boolean][boolean] [operator][Boolean-operators] to combine arguments for a result. |
||||
|
||||
## 3. Define if Pac-Man loses |
||||
|
||||
- You can use the [boolean][Boolean] [operator][Boolean-operators] to combine arguments for a result. |
||||
|
||||
## 4. Define if Pac-Man wins |
||||
|
||||
- You can use the [Boolean][boolean] [operator][Boolean-operators] to combine arguments for a result. |
||||
|
||||
[boolean]: https://docs.python.org/3/library/stdtypes.html#truth |
||||
[Boolean-operators]: https://docs.python.org/3/library/stdtypes.html#boolean-operations-and-or-not |
@ -0,0 +1,94 @@
|
||||
# Ghost Gobble Arcade Game |
||||
|
||||
Welcome to Ghost Gobble Arcade Game on Exercism's Python Track. |
||||
If you need help running the tests or submitting your code, check out `HELP.md`. |
||||
If you get stuck on the exercise, check out `HINTS.md`, but try and solve it without using those first :) |
||||
|
||||
## Introduction |
||||
|
||||
Python represents true and false values with the `bool` type. |
||||
There are only two values in this type: `True` and `False`. |
||||
These values can be bound to a variable: |
||||
|
||||
```python |
||||
>>> true_variable = True |
||||
>>> false_variable = False |
||||
``` |
||||
|
||||
We can evaluate Boolean expressions using the `and`, `or`, and `not` operators: |
||||
|
||||
```python |
||||
>>> true_variable = True and True |
||||
>>> false_variable = True and False |
||||
|
||||
>>> true_variable = False or True |
||||
>>> false_variable = False or False |
||||
|
||||
>>> true_variable = not False |
||||
>>> false_variable = not True |
||||
``` |
||||
|
||||
## Instructions |
||||
|
||||
In this exercise, you need to implement some rules from [Pac-Man][Pac-Man], the classic 1980s-era arcade-game. |
||||
|
||||
You have four rules to implement, all related to the game states. |
||||
|
||||
> _Do not worry about how the arguments are derived, just focus on combining the arguments to return the intended result._ |
||||
|
||||
## 1. Define if Pac-Man eats a ghost |
||||
|
||||
Define the `eat_ghost()` function that takes two parameters (_if Pac-Man has a power pellet active_ and _if Pac-Man is touching a ghost_) and returns a Boolean value if Pac-Man is able to eat the ghost. |
||||
The function should return `True` only if Pac-Man has a power pellet active and is touching a ghost. |
||||
|
||||
```python |
||||
>>> eat_ghost(False, True) |
||||
... |
||||
False |
||||
``` |
||||
|
||||
## 2. Define if Pac-Man scores |
||||
|
||||
Define the `score()` function that takes two parameters (_if Pac-Man is touching a power pellet_ and _if Pac-Man is touching a dot_) and returns a Boolean value if Pac-Man scored. |
||||
The function should return `True` if Pac-Man is touching a power pellet or a dot. |
||||
|
||||
```python |
||||
>>> score(True, True) |
||||
... |
||||
True |
||||
``` |
||||
|
||||
## 3. Define if Pac-Man loses |
||||
|
||||
Define the `lose()` function that takes two parameters (_if Pac-Man has a power pellet active_ and _if Pac-Man is touching a ghost_) and returns a Boolean value if Pac-Man loses. |
||||
The function should return `True` if Pac-Man is touching a ghost and does not have a power pellet active. |
||||
|
||||
```python |
||||
>>> lose(False, True) |
||||
... |
||||
True |
||||
``` |
||||
|
||||
## 4. Define if Pac-Man wins |
||||
|
||||
Define the `win()` function that takes three parameters (_if Pac-Man has eaten all of the dots_, _if Pac-Man has a power pellet active_, and _if Pac-Man is touching a ghost_) and returns a Boolean value if Pac-Man wins. |
||||
The function should return `True` if Pac-Man has eaten all of the dots and has not lost based on the parameters defined in part 3. |
||||
|
||||
```python |
||||
>>> win(False, True, False) |
||||
... |
||||
False |
||||
``` |
||||
|
||||
[Pac-Man]: https://en.wikipedia.org/wiki/Pac-Man |
||||
|
||||
## Source |
||||
|
||||
### Created by |
||||
|
||||
- @neenjaw |
||||
|
||||
### Contributed to by |
||||
|
||||
- @cmccandless |
||||
- @bethanyg |
@ -0,0 +1,40 @@
|
||||
def eat_ghost(power_pellet_active: bool, touching_ghost: bool) -> bool: |
||||
"""Check if the user can eat a ghost. |
||||
|
||||
:param power_pellet_active: does the player have an active power pellet? |
||||
:param touching_ghost: is the player touching a ghost? |
||||
:return: True if the user can eat the ghost. |
||||
""" |
||||
return power_pellet_active and touching_ghost |
||||
|
||||
|
||||
def score(touching_power_pellet: bool, touching_dot: bool) -> bool: |
||||
"""Check if the user scored a point. |
||||
|
||||
:param touching_power_pellet: does the player have an active power pellet? |
||||
:param touching_dot: is the player touching a dot? |
||||
:return: bool |
||||
""" |
||||
return touching_power_pellet or touching_dot |
||||
|
||||
|
||||
def lose(power_pellet_active: bool, touching_ghost: bool): |
||||
"""Check if the user died for touching a ghost without the power pellet. |
||||
|
||||
:param power_pellet_active: does the player have an active power pellet? |
||||
:param touching_ghost: is the player touching a ghost? |
||||
:return: bool |
||||
""" |
||||
return touching_ghost and not power_pellet_active |
||||
|
||||
|
||||
def win(has_eaten_all_dots: bool, power_pellet_active: bool, |
||||
touching_ghost: bool) -> bool: |
||||
"""Check if the user won the game. |
||||
|
||||
:param has_eaten_all_dots: bool - has the player "eaten" all the dots? |
||||
:param power_pellet_active: bool - does the player have an active power pellet? |
||||
:param touching_ghost: bool - is the player touching a ghost? |
||||
:return: bool |
||||
""" |
||||
return has_eaten_all_dots and not lose(power_pellet_active, touching_ghost) |
@ -0,0 +1,110 @@
|
||||
import unittest |
||||
import pytest |
||||
from arcade_game import eat_ghost, score, lose, win |
||||
|
||||
|
||||
class GhostGobbleGameTest(unittest.TestCase): |
||||
|
||||
@pytest.mark.task(taskno=1) |
||||
def test_ghost_gets_eaten(self): |
||||
self.assertIs( |
||||
eat_ghost(True, True), |
||||
True, |
||||
msg="ghost should get eaten" |
||||
) |
||||
|
||||
@pytest.mark.task(taskno=1) |
||||
def test_ghost_does_not_get_eaten_because_no_power_pellet_active(self): |
||||
self.assertIs( |
||||
eat_ghost(False, True), |
||||
False, |
||||
msg="ghost does not get eaten because no power pellet active" |
||||
) |
||||
|
||||
@pytest.mark.task(taskno=1) |
||||
def test_ghost_does_not_get_eaten_because_not_touching_ghost(self): |
||||
self.assertIs( |
||||
eat_ghost(True, False), |
||||
False, |
||||
msg="ghost does not get eaten because not touching ghost" |
||||
) |
||||
|
||||
@pytest.mark.task(taskno=2) |
||||
def test_score_when_eating_dot(self): |
||||
self.assertIs( |
||||
score(False, True), |
||||
True, |
||||
msg="score when eating dot" |
||||
) |
||||
|
||||
@pytest.mark.task(taskno=2) |
||||
def test_score_when_eating_power_pellet(self): |
||||
self.assertIs( |
||||
score(True, False), |
||||
True, |
||||
msg="score when eating power pellet" |
||||
) |
||||
|
||||
@pytest.mark.task(taskno=2) |
||||
def test_no_score_when_nothing_eaten(self): |
||||
self.assertIs( |
||||
score(False, False), |
||||
False, |
||||
msg="no score when nothing eaten" |
||||
) |
||||
|
||||
@pytest.mark.task(taskno=3) |
||||
def test_lose_if_touching_a_ghost_without_a_power_pellet_active(self): |
||||
self.assertIs( |
||||
lose(False, True), |
||||
True, |
||||
msg="lose if touching a ghost without a power pellet active" |
||||
) |
||||
|
||||
@pytest.mark.task(taskno=3) |
||||
def test_dont_lose_if_touching_a_ghost_with_a_power_pellet_active(self): |
||||
self.assertIs( |
||||
lose(True, True), |
||||
False, |
||||
msg="don't lose if touching a ghost with a power pellet active" |
||||
) |
||||
|
||||
@pytest.mark.task(taskno=3) |
||||
def test_dont_lose_if_not_touching_a_ghost(self): |
||||
self.assertIs( |
||||
lose(True, False), |
||||
False, |
||||
msg="don't lose if not touching a ghost" |
||||
) |
||||
|
||||
@pytest.mark.task(taskno=4) |
||||
def test_win_if_all_dots_eaten(self): |
||||
self.assertIs( |
||||
win(True, False, False), |
||||
True, |
||||
msg="win if all dots eaten" |
||||
) |
||||
|
||||
@pytest.mark.task(taskno=4) |
||||
def test_dont_win_if_all_dots_eaten_but_touching_a_ghost(self): |
||||
self.assertIs( |
||||
win(True, False, True), |
||||
False, |
||||
msg="don't win if all dots eaten, but touching a ghost" |
||||
) |
||||
|
||||
@pytest.mark.task(taskno=4) |
||||
def test_win_if_all_dots_eaten_and_touching_a_ghost_with_a_power_pellet_active(self): |
||||
self.assertIs( |
||||
win(True, True, True), |
||||
True, |
||||
msg="win if all dots eaten and touching a ghost with a power pellet active" |
||||
) |
||||
|
||||
@pytest.mark.task(taskno=4) |
||||
def test_dont_win_if_not_all_dots_eaten(self): |
||||
self.assertIs( |
||||
win(False, True, True), |
||||
False, |
||||
msg="don't win if not all dots eaten and touching a ghost with a power pellet active" |
||||
) |
Loading…
Reference in new issue