0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Last updated at Posted at 2020-05-19

目的

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

目次

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

目標

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

作成

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));
        }
    }
}

完成

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);
            }
        }
    }
}

描画するとこんな感じになります。
キャプチャ.PNG

応用

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

まとめ

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

0
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?