1. 程式人生 > >C++ 自定義時間

C++ 自定義時間

重新定義 說明 pre break park mes 提升 有感 身體

??今天精神狀態不好,和公司的領導請了假。為了抵抗我的痛苦,我在床上打坐冥想,從早上九點到下午三點二十六。嗯,感覺好多了。這種溫和的暴力果然有效。
??之後吃了點東西,然後無聊的我就在想,明天的工作該做些什麽。
??我的自定義時間系統還沒有做完。
??我設想的是另一個世界的時間,我把秒,分鐘以及小時,天,年都重新定義了一次。那麽就把新定義的“秒”叫做“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++ 自定義時間