矢印キーの反応が悪くなる問題について

このQ&Aのポイント
  • キーコントロール関数とmain関数を分割すると、矢印キーの反応が悪くなる問題が発生しました。
  • 分割前のソースコードでは正常に動作していた矢印キーが、分割後のソースコードでは不具合が生じました。
  • 分割してみたソースコードを実行したところ、キーのレスポンスが悪くなってしまいました。
回答を見る
  • ベストアンサー

矢印キーの反応が悪くなります

このコードをmain関数とキーコントロール関数とに分けたところ、 キーのレスポンスがわるくなりました。 このソースコードをどのように分割すれば一つのファイルで書いたように、 動いてくれるのかわかりません。 よろしくお願いします。 /* 分割前のソースコード */ #include <stdio.h> #include <conio.h> int main(int argc, char *argv[]){ int key=0; while(key!='q'){ //終了キー 'q' key=_getch(); //Keyによって分岐 switch((key == 0x00 || key == 0xe0) ? _getch(): key) { case 0x48:printf("上");break;//上 case 0x50:printf("下");break;//下 case 0x4b:printf("左");break;//左 case 0x4d:printf("右");break;//右 default:break; } } return 0; } /*--ここから下が分割してみたソースコード---*/ /* arrowkey.h */ #ifndef ARROWKEY_H #define ARROWKEY_H int arrowkey(void); #endif //ARROWKEY_H /*---------------------------------*/ /* arrowkey.c */ #include <stdio.h> #include <conio.h> #include "arrowkey.h" int arrowkey(void){ int key=_getwch(); //Keyによって分岐 switch((key == 0x00 || key == 0xe0) ? _getch(): key) { case 0x48:printf("上");break;//上 case 0x50:printf("下");break;//下 case 0x4b:printf("左");break;//左 case 0x4d:printf("右");break;//右 case 0x71:break;//終了 default:break; } return key; } /*---------------------------------*/ /* main.c */ #include "arrowkey.h" int main(int argc, char *argv[]){ int key=0; while(key!='q'){ //終了キー 'q' key=arrowkey() } return 0; }

質問者が選んだベストアンサー

  • ベストアンサー
  • honor
  • ベストアンサー率35% (25/71)
回答No.1

分割前 key=_getch(); 分割後 key=_getwch(); 分割の前後でここの関数を変えたのは何故でしょうか。

Onetouch
質問者

お礼

知って記された部分を直したら、ちゃんと動きました ありがとうございます

Onetouch
質問者

補足

MSDNを見ていたらアンダーバー付きばかりだったので、いろいろ試してみてたのですが、どれも同じ反応だったのでそのままで投稿してしまいました。

