Help us understand the problem. What is going on with this article?

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

ysuzuki19
電気電子系の大学院生です. 詳しい人の意見を仰ぐ事とモチベ維持のためにQiitaに少しづつ上げていけたらなと思っています. Qiitaで自分が書いた記事をブラッシュアップしつつGithubPagesに移行していこうと試みているところです。
https://ysuzuki19.github.io
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした