ズザギコ アニメーション

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

ズザギコ アニメーション

#1

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

最初に比べたらだいぶマシになりました。

これで、バグは・・・ないはずです^^;(きっと)

ちなみにスリープ関数を使っていないので、モニタのリフレッシュレートを高く設定している人の
実行環境ではめちゃ早くスライドしてしまうかも。


#include <windows.h>
#include <stdio.h>
#define CH_LENGTH 25

void disp(char ch[2][3][CH_LENGTH],int n,int s,int t){
int i,a=0,j; char disp_ch[CH_LENGTH];
for(i=0;i<n;i++)
printf(" ");
if(n>=60-(CH_LENGTH-1)){
j=n;
if(n%2)
j=n-1;
strncpy(disp_ch,ch[t],60-j);
disp_ch[60-j]='\0';
}
else if(n<0){
j=-n;
if(n%2){
j=-n+1; printf(" ");
}
for(i=j;i<CH_LENGTH;i++){
disp_ch[a]=ch[t]; a++;
}
}
else
strcpy(disp_ch,ch[t]);
printf("%s\n",disp_ch);
}

void main(){
int i,j,t=1,n=60;
char ch[2][3][CH_LENGTH]
={{"    ∧∧      ","  ⊂(゜Д゜)    ","⊆⊂´ ̄⊂二ソ 2ゲトー"},
{"   ∧∧ 2ゲトー  ","⊂(゜Д゜⊂⌒`つ≡≡≡","        ズザー "}};
while(1){
while(1){
for(i=0;i<3;i++)
disp(ch,n,i,t);
if(t==1){
n--;
if(n==-CH_LENGTH){
t=0; n++; break;
}
}
else{
n++;
if(n==60){
t=1; break;
}
}
system("cls");
}
}
}

Justy

Re:ズザギコ アニメーション

#2

投稿記事 by Justy » 17年前

>最初に比べたらだいぶマシになりました。
 見たカンジ大丈夫そうです。お疲れ様です。
 と、思ったら。

 void main()はマズイっす。一応 intを返さないと。
 (単独で使われることが多いので)結構この戻り値ってのは軽視されがちなんですが、プログラム同士が連携するときとかで、処理が成功したかどうかをこの値で見ることがあったりします。


>何かtabインデントが使える掲示板ないんでしょうかね。
 うーん、多分投稿されたときの文字処理で、tabがあったら自動的に &nbsp;に変換するようになっているか、preタグ内は改行を brタグにしないようにすればいいと思うのですが・・・。
 21Styleさんのサポート掲示板で訊いてみて可能なら修正してもらうってのはどうでしょう?(お問い合わせフォームで不具合として報告してしまってもいいかもしれません)


