C言語関係掲示板

過去ログ

No.546.↑↓→←キーを入力するプログラム

[戻る] [ホームページ]
No.4730

上下左右の入力の確認と変換に関するプログラムですが・・・
投稿者---偽ギルガメッシュ(2003/01/28 19:00:35)


初めまして
C言語初心者以下とも言えるほどのど素人(?)です。
アルバイトもしない学生なので、フリーウェアであるBorland C++ 5.5.1 for Win32を使って、RPGをつくろうと無謀なことを考えています。
その一環として、そのための入力についての簡単なプログラムを、ほかのネット上で公開されていたものを写し、加工して作ってみた。
出来たのは良いものの、「11E「↑キー」」と押すと、

 あんた、49 をいれたね
 あんた、49 をいれたね
 あんた、101 をいれたね
 あんた、0 をいれたね
 あんた、72 をいれたね
 一応 0としておきます

 とでて、「↑キー」を押したときに「0」の値が無駄に一つ、つくのです。
 以下のようにしたのですが、どうすればいいのでしょうか。
 あんた、49 をいれたね
あんた、49 をいれたね
あんた、101 をいれたね
あんた、72 をいれたね
一応 0としておきます

 問題のプログラムは下に写しておきました。

#include "stdio.h"
#include "conio.h"

main()
{

int c, inkey=-1;

while(1){
c=getch();

printf("あんた、%d をいれたね\n",c);

if(c==0x48) /* 上 */
inkey=0;
else if(c==0x4b) /* 左 */
inkey=1;
else if(c==0x50) /* 下 */
inkey=2;
else if(c==0x4d) /* 右 */
inkey=3;
if(inkey!=-1) break;/*上下左右が押されてたら終了 */
}

printf("一応 %dとしておきます\n",inkey);

return (inkey);
}

無駄に長くなって申し訳ございません。
では

No.4752

Re:上下左右の入力の確認と変換に関するプログラムですが・・・
投稿者---ともじ(2003/01/28 22:54:53)


こんばんは。

> とでて、「↑キー」を押したときに「0」の値が無駄に一つ、つくのです。
> 以下のようにしたのですが、どうすればいいのでしょうか。

http://www.catnet.ne.jp/kouno/c_faq/c19.html
こちらの19.5:にあるように、PC互換機では、矢印やファンクションキー
の入力の時には最初の読み込みで0、次の読み込みで実際のコードを
入力します。ですから、最初の0は捨てるようにしてください。


No.4782

Re:上下左右の入力の確認と変換に関するプログラムですが・・・
投稿者---偽ギルガメッシュ(2003/01/29 15:09:49)



>最初の0は捨てるようにしてください。

 捨てるということがうまく考えられなかった代わりに、0が入ることで、再びgetch()関数内の数字を調べ、調べた結果から変数inkeyに値が代入させる仕組みにしました。
#include"stdio.h"
#include"conio.h"

main()
{
int c,inkey;
c=-1;
inkey=-1;
printf("入力してください\n");
c=getch();
while(c)
{
printf("あなたが入力した文字を、一応%dと表記します。\n",c);
printf("新たに入力してください。\n");
c=getch();
}
while(1)
{
c=getch();
if(c==0x48)
inkey=0;
else if(c==0x4b)
inkey=1;
else if(c==0x50)
inkey=2;
else if(c==0x4d)
inkey=3;
if(inkey!=-1) break;
}
printf("一応%dと表記します\n",inkey);
return(inkey);
}

 ゲームを作る上で、操作が矢印キーであった方が、便利だろうなと思って、いかなるプログラムを使うとうまくいくのかを確かめるために作った実験プログラムです。
 確認の出力を取り除き、適当な関数につければ、すぐに利用できるかなと考えてします。
 実行してみて、不都合は見つかっていませんが、なにぶん、初心者なので、致命的なミスがあるかもしれません。
 ご意見ください。

では

No.4783

Re:上下左右の入力の確認と変換に関するプログラムですが・・・
投稿者---雪猫(2003/01/29 15:29:55)


こんにちわ。 昨日レスをつけておきながら消してしまった雪猫です。

えと、単純に、上下左右を押した時にでる余計な文字を消したいのなら
こういうのはどうでしょう?
実行してみてください。

#include "stdio.h"
#include "conio.h"

main()
{
	int c, inkey=-1;

	while(1){
		c=getch();
	
		if(c != 0xE0){
			printf("%d :",c);
			putchar(c);
			putchar('\n');
		}
	
		if(c==0x48){		 /* 上 */
			inkey=0;
		}else if(c==0x4b){ 	/* 左 */
			inkey=1;
		}else if(c==0x50){ 	/* 下 */
			inkey=2;
		}else if(c==0x4d){ 	/* 右 */
			inkey=3;
		}
		if(inkey!=-1)
			 break;/*上下左右が押されてたら終了 */
	}

	printf("END=%d\n(0:↑,1:←,2:↓,3:→)",inkey);

	return (inkey);
}




