ワーブル・トレインです。うねうね動くプログラムです。
ソースは「ゲームショートプログラム」のベーシックリストを参考にしてます。
ワーブルの意味が分かりません。ベルギー?
devkitPro - NDS 版
・ビルド手順
1. 下記ソースを *.c ファイルに保存。 2. /* コンパイラ_ターゲットの選択設定 */ の部分にある #define _VC2010_WIN_ をコメントアウトして、 #define _DEVKITPRO_NDS_ のコメントアウトを取り除く。 3. devkitPro/examples/nds/templates/arm9 等のテンプレートプロジェクトを流用して ./source/main.c を *.c と差し替える。 4. Makefile のリンクオプションに "-lm" を追記してビルド。 LIBS := -lnds9 -lm
Visual C++ 2010 - Win32 コンソール版
・ビルド手順
1. 下記ソースを *.c ファイルに保存。 2. /* コンパイラ_ターゲットの選択設定 */ の部分にある #define _DEVKITPRO_NDS_ をコメントアウトして、 #define _VC2010_WIN_ のコメントアウトを取り除く。 3. ファイル-新規作成-プロジェクト-Win32 コンソール アプリケーション で空のプロジェクト作って ソース ファイル-追加-既存の項目 で *.c を追加してビルド。
main.c
/*--------------------------------------------------------------------------------- WavreTrain version 0.01 Dec 07, 2011 By REGEKATU ---------------------------------------------------------------------------------*/ /* コンパイラ_ターゲットの選択設定 */ //#define _VC2010_WIN_ #define _DEVKITPRO_NDS_ /* インクルードヘッダ設定 */ #include <math.h> #include <stdio.h> #include <string.h> #ifdef _VC2010_WIN_ #include <Windows.h> #endif #ifdef _DEVKITPRO_NDS_ #include <nds.h> #endif /* ブール型定義 */ #ifndef bool #define bool unsigned char #endif #ifndef true #define true 1 #endif #ifndef false #define false 0 #endif /* コンソール定数 */ #ifdef _VC2010_WIN_ #define CONSOLE_WIDTH 80 /* 表示環境の横表示可能文字数*/ #define CONSOLE_HEIGHT 25 /* 表示環境の縦表示可能文字数*/ #endif #ifdef _DEVKITPRO_NDS_ #define CONSOLE_WIDTH 32 /* 表示環境の横表示可能文字数*/ #define CONSOLE_HEIGHT 24 /* 表示環境の縦表示可能文字数*/ #endif typedef enum{ /* setColor 関数用色定義 */ L_BLACK = 0, /* \x1b[30m 低輝度・黒色 */ L_BLUE, /* \x1b[34m 低輝度・青色 */ L_GREEN, /* \x1b[32m 低輝度・緑色 */ L_CYAN, /* \x1b[36m 低輝度・水色 */ L_RED, /* \x1b[31m 低輝度・赤色 */ L_PURPLE, /* \x1b[35m 低輝度・紫色 */ L_YELLOW, /* \x1b[33m 低輝度・黄色 */ L_WHITE, /* \x1b[37m 低輝度・白色 */ H_BLACK, /* \x1b[40m 高輝度・黒色 */ H_BLUE, /* \x1b[44m 高輝度・青色 */ H_GREEN, /* \x1b[42m 高輝度・緑色 */ H_CYAN, /* \x1b[46m 高輝度・水色 */ H_RED, /* \x1b[41m 高輝度・赤色 */ H_PURPLE, /* \x1b[45m 高輝度・紫色 */ H_YELLOW, /* \x1b[43m 高輝度・黄色 */ H_WHITE /* \x1b[47m 高輝度・白色 */ }COLOR; /* ユーザ定数 */ #define DRAW_WIDTH CONSOLE_WIDTH /* 描画情報横幅 */ #define DRAW_HEIGHT CONSOLE_HEIGHT /* 描画情報縦幅 */ #define DRAW_CENTER (DRAW_WIDTH / 2) /* 描画範囲中心点 */ #define DRAW_RADIUS (DRAW_CENTER - (DRAW_CENTER / 4)) /* 描画範囲半径幅 */ /* コンソール変数 */ #ifdef _VC2010_WIN_ HANDLE hOut; /* コンソールスクリーンバッファのハンドル */ COORD dwPos; /* コンソールスクリーンカーソル指定用構造体 */ CONSOLE_SCREEN_BUFFER_INFO csbi; /* コンソールスクリーンバッファ情報の構造体 */ DWORD written; /* 書き込まれたセル数へのポインタ */ #endif /* ユーザ変数 */ int seed; /* サインカーブ用シード値 */ int draw_buffer[DRAW_WIDTH * DRAW_HEIGHT]; /* 描画情報用配列 */ /* メイン関数 */ int main(void); /* メインプログラム */ /* ユーザ関数 */ void init(void); /* プログラムを初期化する */ void draw(void); /* プログラム画面を表示する */ void update(void); /* プログラムを更新する */ /* コンソール関数 */ void setLocate(int x, int y); /* 文字の表示位置を設定する */ void setColor(int fore, int back); /* 文字の表示色、背景色を設定する */ void clearScreen(void); /* コンソール画面を消去する */ //--------------------------------------------------------------------------------- int main(void){ //--------------------------------------------------------------------------------- /* メインプログラム */ /* コンソールを初期化する */ #ifdef _VC2010_WIN_ hOut = GetStdHandle(STD_OUTPUT_HANDLE); #endif #ifdef _DEVKITPRO_NDS_ consoleDemoInit(); #endif /* プログラムを初期化する*/ init(); /* メインループ */ while(1){ /* プログラムを一定間隔で更新する */ #ifdef _VC2010_WIN_ Sleep(16); #endif #ifdef _DEVKITPRO_NDS_ swiWaitForVBlank(); #endif /* プログラム画面を表示する */ draw(); /* プログラムを更新する */ update(); } } //--------------------------------------------------------------------------------- void init(void){ //--------------------------------------------------------------------------------- /* プログラムを初期化する */ /* 画面を消去する */ clearScreen(); /* 描画情報を初期化する */ memset(&draw_buffer, 0x00, sizeof(draw_buffer)); /* プログラムの初期値を設定する */ seed = 0; } //--------------------------------------------------------------------------------- void draw(void){ //--------------------------------------------------------------------------------- /* プログラム画面を表示する */ int x, y; setLocate(0, 0); for(y = 0;y < DRAW_HEIGHT;y++){ for(x = 0;x < DRAW_WIDTH;x++){ if(draw_buffer[x + y * DRAW_WIDTH]){ setColor(draw_buffer[x + y * DRAW_WIDTH], L_BLACK); printf("*"); }else{ printf(" "); } } if(x < CONSOLE_WIDTH) printf("\n"); } } //--------------------------------------------------------------------------------- void update(void){ //--------------------------------------------------------------------------------- /* プログラムを更新する */ int i, x; /* 描画情報を1ライン分進める */ for(i = DRAW_WIDTH;i < DRAW_WIDTH * DRAW_HEIGHT;i++) draw_buffer[ i - DRAW_WIDTH ] = draw_buffer[i]; /* 新しい描画情報を更新する */ for(i = 0;i < 8;i++){ x =(int)( DRAW_CENTER + DRAW_RADIUS * sin( (double)seed / 10 * ((double)i / 10 + 1) ) ); draw_buffer[ x + (DRAW_HEIGHT - 2) * DRAW_WIDTH ] = i; } seed++; } //--------------------------------------------------------------------------------- void setLocate(int x, int y){ //--------------------------------------------------------------------------------- /* 文字の表示位置を設定する */ #ifdef _VC2010_WIN_ dwPos.X = (short)x; dwPos.Y = (short)y; SetConsoleCursorPosition(hOut, dwPos); #else printf("\x01b[%d;%dH", y, x); #endif } //--------------------------------------------------------------------------------- void setColor(int fore, int back){ //--------------------------------------------------------------------------------- /* 文字の表示色、背景色を設定する */ /* 下位 4 ビットを色番号として使用する */ fore &= 0x0f; back &= 0x0f; #ifdef _VC2010_WIN_ SetConsoleTextAttribute( hOut, (WORD)fore + ((WORD)back << 4) ); #else static const int font_color[] = { 30, 34, 32, 36, 31, 35, 33, 37, 40, 44, 42, 46, 41, 45, 43, 47 }; static const int back_color[] = { RGB15( 0, 0, 0), //30 normal black RGB15( 0, 0, 15), //34 normal blue RGB15( 0, 15, 0), //32 normal green RGB15( 0, 15, 15), //36 normal cyan RGB15(15, 0, 0), //31 normal red RGB15(15, 0, 15), //35 normal magenta RGB15(15, 15, 0), //33 normal yellow RGB15(24, 24, 24), //37 normal white RGB15(15, 15, 15), //40 bright black RGB15( 0, 0, 31), //44 bright blue RGB15( 0, 31, 0), //42 bright green RGB15( 0, 31, 31), //46 bright cyan RGB15(31, 0, 0), //41 bright red RGB15(31, 0, 31), //45 bright magenta RGB15(31, 31, 0), //43 bright yellow RGB15(31, 31, 31) //47 & 39 bright white }; printf("\x1b[%dm", font_color[fore]); BG_PALETTE_SUB[0] = back_color[back]; #endif } //--------------------------------------------------------------------------------- void clearScreen(void){ //--------------------------------------------------------------------------------- /* コンソール画面を消去する */ #ifdef _VC2010_WIN_ dwPos.X = 0; dwPos.Y = 0; if(GetConsoleScreenBufferInfo(hOut, &csbi)) FillConsoleOutputCharacter(hOut, ' ', csbi.dwSize.X * csbi.dwSize.Y, dwPos, &written); #else printf("\x1b[2J"); #endif } //---------------------------------------------------------------------------------