用 Python 为离线游戏创建排行榜

Posted

技术标签:

【中文标题】用 Python 为离线游戏创建排行榜【英文标题】:Creating a leaderboard for offline game in Python 【发布时间】:2015-01-22 16:13:52 【问题描述】:

对于一个学校项目,我正在创建一个具有评分系统的游戏,并且我想创建某种排行榜。完成后,老师会将其上传到共享服务器,其他学生可以下载游戏副本,但遗憾的是学生无法保存到该服务器;如果可以的话,排行榜将是小菜一碟。最多可以记录几百个分数,并且所有计算机都可以访问互联网。

我不太了解服务器或托管,也不懂 java、html 或 Web 开发中常用的任何其他语言,因此其他相关问题并没有真正的帮助。我的游戏将得分信息打印到一个文本文件中,我不知道如何从那里获得每个人都可以访问的在线某个地方。

有没有办法只用 python 完成这样的任务?

这里有代码,用于在获得分数后更新排行榜文件(假设它只是一个文本文件)。这会假设我在同一个地方有一份排行榜和分数文件。

这是我的模拟排行榜 (Leaderboards.txt) 的格式:

Leaderboards

1) JOE  10001
2) ANA  10000
3) JAK  8400
4) AAA  4000
5) ABC  3999

这是日志文件将打印的内容 - 首字母和分数 (log.txt):

ABC
3999

代码(适用于 python 2.7 和 3.3):

def extract_log_info(log_file = "log.txt"):
    with open(log_file, 'r') as log_info:
        new_name, new_score = [i.strip('\n') for i in log_info.readlines()[:2]]

    new_score = int(new_score)
    return new_name, new_score

def update_leaderboards(new_name, new_score, lb_file = "Leaderboards.txt"):
    cur_index = None
    with open(lb_file, 'r') as lb_info:
        lb_lines = lb_info.readlines()
        lb_lines_cp = list(lb_lines) # Make a copy for iterating over
        for line in lb_lines_cp:
            if 'Leaderboards' in line or line == '\n':
                continue

            # Now we're at the numbers
            position, name, score = [ i for i in line.split() ]

            if new_score > int(score):
                cur_index = lb_lines.index(line)
                cur_place = int(position.strip(')'))
                break

        # If you have reached the bottom of the leaderboard, and there
        # are no scores lower than yours
        if cur_index is None:
            # last_place essentially gets the number of entries thus far
            last_place = int(lb_lines[-1].split()[0].strip(')'))
            entry = ") \t\n".format((last_place+1), new_name, new_score)
            lb_lines.append(entry)
        else: # You've found a score you've beaten
            entry = ") \t\n".format(cur_place, new_name, new_score)
            lb_lines.insert(cur_index, entry)

            lb_lines_cp = list(lb_lines) # Make a copy for iterating over
            for line in lb_lines_cp[cur_index+1:]:
                position, entry_info = line.split(')', 1)
                new_entry_info = str(int(position)+1) + ')' + entry_info
                lb_lines[lb_lines.index(line)] = new_entry_info

    with open(lb_file, 'w') as lb_file_o:
        lb_file_o.writelines(lb_lines)


if __name__ == '__main__':
    name, score = extract_log_info()
    update_leaderboards(name, score)

更多信息:

分数将小于 1 000 000 理想情况下,解决方案只是游戏外部的一些代码,这样我就可以制作一个可执行文件,用户在完成后可以运行 我知道这听起来不太安全 - 事实并非如此 - 但没关系,它不需要防黑客攻击

【问题讨论】:

Python 可以做到这一点,但是请让您的问题更加具体,以便得到解答。 我已经更新了它,这样你就可以看到游戏会吐出什么样的信息。此外,还有一个模拟排行榜 您要求某人根据模糊的规范设计和构建您的系统。如果你想这样做,你必须聘请一名顾问。否则,您将不得不去学习基础知识,阅读有关 Web 服务的教程,然后在遇到特定问题时再回来。 此外,指向外部代码的链接也无济于事。将任何相关的代码和数据——或者更好的是Minimal, Complete, Verifiable Example——放在你的问题中。这样,寻找要回答的问题或寻找类似问题的答案的人将在搜索中看到它。两年后,当其他人遇到类似问题时,代码仍然存在。 我已经包含了代码和数据,虽然我不能真正最小化代码,因为我没有任何错误 【参考方案1】:

最简单的可能就是只使用 MongoDB 什么的(MongoDB 是一个 NoSQL 类型的数据库,可以让您轻松保存字典数据……)

您可以使用https://mongolab.com 的免费帐户(应该会给您足够的空间)。

您还需要 pymongo pip install pymongo

然后你可以简单地在那里保存记录:

from pymongo import MongoClient, DESCENDING

uri = "mongodb://test1:test1@ds051990.mongolab.com:51990/joran1"
my_db_cli = MongoClient(uri)
db = my_db_cli.joran1  # select the database ... 

my_scores = db.scores  # this will be created if it doesn't exist!
# add a new score
my_scores.insert("user_name": "Leeeeroy Jenkins", "score": 124, "time": "11/24/2014 13:43:22")
my_scores.insert("user_name": "bob smith", "score": 88, "time": "11/24/2014 13:43:22")

# get a list of high scores (from best to worst)
print(list(my_scores.find().sort("score", DESCENDING)))

如果您想测试系统,这些凭据实际上会起作用(请记住,我添加了 leeroy 几次)。

【讨论】:

这看起来像是我可能可以使用的东西,谢谢!抱歉,如果问题太笼统,我还是新手。

以上是关于用 Python 为离线游戏创建排行榜的主要内容,如果未能解决你的问题,请参考以下文章

基于redis排行榜的实战总结

将排行榜添加到 iOS 游戏

将分数发布到 Game Center 排行榜

游戏中心排行榜现在出现了

游戏中心排行榜得分移除

PHP中游戏的排行榜/高分