昔、職場の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にすると検知されるおそれがあります。
ウィルス認定されたソースは別のページに貼り付けておくので、原因究明が趣味の方はご覧ください。