【C++】windows用にSLコマンドを作りました

C++

 昔、職場のCentOSにSLコマンドを仕込まれて、先輩から「ディレクトリを見るにはSLコマンドだよ」と騙されたことを思い出しました。
 Windowsでは使えないのですが、無いなら作ろうと思い、久しぶりにC言語で作ってみました。
 ジョークソフトなので何の役にも立ちませんが、アスキーアートを修正すれば職場を沸かせられるのではないでしょうか。

●環境

 windows11
 C++(time.hがあれば、Cでも動くと思います)

●ダウンロード

当開発環境でコンパイルしたものをここに置いておきます。

Hash SHA1 ed1b6d7f0c9674111e8b7979a21f23f242a3788e

●ソース

 ファイル名はsl_win.cpp で作成しました。(sl.cppにするとトロイの木馬に認定されることがあります)
 アスキーアートを簡単に変更できるように、配列にしてあります。
  SL部分は train(@は背景を透過します)
  背景部分は backGround
を変更してください。
 環境によってDRAW_FPS とTRAIN_SPEED を調整してください。

#include <iostream>

#define SCREEN_WIDTH (100)
#define SCREEN_HEIGHT (10)

#define TRAIN_WIDTH (30)
#define TRAIN_HEIGHT (8)
#define TRAIN_SPEED (3)

//描画のFPW
#define DRAW_FPS (20)
#define DRAW_INTERVAL (1000/DRAW_FPS)

char train[TRAIN_HEIGHT][TRAIN_WIDTH] = {
"@@@@@@oo@O@@@O@@@@@@O@@@@@@@@",
"@@@@o@@@@@@@@@@@@@@@@@@@@@@@@",
"@@@*@@@@@@@@@@@@@@@@@@@@@@@@@",
"@@@+@@@[---##@@@@@@@@@@@@@@@@",
"@@||@@@||[ ]|@|=@@@@@@@@@@@@@",
"[+++_*@_|_++]+|==*******##*]@",
"//-|o|=@|o|-]@|++o@@@@@o++|]@",
"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" 
};

char backGround[SCREEN_HEIGHT][SCREEN_WIDTH] = {
"                                                                                                   ",
"   ~   _-    /+    ~   //#                                                                         ",
"      / +_//  **     //   ###                                                                      ",
"     /         *## ==       ####~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~##",
"                              #####%%#%$#%%%%%%%%%%%%%%%%%::........................:::%%%%%%%%####",
"iiyijijjjijiiiiiiwiwiiauijiiiiiiiiiiiiiiiaiaiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiyyj               iiy",
"===================================================================================================",
" //     //     //     //     //     //     //     //     //     //     //     //     //     //     ",
"=WW==wwwy=ij==========vWWwjjwvj=ii=wwii=ijy===wWwWWj=wv=========ji=i=wwi=jij===i=i=wi=ji=ywWwji====",
"                                                                                                   "
};

//改行コード分を末尾に追加
char screen_buffer[SCREEN_HEIGHT * SCREEN_WIDTH + 1 + SCREEN_HEIGHT * 2];

typedef struct {
	int x;
	int y;
}SL;

SL sl;
clock_t lastDrawClock = clock(); //最後に描画した時間

void DrawScreen() {
	//画面削除
	system("cls");
	//描画 bufferを使って一回で書ききる
	printf("%s", screen_buffer);
}

void MakeScreen() {
	int index = 0;
	memset(screen_buffer, '\0', sizeof(screen_buffer));

	for (int y = 0; y < SCREEN_HEIGHT-1; y++) {
		for (int x = 0; x < SCREEN_WIDTH-1; x++) {
			bool onTrain = false;

			//SL内はSLを描画
			if (x >= sl.x && x < sl.x + TRAIN_WIDTH -2) {
				if (y >= sl.y && y < sl.y + TRAIN_HEIGHT-1) {
					onTrain = true;
				}
			}
			int dif_x = x - sl.x;
			int dif_y = y - sl.y;
			if (onTrain && train[dif_y][dif_x] != '@') {
				//SLを書き込む
				screen_buffer[index++] = train[dif_y][dif_x];
			}
			else {
				//背景を書き込む
				screen_buffer[index++] = backGround[y][x];
			}
		}
		screen_buffer[index++] = '\n';
	}
	screen_buffer[index] = '\0'; // 終端文字を追加
}

void init() {
	sl.x = 93;
	sl.y = 1;
	MakeScreen();
	DrawScreen();
}

int main()
{
	init();

	//SLが画面を出るまで繰り返し
	while (sl.x >= - TRAIN_WIDTH) {
		//現在時刻に更新
		clock_t nowClock = clock();

		if (nowClock >= lastDrawClock + DRAW_INTERVAL) {
			lastDrawClock = nowClock;
			MakeScreen();
			DrawScreen();
			sl.x = sl.x - TRAIN_SPEED;
		}
	}
}

●実行結果

SL?が右から左に走っていきます。
絵心がないのは容赦願います。

●参考

 今回作成したSLプログラムですが、アスキーアートの一部がトロイの木馬認定され、実行できないというトラブルに見舞われました。(修正済み)
 現在のソースはコンパイルしてもウィルス検知されませんが、実行ファイルをsl.exeにすると検知されるおそれがあります。
 ウィルス認定されたソースは別のページに貼り付けておくので、原因究明が趣味の方はご覧ください。