制限時間内のキー入力検査
Posted feedbacks - Java
題意から標準入力からキーを読む事にこだわりました。
キーを押した瞬間をとるためには、rawモードに変更するしかないのですが、Javaからデバイスを制御する方法が見つからず、やむを得ずデバイス名は起動パラメータで与える事にしました。下記のように起動してください。
java Sample /dev/`who am i | awk '{print $2}'`
Mac OS Xでの動作を確認しています。UNIX系のOSなら動作すると思いますがWindowsでは動作しないはずです。
キーを押した瞬間をとるためには、rawモードに変更するしかないのですが、Javaからデバイスを制御する方法が見つからず、やむを得ずデバイス名は起動パラメータで与える事にしました。下記のように起動してください。
java Sample /dev/`who am i | awk '{print $2}'`
Mac OS Xでの動作を確認しています。UNIX系のOSなら動作すると思いますがWindowsでは動作しないはずです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | import java.io.*;
public class Sample {
private String device = "";
public Sample(String dev) {
device = dev;
}
private void deviceControl(String mode) throws Exception {
Runtime rt = Runtime.getRuntime();
Process p = rt.exec(new String[] {"stty", "-f", device, mode});
p.waitFor();
}
public boolean inputChecker(int n, String s) throws Exception {
BufferedReader r=new BufferedReader(new InputStreamReader(System.in));
deviceControl("raw");
System.out.printf("input(%s)=>", s);
while (!r.ready()) {
Thread.currentThread().sleep(100);
}
long start = System.currentTimeMillis();
deviceControl("-raw");
String input = r.readLine();
if (System.currentTimeMillis() - start > 1000 * n) {
System.out.println("TIME OUT");
return false;
}
if (s.equals(input)) {
System.out.println("OK");
return true;
} else {
System.out.println("NG");
return false;
}
}
public static void main(String[] args) throws Exception {
Sample s = new Sample(args[0]);
s.inputChecker(5, "ABCDEF");
s.inputChecker(5, "ABCDEF");
s.inputChecker(5, "ABCDEF");
}
}
|


raynstard
#3420()
Rating0/2=0.00
関数 InputCheckerは、以下の仕様を満たしてください。
たとえば、「InputCheker(5, "ABCDEF")」と指定した場合、 出力例はこんな感じです。
1. input(ABCDEF) =>と出力して入力待ちをし、ユーザーが「ABCDEF<ENTER>」を入力したとき、 入力開始から5秒以内ならば「OK」、5秒をこえていれば「TIME OUT」を出力します。 このとき、ユーザーがキーを押下しなければ1. を出力してから たとえ10秒たっていても「TIME OUT」にはならないので注意してください。 時間計測はあくまでユーザーが入力を開始してからです。
このお題はraynstardさんの投稿です。ご協力ありがとうございます。
[ reply ]