C言語関係掲示板

過去ログ

No.491.タブでコンソールメニューを移動

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

コンソールの表示について
投稿者---さかぶ(2002/11/28 12:39:10)


こんにちはさかぶです。

A[ ] B[ ] C[ ]
D[ ] E[ ] F[ ]

これをコンソール上に表示して、ユーザに
チェックさせたい場合の処理はどのように
すれば良いのでしょうか?

例えばAとEをユーザがチェックした場合、
A[*] B[ ] C[ ]
D[ ] E[*] F[ ]

こんな感じにしたいです。
その時、AからBに移動するときはTabで移動し
[ ]の中にチェックする時はスペースキーでチェック
する方法をしりたいです。

No.3625

Re:コンソールの表示について
投稿者---ともじ(2002/11/28 17:03:20)


こんにちは。

>例えばAとEをユーザがチェックした場合、
>A[*] B[ ] C[ ]
>D[ ] E[*] F[ ]
>
>こんな感じにしたいです。
>その時、AからBに移動するときはTabで移動し
>[ ]の中にチェックする時はスペースキーでチェック
>する方法をしりたいです。

こんな感じになります。ただし、XPではLSICなどDOSのCでないと
上手く動作しません。
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<time.h>

#define X    3
#define Y    2
#define MOJI 5

char panel[Y][X*MOJI]={
		"A[ ] B[ ] C[ ]",
		"D[ ] E[ ] F[ ]"
	};

void show(int x, int y);
void move(int *x, int *y);
void check(int x, int y);

int main(void)
{
	int x = 0, y = 0;	/*カーソルの位置*/
	int key;

	/* 乱数の初期化 */
	srand((unsigned)time(NULL));

	printf("\033[>5h");      /*DOSのカーソルを隠す*/
	printf("\033[2J");       /*画面クリア*/

	while(1){
		show(x, y);	/* パネルの表示 */
		key = getch();
		switch(key){
			case '\t':	/* tabなら移動 */
	 			move(&x, &y);
				break;
			case ' ':	/* SPならチェック */
				check(x, y);
				break;
			case 'q':	/*[q]なら終了*/
				goto END;
		}
	}
END:
	printf("\033[>51");        /*DOSのカーソルを表示する*/
	return(0);
}

/*** パネルの表示 ***/
void show(int x, int y)
{
	int i,j;
	
	/*DOSのカーソルを左上に持っていく*/
	printf("\033[1;1H\n"); 
	for(i = 0; i < Y; i++){
		for(j = 0; j < X*MOJI; j++){
			if((x*MOJI+2) != j || y != i){
				/*カーソルの位置以外を表示する*/
				printf("%c",panel[i][j]);
			}
			else{
				printf("@");
			}
		}
		printf("\n");    /*改行*/ 
	}
	printf("\n\n");
	printf("移動 tabキー\n");
	printf("選択 SP キー\n");
	printf("終了 q  キー\n");
}

/*** カーソル移動 ***/
void move(int *x, int *y)
{
	(*x)++;
	if (*x >= X) {
		*x = 0;
		(*y)++;
		if (*y >= Y)
			*y = 0;
	}
}

/*** パネルチェック ***/
void check(int x,int y)
{
	panel[y][x*MOJI+2] = '*';
}






No.3630

Re:コンソールの表示について
投稿者---さかぶ(2002/11/28 18:23:06)


ともじさんこんにちは。
早速、ともじさんのプログラムを実行してみました。
感激しました。
@で、ユーザにわかりやすくて、感謝です。
ありがとうございました。


No.3632

Re:コンソールの表示について
投稿者---ともじ(2002/11/28 20:09:27)


すみません、修正です。

#include <time.h>
#include <stdlib.h>

/* 乱数の初期化 */
srand((unsigned)time(NULL));

を削除してください。

昔作ったプログラムを流用していて消し忘れました。


No.3660

<conio.h>とgetch()について
投稿者---かいと(2002/11/29 23:48:14)


このソースについてなのですが、
<conio.h>とgetch()関数はどの様なものなのですか。
C言語の辞典をなどを調べてみても見つかりませんでした。

便乗質問で申し訳ありませんが、よろしくお願いします。

No.3663

Re:<conio.h>とgetch()について
投稿者---ともじ(2002/11/30 00:29:12)


こんばんは。

><conio.h>とgetch()関数はどの様なものなのですか。
>C言語の辞典をなどを調べてみても見つかりませんでした。

getchはMS-DOSやWindowsのCでのみ使える関数で、処理系依存の関数
ですので、C言語の辞典には載っていませんね。
機能的は、エコーバックなしでキーボードから文字を読み込むという
ものです。バッファリングもしないので、リターンキーを押すことなく
即座に文字を読み込むことが出来ます。

No.3670

Re:<conio.h>とgetch()について
投稿者---かいと(2002/11/30 23:11:51)


依存関数だったんですね。
辞典に載ってない関数もあると言うことが分かって
勉強になりました。