ページ 1 / 1
ズザギコ アニメーション
Posted: 2006年10月15日(日) 02:31
by 管理人
最初に比べたらだいぶマシになりました。
これで、バグは・・・ないはずです^^;(きっと)
ちなみにスリープ関数を使っていないので、モニタのリフレッシュレートを高く設定している人の
実行環境ではめちゃ早くスライドしてしまうかも。
#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");
}
}
}
Re:ズザギコ アニメーション
Posted: 2006年10月15日(日) 04:04
by Justy
>最初に比べたらだいぶマシになりました。
見たカンジ大丈夫そうです。お疲れ様です。
と、思ったら。
void main()はマズイっす。一応 intを返さないと。
(単独で使われることが多いので)結構この戻り値ってのは軽視されがちなんですが、プログラム同士が連携するときとかで、処理が成功したかどうかをこの値で見ることがあったりします。
>何かtabインデントが使える掲示板ないんでしょうかね。
うーん、多分投稿されたときの文字処理で、tabがあったら自動的に &nbsp;に変換するようになっているか、preタグ内は改行を brタグにしないようにすればいいと思うのですが・・・。
21Styleさんのサポート掲示板で訊いてみて可能なら修正してもらうってのはどうでしょう?(お問い合わせフォームで不具合として報告してしまってもいいかもしれません)
※ さっきの改行問題ですが、結局全角変換で対応しました。
&nbsp;方式で試したら文字数制限に引っかかってしまったので(w
Re:ズザギコ アニメーション
Posted: 2006年10月15日(日) 04:44
by 管理人
ちょ、Justyさん、別な意味ですごいですよw
3倍のポイントゲットは10回投稿したら1回の割合で行われるように設定してあるんですけど、
Justyさん3回投稿全部ゲット成功してますよw
確率的には10の3乗分の1、つまり千分の一^^;
少ない投稿数で、すでにポイント単独2位w
>void main()はマズイっす。
なるほど、組み合わせるときにはそういうことがあるんですね。
こんな単体のプログラムでもint型にする意味があるんですか?
>21Styleさんのサポート掲示板で訊いてみて可能なら修正してもらうってのはどうでしょう?
あぁ、そういう希望も聞いてもらえる可能性あるんですか?
一回聞いてみる価値ありですね!
>結局全角変換で対応しました。
私も最初それでやってたんですけど、初心者の人だと「認識されない文字のエラー」みたいなエラーが出たとき対処ができないかと
思っていちいちプログラムをウェブにアップロードしていました。
全角は後で置換したらいいんし、見やすいし、使いやすいんでいいですね。
ちょっと21スタイルさんのほうに聞いてみます!
Re:ズザギコ アニメーション
Posted: 2006年10月15日(日) 06:45
by 管理人
あれ!なんでwhile(1)2個も使ってるんだろう^^;
あ、そういえば、右に移動するループ文と、左に移動するループ文分けて書いててあとでくっつけたからそうなっってしまったんですね。
こうみたらwhile2つ使わずにbreakをcontinueで書けばよかったですね。
Re:ズザギコ アニメーション
Posted: 2006年10月15日(日) 07:54
by 管理人
インデントの件ですが、やはりcgiの機能を変更していただくことは出来なかったようです。
しかし<pre>タグで書いた文章はテキストエディタにコピーすると改行されませんが、
ワードにコピーすると改行されるようです。
なのでワードにいったんコピーしてから任意のエディタにコピーしてくださいという事でした。
初めて訪問された方とかには判りにくいですね・・。
何かいい方法はないんでしょうか。いまさら掲示板を変更することはしたくないんですけど・・。
Re:ズザギコ アニメーション
Posted: 2006年10月15日(日) 09:33
by バグ
次にメインプログラムを…
#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:ズザギコ アニメーション
Posted: 2006年10月15日(日) 09:36
by バグ
すみません、順番が逆になりましたが、これが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 ) );
*/
}
Re:ズザギコ アニメーション
Posted: 2006年10月15日(日) 15:25
by Justy
>3倍のポイントゲットは10回投稿したら1回の割合で行われるように設定してあるんですけど、
Justyさん3回投稿全部ゲット成功してますよw
はい、気付いてました(w
投稿前に「みんなもう1000点台だよ、追いつくのは無理だなぁ」と思ってたらあっという間に・・・。
>インデントの件ですが、やはりcgiの機能を変更していただくことは出来なかったようです。
無理でしたか。
>しかし<pre>タグで書いた文章はテキストエディタにコピーすると改行されませんが、ワードにコピーすると改行されるようです。
なんと!
って、うちのマシンにはワードが入ってない・・・(;д;)
>何かいい方法はないんでしょうか。
そうですねぇ・・・当面は&nbsp;で対処、文字数制限に引っかかりそうなら、コードをいろいろ縮めてなんとか納める、ダメなら分割投稿するか添付する。
ってところではないでしょうか。
Re:ズザギコ アニメーション
Posted: 2006年10月15日(日) 16:06
by 管理人
お~~バグさん、カラフルですね!!
すごいです^^
色つけるのとかやったこと無いんで新鮮でした^^
左でとまってしまうのがちょっとおしいですね^^;
さすがコンソールならバグさんですね!
コンソールって画像を表示することも出来るんですか?
たかがコンソール、されどコンソールですねw
>Justyさん
もうダントツですね^^;
>って、うちのマシンにはワードが入ってない・・・(;д;)
マジですか;
ワードただの書類作るほかにも積分の公式とか特別な式がかけて便利ですよね。
表作ったり、プレゼン作ったりすることあるんでオフィス重宝してます。
単に他のよいソフトを知らないだけですがw
そうですね~当面は空白文字で対処しましょう。
せっかくここまで書いてきた掲示板変更するのはもったいないですし。
オプションもかなり申し込んだのでかれこれ6000円くらいこの掲示板にはらってますし^^;
全ログ保存オプションつけたんで、永久にログが消えることがありません。
うちのHPはプログラムのソースコード投稿があるので、特にログ多くなるでしょうね^^;
Re:ズザギコ アニメーション
Posted: 2006年10月15日(日) 17:06
by ナガタ
バグさんがかかれたプログラムきれいですねー☆
これってC++ですか?見たことのない言葉がいっぱいあるので.
Re:ズザギコ アニメーション
Posted: 2006年10月15日(日) 17:15
by 管理人
これはC++ですね^^
コンソール画面でも色をつけるだけで、こんなに華やかさがちがうんですね~☆
Re:ズザギコ アニメーション
Posted: 2006年10月15日(日) 17:48
by ナガタ
C++ですか.Cでも色はつけれるんですか?
Re:ズザギコ アニメーション
Posted: 2006年10月15日(日) 18:10
by バグ
>>管理人さん
え?左で止まりますか?
うちでは、ちゃんと通り過ぎて行くんですが…あれ?(@_@;)
>>ナガタさん
Cでも色を着ける事できますよ(^-^)
WINDOWS上のDOS窓アプリならば、前に書き込みしたCONSOLE.hの中にTextColorという関数で色を変えているので、その中を見てみて下さい。
Re:ズザギコ アニメーション
Posted: 2006年10月15日(日) 18:13
by Justy
>もうダントツですね^^;
管理人さんこそ(w
>ワードただの書類作るほかにも積分の公式とか特別な式がかけて便利ですよね。
>表作ったり、プレゼン作ったりすることあるんでオフィス重宝してます。
便利なんですけどね。今はビューアだけは入れています。
元々 DTP系のソフトが好きなんで、いつもそっち方面のソフトを使っています。
配布するときは txt/html/chm/pdfのどれかになるので、書くソフトはどれもいいんですよ、結局。
とはいえ、オリジナルドキュメントを他人と共有しなければならない時はワードという選択肢もあるかもしれませんが・・・。
Re:ズザギコ アニメーション
Posted: 2006年10月15日(日) 18:28
by 管理人
↑クリックで拡大↑
>バグさん、
私が実行すると、こんな感じになります。
左側に来たとき、胴体だけが止まった状態になります。
まだプログラムの詳細を見てないんで、原因はわかりませんけど、、。
>Justyさん、
私は文書作成は報告書や論文書く時には他にラテックス使いいます。
あれ、かなり綺麗にかけますよね。
ただラテックスで表を書くのはかなり面倒なんで、なかなかリナックス使わないときには手を出しませんが^^;
ちょっと急激にポイントが上がりすぎたなと思ったので密かに獲得ポイントを3倍→2倍にして、獲得確率も1/10→1/15にしたんですけど、
それでも獲得してしまう強運!すごいですねw
Re:ズザギコ アニメーション
Posted: 2006年10月15日(日) 19:08
by Justy
>うちでは、ちゃんと通り過ぎて行くんですが…あれ?(@_@;)
うちも左端で止まります。
ひょっとしてOSのバージョンとかがバグさんのと違ってて、コンソールの挙動が変わってしまっているのでしょうか。
察するに [color=#c0c0ff" face="sans-serif">Neko.DispFlag = FALSE[/color] する条件が [color=#c0c0ff" face="sans-serif]str[0][0] == '\0'[/color] だけなので、耳の絵の部分が画面の端から消えた瞬間に条件が満たされてしまって移動・更新しなくなるからだと思います。
Re:ズザギコ アニメーション
Posted: 2006年10月15日(日) 21:03
by バグ
>>Justyさん
>>察するに Neko.DispFlag = FALSE する条件が str[0][0] == '\0' だけなので、耳の絵の部分が画面の端から消えた瞬間に条件が満たされてしまって移動・更新しなくなるからだと思います。
いえ、それも見越していたので、スペースを入れて耳と胴体の文字列を同じ長さにしておいたのですが…
たしかに、掲示板に書き込みしたソースは耳が短くなってますね…何故だろう(;^_^A
Re:ズザギコ アニメーション
Posted: 2006年10月15日(日) 21:20
by Justy
>いえ、それも見越していたので、スペースを入れて耳と胴体の文字列を同じ長さにしておいたのですが…
>たしかに、掲示板に書き込みしたソースは耳が短くなってますね…何故だろう(;^_^A
あー、なるほど。
全角スペースではなく、半角スペースだったんですね。
htmlの仕様上、タブとか半角スペースが複数連続していても半角スペース1つにまとめられてしまうんです。
なので、""内の半角スペースが投稿の段階で消えてしまったのでしょう。
半角スペースの部分を全部半角で&nbsp;と書くときちんと半角スペースになります。
Re:ズザギコ アニメーション
Posted: 2006年10月16日(月) 00:51
by 管理人
あ~それでですか。
ソースの投稿方法は別トピで新しく紹介したので、そちらをご覧ください^^
Re:ズザギコ アニメーション
Posted: 2006年10月16日(月) 12:11
by バグ
ちょっと修正しました(^_^;)
#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:ズザギコ アニメーション
Posted: 2006年10月16日(月) 12:19
by バグ
あ、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:ズザギコ アニメーション
Posted: 2006年10月16日(月) 12:58
by バグ
そうそう、昔作ったので、こんなのもありました。ずっと見ていると、なんとなく癒される気がします(笑)
#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:ズザギコ アニメーション
Posted: 2006年10月16日(月) 13:00
by バグ
あ、そうだ。↑のプログラム、動いている時に、Windowの大きさを変えてみて下さい。どうでも良い部分に妙にこだわってみました(^_^;)
Re:ズザギコ アニメーション
Posted: 2006年10月16日(月) 20:12
by 管理人
おぉ~、画面の端っこって判定できるんですね^^
コレ応用したらブロック崩しできそう^^
コンソールといえどもあなどれませんねぇw
きっと
y=x;の次は
y=2x
しかあらわせないんでしょうね^^;
しかしコンソールでこれだけできるとは驚きです^^