2010-03-24 36 views
9

cách tốt nhất để triển khai loại mã lừa đảo nói chung là gì? Tôi có ứng dụng WinForms trong tâm trí, nơi một mã cheat sẽ mở khóa một quả trứng Phục sinh, nhưng các chi tiết thực hiện không có liên quan.Làm cách nào để triển khai đúng mã cheat?

Cách tiếp cận tốt nhất mà tôi nghĩ là giữ chỉ mục cho từng mã - hãy xem xét mã DOOM nổi tiếng - IDDQD và IDKFA, trong ứng dụng C# hư cấu.

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; 
    } 
} 

Đây có phải là cách phù hợp để thực hiện không?

Chỉnh sửa: Có lẽ điều tồi tệ nhất tôi nên làm là bao gồm các mã lừa đảo đầu tiên xuất phát từ đỉnh đầu của tôi làm ví dụ. Tôi thực sự đã không muốn xem mã nguồn của Doom hoặc thực hiện của họ, nhưng giải pháp chung cho vấn đề này.

Trả lời

6

Tôi nghĩ cái này là một chút dễ dàng hơn để hiểu, mặc dù ban đầu của bạn có thể sẽ thực hiện tốt hơn thế này một:

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 
     } 
    } 
} 
+0

nhưng mã của bạn có thể sẽ không hoạt động với các mã có độ dài thay đổi, phải không? – Axarydax

+0

@Axarydax: Chắc chắn nó hoạt động. Kiểm tra lại :) –

+0

xấu của tôi. Tôi không thấy phần "EndsWith";) – Axarydax

11

Tại sao không tải xuống nguồn DOOM và tự mình xem? =) http://www.doomworld.com/idgames/?id=14576

+0

về cơ bản nó giống nhau, mặc dù có cấu trúc và phức tạp hơn. Nhưng những gì người khác có thể mong đợi từ ID mềm :) – Axarydax

+1

Mã của họ thực sự cho tôi một sự tôn trọng hoàn toàn mới cho trò chơi đó. – MHarrison

+0

Haha. Tôi luôn luôn yêu thích khi một câu trả lời thông minh-ass như thế này thực sự là giải pháp tốt nhất cho vấn đề +1 –

1

đây là DOOM gian lận thực hiện từ nguồn diệt vong:

#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; 
} 
Các vấn đề liên quan