找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 2435|回复: 11

[求助] 关于一些逻辑问题

[复制链接]
发表于 2022-8-17 19:37:39 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
最近需要做一个功能,这个功能能够通过实时监测游戏时间和游戏发生事件录入一个日志,但是日志需要用游戏天数来分类,并放在屏幕里。(该日志大概会分100以上的不定页数,每页都会显示玩家操作的日志。)

楼主才疏学浅,想了一些例如嵌套字典,列表之类的方法,但是任然没有一个好的方法来完成这项功能。求问一下中文空间的各位有没有什么好的方法来做这个
谢谢各位大佬
发表于 2022-8-18 01:26:29 | 显示全部楼层
你说的方法似乎都可以完成你认为的功能。或者你画个实例的图来说明比较容易让别人明白你的问题。
回复 支持 抱歉

使用道具 举报

 楼主| 发表于 2022-8-19 08:26:27 | 显示全部楼层
blackpineapple 发表于 2022-8-18 01:26
你说的方法似乎都可以完成你认为的功能。或者你画个实例的图来说明比较容易让别人明白你的问题。 ...

遇到的问题大概是,需要写一个方法,这个方法可以用当前获取的时间创建一个日志对象,并将这个日志对象加入时间列表,但是我获取的时间是一个字符串类型,直接用作对象名可能会报错。然后就不知道怎么做了
回复 支持 抱歉

使用道具 举报

 楼主| 发表于 2022-8-19 08:29:58 | 显示全部楼层
alicia 发表于 2022-8-19 08:26
遇到的问题大概是,需要写一个方法,这个方法可以用当前获取的时间创建一个日志对象,并将这个日志对象加 ...

[RenPy] 纯文本查看 复制代码
#笔记本类
    class Noterecord:
        def __init__(self,day,daynote,daytime):
            self.day = day
            self.daynote = defaultdict(int)

#增加笔记 notetime:小时:分钟 am/pm
        def addnote(self,,day,notetime,intrduce=" "):
            for note in daynote:
                if notetime not in self.daynote:
                    self.daynote[notetime] = intrduce
                else:
                    raise Exception('NOTE:note in daynote.')
#删除笔记
        def remnote(self,day,notetime):
            for note in daynote:
                if notetime not in self.daynote:
                    raise Exception('NOTE:note not in daytime')

                else:
                    self.daynote.pop(notetime)


    class Noteitem:
        NOTE_ITEM = [
        ]

        @classmethod
        def notefrash(cls,intrduce=" "):
            if Time.getday() is not None:
                default Time.getday() = Noterecord(day=Time.getday())
            notename.addnote(day=Time.getday(),intrduce=intrduce,notetime=Time.gettime())
            if Time.getday() not in NOTE_ITEM: 
                NOTE_ITEM.append(noteneme.daynote)

            
回复 支持 抱歉

使用道具 举报

 楼主| 发表于 2022-8-19 08:32:02 | 显示全部楼层
gettime和getday都是返回字符串
回复 支持 抱歉

使用道具 举报

发表于 2022-8-19 09:37:15 | 显示全部楼层
“如果一层抽象不能满足需求,那就再加一层抽象。”

楼主的代码看着头疼……
1. addnote参入列表里两个连续的逗号;
2. notefrash方法用了修饰器,难道还有个原型方法?
3. Time类是在哪里定义的?两个方法返回的字符串格式是什么样的?
4. 还没想好……

用一个“时间戳+操作内容”的对象来作为日志基本单元没问题。下一步的设计就不太合适了。
如果我做的话,会把时间戳中的日期作为key,把相同日期的日志基本单元直接扔进一个列表,生成一个字典。这样就很容易根据日期获取到当天所有日志,如何排序和展示是后续考虑的问题。
回复 支持 抱歉

使用道具 举报

 楼主| 发表于 2022-8-19 10:52:06 | 显示全部楼层
被诅咒的章鱼 发表于 2022-8-19 09:37
“如果一层抽象不能满足需求,那就再加一层抽象。”

楼主的代码看着头疼……

