コンソールアプリで…

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
バグ

コンソールアプリで…

#1

投稿記事 by バグ » 17年前

こんにちは(^-^)
ちょっと質問がありまして、書き込みさせてもらいます。
まだ、MS-DOSの時代の事なのですが、テキストキャラを左右や上下に反転して画面に表示させているのを見た記憶があるのですが、今のVC++6.0で同じ事は出来ないのでしょうか?
あと、テキストキャラのドットパターンを抽出する方法も知りたいのですが…
もし、可能ならば教えてもらえないでしょうか?m(__)m

管理人

Re:コンソールアプリで…

#2

投稿記事 by 管理人 » 17年前

バグさん、こんにちは^^

う、VC++は私詳しく知らないんですよ・・m(_ _)m
ドットパターン抽出っていうのはぁ・・
くっついている部分の塊を判定する事がしたいんですか?
画像処理では、同じ部分の抽出する時に、似た色のパターン抽出をしたのですがそんな感じのことでしょうか?
今いるピクセルから上(1)、右(2)、下(3)、左(4)と調べて、パターンマッチした所で止めて、その番号を残す。
すると数字の羅列で塊が判定できる、そんな事をしたことありますが、違うんでしょうか。
ドットパターン抽出って何でしょうか><

バグ

Re:コンソールアプリで…

#3

投稿記事 by バグ » 17年前

