4

我正在制作一个允许您赌博的程序,它会创建一个玩家对象,其属性包括当前资金、玩家的赢/输次数等。

我目前能够让这个工作并且在程序运行时保存信息,但是我想实现一个功能,允许我将此用户信息保存在 json 中,然后在下次运行程序时,检查 json 到查看玩家输入的名称是否与 json 中“名称”的任何值匹配,并从他们上次玩时提取他们的个人资料。

目前我正在学习如何读取/写入 json 数据,并且我能够将数据保存到 json 中,但我无法以我想要的格式保存它并稍后检索它并将数据转换回我的对象属性.. 具体来说,我可以像这样保存用户:

import json

class Casino:
    def __init__(self, name, money, wins, debt):
        self.name = str(name)
        self.money = int(money)
        self.wins = int(wins)
        self.debt = int(debt)
        self.is_gambling = True
        self.losses = 0

    def add_win(self):
        self.wins = self.wins + 1

    def add_loss(self):
        self.losses = self.losses + 1

    def add_money(self, bet: int):
        self.money = self.money + bet

    def add_debt(self, debt: int):
        if self.money == 0:
            print("You have gone into debt..")
            print("Your debt has gone up")
            self.debt = self.debt + debt
        else:
            print("Your debt has gone up")
            self.debt = self.debt + debt

    def change_name(self, newname):
        self.name = newname
        return self.name

    def indebt(self):
        if self.debt > 0:
            print('You are in debt..')
            print(f'You owe ${self.debt}')
        else:
            print('You are not in debt')

    def addrep(self, rep: int):
        self.reputation = self.reputation + rep
        return self.reputation

    def remrep(self, rep: int):
        self.reputation = self.reputation - rep
        return self.reputation


player2 = {
    'name': 'dolorean',
    'money': 0,
    'wins': 0,
    'debt': 0
}

show = json.dumps(player2)

with open('test.json', 'w') as userfile:
    json.dump(show, userfile)

它会像这样保存到json中:

"{\"name\": \"dolorean\", \"money\": 0, \"wins\": 0, \"debt\": 0}"

但我想按用户名检索属性。

我是否需要在 json 中创建某种嵌套列表?如果我这样做,我该怎么做?我尝试从以下位置更改我的播放器变量:

player2 = {
        'name': 'dolorean',
        'money': 0,
        'wins': 0,
        'debt': 0
}

至:

player2 = {
           'users': {
               'name': 'dolorean',
               'money': 0,
               'wins': 0,
               'debt': 0
         }
}

但我不确定如何检索数据,所以它只是以一种对我来说看起来不同的方式保存它..

4

2 回答 2

2

此数据结构将允许许多不同的玩家名称:

{
    "jim": {"money": 100, "wins": 5, "debt": 0},
    "betty": {"money": 200, "wins": 7, "debt": 5}
}
于 2021-12-18T19:21:11.047 回答
1

好的,所以我从 martineau 的评论中得到的解决方案是这样做:

我将使用输入函数生成一个名称(只是临时的,我将其添加到不和谐的机器人中,因此最终名称将是他们的服务器显示名称,他们的文件名将是他们唯一的服务器 ID,因此我可以将他们的信息保存到他们的文件),然后我从该输入中创建以下对象并将其转换为 json 格式,然后将其转换回来。

gam_name = str(input('What is your name?'))
player1 = Casino(gam_name, 500, 0, 0)

player1 = {

        'name': gam_name,
        'money': player1.money,
        'wins': player1.wins,
        'debt': player1.debt
}

with open(gam_name + '.json', 'w') as userfile:
    json.dump(player1, userfile)


with open(gam_name + '.json') as userfile:
    info = json.load(userfile)
    print(info['name'])
    print(info['money'])
    print(info['wins'])
    print(info['debt'])

现在,通过这种方式,我可以将每个值保存到当前的任何值,并且我可以运行它,无论何时他们赢或输,它都会用新的值覆盖他们的当前值,然后在使用 with 语句完成后关闭文件。

这正是我想要做的,现在我可以从特定于播放器的唯一文件中调用信息,这将允许两个人拥有相同的显示名称或用户名和不同的信息。

感谢您的帮助!

于 2021-12-18T20:02:31.777 回答