【C#】リバーシやテトリスとかに使える簡単なコンソール描画

# 目的
コンソール画面でアルゴリズムを視覚化するための描画処理の作成

# 目次
1. 目標
2. 作成
3. 完成
4. 応用
5. まとめ

# 目標
- コンソール画面に四角形を複数表示ができる
- 縦と横の四角形の数を指定できる
- 並べた四角形の色を自由に設定できる

# 作成
```csharp
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Drawing;

/// <summary>
/// コンソール描画
/// </summary>
namespace ConsoleDrawer
{
    /// <summary>
    /// 四角形描画処理
    /// </summary>
    public class SquareDrawer
    {
        private ConsoleColor[,] canvas;
        private int width;
        private int height;

        /// <summary>
        /// コンストラクタ
        /// </summary>
        /// <param name="width">幅</param>
        /// <param name="height">高さ</param>
        public SquareDrawer(int width, int height)
        {
            Console.CursorVisible = false;
            Console.BackgroundColor = ConsoleColor.Black;
            this.width = width;
            this.height = height;
            canvas = new ConsoleColor[height, width];

            for (int i = 0; i < height; i++)
            {
                for (int j = 0; j < width; j++)
                {
                    canvas[i, j] = ConsoleColor.Black;
                }
            }
        }
        
        /// <summary>
        /// 四角形描画
        /// </summary>
        /// <param name="color">文字色</param>
        private void DrawSquare(ConsoleColor color)
        {
            Console.ForegroundColor = color;
            Console.Write("■");
        }

        /// <summary>
        /// すべての四角形の描画
        /// </summary>
        public void DrawAllSquare()
        {
            Console.ForegroundColor = ConsoleColor.Black;
            Console.SetCursorPosition(0, 0);

            for (int i = 0; i < height; i++)
            {
                for (int j = 0; j < width; j++)
                {
                    DrawSquare(canvas[i, j]);
                }
                Console.Write("\n");
            }
        }

        /// <summary>
        /// 文字色の指定
        /// </summary>
        /// <param name="color">文字色</param>
        /// <param name="position">位置</param>
        public void SetColor(ConsoleColor color, Point position)
        {
            canvas[position.Y, position.X] = color;
        }

        /// <summary>
        /// 文字色の指定
        /// </summary>
        /// <param name="color"></param>
        /// <param name="x">横の位置</param>
        /// <param name="y">縦の位置</param>
        public void SetColor(ConsoleColor color, int x, int y)
        {
            SetColor(color, new Point(x, y));
        }
    }
}

```

# 完成
```csharp
using System;
using System.Threading;
using System.Drawing;
using ConsoleDrawer;

namespace Test
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.Title = "テスト";
            SquareDrawer drawer = new SquareDrawer(6, 6);
            
            while (true)
            {
                // アルゴリズムはこの中で動かす

                // 色を指定
                drawer.SetColor(ConsoleColor.White, 0, 1);
                drawer.SetColor(ConsoleColor.Yellow, 0, 0);
                drawer.SetColor(ConsoleColor.Blue, 5, 0);
                drawer.SetColor(ConsoleColor.Green, 5, 5);

                drawer.DrawAllSquare();
                Thread.Sleep(500);
            }
        }
    }
}
```
描画するとこんな感じになります。
<img width="736" alt="キャプチャ.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/550435/105d3331-3c4c-3abe-b2a3-7eb8a10b4e4a.png">



# 応用
- 四角形ではなく丸に
  - リバーシにも使える
- 任意の図形に変更
  - より広くいろいろなアルゴリズムを扱えるようになる?

# まとめ
アルゴリズムを純粋に考えたい時ように今回のものをつくりました。
c#独自のものはあまり使っていないので、他の言語にも参考になればいいと思っています。