※ さっきの改行問題ですが、結局全角変換で対応しました。
 &nbsp;方式で試したら文字数制限に引っかかってしまったので(w

管理人

Re:ズザギコ アニメーション

#3

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

ちょ、Justyさん、別な意味ですごいですよw

3倍のポイントゲットは10回投稿したら1回の割合で行われるように設定してあるんですけど、
Justyさん3回投稿全部ゲット成功してますよw
確率的には10の3乗分の1、つまり千分の一^^;
少ない投稿数で、すでにポイント単独2位w

>void main()はマズイっす。

なるほど、組み合わせるときにはそういうことがあるんですね。
こんな単体のプログラムでもint型にする意味があるんですか?

>21Styleさんのサポート掲示板で訊いてみて可能なら修正してもらうってのはどうでしょう?

あぁ、そういう希望も聞いてもらえる可能性あるんですか?
一回聞いてみる価値ありですね!

>結局全角変換で対応しました。

私も最初それでやってたんですけど、初心者の人だと「認識されない文字のエラー」みたいなエラーが出たとき対処ができないかと
思っていちいちプログラムをウェブにアップロードしていました。
全角は後で置換したらいいんし、見やすいし、使いやすいんでいいですね。

ちょっと21スタイルさんのほうに聞いてみます!

管理人

Re:ズザギコ アニメーション

#4

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

あれ!なんでwhile(1)2個も使ってるんだろう^^;
あ、そういえば、右に移動するループ文と、左に移動するループ文分けて書いててあとでくっつけたからそうなっってしまったんですね。
こうみたらwhile2つ使わずにbreakをcontinueで書けばよかったですね。

管理人

Re:ズザギコ アニメーション

#5

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

インデントの件ですが、やはりcgiの機能を変更していただくことは出来なかったようです。
しかし<pre>タグで書いた文章はテキストエディタにコピーすると改行されませんが、
ワードにコピーすると改行されるようです。
なのでワードにいったんコピーしてから任意のエディタにコピーしてくださいという事でした。

初めて訪問された方とかには判りにくいですね・・。

何かいい方法はないんでしょうか。いまさら掲示板を変更することはしたくないんですけど・・。

バグ

Re:ズザギコ アニメーション

#6

投稿記事 by バグ » 17年前

次にメインプログラムを…

#include "CONSOLE.h"

struct NEKO
{
int X;
int Y;
int Color;
BOOL RorL;
BOOL DispFlag;
};

class ZUZANEKO
{
public:
NEKO Neko;
char Right[2][30] , Left[2][30];
public:
void Initial();
void NekoSetting();
void NekoDisp();
void NekoMove();
};

void ZUZANEKO::Initial()
{
Neko.X = 0;
Neko.Y = 0;
Neko.RorL = FALSE;
Neko.DispFlag = FALSE;

memset( Right , 0 , sizeof( char ) * 2 * 30 );
memset( Left , 0 , sizeof( char ) * 2 * 30 );

sprintf( Right[0] , "   ∧∧  " );
sprintf( Right[1] , "⊂(゜ Д゜ ⊂⌒`⊃≡≡≡ " );
sprintf( Left[0] , " ∧∧ " );
sprintf( Left[1] , " ≡≡≡⊂´⌒⊃ ゜Д ゜)⊃" );
}

void ZUZANEKO::NekoSetting()
{
Neko.DispFlag = TRUE;
Neko.Y = RND( 11 ) * 2;
Neko.Color = RND( 7 ) + 8;
Neko.RorL = RND( 2 );

if( Neko.RorL )
{
Neko.X = 78;
}
else
{
Neko.X = -24;
}
}

void ZUZANEKO::NekoDisp()
{
int i , len , x;
char str[2][30];

memset( str , 0 , sizeof( char ) * 2 * 30 );

if( Neko.X > 54 )
{
x = Neko.X;
len = 80 - Neko.X;

for( i = 0 ; i < len ; i++ )
{
if( Neko.RorL )
{
str[0] = Right[0];
str[1] = Right[1];
}
else
{
str[0] = Left[0];
str[1] = Left[1];
}
}

if( str[0][0] == '\0' )
{
Neko.DispFlag = FALSE;
return;
}
}
else if( Neko.X < 0 )
{
x = 0;
len = -1 * Neko.X;

if( Neko.RorL )
{
sprintf( str[0] , "%s" , &Right[0][len] );
sprintf( str[1] , "%s" , &Right[1][len] );
}
else
{
sprintf( str[0] , "%s" , &Left[0][len] );
sprintf( str[1] , "%s" , &Left[1][len] );
}

if( str[0][0] == '\0' )
{
Neko.DispFlag = FALSE;
return;
}
}
else
{
x = Neko.X;

if( Neko.RorL )
{
sprintf( str[0] , "%s" , Right[0] );
sprintf( str[1] , "%s" , Right[1] );
}
else
{
sprintf( str[0] , "%s" , Left[0] );
sprintf( str[1] , "%s" , Left[1] );
}
}

TextColor( Neko.Color );
Locate( x , Neko.Y );
printf( "%s\n" , str[0] );
Locate( x , Neko.Y + 1 );
printf( "%s\n" , str[1] );
}

void ZUZANEKO::NekoMove()
{
if( Neko.RorL )
{
Neko.X -= 2;
}
else
{
Neko.X += 2;
}
}

void main()
{
srand( ( unsigned )time( NULL ) );

int i , j;
BOOL flag;
ZUZANEKO zuza[10];

for( i = 0 ; i < 10 ; i++ )
{
zuza.Initial();
}

while( 1 )
{
for( i = 0 ; i < 10 ; i++ )
{
if( zuza.Neko.DispFlag )
{
zuza[i].NekoDisp();
zuza[i].NekoMove();
}

if( ( !zuza[i].Neko.DispFlag ) && ( RND( 10 ) == 0 ) )
{
flag = TRUE;
while( flag )
{
flag = FALSE;
zuza[i].NekoSetting();
for( j = 0 ; j < 10 ; j++ )
{
if( i == j )
{
continue;
}

if( zuza[i].Neko.Y == zuza[j].Neko.Y )
{
flag = TRUE;
}
}
}
}
}

Sleep(17);
}
}

バグ

Re:ズザギコ アニメーション

#7

投稿記事 by バグ » 17年前

すみません、順番が逆になりましたが、これがCONSOLE.hです。

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

/******************************************************************/
/* ☆☆☆ 構造体 ☆☆☆ */
/******************************************************************/
struct TIMER
{
long Start;
long End;
long Now;
long Count;
};

/******************************************************************/
/* ☆☆☆ グローバル変数 ☆☆☆ */
/******************************************************************/
HANDLE hOut = GetStdHandle( STD_OUTPUT_HANDLE );
TIMER mSec;
LARGE_INTEGER Counter;

/******************************************************************/
/* ☆☆☆ DOS窓の大きさ設定 ☆☆☆ */
/* */
/* 引 数 : int Left = Windowの左端X座標 */
/* int Top = Windowの上端Y座標 */
/* int Right = Windowの右端X座標 */
/* int Bottom = Windowの下端Y座標 */
/* */
/* 戻り値 : な  し */
/******************************************************************/
void SetWindowSize( int Left , int Top , int Right , int Bottom )
{
SMALL_RECT Sr;
Sr.Left = Left;
Sr.Top = Top;
Sr.Right = Right;
Sr.Bottom = Bottom;
SetConsoleWindowInfo( hOut , TRUE , &Sr );
}

/******************************************************************/
/* ☆☆☆ カーソル表示・非表示設定 ☆☆☆ */
/* */
/* 引 数 : BOOL Flag = TRUE / カーソル表示 */
/* = FALSE / カーソル消去 */
/* */
/* 戻り値 : な  し */
/******************************************************************/
void CursolSet( BOOL Flag )
{
CONSOLE_CURSOR_INFO Cci;
GetConsoleCursorInfo( hOut , &Cci );
Cci.bVisible = Flag;
SetConsoleCursorInfo( hOut , &Cci );
}

/******************************************************************/
/* ☆☆☆ テキストの色指定 ☆☆☆ */
/* */
/* 引 数 : int color = テキストの色 */
/* 1:青 / 2:緑 / 4:赤 / 8:強調 */
/* 16:背景 青 / 32:背景 緑 / 64:背景 赤 / 128:背景 強調 */
/* */
/* 戻り値 : な  し */
/******************************************************************/
void TextColor( int Color )
{
SetConsoleTextAttribute( hOut , Color );
}

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

/******************************************************************/
/* ☆☆☆ 疑似ClearScreen ☆☆☆ */
/* */
/* 引 数 : な  し */
/* */
/* 戻り値 : な し */
/******************************************************************/
void CLS()
{
int i , j;

CONSOLE_SCREEN_BUFFER_INFO Csbi;
GetConsoleScreenBufferInfo( hOut , &Csbi );

for( i = 0 ; i <= Csbi.srWindow.Right ; i++ )
{
for( j = 0 ; j <= Csbi.srWindow.Bottom ; j++ )
{
TextColor( 0 );
Locate( i , j );
printf( " " );
}
}

Locate( Csbi.srWindow.Left , Csbi.srWindow.Top );
TextColor( 7 );
}

/******************************************************************/
/* ☆☆☆ 乱数発生 ☆☆☆ */
/* */
/* 引 数 : int rnd = 乱数の幅 */
/* */
/* 戻り値 : 乱数 */
/******************************************************************/
int RND( int rnd )
{
return( rand() % rnd );
/*
乱数をバラけさせたい場合はmain関数の最初かコンストラクタで下記を追加する。

srand( ( unsigned )time( NULL ) );
*/

}

Justy

Re:ズザギコ アニメーション

#8

投稿記事 by Justy » 17年前

>3倍のポイントゲットは10回投稿したら1回の割合で行われるように設定してあるんですけど、
Justyさん3回投稿全部ゲット成功してますよw

 はい、気付いてました(w
 投稿前に「みんなもう1000点台だよ、追いつくのは無理だなぁ」と思ってたらあっという間に・・・。


>インデントの件ですが、やはりcgiの機能を変更していただくことは出来なかったようです。
 無理でしたか。


>しかし<pre>タグで書いた文章はテキストエディタにコピーすると改行されませんが、ワードにコピーすると改行されるようです。
 なんと!
 って、うちのマシンにはワードが入ってない・・・(;д;)

 
>何かいい方法はないんでしょうか。
 そうですねぇ・・・当面は&nbsp;で対処、文字数制限に引っかかりそうなら、コードをいろいろ縮めてなんとか納める、ダメなら分割投稿するか添付する。
 ってところではないでしょうか。

管理人

Re:ズザギコ アニメーション

#9

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

お~~バグさん、カラフルですね!!
すごいです^^
色つけるのとかやったこと無いんで新鮮でした^^

左でとまってしまうのがちょっとおしいですね^^;
さすがコンソールならバグさんですね!

コンソールって画像を表示することも出来るんですか?
たかがコンソール、されどコンソールですねw


>Justyさん

もうダントツですね^^;

>って、うちのマシンにはワードが入ってない・・・(;д;)

マジですか;
ワードただの書類作るほかにも積分の公式とか特別な式がかけて便利ですよね。
表作ったり、プレゼン作ったりすることあるんでオフィス重宝してます。
単に他のよいソフトを知らないだけですがw

そうですね~当面は空白文字で対処しましょう。
せっかくここまで書いてきた掲示板変更するのはもったいないですし。
オプションもかなり申し込んだのでかれこれ6000円くらいこの掲示板にはらってますし^^;
全ログ保存オプションつけたんで、永久にログが消えることがありません。
うちのHPはプログラムのソースコード投稿があるので、特にログ多くなるでしょうね^^;

ナガタ

Re:ズザギコ アニメーション

#10

投稿記事 by ナガタ » 17年前

バグさんがかかれたプログラムきれいですねー☆
これってC++ですか?見たことのない言葉がいっぱいあるので.

管理人

Re:ズザギコ アニメーション

#11

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

これはC++ですね^^

コンソール画面でも色をつけるだけで、こんなに華やかさがちがうんですね~☆

ナガタ

Re:ズザギコ アニメーション

#12

投稿記事 by ナガタ » 17年前

C++ですか.Cでも色はつけれるんですか?

バグ

Re:ズザギコ アニメーション

#13

投稿記事 by バグ » 17年前

>>管理人さん
え?左で止まりますか?
うちでは、ちゃんと通り過ぎて行くんですが…あれ?(@_@;)

>>ナガタさん
Cでも色を着ける事できますよ(^-^)
WINDOWS上のDOS窓アプリならば、前に書き込みしたCONSOLE.hの中にTextColorという関数で色を変えているので、その中を見てみて下さい。

Justy

Re:ズザギコ アニメーション

#14

投稿記事 by Justy » 17年前

>もうダントツですね^^;
 管理人さんこそ(w

>ワードただの書類作るほかにも積分の公式とか特別な式がかけて便利ですよね。
>表作ったり、プレゼン作ったりすることあるんでオフィス重宝してます。

 便利なんですけどね。今はビューアだけは入れています。
 元々 DTP系のソフトが好きなんで、いつもそっち方面のソフトを使っています。
 配布するときは txt/html/chm/pdfのどれかになるので、書くソフトはどれもいいんですよ、結局。

 とはいえ、オリジナルドキュメントを他人と共有しなければならない時はワードという選択肢もあるかもしれませんが・・・。

管理人

Re:ズザギコ アニメーション

#15

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

↑クリックで拡大↑

>バグさん、

私が実行すると、こんな感じになります。
左側に来たとき、胴体だけが止まった状態になります。
まだプログラムの詳細を見てないんで、原因はわかりませんけど、、。

>Justyさん、

私は文書作成は報告書や論文書く時には他にラテックス使いいます。
あれ、かなり綺麗にかけますよね。
ただラテックスで表を書くのはかなり面倒なんで、なかなかリナックス使わないときには手を出しませんが^^;

ちょっと急激にポイントが上がりすぎたなと思ったので密かに獲得ポイントを3倍→2倍にして、獲得確率も1/10→1/15にしたんですけど、
それでも獲得してしまう強運!すごいですねw

Justy

Re:ズザギコ アニメーション

#16

投稿記事 by Justy » 17年前

>うちでは、ちゃんと通り過ぎて行くんですが…あれ?(@_@;)

 うちも左端で止まります。
 ひょっとしてOSのバージョンとかがバグさんのと違ってて、コンソールの挙動が変わってしまっているのでしょうか。

 察するに [color=#c0c0ff" face="sans-serif">Neko.DispFlag = FALSE[/color] する条件が [color=#c0c0ff" face="sans-serif]str[0][0] == '\0'[/color] だけなので、耳の絵の部分が画面の端から消えた瞬間に条件が満たされてしまって移動・更新しなくなるからだと思います。

バグ

Re:ズザギコ アニメーション

#17

投稿記事 by バグ » 17年前

>>Justyさん
>>察するに Neko.DispFlag = FALSE する条件が str[0][0] == '\0' だけなので、耳の絵の部分が画面の端から消えた瞬間に条件が満たされてしまって移動・更新しなくなるからだと思います。

いえ、それも見越していたので、スペースを入れて耳と胴体の文字列を同じ長さにしておいたのですが…
たしかに、掲示板に書き込みしたソースは耳が短くなってますね…何故だろう(;^_^A

Justy

Re:ズザギコ アニメーション

#18

投稿記事 by Justy » 17年前

>いえ、それも見越していたので、スペースを入れて耳と胴体の文字列を同じ長さにしておいたのですが…
>たしかに、掲示板に書き込みしたソースは耳が短くなってますね…何故だろう(;^_^A

 あー、なるほど。
 全角スペースではなく、半角スペースだったんですね。
 htmlの仕様上、タブとか半角スペースが複数連続していても半角スペース1つにまとめられてしまうんです。
 なので、""内の半角スペースが投稿の段階で消えてしまったのでしょう。

 半角スペースの部分を全部半角で&nbsp;と書くときちんと半角スペースになります。

管理人

Re:ズザギコ アニメーション

#19

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

あ~それでですか。
ソースの投稿方法は別トピで新しく紹介したので、そちらをご覧ください^^

バグ

Re:ズザギコ アニメーション

#20

投稿記事 by バグ » 17年前

ちょっと修正しました(^_^;)
#include "CONSOLE.h" 

struct NEKO 
{ 
	int X; 
	int Y; 
	int Color; 
	BOOL RorL; 
	BOOL DispFlag; 
}; 

class ZUZANEKO 
{ 
	public: 
	NEKO Neko; 
	char Right[2][30] , Left[2][30]; 
	public: 
	void Initial(); 
	void NekoSetting(); 
	void NekoDisp(); 
	void NekoMove(); 
}; 

void ZUZANEKO::Initial() 
{ 
	Neko.X = 0; 
	Neko.Y = 0; 
	Neko.RorL = FALSE; 
	Neko.DispFlag = FALSE; 

	memset( Right , 0 , sizeof( char ) * 2 * 30 ); 
	memset( Left , 0 , sizeof( char ) * 2 * 30 ); 

	sprintf( Right[0] , "   ∧∧        " ); 
	sprintf( Right[1] , "⊂(゜Д゜⊂⌒`⊃≡≡≡ " ); 
	sprintf( Left[0]  , "        ∧∧   " ); 
	sprintf( Left[1]  , " ≡≡≡⊂´⌒⊃゜Д゜)⊃" ); 
} 

void ZUZANEKO::NekoSetting() 
{ 
	Neko.DispFlag = TRUE; 
	Neko.Y = RND( 11 ) * 2; 
	Neko.Color = RND( 7 ) + 9; 
	Neko.RorL = RND( 2 ); 

	if( Neko.RorL ) 
	{ 
		Neko.X = 76; 
	} 
	else 
	{ 
		Neko.X = -24; 
	} 
} 

void ZUZANEKO::NekoDisp() 
{ 
	int i , len , x; 
	char str[2][30]; 

	memset( str , 0 , sizeof( char ) * 2 * 30 ); 

	if( Neko.X > 54 ) 
	{ 
		x = Neko.X; 
		len = 80 - Neko.X; 

		for( i = 0 ; i < len ; i++ ) 
		{ 
			if( Neko.RorL ) 
			{ 
				str[0] = Right[0]; 
				str[1] = Right[1]; 
			} 
			else 
			{ 
				str[0] = Left[0]; 
				str[1] = Left[1]; 
			} 
		} 

		if( str[0][0] == '\0' && str[1][0] == '\0' ) 
		{ 
			Neko.DispFlag = FALSE; 
			return; 
		} 
	} 
	else if( Neko.X < 0 ) 
	{ 
		x = 0; 
		len = -1 * Neko.X; 

		if( Neko.RorL ) 
		{ 
			sprintf( str[0] , "%s" , &Right[0][len] ); 
			sprintf( str[1] , "%s" , &Right[1][len] ); 
		} 
		else 
		{ 
			sprintf( str[0] , "%s" , &Left[0][len] ); 
			sprintf( str[1] , "%s" , &Left[1][len] ); 
		} 

		if( str[0][0] == '\0' && str[1][0] == '\0' ) 
		{ 
			Neko.DispFlag = FALSE; 
			return; 
		} 
	} 
	else 
	{ 
		x = Neko.X; 

		if( Neko.RorL ) 
		{ 
			sprintf( str[0] , "%s" , Right[0] ); 
			sprintf( str[1] , "%s" , Right[1] ); 
		} 
		else 
		{ 
			sprintf( str[0] , "%s" , Left[0] ); 
			sprintf( str[1] , "%s" , Left[1] ); 
		} 
	} 

	TextColor( Neko.Color ); 
	Locate( x , Neko.Y ); 
	printf( "%s\n" , str[0] ); 
	Locate( x , Neko.Y + 1 ); 
	printf( "%s\n" , str[1] ); 
} 

void ZUZANEKO::NekoMove() 
{ 
	if( Neko.RorL ) 
	{ 
		Neko.X -= 2; 
	} 
	else 
	{ 
		Neko.X += 2; 
	} 
} 

void main() 
{ 
	srand( ( unsigned )time( NULL ) ); 

	int i , j; 
	BOOL flag; 
	ZUZANEKO zuza[10]; 

	SetCursol( FALSE );

	for( i = 0 ; i < 10 ; i++ ) 
	{ 
		zuza.Initial(); 
	} 

	while( 1 ) 
	{ 
		for( i = 0 ; i < 10 ; i++ ) 
		{ 
			if( zuza.Neko.DispFlag ) 
			{ 
				zuza[i].NekoDisp(); 
				zuza[i].NekoMove(); 
			} 

			if( ( !zuza[i].Neko.DispFlag ) && ( RND( 10 ) == 0 ) ) 
			{ 
				flag = TRUE; 
				while( flag ) 
				{ 
					flag = FALSE; 
					zuza[i].NekoSetting(); 
					for( j = 0 ; j < 10 ; j++ ) 
					{ 
						if( i == j ) 
						{ 
							continue; 
						} 

						if( zuza[i].Neko.Y == zuza[j].Neko.Y ) 
						{ 
							flag = TRUE; 
						} 
					} 
				} 
			} 
		} 

		Sleep(17); 
	} 
}


多分、これでちゃんと通り過ぎてくれるはずです(^-^)

バグ

Re:ズザギコ アニメーション

#21

投稿記事 by バグ » 17年前

あ、CONSOLE.hも古いVerだったので、新しいのを貼っておきますね。
#include	<windows.h>
#include	<stdio.h>
#include	<time.h>
#include	<conio.h>

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

/******************************************************************/
/*  ☆☆☆ カーソル表示・非表示設定 ☆☆☆                            */
/*                                                                */
/*  引  数 : BOOL Flag		= TRUE	/ カーソル表示                    */
/*                          = FALSE	/ カーソル消去                    */
/*                                                                */
/*  戻り値 : な  し                                             */
/******************************************************************/
void SetCursol( BOOL Flag )
{
	CONSOLE_CURSOR_INFO Cci;

	GetConsoleCursorInfo( hOut , &Cci );
	Cci.bVisible = Flag;

	SetConsoleCursorInfo( hOut , &Cci );
}

/******************************************************************/
/*  ☆☆☆ テキストの色指定 ☆☆☆                                    */
/*                                                                */
/*  引 数 : int CharColor = テキストの色                             */
/*           1:青 / 2:緑 / 4:赤 / 8:強調                          */
/*                                                                */
/*  戻り値 : TRUE  = 成功                                         */
/*           FALSE = 失敗                                         */
/******************************************************************/
BOOL TextColor( int Text )
{	
	if( Text < 0 || Text > 15 )
	{
		return( FALSE );
	}

	int		Color , Back;
	CONSOLE_SCREEN_BUFFER_INFO	Csbi;
	GetConsoleScreenBufferInfo( hOut , &Csbi );

	Back = Csbi.wAttributes & 0xf0; 
	Text &= 0x0f;
	Color = Text + Back;

	SetConsoleTextAttribute( hOut , Color );

	return( TRUE );
}

/******************************************************************/
/*  ☆☆☆ 背景の色指定 ☆☆☆                                    */
/*                                                                */
/*  引 数 : int BgColor = 背景の色                               */
/*           1:青 / 2:緑 / 4:赤 / 8:強調                          */
/*                                                                */
/*  戻り値 : TRUE  = 成功                                         */
/*           FALSE = 失敗                                         */
/******************************************************************/
BOOL BackColor( int Back )
{
	if( Back < 0 || Back > 15 )
	{
		return( FALSE );
	}

	int		Color , Text;
	CONSOLE_SCREEN_BUFFER_INFO	Csbi;
	GetConsoleScreenBufferInfo( hOut , &Csbi );

	Text = Csbi.wAttributes & 0x0f; 
	Back = ( Back << 4 ) & 0xf0;
	Color = Text + Back;

	SetConsoleTextAttribute( hOut , Color );

	return( TRUE );
}

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

/******************************************************************/
/*  ☆☆☆ 疑似ClearScreen ☆☆☆                                 */
/*                                                                */
/*  引 数 : な  し                                             */
/*                                                                */
/*  戻り値 : な    し                                             */
/******************************************************************/
void CLS()
{
	int		i , j;
	CONSOLE_SCREEN_BUFFER_INFO	Csbi;

	GetConsoleScreenBufferInfo( hOut , &Csbi );

	for( i = 0 ; i <= Csbi.srWindow.Right ; i++ )
	{
		for( j = 0 ; j <= Csbi.srWindow.Bottom ; j++ )
		{
			BackColor( 0 );
			Locate( i , j );
			printf( " " );
		}
	}

	Locate( Csbi.srWindow.Left , Csbi.srWindow.Top );
	TextColor( 7 );
}

/******************************************************************/
/*  ☆☆☆ 乱数発生 ☆☆☆                                        */
/*                                                                */
/*  引 数 : int rnd = 乱数の幅                                   */
/*                                                                */
/*  戻り値 : 乱数                                                 */
/******************************************************************/
int RND( int rnd )
{
	return( rand() % rnd );
/*
	乱数をバラけさせたい場合はmain関数の最初かコンストラクタで下記を追加する。

	srand( ( unsigned )time( NULL ) );
*/

}
まだ、いくつかの関数があるのですが、文字数オーバーなので、必要な分だけ、載せておきます(^_^;)

バグ

Re:ズザギコ アニメーション

#22

投稿記事 by バグ » 17年前

そうそう、昔作ったので、こんなのもありました。ずっと見ていると、なんとなく癒される気がします(笑)
#include	"CONSOLE.h"

void	main()
{
	srand( ( unsigned )time( NULL ) );
	int		x , y , xx , yy;
	CONSOLE_SCREEN_BUFFER_INFO	CSBI;


	TextColor( RND( 7 ) + 9 );
	x = 0;
	y = 0;
	xx = 2;
	yy = 1;


	while( 1 )
	{
		GetConsoleScreenBufferInfo( hOut , &CSBI );
		Locate( x , y );
		printf( "●" );
		Sleep( 20 );
		Locate( x , y );
		printf( "  " );

		if( x + xx < 0 || x + xx > CSBI.srWindow.Right )
		{
			if( xx < 0 )
				xx = ( RND( 2 ) + 1 );
			else
				xx = ( RND( 2 ) + 1 ) * - 1;

			TextColor( RND( 7 ) + 9 );
		}
			
		if( y + yy < 0 || y + yy > CSBI.srWindow.Bottom )
		{
			yy *= -1;
			TextColor( RND( 7 ) + 9 );
		}

		x += xx;
		y += yy;
	}
}

バグ

Re:ズザギコ アニメーション

#23

投稿記事 by バグ » 17年前

あ、そうだ。↑のプログラム、動いている時に、Windowの大きさを変えてみて下さい。どうでも良い部分に妙にこだわってみました(^_^;)

管理人

Re:ズザギコ アニメーション

#24

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

おぉ~、画面の端っこって判定できるんですね^^

コレ応用したらブロック崩しできそう^^
コンソールといえどもあなどれませんねぇw
きっと
y=x;の次は
y=2x
しかあらわせないんでしょうね^^;
しかしコンソールでこれだけできるとは驚きです^^

閉鎖

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