たとえば、テキストキャラが仮に16×16ドットで構成されている場合、どのマス目のドットに色が着いていて、どこが着いてないかを知りたいんですよ。
BITMAPデータにすれば一目瞭然なのでしょうが、MS-DOS上で動くソフトで実現していたのを見かけたもので、ひょっとしたら、何か変わった方法があるのかな~と思った訳なんですよ(;^_^A

管理人

Re:コンソールアプリで…

#4

投稿記事 by 管理人 » 17年前

なるほど。
判定する方法はありそうですね。
う、VC++には詳しくなくて・・ごめんなさい><;

Justy

Re:コンソールアプリで…

#5

投稿記事 by Justy » 17年前

 こんばんわ。
 
>MS-DOSの時代の事なのですが、テキストキャラを左右や上下に反転して画面に
 あまり詳しくはないですが、あの当時だと VRAMを直接いじってゴニョゴニョしてたんじゃないですかねぇ。

> テキストキャラのドットパターンを抽出する方法も知りたいのですが…
 コマンドプロンプト上では無理だと思います。
 少なくとも私にはちょっとわかりません。

 Windowsアプリケーションでということなら TextOut()で文字列を書いて、GetPixel()でピクセル毎の色を取得することができます。

 リファレンスを見た限りでは、DXライブラリを使っても多分出来るかと思いますが・・・。

管理人

Re:コンソールアプリで…

#6

投稿記事 by 管理人 » 17年前

やっぱコマンドプロンプトでは不可能なんですか。
DXライブラリだったら簡単に出来るんですけどねぇ><;
GetPixel関数使えばすぐわかります。
Windowsアプリケーションでも同じ名前なんですね。
VCとかWindowsプログラミングとか、勉強しなきゃな><

バグ

Re:コンソールアプリで…

#7

投稿記事 by バグ » 17年前

>>Justyさん
>>管理人さん

やはり、見た目は似ていても、コマンドプロンプトとMS-DOSとは別モノなんですね(;^_^A
ありがとうございました(^-^)

管理人

Re:コンソールアプリで…

#8

投稿記事 by 管理人 » 17年前

コマンドプロンプトでテトリス作った事はありますが、
全て
printf("■");

printf("□");
で書きました^^;

バグ

Re:コンソールアプリで…

#9

投稿記事 by バグ » 17年前

テキストの色を変えれば…

printf( " " );

これでいけますよ(^-^)
空白は黒で設定して、ブロックのある場所は黒以外の色を指定すればOKです(^.^)b

管理人

Re:コンソールアプリで…

#10

投稿記事 by 管理人 » 17年前

なんと!テキストの色を変えた事がないので知りませんでした^^;
そういえばバグさんの作ってらっしゃるゲームも色違いで表現されてましたね。
あれは全部空白で表現してるんですか?

バグ

Re:コンソールアプリで…

#11

投稿記事 by バグ » 17年前

<windows.h>の中にある関数(名前忘れました(;^_^A))で、テキストキャラと背景の色をそれぞれ変更できるんですよ。
ですから、空白を表示して背景色を変更する事で落ちモノパズルのブロックや壁に利用していたんです(^.^)b
┏━┳━
┃●┃●
┗━┻━
例えば、背景緑で文字を黒や白に変更して、上記のように表示すれば、オセロゲームになりますよね。
コンソールでも意外に色々できるんですよ(^-^)

管理人

Re:コンソールアプリで…

#12

投稿記事 by 管理人 » 17年前

なるほど!アスキーアートでゲーム作っても面白いかもしれませんねw^^

バグ

Re:コンソールアプリで…

#13

投稿記事 by バグ » 17年前

コンソールアプリ用に作った関数をいくつか載せておきますね。

// グローバル変数
HANDLE hOut = GetStdHandle( STD_OUTPUT_HANDLE );

//////////////////////////////////////////////////
// ☆☆☆ テキストの表示位置指定 ☆☆☆ //
// //
// 引数 int x : x座標 //
// int y : y座標 //
// //
// 戻値 な し //
//////////////////////////////////////////////////
void Locate( int x , int y )
{
COORD Coord;
Coord.X = x;
Coord.Y = y;
SetConsoleCursorPosition( hOut , Coord );
}

//////////////////////////////////////////////////
// ☆☆☆ テキストの色変更 ☆☆☆ //
// //
// 引数 int Color : 色( 0 ~ 255 ) //
// //
// 戻値 な し //
//////////////////////////////////////////////////
void TextColor( int Color )
{
SetConsoleTextAttribute( hOut , Color );
}

//////////////////////////////////////////////////
// ☆☆☆ カーソルの表示or消去切替 ☆☆☆ //
// //
// 引数 BOOL Mode : TRUE 表示 //
// : FALSE 消去 //
// //
// 戻値 な し //
//////////////////////////////////////////////////
void SetCursol( BOOL Mode )
{
CONSOLE_CURSOR_INFO Cci;
GetConsoleCursorInfo( hOut , &Cci );
Csbi.bVisible = Mode;
SetConsoleCursorInfo( hOut , &Cci );
}
<!--3

すず

for文を使って

#14

投稿記事 by すず » 17年前

以下の宿題が出てるんですがよく分からない所があるので教えて下さい。

以下に示すような資産運用計算プログラムを作成せよ。定期預金の初期金額と最終的な目標金額、運用利率(%)、運用年数を入力し、1年ごとの講座残高を計算する。さらに、目標金額をこえた場合には何年目で目標達成したかを表示し、目標金額に到達しなかった場合には不足額を表示するようにせよ。
なお、(ある年の残高)×(1+運用利率)=(翌年の残高)として計算する。(このときの運用利率は%ではないので注意)。また1円未満は切り捨てること。


一応出来たのはここまでです。
#include <stdio.h>
int main(void)
{
int syoki,mokuhyo,nensu,i,i2,husoku;
double ritu,zandaka;
printf("初期金額を入力してください(単位:円):");
scanf("%d",&syoki);
printf("目標金額を入力してください(単位:円):");
scanf("%d",&mokuhyo);
printf("利率を入力してください(単位:%):");
scanf("%lf",&ritu);
printf("運用年数を入力してください(単位:年):");
scanf("%d",&nensu);
printf("初期残高 %d\n",syoki);
zandaka=syoki*ritu*0.01+syoki;
printf(" 1年目 %.0f\n",zandaka);

for(i=2;i<=nensu;i++){

zandaka=zandaka*ritu*0.01+zandaka;
printf("%4d年目 %.0f\n",i,zandaka);

}
if(zandaka>=mokuhyo){
i2=i;
printf("目標達成です\n");
printf("%d年目に目標金額に到達しました\n",i2);
}

else{
husoku=mokuhyo-zandaka;
printf("目標達成出来ませんでした\n");
printf("%d円不足しています\n",husoku);
}
return 0;
}
一応表示は出来たんですけど
達成した年の表示がうまく出来ません。

管理人

Re:for文を使って

#15

投稿記事 by 管理人 » 17年前

すずさん、お久しぶりです^^

なるほど、意味わかりました。
ちょっと待ってくださいね。

管理人

Re:for文を使って

#16

投稿記事 by 管理人 » 17年前

すみません、出かける用事があるので、、ちょっと行ってきます。
1時間ほどで帰りますので><;

管理人

Re:for文を使って

#17

投稿記事 by 管理人 » 17年前

アルゴリズムの解説はのちほどするので、
これでいいかどうか、実行して確かめてみてください。
#include <stdio.h>

void main(){
	int shoki,mokuhyo,riritu,nensu,i,tassei=0;
	double zandaka;
	printf("初期金額(円):");  scanf("%d",&shoki);
	printf("目標金額(円):");  scanf("%d",&mokuhyo);
	printf("運用利率(%):");  scanf("%d",&riritu);
	printf("運用年数(年):");  scanf("%d",&nensu);
	zandaka=(double)shoki;
	for(i=1;i<nensu;i++){
		zandaka = zandaka * (1.00 + (double)riritu / 100.00);
		printf("%3.d年目:%d円\n",i+1,(int)zandaka);
			if(zandaka>=mokuhyo && tassei==0)
				tassei=i+1;
	}
	if(tassei>0)
		printf("目標金額に%d年目に到達しました。\n",tassei);
	else
		printf("目標金額まで後%d円です。\n",mokuhyo-(int)zandaka);
}

管理人

Re:for文を使って

#18

投稿記事 by 管理人 » 17年前

以下処理の説明をそえました。

やりたいこと、これであってますか?

#include <stdio.h>

void main(){
	int shoki,mokuhyo,riritu,nensu;//入力を受ける各変数
	int i,tassei=0;//for文用のiと達成した時の年数を格納する変数。
	double zandaka;//現在の残高を格納する変数。小数計算するのでdouble型
	printf("初期金額(円):");  scanf("%d",&shoki);
	printf("目標金額(円):");  scanf("%d",&mokuhyo);
	printf("運用利率(%):");  scanf("%d",&riritu);
	printf("運用年数(年):");  scanf("%d",&nensu);
	zandaka=(double)shoki;//1年目の最初の残高を初期金額へ。変数はdouble型に変換
	for(i=1;i<nensu;i++){//入力された年数の間ループ
		zandaka = zandaka * (1.00 + (double)riritu / 100.00);
			//小数計算を行うので全てdouble型に合わせます。利率は100で割ります。
		printf("%3.d年目:%d円\n",i+1,(int)zandaka);
			//現在の残高の表示。iは0から始まるので+1をする。
			if(zandaka>=mokuhyo && tassei==0)
				tassei=i+1;
			//残高が目標金額を超えたら達成した時の年数を格納。ここで注意すべき点は
			//1度しかこの処理が行われないようにする事。tassei変数は0で初期化しておく事で
			//このような書き方で1回のみの処理が可能。&&は両式が両方ともマッチする時
			//にしか真にならないという意味。
	}
	if(tassei>0)//達成金額が格納されていたら達成されているということ。
		printf("目標金額に%d年目に到達しました。\n",tassei);
	else//tassei変数が初期化0のままだったら達成していないということ。
		printf("目標金額まで後%d円です。\n",mokuhyo-(int)zandaka);
}

管理人

Re:for文を使って

#19

投稿記事 by 管理人 » 17年前

お書きになっていた、プログラムですが
for(i=2;i<=nensu;i++){ 

zandaka=zandaka*ritu*0.01+zandaka; 
printf("%4d年目 %.0f\n",i,zandaka); 

} 
if(zandaka>=mokuhyo){ 
i2=i; 
printf("目標達成です\n"); 
printf("%d年目に目標金額に到達しました\n",i2); 
} 

else{ 
husoku=mokuhyo-zandaka; 
printf("目標達成出来ませんでした\n"); 
printf("%d円不足しています\n",husoku); 
} 
return 0; 
}
ここの部分、全部計算が終わった後で、残高が目標より高いか低いか計算しているため、
計算が出来ていません。(判っていらっしゃるとは思いますが。)
ですから計算途中のfor文内で、判定を行う必要があります。

ただし、
if(zandaka>=mokuhyo)
という判定では出来ません。
これは一度目標金額を超えると、その後の年から計算は全部この条件文にマッチしてしまうからです。
breakをかいてしまったら、複利計算がとまってしまいます。
そこで、サンプルのように、tassei変数を用意し、0で初期化しておきます。
やりかたは注釈をみてください。


回答が遅くなってごめんなさい、もうお休みになられましたかね。

また、わからないことがあれば聞いてください

すず

Re:for文を使って

#20

投稿記事 by すず » 17年前

出来ました。ありがとうございました。
また、そのうち質問すると思いますがそのときもよろしくお願いします。ありがとうございました。

管理人

Re:for文を使って

#21

投稿記事 by 管理人 » 17年前

できてよかったですね^^

閉鎖

“C言語何でも質問掲示板” へ戻る