関連するQ&A

  • C言語での方向キー入力判定

    C言語でキーの入力判定をするプログラムを作ってい ます。下の例だとeやエンターを押したときは認識できる のに、方向キー↑を押したときはなぜか無反応です。 コンパイラはボーランドでOSはXPでコンパイルした のですが、何がいけなかったのでしょうか? #include <stdio.h> #include <conio.h> #include <windows.h> void check(void){ int key; key = getch(); switch (key){ case 'e': puts("e"); break; case VK_RETURN: puts("ENTER"); break; case VK_UP: puts("UP"); break; } } int main(void) { while(1){ check(); } return 0; }

  • なぜに0が表示されるの?

    キー入力を調べるために以下の プログラムを作成したのですが・・・ #include <stdio.h> #include <stdlib.h> #include <conio.h> int main(void) { int inkey = 0; while (1) { inkey = getch(); if (inkey == 0x1b) { break; } printf("%d %x\n", inkey); } } ↑↓→←とかのキーは、 変数inkeyの値を表示する前に、 0 0と表示されます。 なぜなんでしょうか? ほかのキーでは、普通に表示されます。 教えてください。

  • なぜかうまく表示されません(原因不明で困ってます)。

    キーを入力するとその入力された文字を表示する、 という単純なプログラムを作成しました。 そこで次のソースを見ていただきたいのですが、 下のこの状態ではうまくいきます。 ところが、余計についているはずの「int t;」を取ると、 表示される文字に余計なものがくっついてきてしまいます。 プログラムをどうみても「t」を使っている箇所はなく、 原因がさっぱりつかめません。 ソースの解読、大変お手数をおかけしますが、 原因を教えていただけないでしょうか。 よろしくお願いいたします。 ---------以下ソース------------- #include <stdio.h> #include <string.h> #include <conio.h> int main(void) { while(1) { char i[40]; int t; i[0]=getch(); if(strcmp(i,"q")==0 || strcmp(i,"Q")==0) break; printf("%s ",i); } return 0; }

  • C言語でタイミングを合わせるゲームを作っているのですが・・・。【getch()】

    C言語で壁に向かって衝突していくボールをタイミングよくスペースキーを押すことで打ち返すプログラムを作っています(多分実行しないと分かりにくいかも)。 そこでキーの入力にgetch()関数を使っていますが、これだと何かキーが入力されるまで永遠と待ち続けてしまうので、タイミングが100%合ってしまいます。 そこで指定された秒数だけキーの入力を受け付けるような方法を探しているのですが、そのようなものはあるのでしょうか? #include <stdio.h> #include <stdlib.h> #include <time.h> #include <conio.h> #include <windows.h> int main(void){ int key=0,ballichi=0,i,i2; system("cls");//画面の初期化 for(i=0;i<10;i++){ for(i2=0;i2<10;i2++){ if(ballichi==i2){printf(" o"); }else{printf(" ");} } printf("|壁"); if(i==9){ key = getch(); //キーから一文字入力 switch (key) { /* キー入力チェック */ case ' ': printf("スペースキーが押されました"); break; } } Sleep(500); ballichi++; system("cls"); } return 0; }

  • このプログラムを見てください(C言語) m( _ _ )m

    現在乱数を使ったプログラムを作っています。 下のプログラムでコンパイルではエラーがでませんが、実行するとデバッグエラーが出てきます。コンパイラにはbccを使っています。恐らく原因は別の関数でbに値を代入してそれをaに代入しているからだろうと思いますが、なぜこれがいけないのかが分かりません。 #include <stdio.h> #include <stdlib.h> #include <time.h> #include <conio.h> int ran, a=1, b, c; void test(void){ b=8; } void main(){ srand(time(NULL)); a=b;//ここを無くすとなぜかエラーが出ない。 while(1){ ran=rand()%(a*2)+1; switch(ran){ case 1: c=1; break; case 2: c=1; break; case 3: c=1; break; case 4: c=2; break; case 5: c=2; break; case 6: c=3; break; case 7: c=3; break; case 8: c=4; break; } printf("%d",c);printf("何か押してください\n");getch(); } }

  • C言語プログラム

    2つの整数を入力させ、それらが等しい場合hitoshii、異なる場合にはhitoshikunaiと出力するプログラムを作りたいのですが、うまくいきません。間違っているところを教えてください。 #include<stdio.h> #include<conio.h> void main() { printf("整数を入力してください:"); int number1; scanf("%d",number1); printf("整数を入力してください:"); int number2; scanf("%d",number2); if(number1==number2) { printf("hitoshii"); } else { printf("hitoshikunai"); } getch(); }

  • C言語エラー

    C言語をいじっているのですが、16行目と19行目の「型」の前に「;」がありませんと表示されます。 どこをどう改善すればいいか教えてもらえないでしょうか /*遊び半分*/ #include <stdio.h> #include <process.h> int main() { char dear; printf("ああああ\n"); printf("ああああ \n"); scanf_s("%c", &dear); switch (dear){ case 'A04': ; int main(void); { printf("ああああ\n"); int main(void); printf("あああ\n"); printf("あああ\n"); break; system("pause"); return 0; } case 'C34' : printf("\n"); break; case 'E24' : printf("\n"); break; case 'F38' : printf("\n"); break; default: printf("メッセージはありません\n"); break;} return 0;

  • 0x8, スペース, 0x8をプログラムで組むと

    『scanfを使わずに_getch()でキーボードからファイル名を入力していき、入力した文字をprintfで表示する流れについて質問です。 表示された文字をバックスペースで消していっても打ち込んだ文字は消えないですよね? 間違ったファイル名を入力してしまった際に文字が残っているので、正しく入力し直しても間違ったファイル名となってします。 一度打った文字を消す方法はありますでしょうか? 』 以前このような質問をさせていただき、_getch()で得た文字のキーボード上での削除の仕方は分かりました。 今度はそのやり方をプログラムで作るとしたら、どう組んでいけば良いのか教えて頂けないでしょうか。 できればそのプログラムを教えて頂けたら嬉しいです。 今現在書いてるプログラムのgetchを使っている部分です。 ファイルがオープンできたら別の処理に移行しますが、その関数は長くなるので省略しています。 #include <stdio.h> #include <conio.h> int main() { int key; int i; char file_name[256] = { 0 }; FILE *fp; errno_t e; while(1) { i = 0; // エンタキーが押されるまで入力を続ける do { printf("%c", key); file_name[i] = key; key = _getch(); i++; } while(key != 0x0d); printf("\n"); if(e = fopen_s(&fp, file_name, "rb") != 0) { printf("ファイルが存在しません\n"); return 0; } else { // 成功したらプログラムの処理をする関数に移行 return 1; } } }

  • 何を行っているのか分かりません(C言語)

    #include <stdio.h> #include <stdlib.h> #include <conio.h> enum transport {car, train, airplane, bus} tp; char trans[][20] = { "車", "電車", "飛行機", "バス" }; int main(void) { printf("キーを押して移動手段を選んでください: "); /* プログラムを実行するたびに新しい乱数を生成する */ while(!kbhit()) rand(); getch(); /* 文字を読み込んで廃棄する */ tp = rand() % 4; printf("%s", trans[tp]); return 0; } 【質問】 上記のプログラムで while(!kbhit()) rand(); getch(); のコードが全体的に何を行っているのか分かりません。 1.「while(!kbhit())」でキーが押されたら繰り返しを終了する。 2.繰り返しが終了するまで「rand();」で乱数を発生し続ける。 ぐらいしか分かりません。 「文字を読み込んで廃棄する」コメントはどういう事なのか分かりません。 教えて頂けないでしょうか?

  • RPGゲームの簡単なプログラムを打ってみたんですがうまく表示されません

    RPGゲームの簡単な初歩的なサンプルプログラムを自分で打ってみたんですが、思った通りに表示されません。 以下のソースのどこかおかしいとこありますでしょうか。 #include<stdio.h> #include<windows.h> #define MAP_SIZE_Y 10 #define MAP_SIZE_X 10 int x = 4,y = 5; int j,i; int map[100][100] = { {1,1,1,1,1,1,1}, {1,0,0,3,0,0,1}, {1,0,0,0,0,0,1}, {1,0,2,0,2,0,1}, {1,0,0,0,0,0,1}, {1,1,1,1,1,1,1}, }; void DrawMap(){ for(j = 0; i < MAP_SIZE_Y; j++){ for(i = 0; i < MAP_SIZE_X; i++){ if(j == y && i == x){ printf("勇"); }else{ switch ( map[j][i]){ case 1: printf("■"); break; case 2: printf("兵"); break; case 3: printf("王"); break; default:printf(" "); break; } } } printf("\n"); } } void main(){ while(1) { system("cls"); DrawMap(); } }

専門家に質問してみよう