كيفية تنفيذ رموز الغش بشكل صحيح؟
سؤال
ما هي أفضل طريقة لتنفيذ نوع من رموز الغش بشكل عام؟ لديّ تطبيق 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;
}