No.4787

Re:上下左右の入力の確認と変換に関するプログラムですが・・・
投稿者---silver fox(2003/01/29 16:07:20)


>         if(c != 0xE0){
>             printf("%d :",c);
>             putchar(c);
>             putchar('\n');
>         }
 ほう、雪猫さんもやはりこうなりましたか。偽ギルガメッシュさんの実行結果
やともじさんの回答を見ていて0とおっしゃっていたので変だなとは思っていま
した。質問しようかとは思っていたのですが何分小心者で・・・

私のところでも0xE0になるのですがこれは環境の違い?

 ちなみにキー入力判断のスレッドで私が見つけましたとか言っていたリンクは
今気がつけば上でともじさんが示していたものと同じだったんですね。だぶっち
まったい!

No.4791

Re:上下左右の入力の確認と変換に関するプログラムですが・・・
投稿者---雪猫(2003/01/29 17:32:13)


>私のところでも0xE0になるのですがこれは環境の違い?
 ん〜どうなんでしょうねぇ〜 
 ここらへんは専門の人に任せるとして♪ 

実は、↑で示したプログラムも間違いなんですよねぇ(><;)
大文字の'H','K','M','P'を押してみてください。
プログラムが終了すると思います。

これは、上、左、右、下矢印キーはそれぞれ72、75、77、80で、
H,K,M,Pも72,75,77,80 だからなんです。

がんばってください☆ミ (*^▽^*)ノ


No.4794

Re:上下左右の入力の確認と変換に関するプログラムですが・・・
投稿者---ともじ(2003/01/29 19:46:33)


>>私のところでも0xE0になるのですがこれは環境の違い?
> ん〜どうなんでしょうねぇ〜 

http://www.microsoft.com/JAPAN/developer/library/vccore/_crt__getch.2c_._getche.htm
にもあるように、処理系依存のようですね。

>実は、↑で示したプログラムも間違いなんですよねぇ(><;)
>大文字の'H','K','M','P'を押してみてください。
>プログラムが終了すると思います。

これは、0x00か0xE0のときに再入力でいいのでは?
#include <stdio.h>
#include <conio.h>

main()
{
    int c, inkey=-1;

    while(1){
        c=getch();
        
        /* 矢印あるいはファンクションキーは再読込み */
        if(c == 0x00 || c == 0xE0){
            c=getch();

            if(c==0x48){         /* 上 */
                inkey=0;
            }else if(c==0x4b){     /* 左 */
                inkey=1;
            }else if(c==0x50){     /* 下 */
                inkey=2;
            }else if(c==0x4d){     /* 右 */
                inkey=3;
            }
            if(inkey!=-1)
                break;/*上下左右が押されてたら終了 */
        }
        else {
            printf("%d :",c);
            putchar(c);
            putchar('\n');
        }
    }
    printf("END=%d\n(0:↑,1:←,2:↓,3:→)",inkey);

    return (inkey);
}



No.4830

Re:上下左右の入力の確認と変換に関するプログラムですが・・・
投稿者---偽ギルガメッシュ(2003/01/30 15:32:17)


皆様、ありがとうございます。

解決できましたので、別のプログラムを考えているとことです。
では



No.4832

補足
投稿者---shu(2003/01/30 15:55:47)
http://kura.s18.xrea.com/


どういった意図かは、解かりませんが、

#include "stdio.h"
#include "conio.h"

の部分は

#include &lt;stdio.h&gt;
#include &lt;conio.h&gt;

にしておいたほうが良いです。

No.4833

Re:正しい補足
投稿者---shu(2003/01/30 15:57:54)
http://kura.s18.xrea.com/


どういった意図かは、解かりませんが、

#include "stdio.h"
#include "conio.h"

の部分は

#include <stdio.h>
#include <conio.h>

にしておいたほうが良いです。


No.4917

Re:正しい補足
投稿者---偽ギルガメッシュ(2003/02/03 00:06:25)



 わかりました。

 でも、””でもうまく動くのですが・・・何か悪いことでもあるのでしょうか。

No.4952

Re:正しい補足
投稿者---ともじ(2003/02/03 18:25:32)


こんばんは。

> でも、””でもうまく動くのですが・・・何か悪いことでもあるのでしょうか。

標準ヘッダファイルは、通常<>で囲みます。#include指令では、<>で囲ま
れたファイルはコンパイラに指示されたディレクトリを探索に行きます。
一方 ""で囲まれたヘッダファイルはユーザ定義のヘッダファイルです。
""で囲まれたヘッダファイルの場合は、コンパイラはまず現在作業中の
カレントディレクトリを探索に行きます。そこにない場合には標準
ディレクトリを探します。

このようにヘッダファイルの記述を分けるのは、標準ディレクトリを
特別扱いし、標準ヘッダファイルの誤った変更や削除を防止するためです。