呃,早上打的有点急,可能有一些错误没有筛查。楼主感到非常抱歉
修饰器是保证能够通过类名引用方法
time是一个随时获取时间的类:
[RenPy] 纯文本查看 复制代码
    #时间操作
    class Time:
        TIME_DAY = 1
        TIME_HOUR = 8
        TIME_MINUTE = 0
        TIME_STR = "AM"
        TIME_VALUE = "morning"
        TIME_STR_VALUE = "早上"

#用来编写表达式
        @classmethod
        def within_interval(cls,start,end):
            if Time.TIME_HOUR >= start and Time.TIME_HOUR <= end:
                return  True
            else:
                return False
#获取当前小时数
        @classmethod
        def gethour(cls):
            Time.timefrush()
            if Time.TIME_HOUR > 12:
                return str(Time.TIME_HOUR - 12)
            else:
                return str(Time.TIME_HOUR)
#获取当前下午还是上午
        @classmethod
        def gettimestr(cls):
            if Time.within_interval(0,12):
                Time.TIME_STR = "AM"
            else:
                Time.TIME_STR = "PM"
            return Time.TIME_STR
#获取当前天数
        @classmethod
        def getday(cls):
            Time.timefrush()
            return str(Time.TIME_DAY)
#获取时间 小时:分钟 am/pm
        @classmethod
        def gettime(cls):
            Time.gethour()
            if Time.TIME_MINUTE< 10:
                return Time.gethour() + ":0" + str(Time.TIME_MINUTE) +" "+Time.gettimeafter()
            return Time.gethour() +":"+str(TIME_MINUTE)+" "+ Time.gettimestr()
#过去多少时间
        @classmethod
        def timepass(cls,minute=0,hour=0):
            Time.TIME_HOUR = Time.TIME_HOUR + hour
            Time.TIME_MINUTE = Time.TIME_MINUTE + minute
            return Time.timefrush()
#对时间进行刷新
        @classmethod
        def timefrush(cls):
            if Time.TIME_MINUTE > 60:
                if Time.TIME_HOUR >= 24:
                    Time.TIME_DAY = Time.TIME_DAY+(Time.TIME_HOUR-Time.TIME_HOUR%24)/24
                Time.TIME_HOUR = Time.TIME_HOUR+(Time.TIME_MINUTE-Time.TIME_MINUTE%60)/60
                Time.TIME_MINUTE = Time.TIME_MINUTE%60
            else: 
                Time.TIME_MINUTE = Time.TIME_MINUTE

大概是这样的东西,楼主的代码水平比较低级,是边写边优化的状态)
原来的构想大概就是
将以时间命名的日志对象填充进日志列表,对象里的字典以在屏幕上显示的时间字符串作为键,以日志内容作为值
回复 支持 抱歉

使用道具 举报

发表于 2022-8-19 12:47:57 | 显示全部楼层
alicia 发表于 2022-8-19 10:52
呃,早上打的有点急,可能有一些错误没有筛查。楼主感到非常抱歉
修饰器是保证能够通过类名引用方法
time ...

我啥也没看,但是看到一堆classmethod我是懵逼的,您可能搞错了类方法和静态方法(
一个类方法的第一个入参是类,但是您根本没有用到类来生成实例(一般来说类方法的返回值是实例)
回复 支持 抱歉

使用道具 举报

发表于 2022-8-19 13:07:14 | 显示全部楼层
以及,我非常不解为什么不使用Unix timestamp时间戳作为日志的时间标准呢?字符串可以散列但是不利于排序,时间戳是int类型没有这个问题
可以说明一下上面的Time类在干啥吗,我有种感觉,那些莫名其妙的方法都可以用python自带的时间处理相关库来简单实现
回复 支持 抱歉

使用道具 举报

 楼主| 发表于 2022-8-19 14:35:09 | 显示全部楼层
本帖最后由 alicia 于 2022-8-19 14:39 编辑
Lost 发表于 2022-8-19 13:07
以及,我非常不解为什么不使用Unix timestamp时间戳作为日志的时间标准呢?字符串可以散列但是不利于排序, ...

因为这个时间戳不是计算机时间。是游戏内定义的特殊时间,然后这个日志也是基于这个会在游戏内显示出来的一个功能
回复 支持 抱歉

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|RenPy中文空间 ( 苏ICP备17067825号|苏公网安备 32092302000068号 )

GMT+8, 2024-4-29 17:45 , Processed in 0.064693 second(s), 12 queries , File On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表