Возвращение значения из функции в переменную - PullRequest
0 голосов
/ 11 февраля 2020

Так что в настоящее время у меня возникли проблемы с разработкой того, как создать функцию «считать» в моей игре «Камень, ножницы, бумага». Я новичок в Python, и это мой первый опыт использования нескольких функций для выполнения игровой логики c. Вот мой код ...

import random
from random import choice

cpu_score = 0
player_score = 0

# dictionary from which gestures are pulled
gestures = ["rock","paper","scissors"]

n_rounds = int(input("How many rounds would you like to play? "))

while n_rounds % 2 == 0 or n_rounds <= -1:
    print("Number of rounds must be an odd number! Select an odd number!")
    n_rounds = input("How many rounds?")
    break
print("Lets play",n_rounds,"rounds!")

rounds_to_win = ((n_rounds + 1)//2)
rounds_to_win = round(rounds_to_win)
print("You must win",rounds_to_win,"rounds to beat the game!")

def computer_choice():
    """Movement made by the computer"""
    comp = random.choice(gestures)   
    return comp

def player_gesture():
    """Movement by player"""
    player = input("Please select, rock, paper or scissors")
    if player not in gestures:
        print("That's not an option! Please try again.")
        player = input("Please select, rock, paper or scissors")  
    return player

def who_won_round(comp, player):
    '''Who is the winner of the round.'''

    winner = 0     

    if ((player == "rock") and (comp == "paper")) or \
            ((player == "paper") and (comp ==  "scissors")) or \
            ((player == "scissors") and (comp == "rock")):
          winner = 1

    elif ((comp == "rock") and (player == "paper")) or \
            ((comp == "paper") and (player == "scissors")) or \
            ((comp == "scissors") and (player == "rock")):
          winner = 2

    else:
        winner = 0

    return winner

def win_counter(winner, cpu_score,player_score):

    rounds = 1

    if winner == 1:
        player_score += 1
        print("This is round",rounds)
        rounds += 1
        return player_score

    if winner == 2:
        cpu_score += 1
        print("This is round",rounds)
        rounds += 1
        return cpu_score

def count_round(winner, player, comp, cpu_score, player_score):

    if winner == 0:
        print("It's a tie!")      

    elif winner == 1:

        print("The player chose",player)
        print("The computer chose",comp)
        print("The computer won the round!")
        print("The computer has won",cpu_score,"rounds!")

    elif winner == 2:
        print("The player chose",player)
        print("The computer chose",comp)
        print("The player won the round!")
        print("The player has won",player_score,"rounds!")

def game_structure():
    while rounds_to_win < n_rounds:
        comp = computer_choice()
        player = player_gesture()
        winner = who_won_round(comp,player)
        win_count = win_counter(winner, cpu_score,player_score)
        count = count_round(winner, player, comp, cpu_score, player_score)

game_structure()

В основном у меня возникают проблемы с возвратом переменных, чтобы вести подсчет баллов за "количество раундов" и "cpu_score" и "player_score". Я предпочитаю не объявлять глобальные переменные, так как я понимаю, что они могут быть грязными, но я не совсем уверен, как этого избежать.

Ответы [ 2 ]

0 голосов
/ 11 февраля 2020

Из того, что я вижу, cpu_score и player_score никогда не обновляются. У вас есть только самый новый результат в win_count, который не присваивается cpu_score или player_score в любое время. Это может быть что-то вроде:

win_count = win_counter(winner, cpu_score,player_score)
if winner == 1:
    cpu_score = win_count
if winner == 2:
    player_score = win_count
rounds_to_win = max(player_score, cpu_score)
count_round(winner, player, comp, cpu_score, player_score)

Я не запускал его, но эта модификация должна помочь. Есть лучшие способы сделать это; возможно, используя список, чтобы сохранить результаты и использовать победителя в качестве индекса, или объектный подход, как сказал кто-то другой, но я не хочу слишком сильно менять код.

Кроме того, имейте в виду, что round переменная в win_counter ничего не делает.

0 голосов
/ 11 февраля 2020

Если вы должны избегать использования глобальных переменных, вы должны использовать объектно-ориентированный подход. Таким образом, вы можете хранить переменные в объекте.

Таким образом, вы делаете что-то вроде этого:

newgame = mytictactoe()

while True #infinite loop
    input("wanna play?")
    if input == yes:
        newgame.start
    else:
        break
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...