C++ 自定义时间
今天精神状态不好,和公司的领导请了假。为了抵抗我的痛苦,我在床上打坐冥想,从早上九点到下午三点二十六。嗯,感觉好多了。这种温和的暴力果然有效。
之后吃了点东西,然后无聊的我就在想,明天的工作该做些什么。
我的自定义时间系统还没有做完。
我设想的是另一个世界的时间,我把秒,分钟以及小时,天,年都重新定义了一次。那么就把新定义的“秒”叫做“Selee”吧。类似的:
秒:Selee,相当于现实世界的1200毫秒
刻:Qulee,100 x Selee
时:Hulee,3000 x Selee
天:Dalee,21 x Hulee - 57 x Selee
月:Molee,40 x Dalee
年:Yelee, 398 x Dalee
上面提到的57是要被修改的,因为我要实现闰年的概念。我计算过那个误差到底多少才合适,但是让我忘了。
所以呢?这有什么用?没有用!
总是有人一而再再而三地问“你写这个有什么用”。难道一定要有用的东西我才去弄吗?活着有什么用?没有用,因为你早晚得死,所以你为什么不去死?没有意义才是真正的意义。这是一个无法反驳的宇宙真理。
一旦思维的石墙遇到了崩塌,那么就会看见更多没有意义的事。这种崩塌一次又一次带给了我惊喜,尽管这种惊喜没能给我的生活质量带来任何的提升。那么时间已经存在了,是不是应该创建“物体”的概念了?
是的,我说得没错。
现实中的物品拥有的属性太多了,根本不是这幼稚的计算机能够模拟出来的。人也是个 物体,但特殊在人拥有感情,判断力,就是一个移动的弱智版计算机。但话说回来,无论所谓的感情和思想有多么得神圣和神奇,说到底都是由激素等物质决定的。
而类似于这种影响性格和判断分支的物体,用一组动态参数控制再好不过了。比如一个人出去嫖被染了性病并幸运地治好了,那么他以后就不敢像以前那么放肆地嫖了。
但现实中真的有那种“我就不信了我还能中奖”的人,那说明他的“倔强”参数比较高。
类似石头等静态物品随机投放。那么就算是随机的,也不能是完全随机,这是偏向“集群”的。好吧,给一个柏林噪音好了。
随机数谁给的。。。
这里,必须创建一个“GodHand”类。我总有一种感觉,这个世界真的是有“上帝之手”存在,也许是我对大自然能够自我进化得如此神奇感到怀疑。
OK,我觉得我可以把基础类和枚举创建出来了。
首先,属性枚举。
这里的重点是生物,不同的生物拥有的属性种类数量并不相同。其中,人类的脑回路更加难以预测,除了与其他生物相同的求生欲望和食物需求之外,精神需求是一大特点。
其次,影响属性的事件枚举。
每个生物遭遇的的事件和受到的影响力各不相同。事件根本无法枚举。那么可以使用一个统一的方式来模拟事件。我可以随机一个事件,这个事件带来的影响是,如果目标生物成功完成了这个事件,那么他会得到这个事件提供的属性变化,否则,会带来另一个变化。
举个例子。我现在创建了一个事件,这个事件的影响是对物体A的恐惧感+13,生物通常属性中的“胆量”-16。你可 以把这个事件想象成一只狗尝试去闻一个即将爆炸的爆竹(麻雷子知道是什么吗?),也可以认为是一只狗尝试吃一个柠檬。
一只狗执行了这个事件可以认为只有一种结果,也就是说这只狗受到此事件带来的影响概率为100%。而对于人类或其他较高智慧的生物而言,这个事件带来的影响更加复杂,可能需要一个“提供参数”来支持事件的成功与否,并且需要一个服从正态分布的随机数来生成一个影响结果。就像最上面说的例子,一个十分“倔强”的人接着去嫖的概率是63%,那么一个比较“倔强”的人可能是34.32%。
从此能看出,人与狗的区别之一在于:狗拥有的“倔强”属性上限相对于人类要低得多。如果要降低系统的复杂性,可以简单地认为狗没有倔强属性。
另外,事件也分为主动事件和被动事件。
这个比较容易理解。比如一个生物枚举类型为“人类”的物体,随着时间的增长,他的“异性追求欲望”会随之改变,当然,时间流逝的过程中他会执行其他事件,这有可能导致他“同性恋”、“异性恋”、“无性恋”、“双性恋”都有可能。假设结果是他找到了一个配偶BZ,然而是他追的BZ还是BZ追的他呢?
身体不好并且“珍惜生命”属性正常并且“懒惰”属性不是偏低的人会主动寻找增加“健康”的事件来执行;喜欢旅行的人会被动地执行更多事件,而由于自身拥有通常属性的缘故,执行的事件结果会逐渐向某一侧发展,这可能会导致这个喜爱旅行的人某一项属性异常得高。这挺符合现实规律的。
第三,属性关联。
这部分我还没有想好,我不知道此功能是否有存在的必要,或者用其他的方式来代替。暂时想到的点子是将属性进行归类,这样属性之间的联系就非常清晰了。
现在,我把瞎写的自定义时间系统先记下来。以后的东西没事就瞎琢磨琢磨。
TileeCfg.h
#include <stdint.h>
#include <array>
#pragma once
const int16_t OneSelee = 1200;
const int16_t Selee = OneSelee;
const int16_t Qulee = 100 * 1/*Selee*/;
const int32_t Holee = 30 * Qulee;
const int64_t Dalee = 21 * Holee;
const int16_t Deviation = +1 * 79 * 1/*Selee*/; //Dalee + Deviation is actual.
const int8_t LeapDay = 1;
const int64_t Yelee = 398 * Dalee;
const int8_t MoleeCountEveryYelee = 10;
typedef std::array<int8_t, MoleeCountEveryYelee> MoleeType;
const MoleeType Molee = { 39, 39, 40, 40, 40, 40, 40, 40, 40, 40/*Dalee*/ };
const MoleeType LeapMolee = { 39, 39, 40, 40, 39, 40, 40, 40, 40, 40 };
//check Molee
const auto TotalDalees = [](const MoleeType& moleeDef, bool isLeap) -> bool
{
int total = 0;
for (int8_t delees : moleeDef)
{
total += delees;
}
switch (isLeap)
{
case false:
return total == (Yelee / Dalee);
case true:
return total == (-1 * (Deviation / std::abs(Deviation)) * LeapDay + Yelee / Dalee);
}
return false;
};
const int64_t TileeStampStart_ms = 1325347200000; //2012-01-01 00:00:00
const int16_t BaseYelee = 680; //2E680: SPARK.
其中出现的 //2E680: SPARK.
是我写的小说中的大事件之一:第二纪元的680年:星火。
Tilee.h
#include "stdinc.h"
#include "TileeCfg.h"
#pragma once
namespace Lunacia
{
class Tilee final
{
public:
Tilee();
~Tilee();
public:
struct TileeInfo
{
public:
TileeInfo()
{
}
TileeInfo(int16_t yelee, int8_t molee, int16_t dalee, int32_t holee, int64_t qulee, int64_t selee) :
yelee(yelee),
molee(molee),
dalee(dalee),
holee(holee),
qulee(qulee),
selee(selee)
{
}
friend std::ostream& operator<<(std::ostream &out, const TileeInfo &ti)
{
//std::string strInfo;
//TileeInfo::GetInfoString(strInfo, ti);
out << ti.yelee << '/' << ti.molee << '/' << ti.dalee << ' ' << ti.holee << ':' << ti.qulee << ':' << ti.selee;
return out;
}
public:
int16_t yelee = 0;
int8_t molee = 1;
int16_t dalee = 1;
int32_t holee = 0;
int64_t qulee = 0;
int64_t selee = 0;
};
public:
static void TimeSync(int64_t* const __out tileeStamp, const int* const __in syncPeriod);
int64_t GetSeleeStamp() const;
void SetSyncPeriod(int syncPeriod);
void GetTileeInfo(TileeInfo& tileeInfo);
private:
void SetTileeInfo();
inline int8_t GetPeriodYelee() const;
public:
void GetTileeString(std::string& strInfo);
void GetTileeString(std::wstring& strInfo);
private:
int64_t m_TileeStamp;
TileeInfo m_tileeInfo;
int m_syncPeriod;
};
};
Tilee.cpp
#include "Tilee.h"
namespace Lunacia
{
Tilee::Tilee()
{
m_syncPeriod = 100;
m_TileeStamp = 0;
if (!(TotalDalees(Molee, false) && TotalDalees(LeapMolee, true)))
{
ErrorThrow("Molee Define Error.");
return;
}
std::thread t(Tilee::TimeSync, &m_TileeStamp, &m_syncPeriod);
t.detach();
}
Tilee::~Tilee()
{
}
void Tilee::TimeSync(int64_t* const __out tileeStamp, const int* const __in syncPeriod)
{
while (true)
{
auto timeNow_ms =
std::chrono::system_clock::now().time_since_epoch() - \
std::chrono::milliseconds(TileeStampStart_ms);
*tileeStamp =
std::chrono::duration_cast<std::chrono::milliseconds>(timeNow_ms).count() / \
OneSelee;
Sleep(*syncPeriod);
}
}
int64_t Tilee::GetSeleeStamp() const
{
return m_TileeStamp;
}
void Tilee::SetSyncPeriod(int syncPeriod)
{
m_syncPeriod = syncPeriod;
}
//If the return value is greater than zero,
//it means that each cycle has more passed through "LeapDay" days,
//and vice versa.
inline int8_t Tilee::GetPeriodYelee() const
{
return LeapDay * Dalee / (398 * Deviation);
}
void Tilee::SetTileeInfo()
{
int8_t periodYelee = std::abs(GetPeriodYelee());
int64_t periodSelee = (periodYelee * 398 + LeapDay) * Dalee;
int64_t remainSelee = (m_TileeStamp % periodSelee) % Yelee; //Remaintion Selee Of A Yelee .
int curYelee = m_tileeInfo.yelee = static_cast<int16_t>(m_TileeStamp / periodSelee * periodYelee + 1 + BaseYelee);
bool isLeapYelee = curYelee % periodYelee == 0;
const MoleeType& curMoleeArray = (isLeapYelee) ? LeapMolee : Molee;
int64_t throughSelees = 0;
for (int8_t i = 0; i < MoleeCountEveryYelee; i++)
{
int8_t dalees = curMoleeArray[i];
throughSelees += dalees * Dalee;
if (remainSelee >= throughSelees)
{
continue;
}
throughSelees -= dalees * Dalee;
m_tileeInfo.molee = i + 1;
remainSelee = remainSelee - throughSelees;
m_tileeInfo.dalee = static_cast<int16_t>(remainSelee / Dalee + 1);
remainSelee = remainSelee % Dalee;
m_tileeInfo.holee = static_cast<int32_t>(remainSelee / Holee);
remainSelee = remainSelee % Holee;
m_tileeInfo.qulee = remainSelee / Qulee;
m_tileeInfo.selee = remainSelee % Qulee;
break;
}
}
void Tilee::GetTileeInfo(TileeInfo& tileeInfo)
{
SetTileeInfo();
tileeInfo = m_tileeInfo;
}
void Tilee::GetTileeString(std::string& strInfo)
{
TileeInfo tiInfo;
GetTileeInfo(tiInfo);
strInfo = std::to_string(m_tileeInfo.yelee) + "/" + std::to_string(m_tileeInfo.molee) + "/" + std::to_string(m_tileeInfo.dalee) + " " +
std::to_string(m_tileeInfo.holee) + ":" + std::to_string(m_tileeInfo.qulee) + ":" + std::to_string(m_tileeInfo.selee);
}
void Tilee::GetTileeString(std::wstring& strInfo)
{
TileeInfo tiInfo;
GetTileeInfo(tiInfo);
strInfo = std::to_wstring(m_tileeInfo.yelee) + L"/" + std::to_wstring(m_tileeInfo.molee) + L"/" + std::to_wstring(m_tileeInfo.dalee) + L" " +
std::to_wstring(m_tileeInfo.holee) + L":" + std::to_wstring(m_tileeInfo.qulee) + L":" + std::to_wstring(m_tileeInfo.selee);
}
};
以上文件归属于同一个项目A, 项目配置类型为“静态库 .lib”.
以下为测试项目B(MFC,项目名MFC_Tilee),并引用项目A。两者字符集都设置为多字符集。
MFC_Tilee.h
CMFCTileeApp 类中 引入头文件 #include "../Lunacia/Tilee.h"
CMFCTileeApp 类中 public 成员变量添加 Lunacia::Tilee ti;
MFC_TileeDlg.cpp
对话框初始化函数 BOOL CMFCTileeDlg::OnInitDialog(); 中添加 SetTimer(0, 6, NULL); 并在类视图属性中添加 WM_TIMER 消息。
void CMFCTileeDlg::OnTimer(UINT_PTR nIDEvent)
{
std::string tileeInfo;
theApp.ti.GetTileeString(tileeInfo);
EditTilee.SetWindowText(tileeInfo.c_str());
UpdateData(FALSE);
CDialogEx::OnTimer(nIDEvent);
}
不知道为什么,同样的代码在VS2013中,对话框很顺畅,然而在2017中却偶尔出现闪烁。
感叹自己,曾希望自己成为一个天才,而今却是一只疯子。
C++ 自定义时间的更多相关文章
- linux 获取时间后--自定义时间格式
自定义时间格式 =================================-===================================== #include <stdio.h ...
- Mui自定义时间格式:
Mui自定义时间格式: (function($) { $.init(); $(document).on('tap','.btn',function(){ var obj = getFormJson($ ...
- Centos date 设置自定义时间
[1]手动修改 (1)设置日期 # date -s 20190315 (2)设置时间 # date -s 15:23:34 (3)设置日期和时间 # date -s "20190315 15 ...
- Gorm 预加载及输出处理(三)- 自定义时间格式
前言 Gorm 中 time.Time 类型的字段在 JSON 序列化后呈现的格式为 "2020-03-11T18:26:13+08:00",在 Go 标准库文档 - time 的 ...
- Python-时间戳、元组时间的格式、自定义时间格式之间的转换
一.时间戳.元组时间的格式.自定义时间格式之间的转换 1.下面是三者之间的转换关系: 2.代码如下: import time import datetime print(time.time()) #获 ...
- picker-view、微信小程序自定义时间选择器(非官方)
picker-view自定义时间选择器 官网的自定义时间选择器比较简陋.日期不准 下面是我自己写的一个demo <view class="baseList"> < ...
- 把excel导入的自定义时间改成yyyyMMdd
public static String changeCellToString(XSSFCell cell){ String result = "";// Object value ...
- Python学习笔记(4):自定义时间类
Python的时间我实在无法接受,太难用了.我觉得C#的时间就非常完美,简单.好用.所以,自定义了自己的时间类: 用法: 一个小小的应用,我需要取出每天股市交易的分钟段,开始是这样的: 稍微改进一下, ...
- C#自定义时间显示格式
string time = System.DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); 下面是常见的一些日期时间显示格式 标准的For ...
随机推荐
- vim详解
vim介绍: 1.vim是vi的升级版本 2.vim是带有颜色显示的 3.vim三个模式:一般模式.编辑模式.命令模式 最小化模式下默认是没有安装vim的: [root@linux-xl ~]# yu ...
- LVM逻辑卷扩容、缩容
LVM就是动态卷管理,可以将多个硬盘和硬盘分区做成一个逻辑卷,并把这个逻辑卷作为一个整体来统一管理,动态对分区进行扩缩空间大小,安全快捷方便管理. 后期出现问题恢复数据也比较麻烦. 概念: ①PE(P ...
- JavaScript的局部变量和全局变量小知识
(了解一下,避免初学者犯错,但下面定义全局变量的做法并不推荐,只是让你们知道这是怎么一回事) 如果在函数中使用var定义一个变量,那么这个变量在函数退出后就会被销毁,例如: function test ...
- hive表分区操作
1.修复表分区命令 msck repair table table_name; 2.添加表分区操作 alter table table_name add partition(month_id='201 ...
- Openresty 源码安装脚本
Openresty 中文官网地址 http://openresty.org/cn/ #! /bin/bash function openrestyinstall() { cd /opt/openres ...
- python pycharm pyqt 安装
1.python3 windows:www.python.org/download/windows/ 我的是WIN7 64位所以选的是 Download Windows x86-64 exec ...
- 未能加载文件或程序集“BLL”或它的某一个依赖项。生成此程序集的运行时比当前加载的运行时新,无法加载此程序集。
今天使用VS2012创建项目的时候,考虑到项目中代码的重用性以及清晰简洁性,搭建了一个三层架构,但是在项目运行的时候,总是报错: “未能加载文件或程序集“BLL”或它的某一个依赖项.生成此程序集的运行 ...
- 剑指Offer 60. 把二叉树打印成多行 (二叉树)
题目描述 从上到下按层打印二叉树,同一层结点从左至右输出.每一层输出一行. 题目地址 https://www.nowcoder.com/practice/445c44d982d04483b04a54f ...
- servlet之小demo(四)
描述: 1.在web.xml文件中设置两个web应用的初始化参数,user和password 2.定义一个login.html,里面定义两个请求字段:user,password,发送请求到loginS ...
- USGS bulk批量下载工具
最近美国EarthExplorer上批量下载遥感数据---官方给出了批量下载工具BULK 下载地址:https://earthexplorer.usgs.gov/bulk/ bulk 使用帮助文档 根 ...