Сохранение результатов игры на Python в файле .txt до следующего запуска программы? (Python 3.8)

#python #python-3.8 #file-writing #storing-data

#python #python-3.8 #запись в файл #хранение-данные

Вопрос:

Прежде всего, позвольте мне извиниться за заголовок, потому что я не был уверен, как правильно спросить / указать, что я пытаюсь сделать. Итак, позвольте мне сразу перейти к объяснению.

Я пишу программу Python Dice, в которой пользователь делает ставку (начальная ставка составляет 500 долларов) и выбирает число от 2 до 12. Пользователь получает три броска кубиков в соответствии с их количеством, в которых в зависимости от количества бросков они прибавляют к своей заработной плате, выигрывают свою заработную плату или вычитают из своей заработной платы (сумма банка). Это продолжается до

  1. они превышают лимит ставки, 500.
  2. Введите a 0 (zero) в качестве суммы ставки, при которой 0 (zero) программа завершается.
  3. Пользователь потерял все свои деньги, таким образом, сумма банка достигает 0 (zero) .

Все это работает именно так, как мне нужно. Однако я хочу сохранить значение банковской суммы в .txt файл, чтобы, например, если я выйду из игры с общей суммой в 300 долларов, то в следующий раз, когда я открою и запущу программу, я начну с 300 долларов вместо 500 долларов по умолчанию. Поэтому мне нужно создать этот файл и выяснить, как / где включить его в мою написанную программу.

Пока это мой код для программы:

 import random

def rollDice(rcnt):
    die1 = random.randint(1,6)
    die2 = random.randint(1,6)
    x = int(die1   die2)
    print('Roll #', rcnt, 'was', x)
    return x

def prog_info():
    print("You have three rolls of the dice to match a number you select.")
    print("Good Luck!!")
    print("---------------------------------------------------------------")
    print(f'You will win 2 times your wager if you guess on the 1st roll.')
    print(f'You will win 1 1/2 times your wager if you guess on the 2nd roll.')
    print(f'You can win your wager if you guess on the 3rd roll.')
    print("---------------------------------------------------------------")

def total_bank(bank):
    bet = 0
    while bet <= 0 or bet > min([500,bank]):
        print(f'You have ${bank} in your bank.')
        get_bet = input('Enter your bet (or 0 to quit): ')
        bet = int(get_bet)
        if get_bet == '0':
            print('Thanks for playing!')
            return bank, bet
        return bank, bet

def get_guess():
    guess = 0
    while (guess < 2 or guess > 12):
        try:
            guess = int(input('Choose a number between 2 and 12: '))
        except ValueError:
            guess = 0
        return guess

prog_info()
bank = 500
guess = get_guess
rcnt = 1
bet = 1  

while rcnt < 4 and bet:
    rcnt = 0
    bank,bet = total_bank(bank)
    if not bet: continue
    guess = get_guess()
    if guess == rollDice(rcnt 1):
        bank  = bet * 2
    elif guess == rollDice(rcnt 2):
        bank  = bet * 1.5
    elif guess == rollDice(rcnt 3):
        bank = bank
    else:
        if bet:
            bank = bank - bet
            if bank == 0:
                print(f'You have ${bank} saved in your bank.')
                print('Thanks for playing!')
 

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

1. Пожалуйста, не создавайте лишней работы для других людей, вандализируя свои посты. Размещая в сети Stack Exchange, вы предоставляете Stack Exchange не подлежащее отзыву право в соответствии с лицензией CC BY-SA 4.0 на распространение этого контента (т. Е. Независимо от вашего будущего выбора). Согласно политике Stack Exchange, распространяемой является версия сообщения, не подвергшаяся вандализму. Таким образом, любой вандализм будет отменен. Если вы хотите узнать больше об удалении записи, пожалуйста, смотрите: Как работает удаление?

Ответ №1:

Есть встроенная функция python, которая называется open() : https://www.w3schools.com/python/python_file_write.asp

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

Способ сделать это может быть:

 try:
    f=open("winnings.txt","r") # reads the file for any saved progress, if it exists
    bank = int(f.readline())
    f.close() # closes the connection. important, as the file might be lost if you don't close it after using it

except IOError: # if the file doesn't exist
     bank = 500

...your code here...

f=open("winnings.txt","w") # overwrites the previous save
f.write(str(bank))
f.close()
 

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

1. Похоже, что ссылка будет очень многообещающей и поможет мне понять. Я слышал, что w3schools был очень информативным сайтом, спасибо, чувак! Кроме того, спасибо за предложение кода. Это определенно сохранило банковскую стоимость, как и предполагалось, моя единственная проблема с этим заключается в том, что при повторном запуске программы я продолжаю получать эту ошибку ValueError: invalid literal for int() with base 10: # some value

2. Независимо от ошибки, я ценю совет, он дает мне что-то, с чем можно работать и чему учиться.

3. @carmelladiaz это определенно f.readline() . Причина, по которой это не работает, заключается в том, что код, который я там написал, преобразует прочитанную строку в целое число. Однако вы вводите туда «# some value», которое компьютер не может преобразовать в целое число. Могут быть преобразованы только числа. Попробуйте ввести в файл фактическое целое число и только целое число!

4. Часть проблемы заключается в том, что всякий раз, когда математика умножается на 1.5 нее, создается значение, скажем, например, 200,0 долларов США для банковской суммы. int Я не смог его прочитать, поэтому я изменил его на float , а затем установил bank = 500 на bank = bank , и теперь он сохраняет и печатает правильные цифры каждый раз, не .0 вызывая никаких ошибок. До того, как я использовал bank = bank код, он сохранял значение в файл, но float , по-видимому, заставлял его печатать начальную сумму в 500 долларов по умолчанию. Я не уверен, почему, но теперь он запущен и работает, так что еще раз спасибо!

5. @carmelladiaz Я предполагал, что ваша программа имеет дело только с целыми числами, отсюда int и . Поскольку это не так, и код, который я написал, сказал компьютеру «попробовать» преобразовать то, что он прочитал из файла, в целое число. Если что-то не удается, выполните условие «except». Изменение его на float было правильной идеей. Хорошая работа!

Ответ №2:

https://docs.python.org/3/tutorial/inputoutput.html#reading-and-writing-files
https://www.w3schools.com/python/python_json.asp

Это приведет к записи (и перезаписи) файла:

 import json

saveData = {
    "var 1": 1234,
    "foo": "hello world",
    10: "in the morning"
}

# Saving
with open("save.txt", "w") as f: # Write
    # Remove the indent if you want it all on one line
    print(json.dumps(saveData, indent=4), file=f)

del saveData

# Loading
with open("save.txt", "r") as f: # Read
    saveData = json.loads(f.read())

print(saveData)
# Or, print with JSON to make it look good
print(json.dumps(saveData, indent=4))
 

ПРЕДУПРЕЖДЕНИЕ: это работает только с объектами Python по умолчанию. Вам нужно будет преобразовать (сериализовать) любые пользовательские объекты, прежде чем отправлять их в файл. Вот пример сериализации ваших объектов:

 class myClass:
    def __init__(self, x, y):
        self.x = x
        self.y = y

    def save(self):
        return {
            "x": self.x,
            "y": self.y
        }

    def load(self, data):
        self.x = data["x"]
        self.y = data["y"]

obj = myClass(1234, 5678)
objData = obj.save()

print(objData)
del obj

obj = myClass(None, None)
obj.load(objData)