C言語関係掲示板

過去ログ

No.220.何かキーを押した時に数字を決定


No.1355

何かキーを押した時に1〜6の数字を決定するやり方を教えてください
投稿者---ベン(2002/03/30 22:36:08)


どなたか教えて頂けないでしょうか。

例えば、スペースキーを押した時に1〜6の数字を決定するには、
rand関数を使ってどうにかすれば良いのでしょうか。
スペースキーを認識するには、scanf関数を使えば出来るのでしょうか。



No.1357

Re:何かキーを押した時に1〜6の数字を決定するやり方を教えてください
投稿者---C職人(2002/03/30 23:56:11)


>どなたか教えて頂けないでしょうか。
>
>例えば、スペースキーを押した時に1〜6の数字を決定するには、
>rand関数を使ってどうにかすれば良いのでしょうか。
>スペースキーを認識するには、scanf関数を使えば出来るのでしょうか。
>
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#include <conio.h>
#include <ctype.h>

int main( void )
{

/* 実行するたびに違う値が得られるように、現在の時刻値を使って
* 乱数ジェネレータを初期化します。
*/
srand( (unsigned)time( NULL ) );

/*スペースが押されたかどうかをチェック*/
while(1){
/*何かキー入力があったかどうかを調べる*/
kbhit();
if(isspace(getch()) != 0){
printf("%d\n",rand()%6+1);
break;
}
else{
printf("スペースを押してください。\n");
}
}

return 0;
}
kbhitという関数でキー入力があったかどうかを判断し、
キー入力があった場合にその文字をバッファから取り出すのが
getchという関数です。



No.1360

Re:何かキーを押した時に1〜6の数字を決定するやり方を教えてください
投稿者---B.Smith(2002/03/31 13:56:00)


こんにちは。

関数kbhitは現在のキー入力の状態を調べます。キー入力が無いとゼロを返します。また、関数getchはキーバッファから入力されているコードを取得します。コードが入力されていない場合は、そのままキー入力待ちとなります。

関数kbhitでキー入力状態を調べても、キーバッファの内容は変わりません。そのため、関数kbhitで「キー入力があった」ということが分かった時は、関数getchにより貯まっているコードを拾って、キーバッファをクリアしなければなりません。
「単なるキー入力だけなら関数getchだけで良いのでは?」と思うかも知れません。実際、関数getchだけで済む場合もあるのですが、関数kbhitを使うと、関数getchのキー入力待ちを回避することが出来るので、キー入力が無い間にも他の処理を行わせておくことが出来るようになります。
例1.
#include <stdio.h>
#include <string.h>
#include <conio.h>
#include <time.h>

void main(void )
{
    time_t      lTime;
    struct tm   *pLocal_tm;
    char        Buf[80+1];

    while(1){
        /*** 時間の取得 ***/
        time(&lTime);
        pLocal_tm = localtime(&lTime);
        strcpy(Buf,asctime(pLocal_tm));

        /* (関数asctimeは文末に改行コードを挿入するので削除する) */
        Buf[strlen(Buf) - 1] = 0;

        printf("%s\r",Buf);     /* 表示 */

        /* キー入力が無い場合は、ループを続行 */
        if (!kbhit())
            continue;

        /* 入力キーがEnterの場合はループ終了 */
        if (getch() == 0x0d)
            break;
    }
}

このサンプルは、Enterキーが押されるまで現在の日付と時刻を表示し続けます。キーボード入力があった時だけ関数getchを実行するので、キー入力待ち状態になることはなく、キーが押されていない時にも刻々と変わる時間を表示し続けていることが出来ます。

乱数は、ゲーム等、それほど厳密なものを求めているのではない場合は、以下のように「ユーザが何時キーを押すか分からない」という、インターフェースとしてのランダム要素を利用するお手軽な方法もあります。
例2.
#include <stdio.h>
#include <conio.h>

void main(void )
{
    int     Idx = 0;

    while(1){
        Idx++;                      /* インクリメント */
        if (Idx > 6)    Idx = 1; /* 6以上の場合1に戻す */

        /* スペースキーが押されたらループ終了 */
        if (kbhit() && getch() == 0x20)
            break;
    }

    printf("数値:%d\n",Idx);
}

変数Idxを1〜6の範囲で常にインクリメントさせておき、スペースキーが押されたら、その時のIdxの値を使用します。スロットマシンのイメージですね。
変数Idxの初期値を時間等で決めるようにすると、もう少しランダム性が高くなります。



戻る


「初心者のためのポイント学習C言語」 Last modified:2002.05.26
Copyright(c) 2000-2002 TOMOJI All Rights Reserved