![]() |
#2
forever742023-03-11 21:04
|
1.先输入若干数字(输入密码的节奏自行控制(ex. 1--2----3--4("-"为输入间隔(以ms表示))))
遇到问题(1)不确定C语言是否能做到如"ex.",在只以数字键输入密码前提下,捕捉到其在输入的间隔时间并以某种形式记录下来
(2)希望在键入密码的"同时"以声音做为提示音(类似提款机),目前是以<windows.h> 中的 Beep() 函数作为原型,但效果不理想(做不到同时的效果)
2.输入完成后按下enter进入到验证密码(使用者需照输入时的间隔节奏输入第一步设定的密码)
遇到问题(1)希望输入密码时,将记录下的节奏加入+-的滞迟时间补偿(就如玩节奏游戏,不可能100%完全准确地按在节奏上,希望实现这种功能)
3.节奏与密码输入正确则显示正确提示(此用Password correct!表示)反之以Password incorrect!表示。
遇到问题(1)还未能做到在验证密码"步骤2."让系统纪录时间差,故无法结合判断时间差(节奏)去做密码验证,目前程式码只能以密码是否正确作为验证(但这样失去设计本意),希望可以有解决办法
以上是目前遇到的技术瓶颈,自己在初次做这个项目有查阅很多资料,但几乎没有发现可行的解决办法,也许是基于C语言框架本身的限制,或着说我的观念还不太纯熟,提供这些,希望能提供一些帮助。

下面提供当初的程式码供参考:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <windows.h>
#include <conio.h>
#include <math.h>
const int NOTE = 440;
// 随机生成节奏和音高,并存储到对应的数组中
void generate_rhythm(int rhythm[], int durations[], int length)
{
srand(time(NULL));
for (int i = 0; i < length; i++)
{
rhythm[i] = rand() % 7;
durations[i] = rand() % 1200 + 200;
}
}
// 根据音高和持续时间,发出声音
void play_tone(int note_index, int duration)
{
Beep(NOTE * (int)pow(2, note_index / 7.0), duration);
}
// 验证密码
int check_password(char password[], int rhythm[], int durations[], int length)
{
int note_index = 0;
printf("Please input the password in rhythm:n");
for (int i = 0; i < length; i++)
{
char c = getch();
if (c == 'r' || c == 'n' || c == ' ')
{
break;
}
if (password[i] != c)
{
return 0;
}
play_tone(rhythm[note_index], durations[note_index]);
note_index = (note_index + 1) % length;
Sleep(250);
}
return 1;
}
int main()
{
char password[50];
int rhythm[50], durations[50];
int password_length = 0;
generate_rhythm(rhythm, durations, 50);
printf("Please enter your password:n");
// 读入密码
while (1)
{
char c = getch();
if (c == 'r' || c == 'n')
{
break;
}
password[password_length] = c;
password_length++;
}
// 发出节奏
for (int i = 0; i < password_length; i++)
{
play_tone(rhythm[i], durations[i]);
// 暂停一段时间,以实现特定的节奏
Sleep(250);
}
// 验证密码
if (check_password(password, rhythm, durations, password_length))
{
printf("nPassword correct!n");
}
else
{
printf("nPassword incorrect!n");
}
return 0;
}