Больше о второй главе сказать нечего, но была еще одна игра, «Камень, ножницы, бумага». Именно добавление этой игры побудило меня написать свою библиотеку customUtils. Я устал писать циклы while, чтобы убедиться, что люди следуют указаниям. (Мальчик, я был рад, что сделал, есть много мини-игр, чтобы написать в этой книге)

С «Камнем, ножницами, бумагой» я сделал то же самое, что и с «Угадай число». Он сказал мне, какой будет программа, и выдал результат. Я сделал свой собственный, прежде чем читать дальше.

Я начал с очень простого, а затем построил его. Это то, над чем я работаю. Я бы предпочел просто начать программировать, и когда я вижу, что где-то можно повысить эффективность, я обычно просто делаю это тогда. Это часто приводит к странным ошибкам и потере времени. Если бы я научился замедляться, мне бы не пришлось иметь с ними дело. Так что эта книга также о том, как научить меня писать длинные тексты, а затем улучшать их. Улучшение его по ходу дела только создает проблемы!

К сожалению, эта программа по-прежнему использует глупое количество операторов if. Я сократил это немного, чтобы вложить их на один уровень вглубь.

if player == computer:
            print(f"It's a tie, you both picked {words[player]}")
            ties += 1
        elif player == 'r':
            if computer == 's':
                print("You win! rock beats scissors")
                wins += 1
            else:
                print("You lost this one, paper beats rock")
                losses += 1
        elif player == 'p':
            if computer == 'r':
                print("You win! paper beats rock")
                wins += 1
            else:
                print("You lost this one, scissors beats paper")
                losses += 1
        else:
            if computer == 'r':
                print("You win! scissors beats paper")
                wins += 1
            else:
                print("You lost this one, rock beats scissors")
                losses += 1

Я все еще думаю, что, вероятно, есть более элегантный способ сделать это. Вроде передачи пар и запоминания, какая из них игрок, а какая компьютер. Функция должна знать только, какая буква лучше какой, а затем вы можете использовать это, чтобы напечатать свое сообщение и сообщить игроку, выиграл ли он или компьютер. Излишне говорить, что я еще не сделал этого.

Мой подход использовал список и словарь для хранения параметров. (Я только что заметил, что это можно сделать с одной структурой данных, а не с двумя) Они

possibilities = ["r", "p", "s"]
    words = {
        "r": "rock",
        "p": "paper",
        "s": "scissors"
    }

Возможности используются для определения того, выбрал ли игрок действительный ход, используя «игрок в возможностях». Второй сопоставляет возможности с реальными словами. Еще одна вещь, которую я только что заметил, словарь используется только один раз, в случае с галстуком. Я мог бы использовать его для вывода сообщения о выигрышах и проигрышах. Я делал меня немного скрюченным, жестко кодируя слова. Я видел довольно много вещей, которые можно было бы улучшить. Написание этого является полезным упражнением в дополнение к программам.

В этом нет ничего большего. Немного красивого форматирования для названия, потому что это игра из командной строки и отображение очков.

import random
import customUtils


def main():
    possibilities = ["r", "p", "s"]
    words = {
        "r": "rock",
        "p": "paper",
        "s": "scissors"
    }
    wins = 0
    losses = 0
    ties = 0
    while True:
        computer = random.choice(possibilities)

        print("\n===============================\n" +
              "Lets play rock, paper, scissors" +
              "\n===============================")
        print(f"{wins} wins, {losses} losses, {ties} ties\n")
        print("Enter your move: (r)ock, (p)aper, (s)cissors")

        player = customUtils.getAns(input(), possibilities)

        if player == computer:
            print(f"It's a tie, you both picked {words[player]}")
            ties += 1
        elif player == 'r':
            if computer == 's':
                print("You win! rock beats scissors")
                wins += 1
            else:
                print("You lost this one, paper beats rock")
                losses += 1
        elif player == 'p':
            if computer == 'r':
                print("You win! paper beats rock")
                wins += 1
            else:
                print("You lost this one, scissors beats paper")
                losses += 1
        else:
            if computer == 'r':
                print("You win! scissors beats paper")
                wins += 1
            else:
                print("You lost this one, rock beats scissors")
                losses += 1

        customUtils.playAgain("Rock Paper Scissors", [
                              f"wins: {wins}", f"losses: {losses}", f"ties: {ties}"])


if __name__ == "__main__":
    main()

Вот их рекомендуемый код. Мое может быть некрасивым, но, по крайней мере, я устранил целую кучу «если».

import random, sys

print('ROCK, PAPER, SCISSORS')

# These variables keep track of the number of wins, losses, and ties.
wins = 0
losses = 0
ties = 0

while True: # The main game loop.
    print('%s Wins, %s Losses, %s Ties' % (wins, losses, ties))
    while True: # The player input loop.
        print('Enter your move: (r)ock (p)aper (s)cissors or (q)uit')
        playerMove = input()
        if playerMove == 'q':
            sys.exit() # Quit the program.
        if playerMove == 'r' or playerMove == 'p' or playerMove == 's':
            break # Break out of the player input loop.
        print('Type one of r, p, s, or q.')

    # Display what the player chose:
    if playerMove == 'r':
        print('ROCK versus...')
    elif playerMove == 'p':
        print('PAPER versus...')
    elif playerMove == 's':
        print('SCISSORS versus...')

    # Display what the computer chose:
    randomNumber = random.randint(1, 3)
    if randomNumber == 1:
        computerMove = 'r'
        print('ROCK')
    elif randomNumber == 2:
        computerMove = 'p'
        print('PAPER')
    elif randomNumber == 3:
        computerMove = 's'
        print('SCISSORS')

    # Display and record the win/loss/tie:
    if playerMove == computerMove:
        print('It is a tie!')
        ties = ties + 1
    elif playerMove == 'r' and computerMove == 's':
        print('You win!')
        wins = wins + 1
    elif playerMove == 'p' and computerMove == 'r':
        print('You win!')
        wins = wins + 1
    elif playerMove == 's' and computerMove == 'p':
        print('You win!')
        wins = wins + 1
    elif playerMove == 'r' and computerMove == 'p':
        print('You lose!')
        losses = losses + 1
    elif playerMove == 'p' and computerMove == 's':
        print('You lose!')
        losses = losses + 1
    elif playerMove == 's' and computerMove == 'r':
        print('You lose!')
        losses = losses + 1

Книгу, включая пример кода и пояснения, можно найти по адресу https://automatetheboringstuff.com/2e/chapter2/.