如何正确实施作弊码?

Axa*_*dax 9 keyboard keystroke

一般来说,实施一种作弊码的最佳方法是什么?我有WinForms应用程序,其中一个作弊代码可以解锁一个复活节彩蛋,但实现细节是不相关的.

我想到的最好的方法是保留每个代码的索引 - 让我们在一个虚构的C#应用​​程序中考虑着名的DOOM代码 - IDDQD和IDKFA.

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; 
    }
}
Run Code Online (Sandbox Code Playgroud)

这是正确的方法吗?

编辑:可能我应该做的最糟糕的事情就是把我头顶的第一个作弊码作为例子.我真的希望看到末日的源代码或实施,但一般的解决了这个问题.

小智 11

为什么不下载DOOM源代码并自己查看?=) http://www.doomworld.com/idgames/?id=14576


Bil*_*eal 6

我认为这个更容易理解,虽然你的原版可能会比这个更好:

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
        }
    }
}
Run Code Online (Sandbox Code Playgroud)