Больше о второй главе сказать нечего, но была еще одна игра, «Камень, ножницы, бумага». Именно добавление этой игры побудило меня написать свою библиотеку 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/.