سؤال

ما هي أفضل طريقة لتنفيذ نوع من رموز الغش بشكل عام؟ لديّ تطبيق WinForms في الاعتبار ، حيث يقوم رمز الغش بإلغاء قفل بيضة عيد الفصح ، لكن تفاصيل التنفيذ ليست ذات صلة.

أفضل نهج يتبادر إلى ذهني هو الحفاظ على الفهرس لكل رمز - دعنا ننظر في رموز الهلاك الشهيرة - IDDQD و IDKFA ، في تطبيق C# خيالي.

string[] CheatCodes = { "IDDQD", "IDKFA"};
int[] CheatIndexes = { 0, 0 };
const int CHEAT_COUNT = 2;
void KeyPress(char c)
{
    for (int i = 0; i < CHEAT_COUNT; i++) //for each cheat code
    {
        if (CheatCodes[i][CheatIndexes[i]] == c)
        { //we have hit the next key in sequence
            if (++CheatIndexes[i] == CheatCodes[i].Length) //are we in the end?
            {
                //Do cheat work
                MessageBox.Show(CheatCodes[i]);
                //reset cheat index so we can enter it next time
                CheatIndexes[i] = 0; 
            }
        }
        else //mistyped, reset cheat index
            CheatIndexes[i] = 0; 
    }
}

هل هذه هي الطريقة الصحيحة للقيام بذلك؟

تحرير: ربما كان أسوأ شيء كان يجب علي فعله هو تضمين رموز الغش الأولى التي جاءت من أعلى رأسي كمثال. أنا في الحقيقه لم تريد أن ترى رمز مصدر Doom أو تنفيذها ، ولكن الحل العام لهذه المشكلة.

هل كانت مفيدة؟

المحلول

أعتقد أن هذا واحد أسهل قليلاً في الفهم ، على الرغم من أن الأصل الخاص بك سيؤدي على الأرجح أداء أفضل من هذا:

using System.Collections.Generic;

void KeyPress(char c)
{
    string[] cheatCodes = { "IDDQD", "IDKFA"};
    static Queue<char> buffer; //Contains the longest number of characters needed
    buffer.Enqueue(c);
    if (buffer.Count() > 5) //Replace 5 with whatever your longest cheat code is
        buffer.Dequeue();
    bufferString = new System.String(buffer.ToArray());
    foreach(string code in cheatCodes) {
        if (bufferString.EndsWith(code)) {
            //Do cheat work
        }
    }
}

نصائح أخرى

لماذا لا تنزيل مصدر Doom وترى بنفسك؟ =)http://www.doomworld.com/idgames/؟id=14576

إليكم تنفيذ الغش من Doom من مصدر Doom:

#define SCRAMBLE(a) \
((((a)&1)<<7) + (((a)&2)<<5) + ((a)&4) + (((a)&8)<<1) \
 + (((a)&16)>>1) + ((a)&32) + (((a)&64)>>5) + (((a)&128)>>7))

int cht_CheckCheat ( cheatseq_t* cht, char key )
{
    int i;
    int rc = 0;

    if (firsttime)
    {
        firsttime = 0;
        for (i=0;i<256;i++) cheat_xlate_table[i] = SCRAMBLE(i);
    }

    if (!cht->p)
        cht->p = cht->sequence; // initialize if first time

    if (*cht->p == 0)
        *(cht->p++) = key;
    else if
        (cheat_xlate_table[(unsigned char)key] == *cht->p) cht->p++;
    else
        cht->p = cht->sequence;

    if (*cht->p == 1)
        cht->p++;
    else if (*cht->p == 0xff) // end of sequence character
    {
        cht->p = cht->sequence;
        rc = 1;
    }

    return rc;
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top