C
C++
cli

C++で雪を降らす(?)CLIアプリケーション


はじめに

休日だしC++で何かできないかなと思ったところ,「プログラミングを学習するために技術力より難しすぎることをすると断念する」という言葉を見かけたので,簡単ながら結果を視覚的に見ることができるものを模索した.

そこで,「ターミナルで雪を降らせる」という内容を考えた.雪とは*のこととした.


コード

実際の雪を降らせるプログラムは以下である.


snow.cpp

#include <iostream>

#include <vector>
#include <thread>
#include <random>
using namespace std;
#include <color.hpp>

int snowwing(vector<vector<char> >&);
int displaySnow(vector<vector<char> >&);

int main(int argv, char **argc){
const int R = 100;
const int C = 50;
const int sleepTime = 10;
vector<vector<char> > snow (C, vector<char>(R, ' '));

while(1){
snowwing(snow);
system("clear");
displaySnow(snow);
this_thread::sleep_for(chrono::milliseconds(sleepTime));
}
return 0;
}

int snowwing(vector<vector<char> > &snow){
for(int i=1; i<snow.size(); i++){
snow[snow.size()-i] = snow[snow.size()-i-1];
}
for(int i=0; i<snow.front().size(); i++){
if(rand()%20 == 0){
snow[0][i] = '*';
}else{
snow[0][i] = ' ';
}
}
return 0;
}

int displaySnow(vector<vector<char> > &snow){
for(int i=0; i<snow.size(); i++){
for(int j=0; j<snow.front().size(); j++){
cout << CYAN << snow[i][j] << RESET;
}
cout << endl;
}
return 0;
}



color.hpp

#define RESET   "\033[0m"

#define BLACK "\033[30m"
#define RED "\033[31m"
#define GREEN "\033[32m"
#define YELLOW "\033[33m"
#define BLUE "\033[34m"
#define MAGENTA "\033[35m"
#define CYAN "\033[36m"
#define WHITE "\033[37m"
#define BOLDBLACK "\033[1m\033[30m"
#define BOLDRED "\033[1m\033[31m"
#define BOLDGREEN "\033[1m\033[32m"
#define BOLDYELLOW "\033[1m\033[33m"
#define BOLDBLUE "\033[1m\033[34m"
#define BOLDMAGENTA "\033[1m\033[35m"
#define BOLDCYAN "\033[1m\033[36m"
#define BOLDWHITE "\033[1m\033[37m"

color.hppはcoutで出力する際に色を変更するための値をdefineしたファイルである.

snowwing()関数はvector>型の配列の最上段に一定確率で雪を生成させつつ,雪を一つ下の段にスライドする関数である.

displaySnow()関数は雪の情報が格納されたvector>型の配列をターミナルに出力する関数である.

int型の変数Rは雪の配列の横の文字数を指定し,int型の変数Cは雪の配列の縦の文字数を指定する.int型の変数sleepTimeは雪を降らせる速度を意味する.

system("clear")では画面がずれないために毎回ターミナル画面をclearしている.

this_thread::sleep_for()関数では雪を降らせるための遅延をしている.


実行画面

snowRunMovie.gif