Poprawa jakości kodu gry do wersji Python 3.15.

Poprawa jakości kodu gry do wersji Python 3.15.
PM
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 4
0

Napisałem prostą grę tekstowa w pythonoie 3.12, ale chciałbym wprowadzić do gry jakieś innowacyjne zmiany z wersji Python 3.15.
main.py

Kopiuj
import sys
import random
from enum import Enum


def rps(name="PlayerOne"):
    game_count = 0
    player_wins = 0
    python_wins = 0

    def play_rps():
        nonlocal name
        nonlocal player_wins
        nonlocal python_wins

        class RPS(Enum):
            ROCK = 1
            PAPER = 2
            SCISSORS = 3

        playerchoice = input(
            f"\n{name}, please enter...\n1 for Rock,\n2 for Paper, or \n3 for Scissors:\n\n"
        )

        if playerchoice not in ["1", "2", "3"]:
            print(f"{name} please enter 1, 2, or 3.")
            return play_rps()

        player = int(playerchoice)

        # if player < 1 | player > 3:
        #     sys.exit("You must enter 1, 2, or 3.")

        computerchoice = random.choice("123")

        computer = int(computerchoice)

        print(f"\n{name}, you chose {str(RPS(player)).replace("RPS.", "").title()}.")
        print(f"Python chose {str(RPS(computer)).replace("RPS.", "").title()}.\n")

        def decide_winner(player, computer):
            nonlocal name
            nonlocal player_wins
            nonlocal python_wins
            if player == 1 and computer == 3:
                player_wins += 1
                return f"🥇 {name}, you win!"
            elif player == 2 and computer == 1:
                player_wins += 1
                return f"🥇 {name}, you win!"
            elif player == 3 and computer == 2:
                player_wins += 1
                return f"🥇 {name}, you win!"
            elif player == computer:
                return "⚖️  Tie game!"
            else:
                python_wins += 1
                return f"🐍 Python wins!\nSorry, {name}..😥"

        game_result = decide_winner(player, computer)

        print(game_result)

        nonlocal game_count
        game_count += 1

        print(f"\nGame count: {str(game_count)}")
        print(f"\n{name}'s wins: {str(player_wins)}")
        print(f"Python wins: { str(python_wins)}")

        print("\nPlay again, {name}?")

        while True:
            playagain = input("\nY for Yes or \nQ to Quit \n")
            if playagain.lower() not in ["y", "q"]:
                continue
            else:
                break

        if playagain.lower() == "y":
            return play_rps()
        else:
            print("\n🏅🏅🏅🏅")
            print("Thank you for playing!\n")
            playagain = False
            sys.exit(f"Bye {name}! 👋")
            # break

    return play_rps


rock_paper_scissors = rps()

if __name__ == "__main__":
    import argparse

    parser = argparse.ArgumentParser(
        description="Provides a personalized game experience."
    )

    parser.add_argument(
        "-n",
        "--name",
        metavar="name",
        required=True,
        help="The name of the person playing the game.",
    )

    args = parser.parse_args()

    rock_paper_scissors = rps(args.name)
    rock_paper_scissors()

# ctrl + i - emoji
# alt + j - zmiana nazwy wielu plików

# py main.py -n "John"
# "python": "clear && python3 -u $fileName -n James",

arcade.py

Kopiuj
import sys
from main import main
from guess_number import guess_number


def play_game(name='PlayerOne'):
    welcome_back = False

    while True:
        if welcome_back == True:
            print(f"\n{name}, welcome back to the Arcade menu.")

        playerchoice = input(
            "\nPlease choose a game:\n1 = Rock Paper Scissors\n2 = Guess My Number\n\nOr press \"x\" to exit the Arcade\n\n"
        )

        if playerchoice not in ["1", "2", "x"]:
            print(f"\n{name}, please enter 1, 2, or x.")
            return play_game(name)

        welcome_back = True

        if playerchoice == "1":
            rock_paper_scissors = rps(name)
            rock_paper_scissors()
        elif playerchoice == "2":
            guess_my_number = guess_number(name)
            guess_my_number()
        else:
            print("\nSee you next time!\n")
            sys.exit(f"Bye {name}! 👋")


if __name__ == "__main__":
    import argparse

    parser = argparse.ArgumentParser(
        description="Provides a personalized game experience."
    )

    parser.add_argument(
        '-n', '--name', metavar='name',
        required=True, help='The name of the person playing the game.'
    )

    args = parser.parse_args()

    print(f"\n{args.name}, welcome to the Arcade! 🤖")

    play_game(args.name)

