Как реализовать критерии «Точка A и Точка B должны иметь как минимум разницу 2» в цикле while - PullRequest
0 голосов
/ 10 июля 2019

Я столкнулся с проблемой, связанной с моей игрой «камень-ножницы-бумага».Чтобы закончить игру, он должен иметь оба критерия:

  • Один игрок должен набрать не менее 5 очков
  • Разница в баллах двух игроков должна быть не менее двух

Я сделал часть, в которой один из баллов должен быть не менее 5. Кроме того, попытался поместить условие разницы в строку «Пока», но безрезультатно.Это приводит к окончанию игры, если один из игроков достигает 5, или один игрок достиг разницы более двух.Критерии говорят, что ОБА должны быть удовлетворены, а не только один или другой.Кодирование ножниц из каменной бумаги уже было дано властью.

import play_rock_paper_scissors as play_rps

NUM_POINTS_TO_WIN = 5

num_rounds_played = 0
points_a = 0 
points_b = 0 

while (points_a < NUM_POINTS_TO_WIN and points_b < NUM_POINTS_TO_WIN) or \
abs(points_a - points_b)<2:


    winner = play_rps.play()
    print('Outcome of round', num_rounds_played,':',winner)
    num_rounds_played += 1
    if winner == 'a':
        points_a += 1
    elif winner == 'b':
        points_b += 1


print('Number of rounds played =',num_rounds_played) 

print('A has won',points_a,'rounds')
print('B has won',points_b,'rounds') 

Я ожидал, что результаты будут примерно такими:

[1] A: 2 B: 5
[2] A: 5 B: 3
[3] A: 0 B: 5

Но фактический результат:

[1] A: 6 B: 8
[2] A: 2 B: 4
[3] A: 9 B: 11

, который не удовлетворяет критерию «не может превышать 5».

Ответы [ 2 ]

1 голос
/ 10 июля 2019

Если вы хотите, чтобы оба критерия были выполнены, вы должны использовать логический оператор and вместо оператора or:

while (points_a < NUM_POINTS_TO_WIN and points_b < NUM_POINTS_TO_WIN) and abs(points_a - points_b) < 2:
# Here ---------------------------------------------------------------^
0 голосов
/ 10 июля 2019

В идеале, вместо длинного условия, из-за которого люди будут сбиты с толку, вы можете написать правильно названную функцию:

def should_end(points_a, points_b):
  # first condition - one player crossing the threshold
  if points_a < NUM_POINTS_TO_WIN and points_b < NUM_POINTS_TO_WIN:
    return False
  # second condition - points difference at least 2
  if abs(points_a - points_b)<2:
    return False

  # both a satisfied
  return True

while not should_end(points_a, points_b):

Если вы не можете использовать функцию для этого назначения, вы все равно можете переписать условие, чтобы оно было более читабельным / ближе к тому, что вы хотите сказать. У вас 2 конечных условия, поэтому

не продолжать, если любой игрок достиг NUM_POINTS_TO_WIN а также разница точек> = 2

, что составляет

while not ((points_a >= NUM_POINTS_TO_WIN or points_b >= NUM_POINTS_TO_WIN) and abs(points_a - points_b)>=2)

Вы можете преобразовать его оттуда, если вам не нравится ведущий not.

...