Örnek Console Uygumalaması: Gelişmiş Kutu

C# ve algoritma bilgisini arttırmak isteyen arkadaşlar bu yazıyı inceleyebilirler.

Programda method, anonymous method, if, for, do-while, rastgele sayı üretme, klavye kontrolü, sistem bekletme gibi konulara örnekler bulabilirsiniz.

Programın özellikleri:

  • Console ortamında çift çizgilerden oluşturulan bir kutu çizdiriyoruz.
  • Boşluk tuşu (space bar) ile otomatik/elle kutu hareketi sağlanıyor.
  • PageUp / PageDown tuşları ile kutu hızı ayarlanıyor.
  • Elle hareket modunda, yön tuşları ile kutu hareket ettiriliyor.
  • Shift+yön tuşları ile kutu büyüklüğü/genişliği arttırılıyor/azaltılıyor.
  • Kutu ekran kenarlarına çarpınca renk değiştiriyor.
  • ESC tuşu ile programdan çıkılıyor.

Uygulama kodları:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace KutuUygulamasi
{
    class Program
    {
        static void Yaz(int x, int y, char c)
        {
            Console.CursorLeft = x;
            Console.CursorTop = y;
            Console.Write(c);
        }
        static void Box(int x, int y, int w, int h)
        {
            Console.Clear();
            Yaz(x, y, '?');
            Yaz(x + w - 1, y, '?');
            Yaz(x, y + h - 1, '?');
            Yaz(x + w - 1, y + h - 1, '?');
            for (int i = 1; i < w - 1; i++)
            {
                Yaz(x + i, y, '?');
                Yaz(x + i, y + h - 1, '?');
            }
            for (int i = 1; i < h - 1; i++)
            {
                Yaz(x, y + i, '?');
                Yaz(x + w - 1, y + i, '?');
            }
        }
        static void Main()
        {
            Random rnd = new Random();
            int mw = Console.WindowWidth;
            int mh = Console.WindowHeight;
            int w = 5;
            int h = 5;
            int x = rnd.Next(80 - w);
            int y = rnd.Next(25 - h);
            int artisX = 1;
            int artisY = 1;
            int sure = 50;
            bool oto = true;

            Action CarpmaTest =
            () =>
            {
                if (x == 0 || (x + w == mw) || (y == 0) || (y + h == mh))
                {
                    int rast = rnd.Next(16);
                    Console.ForegroundColor = (ConsoleColor)rast;
                }
            };

            do
            {

                if (Console.KeyAvailable)
                {
                    ConsoleKeyInfo key = Console.ReadKey();
                    if (key.Key == ConsoleKey.Escape)
                        return;
                    if (key.Key == ConsoleKey.Spacebar)
                    {
                        oto = !oto;
                    }
                    if (key.Key == ConsoleKey.PageDown)
                        sure += 10;
                    else if (key.Key == ConsoleKey.PageUp)
                    {
                        if (sure > 10)
                            sure -= 10;
                    }
                    else if (key.Modifiers == ConsoleModifiers.Shift && key.Key == ConsoleKey.RightArrow)
                    {
                        if (x + w < mw) w++;
                    }
                    else if (key.Modifiers == ConsoleModifiers.Shift && key.Key == ConsoleKey.LeftArrow)
                    {
                        if (w > 2) w--;
                    }
                    else if (key.Modifiers == ConsoleModifiers.Shift && key.Key == ConsoleKey.UpArrow)
                    {
                        if (y + h < mh) h++;
                    }
                    else if (key.Modifiers == ConsoleModifiers.Shift && key.Key == ConsoleKey.DownArrow)
                    {
                        if (h > 2) h--;
                    }

                    if (!oto)
                    {
                        if (key.Key == ConsoleKey.RightArrow)
                        {
                            if (x + w < mw)
                                x++;
                            else
                                artisX = -1;
                        }
                        else if (key.Key == ConsoleKey.LeftArrow)
                        {
                            if (x > 0)
                                x--;
                            else
                                artisX = 1;
                        }
                        else if (key.Key == ConsoleKey.DownArrow)
                        {
                            if (y + h < mh)
                                y++;
                            else
                                artisY = -1;
                        }
                        else if (key.Key == ConsoleKey.UpArrow)
                        {
                            if (y > 0)
                                y--;
                            else
                                artisY = 1;
                        }
                        CarpmaTest();
                    }
                }
                Box(x, y, w, h);

                if (oto)
                {
                    if (artisX == 1)
                    {
                        if (x + w < mw)
                            x++;
                        else
                            artisX = -1;
                    }
                    else
                    {
                        if (x > 0)
                            x--;
                        else
                            artisX = 1;
                    }

                    if (artisY == 1)
                    {
                        if (y + h < mh)
                            y++;
                        else
                            artisY = -1;
                    }
                    else
                    {
                        if (y > 0)
                            y--;
                        else
                            artisY = 1;
                    }
                    System.Threading.Thread.Sleep(sure);
                    CarpmaTest();
                }
                else
                {
                    while (!Console.KeyAvailable) ;
                }

            } while (true);

        }
    }
}

 

Merak edenler için ascii karakter tablosu:

Programın kodlarını incelediyseniz ben de bir soru sorayım:

CarpmaTest isimli anonymous methods (isimsiz metod) u neden kullanmış olabilirim?

Cevabını beğendiğim ilk 3 kişiye MyPageX'ten %100 indirim kuponu vereceğim.

Program kodlarını buradan indirebilirsiniz.

Herkese kolay gelsin.