guest_number.py

Kopiuj
import sys
import random


def guess_number(name='PlayerOne'):
    game_count = 0
    player_wins = 0

    def play_guess_number():
        nonlocal name
        nonlocal player_wins

        playerchoice = input(
            f"\n{name}, guess which number I'm thinking of... 1, 2, or 3.\n\n")

        if playerchoice not in ["1", "2", "3"]:
            print(f"{name}, please enter 1, 2, or 3.")
            return play_guess_number()

        computerchoice = random.choice("123")

        print(f"\n{name}, you chose {playerchoice}.")
        print(
            f"I was thinking about the number {computerchoice}.\n"
        )

        player = int(playerchoice)

        computer = int(computerchoice)

        def decide_winner(player, computer):
            nonlocal name
            nonlocal player_wins

            if player == computer:
                player_wins += 1
                return f"🎉 {name}, you win!"
            else:
                return f"Sorry, {name}. Better luck next time. 😢"

        game_result = decide_winner(player, computer)

        print(game_result)

        nonlocal game_count
        game_count += 1

        print(f"\nGame count: {game_count}")
        print(f"\n{name}'s wins: {player_wins}")
        print(f"\nYour winning percentage: {player_wins/game_count:.2%}")

        print(f"\nPlay again, {name}?")

        while True:
            playagain = input("\nY for Yes or \nQ to Quit\n")
            if playagain.lower() not in ["y", "q"]:
                continue
            else:
                break

        if playagain.lower() == "y":
            return play_guess_number()
        else:
            print("\n🎉🎉🎉🎉")
            print("Thank you for playing!\n")
            if __name__ == "__main__":
                sys.exit(f"Bye {name}! 👋")
            else:
                return

    return play_guess_number


if __name__ == "__main__":
    import argparse

    parser = argparse.ArgumentParser(
        description="Provides a personalized game experience."
    )

    parser.add_argument(
        '-n', '--name', metavar='name',
        required=True, help='The name of the person playing the game.'
    )

    args = parser.parse_args()

    guess_my_number = guess_number(args.name)
    guess_my_number()
Spine
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 7066
0

Sprawdź co zmienili w pythonie 3.15 w stosunku do wersji 3.12 i zastanów się, którą z tych zmian mógłbyś użyć w swoim projekcie.

LukeJL
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 8509
2

Zamiast na siłę wdrażać nowinki, to zobaczyłbym, co w obecnym kodzie da się zmienić np. masz magiczne liczby w kodzie. Nie jest to czytelne:

Kopiuj
if player == 1 and computer == 3:
                player_wins += 1
                return f"🥇 {name}, you win!"
            elif player == 2 and computer == 1:
                player_wins += 1
                return f"🥇 {name}, you win!"

Co ciekawe widać, że tam próbowałeś to zamienić na enumy:

Kopiuj
class RPS(Enum):
            ROCK = 1
            PAPER = 2
            SCISSORS = 3

ale finalnie nie widzę, żebyś to gdziekolwiek wykorzystywał.

No i tworzysz funkcje, które nic nie robią, tylko owijają jakiś kawałek logiki, który i tak odpalasz od razu:

Kopiuj
      def decide_winner(player, computer):
            nonlocal name
            nonlocal player_wins

            if player == computer:
                player_wins += 1
                return f"🎉 {name}, you win!"
            else:
                return f"Sorry, {name}. Better luck next time. 😢"

      game_result = decide_winner(player, computer)

i taka funkcja korzysta ze zmiennych zewnętrznych (nonlocal name, nonlocal player_wins), co jest dodatkowym sygnałem, że funkcja nie jest niezależnym bytem, tylko nakładką na istniejący kod. Bywają sytuacje, że takie domknięcie ma sens, ale w tym przypadku jakoś nie widzę zysku, ponieważ efektywnie możesz napisać to tak:

Kopiuj

            if player == computer:
                player_wins += 1
                game_result = f"🎉 {name}, you win!"
            else:
                game_result = f"Sorry, {name}. Better luck next time. 😢"

mniej linijek, a robi to samo (no chyba, że decide_winner byś używał w wielu miejscach, ale z tego, co widzę, to tylko jednorazowa funkcja).

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.