Wdrażam grę, która pozwala dwoma graczom wybrać na przemian ze stosu 27 pałeczek. Każdy gracz może zająć 1, 2 lub 3 kije na każdej turze; Gracz zmuszony do podjęcia ostatnich tętniaków.

Zrobiłem większość kodu, ale muszę zawierać walidacja. Poza tym, biorąc 1-3 kije, gracz nie może wziąć ostatecznego patyka. Próbowałem użyć instrukcji Kontynuować, ale kiedy gracz dwa przekracza limit, program powraca do tury gracza 1.

Oto, co mam do tej pory:

count = 27
T = False
F = False

while count > 1:

  Playerone = int(input("Player 1's Turn, Enter from 1-3"))
  if Playerone < 1 or Playerone > 3:
    print("Error")
    continue
  count -= Playerone
  print(count)

  if count == 1:
    print("P1 wins")
    break

  if count < 1:
    print("You can't pick up those many sticks")
    continue

  Playertwo = int(input("Player 2's Turn, Enter from 1-3"))
  if Playertwo < 1 or Playertwo > 3:
    print("Error")
    continue

  count -= Playertwo
  print(count)

  if count == 1:
    print("P2 wins")
    break

  if count < 1:
    print("You can't pick up those many sticks")
    continue

Ostatni, jeśli stwierdzenie jest problemem

Pomoc będzie bardzo mile widziane,

0
poisonishere 5 czerwiec 2018, 01:56

3 odpowiedzi

Najlepsza odpowiedź

Masz podstawową wadę przepływu pętli: Niezależnie od problemu napotkanego z wejściem gracza, używasz continue, aby powrócić do góry pętli, która powraca do gracza 1. Musisz to naprawić: Pętla na danym wejściu odtwarzacza, aż będzie ważna na wszystkich sposobach. Coś takiego powinno zrobić:

valid = False
while not valid:
  Playertwo = int(input("Player 2's Turn, Enter from 1-3"))

  if Playertwo < 1 or Playertwo > 3:
    print("Error")

  elif count - Playertwo < 1:
    print("You can't pick up those many sticks")

  else:
    valid = True

Zastosuj to do wejścia każdego gracza. Po wyjściu z tej pętli masz ważny wejście. Stamtąd możesz zmniejszyć liczbę i ustalić, czy ktoś wygrał.

1
Prune 4 czerwiec 2018, 23:06

To właśnie zrobiłbym, mógłbyś szalony z Classes, ale to trochę dla ciebie teraz (ale coś do zobaczenia). Powinieneś także zajrzeć do tworzenia metod, ale sprawdź mój kod poniżej z komentarzami, które wyjechałem.

def player_input(player_number: int):  # This is a method, that requires an integer to be pass to it
    p_input = int(input("Player {}'s Turn, Enter from 1-3: ".format(player_number)))
    while p_input < 1 or p_input > 3:  # This will cause a loop continuously asking the player to input a number until that number is between 1 or 3. 
        print('Please choose a number between 1 and 3')
        p_input = int(input("Player {}'s Turn, Enter from 1-3: ".format(player_number)))  # Format will replace the '{}' with the value of the variable you give it
    return p_input  # This 'return' line will return the what the results of what the player typed in


def found_winner(stick_number: int):  # stick_number is a required variable and ': int' requires that that variable be an integer
    winner = False
    if stick_number == 1:
        winner = True
    return winner  # This method will return if a winner is found or not


def next_player(player_number: int):  # This method will swap the players turn
    if player_number == 1:
        player_number = 2
    elif player_number == 2:
        player_number = 1
    return player_number


def start_game(stick_count: int = 27):  # This method will start the game, the '= 27' says that you can give me any stick count you want(that is an integer), but if you don't provide one I will use '27' by default
    player_number = 1
    while stick_count > 1:  # This will loop through until the stick count is 1 or less
        sticks_to_remove = player_input(player_number)  # I store the plays result just in case the stick_count goes below 1, and then I remove the sticks if the the count doesn't go below 1
        if stick_count - sticks_to_remove < 1:
            print('You cant pick up that many sticks')
            continue
        else:
            stick_count -= sticks_to_remove  # Remove the sticks
        if found_winner(stick_count):  # Look for the winner
            print('Player {} wins!'.format(player_number))
        else:
            player_number = next_player(player_number)  # If no winner go to the next player


if __name__ == '__main__':  # This says only execute the 'start_game()' method automatically if this python script is called, this is useful later when you start creating more complicated Python scripts that span multiple files.
    start_game()
0
chemical 4 czerwiec 2018, 23:44

Jednym ze sposobów zapewnienia ważnego wejścia użytkownika jest użycie pętli.

Oto szybki przykład funkcji, której możesz użyć:

def prompt_integer(msg, minval, maxval, err_invalid, err_oob):
    while True:
        resp = input(msg) # Python3, use raw_input in Python2
        try:
            resp = int(resp)
            if minval <= resp <= maxval:
                return resp
            else:
                print(err_oob)
        except ValueError:
            print(err_invalid)


x = prompt_integer("Enter an integer: ", 1, 3, "Invalid Integer.", "Integer Out of Bounds")

Tutaj funkcja nie powróci, dopóki użytkownik wejdzie do ważnego całkowitego między 1 a 3 (włącznie).

Jeśli wejdą, powiedzmy: "ABC", program wyświetli "Nieprawidłowy Integer". i zapytaj ich ponownie.

Jeśli wejdą, powiedzmy, 5, gdy określono, że granice są 1 i 3, program wyświetli "liczbę całkowitą poza granicami", a następnie zapytaj ich ponownie.

Po powrocie tej funkcji wiesz, że masz akceptowalną wartość.

Możesz użyć tej funkcji w swoim kodzie i zmodyfikuj argument maxval za każdym razem, gdy nazywasz go zgodnie z tym, ile kije, które są w stanie odebrać.

0
jedwards 4 czerwiec 2018, 23:06