C言語関係掲示板

過去ログ

No.559.テトリスつくってます

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

テトリスつくってます
投稿者---ken(2003/02/08 13:20:09)


今ゲームをつくっているんですが、キー入力のやり方がわかりません。
例えば 『'j 'をおしたら左にうごく、' k 'をおしたら右にうごく』このようなプログラムはできるんです。問題は'j 'をおしてEnterをおさないとその処理をしてくれないことです。

if(fgetc(stdin)=='j '){ ←僕のプログラム

//処理

}

市販のゲームみたいに入力したらすぐさま反応するプログラムを教えて下さい。よろしくお願いいたします。m(_ _)m

No.5073

Re:テトリスつくってます
投稿者---ともじ(2003/02/08 13:50:50)


こんにちは。

>市販のゲームみたいに入力したらすぐさま反応するプログラムを教えて下さい。よろしくお願いいたします。m(_ _)m

環境がわかりませんが、BCC5.5やLSIC86では非標準の関数、kbhitとgetchが
使えますので、下記の要領で使ってみてください。
#include <conio.h>
#include <stdio.h>

int main(void)
{
    int c;
    
    printf("\'j\':左 \'k\':右 \'e\':終了\n");
    while(1) {
        if (kbhit()) {      /* キー入力があると1を返す */
            c = getch();    /* 入力をエコーバックなしに取得 */
            switch (c) {
                case 'j':
                    printf("←\n");
                    break;
                case 'k':
                    printf("→\n");
                    break;
                case 'e':
                    goto END;
            }
        }
    }
END:
    printf("終了します\n");
    
    return 0;
}





No.5074

Re:テトリスつくってます
投稿者---偽ギルガメッシュ(2003/02/08 13:57:31)


 この問題には、二つのことが同時に入っているので注意してください。

 二つ、というのは、

  ・キー入力に関する関数
  ・キーの識別

 についてです。

 まずは、関数について
 私は、キー入力に関しては、borland c 固有の関数である、getch()関数を使用します。
 しかし、ANSI Cには、何かキーを押されると、直ぐに何かしらの値を返すという関数はないらしいです。(「独習C」より)
 あなたが使用しているコンパイラについて載せる必要があるかもしれません。
 
 次に、キーが返す値についてです。
 一般的に使用される文字キーとそれに関係したキーには、返す固有の値があるのは知っているかもしれませんし、このHPに、その値が載っています。
 ところが、この、キーが返す値の表と、実際に操作しているキーを見比べると、数が合いません。
 これに該当するのが、矢印キーやファンクションキーです。
 これらのキーも値を返します。実は、その値を調べていくと面白いことがあります。
 これもコンパイラやその他のこともありますし、私自身も初心者なのでなんともいえませんが、何かと紛らわしいことになる原因となりえますので、矢印キー等の特殊なキーには、少し注意してください。

では

No.5080

テトリスつくってます
投稿者---ken(2003/02/08 15:22:44)


ともじさんへ

linux C でコンパイルしていたので(始めに言っとくべきでした。スミマセン) getch();がつかえなかったです。
もうすこし、自分で考えてみます。でも、返答ありがとうございました。

偽ギルガメッシュさんへ
あなたさんは全然初心者では、ないですね詳しいです!!
僕ももうすこし勉強します。
linux Cでは、getch()が使えないようなので他の方法をかんがえます。
返事有り難うございました。

No.5081

Re:テトリスつくってます
投稿者---kikk(2003/02/08 15:49:38)


ども。

なんだかこのごろバッファなしキー入力の話がよくでますね。


>linux Cでは、getch()が使えないようなので他の方法をかんがえます。

たぶんgccだとおもいますが、libcursesが入ってませんでした?
curses.hがincludeできれば、getch()は使えると思います。
curses.hにはconio.hで宣言されている関数と同等のものが
いくつかあります。詳細はman getchを。
# というようなことを最近書いた気がしましたが、流れてしまって
# 見られないようです。。


あと、前に、Linuxでテキストベースのテトリスをやったことがあるので
探せばみつかるかもしれません。


では。

No.5087

テトリスつくってます
投稿者---ken(2003/02/08 16:26:33)


>たぶんgccだとおもいますが、libcursesが入ってませんでした?

そうなんですよgccなんですけど、curses.hをインクルードしても

