Как мне записать результаты моей игры в leaderboard.txt и отобразить 5 лучших результатов только с именем каждого игрока

#python #text-files #file-handling

#питон #текстовые файлы #обработка файлов #python

Вопрос:

В настоящее время я играю в кости для своего школьного проекта по программированию, и он включает в себя правила: «Сохраняет счет победителя и его имя во внешнем файле» и «Отображает счет и имя игрока из 5 лучших выигрышных результатов из внешнего файла». Я сделал все в своей игре, кроме таблицы лидеров. Я могу записать имя и оценку пользователя в текстовый файл, но я не уверен в том, как его затем отсортировать, а также хотел бы, чтобы при первом запуске программы пользователи могли использовать меню для перехода к таблице лидеров, где он затем прочитает текстовый файл и распечатает 5 лучших результатов по порядку, включая имена. Я проверил множество вопросов, похожих на мои, но ни один из них точно не подходил для моего кода, поскольку я продолжал получать ошибки при внедрении чужого кода в мой, которые просто не были совместимы с моим макетом.

 (deleted)
  

Заранее спасибо, я никогда не использовал stack overflow, чтобы задать вопрос, поэтому приношу извинения, если я что-то сделал не так в своем посте.

Ответ №1:

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

Учитывая, что вы упомянули, что это школьный проект, я не дам вам полностью решение для копирования / вставки, но, надеюсь, объясню достаточно подробностей о том, как решить это самостоятельно.

Теперь, согласно вопросу, вы не знаете, как отсортировать свою таблицу лидеров. Я сам несколько раз запускал программу (после удаления спящих, потому что я нетерпеливый 😋) и вижу, что ваш файл таблицы лидеров выглядит следующим образом:

 90 - somename
38 - anothername
48 - yetanothername
  

Чтобы отобразить это, вы должны сделать две вещи:

  • Откройте файл и прочитайте данные
  • Преобразуйте данные из файла во что-то, что может быть использовано программой

Похоже, что первый шаг — это то, что вы уже знаете, поскольку вы уже используете open() для записи в файл. Чтение очень похоже.

Следующий шаг не так очевиден, если вы новичок в программировании. Файл считывается как текстовые данные, и вам нужно отсортировать его по номерам. Для компьютера текст "10" отличается от числа 10 (обратите внимание на кавычки). Вы можете попробовать это, открыв оболочку Python:

 >>> 10 == 10
True
>>> 10 == "10"
False
>>> "10" == 10
False
  

И сортировка текста отличается от чисел. Итак, у вас есть одна часть решения — преобразовать текст в цифры.

Вы также получите данные в виде строк (либо используя readlines() , либо splitlines() в зависимости от того, как вы их используете. Эти строки должны быть разделены на оценку и название. Шаблон в файле выглядит следующим образом:

 <score> - <name>
  

Важно заметить, что у вас есть текст " - " в качестве разделителя между ними (включая пробелы). Взгляните на функции Python str.split() и str.partition() . Эти функции могут быть применены к любому текстовому значению:

 >>> "hello.world".split(".")
['hello', 'world']
>>> "hello.world".partition(".")
('hello', '.', 'world')
  

Вы можете использовать это, чтобы «разрезать» линию на несколько частей.

После этого вы должны запомнить предыдущий пункт о преобразовании текста в цифры.

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

При чтении из файла вы можете загрузить преобразованные данные в список Python, который затем можно отсортировать.

Удобным решением является создание списка, в котором каждый элемент этого списка представляет собой кортеж с полями (score, name) . Таким образом, вы можете напрямую сортировать список без каких-либо тайных трюков.

И, наконец, после сортировки вы можете распечатать его на экране.

В итоге

  • Откройте файл
  • Считайте данные из файла в виде «строк»
  • Создайте новый пустой список.
  • Повторите цикл над каждой строкой и…
    • … разделите строку на несколько частей, чтобы получить оценку и имя отдельно
    • … преобразовать результат в число
    • … добавьте два значения в новый список из пункта 3
  • Отсортируйте список из пункта 3
  • Распечатайте список.

Некоторые общие мысли

Вы можете улучшить и упростить код, используя больше функций

Вы уже показали, что знаете, как использовать функции. Но посмотрите на комментарии #THIS IS ROUND1 к #THIS IS ROUND5 . Строки кода для каждого раунда одинаковы. Переместив эти строки в функцию, вы сэкономите много кода. И это имеет два преимущества: вам нужно будет внести изменения в код (улучшение или исправление) только в одном месте. И, во-вторых, вы гарантируете, что все блоки ведут себя одинаково.

Чтобы сделать это, вам нужно подумать о том, какие переменные нужны этому блоку (это будут новые аргументы функции) и каков будет результат (это будет возвращаемое значение функции).

Простой пример с дублированием:

 print("round 1")
outcomes = []
value1 = random(1, 100)
value2 = random(1, 100)
if value1 > value2:
    outcomes.append("A")
else:
    outcomes.append("B")

print("round 2")
outcome = ""
value1 = random(1, 100)
value2 = random(1, 100)
if value1 > value2:
    outcomes.append("A")
else:
    outcomes.append("B")
  

Переписано с помощью функций

 def run_round(round_name):
    print(round_name)
    value1 = random(1, 100)
    value2 = random(1, 100)
    if value1 > value2:
        return "A"
    else:
        return "B"

outcomes = []
result_1 = run_round("round 1")
outcomes.append(result_1)
result_2 = run_round("round 2")
outcomes.append(result_2)
  

Как вы можете видеть, второй код намного короче и больше не дублируется. В вашем коде будет больше аргументов функции. Обычно в программировании сложно организовать свой код таким образом, чтобы функции имели мало аргументов и не имели сложных возвращаемых значений. Хотя, пока это работает, никто не будет смотреть слишком пристально 😉

Безопасный способ запросить пароль

Вы можете использовать getpass() из модуля getpass() для запроса пароля безопасным способом:

 from getpass import getpass
password = getpass()
  

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

Спит

Вызовы «sleep ()» приятны и дают вам возможность следить за программой, но замедляют тестирование программы. Рассмотрите возможность использования меньших значений (возможны значения через запятую) или, что еще лучше, напишите свою собственную функцию, которую вы можете «закоротить» для тестирования. Что-то вроде этого:

 import time


ENABLE_SLEEP = True

def sleep(s):
    if ENABLE_SLEEP:
        time.sleep(s)

print("some code")
sleep(1)
print("more code")
sleep(4)
  

Затем вы будете использовать свою собственную sleep() функцию в любое время, когда захотите подождать. Таким образом, вы можете просто установить переменную ENABLE_SLEEP в False , и ваш код будет выполняться быстро (для тестирования).

Комментарии:

1. Большое спасибо, это действительно помогло мне завершить его с вашим замечательным руководством. Я сделал так много кода для таблицы лидеров, однако мне все еще нужно ограничить результаты только топ-5, которые нужно распечатать или даже поместить в блокнот. « def lb(): scores = [] с помощью open(‘leaderboard.txt ‘, ‘r’) в виде файла: для строки в файле: имя, оценка = line.split(‘ — ‘) оценка = int (оценка) scores.append((имя, оценка)) scores.sort (ключ = лямбда s: s [0], обратный = True) для имени, оценка в баллах: print(имя, оценка, sep=’ — ‘) «

2. на самом деле вам не нужна «лямбда» при использовании подобных кортежей. Они автоматически сортируются соответствующим образом, так что вы можете немного упростить это. Для топ-5 найдите в Google «нарезку списка Python»