Are you looking to dive into the world of Python game development? Rock paper scissors in Python is a fantastic starting point, especially if you’re interested in landscaping and need a break from designing rock gardens. At rockscapes.net, we believe in blending creativity with technology, and this guide will show you exactly how to code your own rock paper scissors game, transforming abstract concepts into tangible, playable code.
This comprehensive guide will teach you how to create a rock paper scissors game using Python, perfect for beginners and those looking to enhance their coding skills, while offering a refreshing mental break for landscape designers and outdoor enthusiasts, and even provide some insights for your next rock arrangement. Let’s get started by exploring the basics of creating this classic game in Python.
Here’s what we’ll cover in this guide:
- Understanding the Basics of Rock Paper Scissors
- Setting Up Your Python Environment
- Coding the Basic Rock Paper Scissors Game
- Adding User Input
- Implementing Computer Choice
- Determining the Winner
- Playing Multiple Rounds
- Improving Code with Enums
- Structuring Your Code with Functions
- Advanced Features: Rock Paper Scissors Lizard Spock
- Error Handling and Input Validation
- Adding a Graphical User Interface (GUI)
- Testing Your Rock Paper Scissors Game
- Optimizing Your Code
- Deploying Your Rock Paper Scissors Game
- Integrating with Landscaping Themes
- FAQ Section
- Conclusion
1. Understanding the Basics of Rock Paper Scissors
What is Rock Paper Scissors, and how does it translate into code?
Rock paper scissors is a classic hand game played between two or more people. Each player simultaneously forms one of three shapes with their hand: rock (a closed fist), paper (a flat hand), or scissors (two fingers extended). The rules are simple:
- Rock crushes scissors.
- Paper covers rock.
- Scissors cut paper.
In the event that players choose the same shape, the game is a tie and is usually replayed. Translating this into code involves creating a system that allows the user and the computer to make these choices and then determines the winner based on these rules.
Key elements to consider:
- User Input: Gathering the user’s choice (rock, paper, or scissors).
- Computer Choice: Randomly generating the computer’s choice.
- Game Logic: Implementing the rules to determine the winner.
- Output: Displaying the choices and the outcome of the game.
These elements form the foundation of the rock paper scissors game in Python.
2. Setting Up Your Python Environment
How do you set up your Python environment to start coding Rock Paper Scissors?
Before diving into the code, ensure your Python environment is properly set up. This involves installing Python, choosing a suitable Integrated Development Environment (IDE), and setting up any necessary libraries.
Steps to Set Up Your Python Environment:
-
Install Python:
- Download the latest version of Python from the official Python website.
- Follow the installation instructions for your operating system (Windows, macOS, or Linux).
- During installation, make sure to check the box that says “Add Python to PATH” to allow you to run Python from the command line.
-
Choose an IDE:
- An IDE (Integrated Development Environment) is a software application that provides comprehensive facilities to computer programmers for software development. Choose one that suits your coding style. Here are a few popular options:
- VS Code: A lightweight but powerful source code editor.
- PyCharm: A dedicated Python IDE with advanced features.
- Sublime Text: A sophisticated text editor for code, markup, and prose.
- Install your chosen IDE and familiarize yourself with its interface.
- An IDE (Integrated Development Environment) is a software application that provides comprehensive facilities to computer programmers for software development. Choose one that suits your coding style. Here are a few popular options:
-
Verify Installation:
- Open your command line or terminal.
- Type
python --version
and press Enter. - If Python is installed correctly, you should see the version number displayed.
-
Create a Project Directory:
- Create a new directory on your computer where you will save your rock paper scissors game files.
- Open your IDE and set this directory as your project folder.
With your Python environment set up, you’re now ready to start coding your rock paper scissors game. Let’s move on to writing the core logic of the game.
3. Coding the Basic Rock Paper Scissors Game
What are the basic steps to code a simple Rock Paper Scissors game in Python?
Coding the basic rock paper scissors game involves writing the core logic that allows the user to play against the computer. Here’s a step-by-step breakdown of how to do it:
Basic Code Structure:
-
Import the
random
module:- The
random
module will be used to generate the computer’s random choice. - Add the following line at the beginning of your script:
import random
- The
-
Define the choices:
- Create a list or tuple containing the possible choices: rock, paper, and scissors.
choices = ["rock", "paper", "scissors"]
-
Get user input:
- Prompt the user to enter their choice.
user_choice = input("Enter your choice (rock, paper, scissors): ")
-
Generate computer choice:
- Use
random.choice()
to make the computer choose randomly from the list of choices.
computer_choice = random.choice(choices)
- Use
-
Determine the winner:
- Implement the game logic to compare the user’s choice and the computer’s choice and determine the winner.
if user_choice == computer_choice: print("It's a tie!") elif user_choice == "rock": if computer_choice == "scissors": print("Rock crushes scissors! You win!") else: print("Paper covers rock! You lose.") elif user_choice == "paper": if computer_choice == "rock": print("Paper covers rock! You win!") else: print("Scissors cut paper! You lose.") elif user_choice == "scissors": if computer_choice == "paper": print("Scissors cut paper! You win!") else: print("Rock crushes scissors! You lose.")
-
Print the results:
- Display the choices made by the user and the computer, and announce the winner.
print(f"You chose: {user_choice}") print(f"The computer chose: {computer_choice}")
This is the basic structure of the rock paper scissors game. The following sections will delve into each step in more detail, enhancing the game with user input validation, looping for multiple rounds, and more sophisticated code structures.
4. Adding User Input
How do you take input from the user in Python for the Rock Paper Scissors game?
Adding user input involves prompting the user to enter their choice (rock, paper, or scissors) and storing that input for later use. Here’s how to handle user input effectively:
Steps to Add User Input:
-
Prompt the user:
- Use the
input()
function to display a message and wait for the user to enter their choice.
user_choice = input("Enter your choice (rock, paper, scissors): ")
- Use the
-
Validate user input:
- Ensure the user enters a valid choice (rock, paper, or scissors). Use a loop to continuously prompt the user until a valid choice is entered.
while user_choice not in choices: print("Invalid choice. Please try again.") user_choice = input("Enter your choice (rock, paper, scissors): ")
-
Normalize user input (optional):
- Convert the user input to lowercase to avoid case sensitivity issues.
user_choice = user_choice.lower()
-
Handle special cases:
- Consider adding options for the user to quit the game or view the rules.
if user_choice == "quit": print("Thanks for playing!") exit()
Example Code Snippet:
choices = ["rock", "paper", "scissors"]
while True:
user_choice = input("Enter your choice (rock, paper, scissors, or quit to exit): ").lower()
if user_choice == "quit":
print("Thanks for playing!")
break
if user_choice not in choices:
print("Invalid choice. Please try again.")
continue
computer_choice = random.choice(choices)
print(f"You chose: {user_choice}")
print(f"The computer chose: {computer_choice}")
# Game logic here
This ensures that the user can interact with the game effectively, providing their choice and receiving feedback on invalid inputs.
5. Implementing Computer Choice
How can you make the computer choose its move in Rock Paper Scissors?
Implementing the computer’s choice in Rock Paper Scissors involves using the random
module to generate one of the available options (rock, paper, or scissors).
Steps to Implement Computer Choice:
-
Import the
random
module:- Ensure the
random
module is imported at the beginning of your script.
import random
- Ensure the
-
Define the choices:
- Create a list or tuple containing the possible choices for the computer.
choices = ["rock", "paper", "scissors"]
-
Generate computer choice:
- Use the
random.choice()
function to select a random choice from the list.
computer_choice = random.choice(choices)
- Use the
-
Display the computer’s choice:
- Print the computer’s choice to inform the user.
print(f"The computer chose: {computer_choice}")
Example Code Snippet:
import random
choices = ["rock", "paper", "scissors"]
computer_choice = random.choice(choices)
print(f"The computer chose: {computer_choice}")
This simple implementation allows the computer to make a fair and unpredictable choice, enhancing the gameplay experience. By integrating this with user input and game logic, you create a fully functional rock paper scissors game.
6. Determining the Winner
How do you determine the winner in a Rock Paper Scissors game?
Determining the winner involves comparing the user’s choice with the computer’s choice and applying the game’s rules to decide the outcome. Here’s how to implement the game logic:
Steps to Determine the Winner:
-
Compare choices:
- Use conditional statements (
if
,elif
,else
) to compare the user’s choice and the computer’s choice.
- Use conditional statements (
-
Check for a tie:
- If both the user and the computer choose the same option, it’s a tie.
if user_choice == computer_choice: print("It's a tie!")
-
Implement the game rules:
- Use
elif
statements to check each possible scenario and determine the winner based on the rules of rock paper scissors.
elif user_choice == "rock": if computer_choice == "scissors": print("Rock crushes scissors! You win!") else: print("Paper covers rock! You lose.") elif user_choice == "paper": if computer_choice == "rock": print("Paper covers rock! You win!") else: print("Scissors cut paper! You lose.") elif user_choice == "scissors": if computer_choice == "paper": print("Scissors cut paper! You win!") else: print("Rock crushes scissors! You lose.")
- Use
-
Handle invalid input:
- If the user enters an invalid choice, display an error message and prompt them to try again (this was covered in the user input section).
Example Code Snippet:
if user_choice == computer_choice:
print("It's a tie!")
elif user_choice == "rock":
if computer_choice == "scissors":
print("Rock crushes scissors! You win!")
else:
print("Paper covers rock! You lose.")
elif user_choice == "paper":
if computer_choice == "rock":
print("Paper covers rock! You win!")
else:
print("Scissors cut paper! You lose.")
elif user_choice == "scissors":
if computer_choice == "paper":
print("Scissors cut paper! You win!")
else:
print("Rock crushes scissors! You lose.")
This logic block effectively determines the winner of each round, providing feedback to the user. Integrating this with the other components will result in a fully playable game.
7. Playing Multiple Rounds
How do you enable the game to be played multiple times in Python?
To allow users to play multiple rounds of Rock Paper Scissors, you can use a loop. This allows the game to continue until the user decides to quit.
Steps to Play Multiple Rounds:
-
Wrap the game logic in a loop:
- Use a
while
loop to keep the game running until the user decides to quit.
while True: # Game logic here
- Use a
-
Prompt the user to play again:
- After each round, ask the user if they want to play again.
play_again = input("Play again? (yes/no): ").lower()
-
Break the loop if the user doesn’t want to play again:
- If the user enters “no” (or any variation), break out of the loop to end the game.
if play_again != "yes": print("Thanks for playing!") break
Example Code Snippet:
import random
choices = ["rock", "paper", "scissors"]
while True:
user_choice = input("Enter your choice (rock, paper, scissors, or quit to exit): ").lower()
if user_choice == "quit":
print("Thanks for playing!")
break
if user_choice not in choices:
print("Invalid choice. Please try again.")
continue
computer_choice = random.choice(choices)
print(f"You chose: {user_choice}")
print(f"The computer chose: {computer_choice}")
if user_choice == computer_choice:
print("It's a tie!")
elif user_choice == "rock":
if computer_choice == "scissors":
print("Rock crushes scissors! You win!")
else:
print("Paper covers rock! You lose.")
elif user_choice == "paper":
if computer_choice == "rock":
print("Paper covers rock! You win!")
else:
print("Scissors cut paper! You lose.")
elif user_choice == "scissors":
if computer_choice == "paper":
print("Scissors cut paper! You win!")
else:
print("Rock crushes scissors! You lose.")
play_again = input("Play again? (yes/no): ").lower()
if play_again != "yes":
print("Thanks for playing!")
break
This structure ensures that the game continues to run until the user explicitly chooses to quit, making for a more engaging experience.
8. Improving Code with Enums
How do you use Enums to improve the code quality of your Rock Paper Scissors game?
Using Enums (enumerations) can significantly enhance the readability and maintainability of your Rock Paper Scissors code. Enums create a set of named constants, making your code more expressive and less prone to errors.
Steps to Improve Code with Enums:
-
Import the
Enum
class:- Start by importing the
Enum
class from theenum
module.
from enum import Enum
- Start by importing the
-
Define an Enum for the choices:
- Create an Enum class to represent the possible choices (rock, paper, scissors).
class Choice(Enum): ROCK = 1 PAPER = 2 SCISSORS = 3
-
Use the Enum in your game logic:
- Replace the string literals (“rock”, “paper”, “scissors”) with the Enum members (Choice.ROCK, Choice.PAPER, Choice.SCISSORS).
user_choice = input("Enter your choice (1: Rock, 2: Paper, 3: Scissors): ") user_choice = Choice(int(user_choice)) computer_choice = random.choice(list(Choice)) if user_choice == computer_choice: print("It's a tie!") elif user_choice == Choice.ROCK: if computer_choice == Choice.SCISSORS: print("Rock crushes scissors! You win!") else: print("Paper covers rock! You lose.") elif user_choice == Choice.PAPER: if computer_choice == Choice.ROCK: print("Paper covers rock! You win!") else: print("Scissors cut paper! You lose.") elif user_choice == Choice.SCISSORS: if computer_choice == Choice.PAPER: print("Scissors cut paper! You win!") else: print("Rock crushes scissors! You lose.")
Example Code Snippet:
import random
from enum import Enum
class Choice(Enum):
ROCK = 1
PAPER = 2
SCISSORS = 3
while True:
user_choice = input("Enter your choice (1: Rock, 2: Paper, 3: Scissors, or quit to exit): ").lower()
if user_choice == "quit":
print("Thanks for playing!")
break
try:
user_choice = Choice(int(user_choice))
except ValueError:
print("Invalid choice. Please enter 1, 2, or 3.")
continue
computer_choice = random.choice(list(Choice))
print(f"You chose: {user_choice.name}")
print(f"The computer chose: {computer_choice.name}")
if user_choice == computer_choice:
print("It's a tie!")
elif user_choice == Choice.ROCK:
if computer_choice == Choice.SCISSORS:
print("Rock crushes scissors! You win!")
else:
print("Paper covers rock! You lose.")
elif user_choice == Choice.PAPER:
if computer_choice == Choice.ROCK:
print("Paper covers rock! You win!")
else:
print("Scissors cut paper! You lose.")
elif user_choice == Choice.SCISSORS:
if computer_choice == Choice.PAPER:
print("Scissors cut paper! You win!")
else:
print("Rock crushes scissors! You lose.")
play_again = input("Play again? (yes/no): ").lower()
if play_again != "yes":
print("Thanks for playing!")
break
Using Enums makes your code cleaner and more maintainable. It also prevents common errors associated with string comparisons and typos.
9. Structuring Your Code with Functions
How can you structure your Rock Paper Scissors game using functions to make it more organized?
Structuring your code with functions makes it more modular, readable, and maintainable. Each function can handle a specific part of the game logic, making it easier to understand and modify.
Steps to Structure Your Code with Functions:
-
Define a function for getting user choice:
- Create a function to handle user input and validate it.
def get_user_choice(): while True: user_choice = input("Enter your choice (1: Rock, 2: Paper, 3: Scissors, or quit to exit): ").lower() if user_choice == "quit": return None try: user_choice = Choice(int(user_choice)) return user_choice except ValueError: print("Invalid choice. Please enter 1, 2, or 3.")
-
Define a function for getting computer choice:
- Create a function to generate the computer’s choice.
def get_computer_choice(): return random.choice(list(Choice))
-
Define a function for determining the winner:
- Create a function to compare the user’s choice and the computer’s choice and determine the winner.
def determine_winner(user_choice, computer_choice): if user_choice == computer_choice: print("It's a tie!") elif user_choice == Choice.ROCK: if computer_choice == Choice.SCISSORS: print("Rock crushes scissors! You win!") else: print("Paper covers rock! You lose.") elif user_choice == Choice.PAPER: if computer_choice == Choice.ROCK: print("Paper covers rock! You win!") else: print("Scissors cut paper! You lose.") elif user_choice == Choice.SCISSORS: if computer_choice == Choice.PAPER: print("Scissors cut paper! You win!") else: print("Rock crushes scissors! You lose.")
-
Define a main function to run the game:
- Create a
main
function to orchestrate the game logic.
def main(): while True: user_choice = get_user_choice() if user_choice is None: print("Thanks for playing!") break computer_choice = get_computer_choice() print(f"You chose: {user_choice.name}") print(f"The computer chose: {computer_choice.name}") determine_winner(user_choice, computer_choice) play_again = input("Play again? (yes/no): ").lower() if play_again != "yes": print("Thanks for playing!") break
- Create a
-
Call the main function to start the game:
- Ensure the
main
function is called when the script is executed.
if __name__ == "__main__": main()
- Ensure the
Example Code Snippet:
import random
from enum import Enum
class Choice(Enum):
ROCK = 1
PAPER = 2
SCISSORS = 3
def get_user_choice():
while True:
user_choice = input("Enter your choice (1: Rock, 2: Paper, 3: Scissors, or quit to exit): ").lower()
if user_choice == "quit":
return None
try:
user_choice = Choice(int(user_choice))
return user_choice
except ValueError:
print("Invalid choice. Please enter 1, 2, or 3.")
def get_computer_choice():
return random.choice(list(Choice))
def determine_winner(user_choice, computer_choice):
if user_choice == computer_choice:
print("It's a tie!")
elif user_choice == Choice.ROCK:
if computer_choice == Choice.SCISSORS:
print("Rock crushes scissors! You win!")
else:
print("Paper covers rock! You lose.")
elif user_choice == Choice.PAPER:
if computer_choice == Choice.ROCK:
print("Paper covers rock! You win!")
else:
print("Scissors cut paper! You lose.")
elif user_choice == Choice.SCISSORS:
if computer_choice == Choice.PAPER:
print("Scissors cut paper! You win!")
else:
print("Rock crushes scissors! You lose.")
def main():
while True:
user_choice = get_user_choice()
if user_choice is None:
print("Thanks for playing!")
break
computer_choice = get_computer_choice()
print(f"You chose: {user_choice.name}")
print(f"The computer chose: {computer_choice.name}")
determine_winner(user_choice, computer_choice)
play_again = input("Play again? (yes/no): ").lower()
if play_again != "yes":
print("Thanks for playing!")
break
if __name__ == "__main__":
main()
By structuring your code with functions, you create a well-organized and maintainable game. Each function has a clear purpose, making it easier to debug and extend the game with new features.
10. Advanced Features: Rock Paper Scissors Lizard Spock
How can you extend the Rock Paper Scissors game to include Lizard and Spock for more complex gameplay?
Extending the Rock Paper Scissors game to include Lizard and Spock introduces more complex gameplay and strategic possibilities. This variation, popularized by The Big Bang Theory, adds two new choices and expands the rules.
Steps to Add Lizard and Spock:
-
Update the Enum:
- Add
LIZARD
andSPOCK
to theChoice
Enum.
class Choice(Enum): ROCK = 1 PAPER = 2 SCISSORS = 3 LIZARD = 4 SPOCK = 5
- Add
-
Update the game logic:
- Modify the
determine_winner
function to include the new rules.
def determine_winner(user_choice, computer_choice): if user_choice == computer_choice: print("It's a tie!") elif user_choice == Choice.ROCK: if computer_choice == Choice.SCISSORS or computer_choice == Choice.LIZARD: print("Rock crushes scissors and rock crushes lizard! You win!") else: print(f"{computer_choice.name} beats rock! You lose.") elif user_choice == Choice.PAPER: if computer_choice == Choice.ROCK or computer_choice == Choice.SPOCK: print("Paper covers rock and paper disproves Spock! You win!") else: print(f"{computer_choice.name} beats paper! You lose.") elif user_choice == Choice.SCISSORS: if computer_choice == Choice.PAPER or computer_choice == Choice.LIZARD: print("Scissors cut paper and scissors decapitate lizard! You win!") else: print(f"{computer_choice.name} beats scissors! You lose.") elif user_choice == Choice.LIZARD: if computer_choice == Choice.SPOCK or computer_choice == Choice.PAPER: print("Lizard poisons Spock and lizard eats paper! You win!") else: print(f"{computer_choice.name} beats lizard! You lose.") elif user_choice == Choice.SPOCK: if computer_choice == Choice.SCISSORS or computer_choice == Choice.ROCK: print("Spock smashes scissors and Spock vaporizes rock! You win!") else: print(f"{computer_choice.name} beats Spock! You lose.")
- Modify the
-
Update user input prompt:
- Modify the
get_user_choice
function to include the new choices in the prompt.
def get_user_choice(): while True: user_choice = input("Enter your choice (1: Rock, 2: Paper, 3: Scissors, 4: Lizard, 5: Spock, or quit to exit): ").lower() if user_choice == "quit": return None try: user_choice = Choice(int(user_choice)) return user_choice except ValueError: print("Invalid choice. Please enter 1, 2, 3, 4, or 5.")
- Modify the
Example Code Snippet:
import random
from enum import Enum
class Choice(Enum):
ROCK = 1
PAPER = 2
SCISSORS = 3
LIZARD = 4
SPOCK = 5
def get_user_choice():
while True:
user_choice = input("Enter your choice (1: Rock, 2: Paper, 3: Scissors, 4: Lizard, 5: Spock, or quit to exit): ").lower()
if user_choice == "quit":
return None
try:
user_choice = Choice(int(user_choice))
return user_choice
except ValueError:
print("Invalid choice. Please enter 1, 2, 3, 4, or 5.")
def get_computer_choice():
return random.choice(list(Choice))
def determine_winner(user_choice, computer_choice):
if user_choice == computer_choice:
print("It's a tie!")
elif user_choice == Choice.ROCK:
if computer_choice == Choice.SCISSORS or computer_choice == Choice.LIZARD:
print("Rock crushes scissors and rock crushes lizard! You win!")
else:
print(f"{computer_choice.name} beats rock! You lose.")
elif user_choice == Choice.PAPER:
if computer_choice == Choice.ROCK or computer_choice == Choice.SPOCK:
print("Paper covers rock and paper disproves Spock! You win!")
else:
print(f"{computer_choice.name} beats paper! You lose.")
elif user_choice == Choice.SCISSORS:
if computer_choice == Choice.PAPER or computer_choice == Choice.LIZARD:
print("Scissors cut paper and scissors decapitate lizard! You win!")
else:
print(f"{computer_choice.name} beats scissors! You lose.")
elif user_choice == Choice.LIZARD:
if computer_choice == Choice.SPOCK or computer_choice == Choice.PAPER:
print("Lizard poisons Spock and lizard eats paper! You win!")
else:
print(f"{computer_choice.name} beats lizard! You lose.")
elif user_choice == Choice.SPOCK:
if computer_choice == Choice.SCISSORS or computer_choice == Choice.ROCK:
print("Spock smashes scissors and Spock vaporizes rock! You win!")
else:
print(f"{computer_choice.name} beats Spock! You lose.")
def main():
while True:
user_choice = get_user_choice()
if user_choice is None:
print("Thanks for playing!")
break
computer_choice = get_computer_choice()
print(f"You chose: {user_choice.name}")
print(f"The computer chose: {computer_choice.name}")
determine_winner(user_choice, computer_choice)
play_again = input("Play again? (yes/no): ").lower()
if play_again != "yes":
print("Thanks for playing!")
break
if __name__ == "__main__":
main()
By incorporating Lizard and Spock, you create a more engaging and strategically rich game. The updated rules require players to think more carefully about their choices, enhancing the overall gameplay experience.
11. Error Handling and Input Validation
How do you implement error handling and input validation in your Rock Paper Scissors game to make it more robust?
Implementing error handling and input validation is crucial for creating a robust Rock Paper Scissors game. It ensures that the game responds gracefully to unexpected inputs and prevents crashes.
Steps to Implement Error Handling and Input Validation:
-
Validate user input:
- Ensure the user enters a valid choice (1, 2, 3, 4, or 5 for Rock, Paper, Scissors, Lizard, Spock).
def get_user_choice(): while True: user_choice = input("Enter your choice (1: Rock, 2: Paper, 3: Scissors, 4: Lizard, 5: Spock, or quit to exit): ").lower() if user_choice == "quit": return None try: user_choice = Choice(int(user_choice)) return user_choice except ValueError: print("Invalid choice. Please enter 1, 2, 3, 4, or 5.")
-
Handle potential exceptions:
- Use
try
andexcept
blocks to handle potential exceptions, such asValueError
if the user enters non-integer input.
try: user_choice = Choice(int(user_choice)) except ValueError: print("Invalid choice. Please enter a valid integer.")
- Use
-
Provide informative error messages:
- Display clear and helpful error messages to guide the user on how to correct their input.
print("Invalid choice. Please enter 1, 2, 3, 4, or 5.")
-
Prevent the game from crashing:
- Ensure that the game continues to run even if an error occurs, prompting the user to try again.
continue # Go back to the beginning of the loop
Example Code Snippet:
import random
from enum import Enum
class Choice(Enum):
ROCK = 1
PAPER = 2
SCISSORS = 3
LIZARD = 4
SPOCK = 5
def get_user_choice():
while True:
user_choice = input("Enter your choice (1: Rock, 2: Paper, 3: Scissors, 4: Lizard, 5: Spock