Keyboard 如何正确实施作弊代码?
一般来说,实施作弊代码的最佳方式是什么? 我考虑了WinForms应用程序,其中一个作弊代码将解锁复活节彩蛋,但实现细节并不相关 <> P>我想到的最好的方法是保持每个代码的索引-让我们考虑著名的毁灭代码IDDQD和IDKFA,在虚构的C应用程序中。Keyboard 如何正确实施作弊代码?,keyboard,keystroke,Keyboard,Keystroke,一般来说,实施作弊代码的最佳方式是什么? 我考虑了WinForms应用程序,其中一个作弊代码将解锁复活节彩蛋,但实现细节并不相关 P>我想到的最好的方法是保持每个代码的索引-让我们考虑著名的毁灭代码IDDQD和IDKFA,在虚构的C应用程序中。 string[]CheatCodes={“IDDQD”,“IDKFA”}; int[]索引={0,0}; const int check_COUNT=2; 无效按键(字符c) { 对于(int i=0;i5)//用最长的作弊代码替换5 buffer.D
string[]CheatCodes={“IDDQD”,“IDKFA”};
int[]索引={0,0};
const int check_COUNT=2;
无效按键(字符c)
{
对于(int i=0;i
这样做对吗
编辑:也许我应该做的最糟糕的事情就是把我头顶上的第一个作弊代码作为一个例子。我真的不想看到Doom的源代码或它们的实现,而是想看到这个问题的一般解决方案。为什么不下载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
}
}
}
使用System.Collections.Generic;
无效按键(字符c)
{
字符串[]cheatCodes={“IDDQD”,“IDKFA”};
静态队列缓冲区;//包含所需的最长字符数
缓冲区排队(c);
if(buffer.Count()>5)//用最长的作弊代码替换5
buffer.Dequeue();
bufferString=新的System.String(buffer.ToArray());
foreach(cheatCodes中的字符串代码){
if(bufferString.EndsWith(代码)){
//作弊
}
}
}
以下是来自DOOM源的DOOM-cheat实现:
#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;
}
定义加扰(a)\
((a)及1)7)
int-cht\u CheckCheat(cheatseq\u t*cht,字符键)
{
int i;
int rc=0;
如果(第一次)
{
第一次=0;
对于(i=0;ip)
cht->p=cht->sequence;//如果是第一次,则初始化
如果(*cht->p==0)
*(cht->p++)=键;
否则如果
(cheat_xlate_table[(unsigned char)key]==*cht->p)cht->p++;
其他的
cht->p=cht->序列;
如果(*cht->p==1)
cht->p++;
else if(*cht->p==0xff)//序列结束字符
{
cht->p=cht->序列;
rc=1;
}
返回rc;
}
基本上是一样的,尽管结构更为复杂。但人们还能从ID soft中期待什么:)他们的代码确实给了我对该游戏全新的尊重。哈哈。我总是喜欢这样一个聪明的回答真的是问题的最佳解决方案+1但你的代码可能无法处理可变长度的代码,不是吗是吗?我的错。我没有看到“EndsWith”部分;)@Axarydax:那是个笑话哈哈——我后来编辑了EndsWith部分。查看原始版本的编辑历史。编辑完成后,我阅读了你的评论,你很幸运:)
#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;
}