1

ポータブルな方法で kbhit および getch 機能を使用する方法が必要です。現在、単純な ASCII ゲームを開発しており、キーが押されたかどうかを検出する必要があります。そうである場合はそれを読む必要があり、そうでない場合は入力を待たずに続行する必要があります。私はそれを繰り返したくありませんが、それについてうるさくするつもりはありません。これにはkbhitとgetchが最適だと思いますが、完全に移植可能なコードのみを使用できます(少なくともLinux、Mac、およびPC用のコードですが、他の多くのOSは思い浮かびません)。私が理解しているように、termios、curses、および conio ライブラリは、私が必要とする 3 つの OS すべてに完全に実装されているわけではありません。私は途方に暮れています。私が見つけたすべてのソリューションは、移植性のないコードを使用しています。これのために移植可能な関数を自分で書くことができる方法はありますか? 現在、stdio.h、stdlib.h、および time.h をインクルードしています。また、現在 system("cls") と system("clear") を使用しているため、OS を変更するたびに変更する必要があるため、画面をクリアするポータブルな方法も必要です。 if-else を実行し、コードが実行されている OS を検出して、これら 2 つのステートメントを切り替えます。これらの機能を持つコードの一部を次に示します。

    char key = ' ';
    while(1)
    {
        system("cls");
        if (_kbhit())
        {
            key =_getch();
            printf("output: %c", key);
        }    
        else
            printf("output:");
    }

これは基本的にコードに必要な機能ですが、それを実行するための移植可能な方法がわかりません。また、教師は、標準の c および標準ライブラリを使用して Linux、Mac、および PC でコードを動作させることを要求しています。助けてください!c++ は使用しないでください。c を使用しています。

編集: ncurses が私が探していたものではなかったとは思いません。#ifdefコンパイル時にこれらを実装するために使用することを誰かが勧めました。このソリューションは気に入っていますが、現在のセットアップでは Windows でしかテストできないため、Linux と Mac でこれを行う方法を理解するための助けが必要です。願わくば、近いうちに別のマシンで Linux をテスト用に走らせたいと思っていますが、OSX には大きな値札が付いているので、助けていただければ幸いです。現在のコードは次のとおりです。

 //libraries
#include <stdio.h>      //used for i/o
#include <stdlib.h>     //used for clearing the screen
#include <time.h>       //used to get time for random number generator

//check OS and include necessary libraries
#ifdef _WIN32
    //code for Windows (32-bit and 64-bit, this part is common)
    #include <conio.h>
    #define CLEARSCREEN system("cls")
    #define CHECKKEY _kbhit()
    #define NBGETCHAR getch()

#elif __APPLE__
    //code for mac
    #define CLEARSCREEN system("clear")
    #define CHECKKEY 
    #define NBGETCHAR 

#elif __linux__
    //code for linux
    #define CLEARSCREEN system("clear")
    #define CHECKKEY 
    #define NBGETCHAR 

#else
#   error "Unknown compiler"
#endif

int main()
{
    char key = ' ';
    while(1)
    {
        CLEARSCREEN;
        if (CHECKKEY)
        {
            key=NBGETCHAR;
            printf("output: %c", key);
        }    
        else
            printf("output:");
    }
}
4

1 に答える 1