/tmp/ccDUHV0K.o: In function `Sousa':
/tmp/ccDUHV0K.o(.text+0x1db): undefined reference to `stdscr'
/tmp/ccDUHV0K.o(.text+0x1e0): undefined reference to `wgetch'
collect2: ld returned 1 exit status



このようなメッセージがでてしまいます。manで見たのですがgetchは
英語で出てきたのでわかりませんでした。(* *)他のだと日本語ででるんですけどねf^^; 例えば getchar など…

No.5090

Re:テトリスつくってます
投稿者---kikk(2003/02/08 17:06:25)


ども。


>collect2: ld returned 1 exit status

コンパイル時に-lcursesをつけてみてください
(math.hのinclude時に-lmをつけるように)。


>英語で出てきたのでわかりませんでした。(* *)他のだと日本語ででるんで

読んでください、と書こうかとも思いましたが、
読んでも問題解決のための情報はほとんどないようですね。
でも、まあ、読んどいてください。


では。

p.s. それにしてもなんというか、流れてしまったものはしかたありません。

No.5091

Re:テトリスつくってます
投稿者---ともじ(2003/02/08 17:55:56)


>p.s. それにしてもなんというか、流れてしまったものはしかたありません。

このあたりのログでしょうか。
http://f1.aaa.livedoor.jp/~pointc/4805.htm
http://f1.aaa.livedoor.jp/~pointc/4407.htm
仮にアップしておきます。

最近、書き込みが多いので1週間で流れますね。この掲示板サービスは
1件当たりの書き込みMAXが多くていいのですが、保持件数が200件なので、
瞬く間に流れてしまい、申し訳ありません。


No.5102

Re:テトリスつくってます
投稿者---かずま(2003/02/09 02:34:11)


> あと、前に、Linuxでテキストベースのテトリスをやったことがあるので
> 探せばみつかるかもしれません。

昔、comp.sources.games で BSD 用のプログラムを見つけたんですが、
Linux で動くように少し修正してみました。

tetris [speed [key]] で起動します。
speed のデフォルトは 2、
key のデフォルトは "jkl pq" で、左、回転、右、落とす、中断、終了の順です。
例えば、tetris 5 hkljpq で起動すると、左が h、落とすのは j になります。
long h[4];t(){h[3]-=h[3]/3000;setitimer(0,h,0);}c,d,l,v[]={(int)t,0,2},w,s,I,K
=0,i=276,j,k,q[276],Q[276],*n=q,*m,x=17,f[]={7,-13,-12,1,8,-11,-12,-1,9,-1,1,
12,3,-13,-12,-1,12,-1,11,1,15,-1,13,1,18,-1,1,2,0,-12,-1,11,1,-12,1,13,10,-12,
1,12,11,-12,-1,1,2,-12,-1,12,13,-12,12,13,14,-11,-1,1,4,-13,-12,12,16,-11,-12,
12,17,-13,1,-1,5,-12,12,11,6,-12,12,24};u(){for(i=11;++i<264;)if((k=q[i])-Q[i]
){Q[i]=k;if(i-++I||i%12<1)printf("\033[%d;%dH",(I=i)/12,i%12*2+28);printf(
"\033[%dm  "+(K-k?0:5),k);K=k;}Q[263]=c=getchar();}G(b){for(i=4;i--;)if(q[i?b+
n[i]:b])return 0;return 1;}g(b){for(i=4;i--;q[i?x+n[i]:x]=b);}main(C,V,a)char*
*V,*a;{h[3]=1000000/(l=C>1?atoi(V[1]):2);for(a=C>2?V[2]:"jkl pq";i;i--)*n++=i<
25||i%12<2?7:0;srand(getpid());system("stty cbreak -echo stop u");sigvec(14,v,
0);t();puts("\033[H\033[J");for(n=f+rand()%7*4;;g(7),u(),g(0)){if(c<0){if(G(x+
12))x+=12;else{g(7);++w;for(j=0;j<252;j=12*(j/12+1))for(;q[++j];)if(j%12==10){
for(;j%12;q[j--]=0);u();for(;--j;q[j+12]=q[j]);u();}n=f+rand()%7*4;G(x=17)||(c
=a[5]);}}if(c==*a)G(--x)||++x;if(c==a[1])n=f+4**(m=n),G(x)||(n=m);if(c==a[2])G
(++x)||--x;if(c==a[3])for(;G(x+12);++w)x+=12;if(c==a[4]||c==a[5]){s=sigblock(
8192);printf("\033[H\033[J\033[0m%d\n",w);if(c==a[5])break;for(j=264;j--;Q[j]=
0);while(getchar()-a[4]);puts("\033[H\033[J\033[7m");sigsetmask(s);}}system(
"stty sane");d=popen("touch HI;sort -mnr -o HI - HI;cat HI","w");fprintf(d,
"%4d from level %1d by %s\n",w,l,getlogin());pclose(d);}

これだけ、分かりにくいプログラムだと、ずばり答えを書いたことにはならないでしょう。
最初の質問者の作る楽しみは奪っていないと思います。参考になるところは参考にして、
頑張ってください。