-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathTerminal.cs
145 lines (132 loc) · 6.58 KB
/
Terminal.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
namespace Chapter02.UI.View
{
/*
Terminal aslında kullanıcı ile etkileşimde olunan bir ortam. Genel olarak View olarak ifade edilir.
Bu uygulamanın UI(User Interface) ile ilgili işlerinin toplandığı, View alanı altında konuşlandırılmıştır.
Burada en zoru hangi türü hangi isim alanı(namespace) altına alacağımıza karar vermektir. Bu anlamda genel yazılım
prensipleri ve pratikleri var. Örneğin MVC (Model View Controller) veya MVVM (Model View View Model)
Terminal sınıfının fonksiyonları sadece Console ile çalışır halde. Genel olarak Terminal ile Console sınıfı arasında sıkı bağlı
bir ilişki olduğunu söyleyebiliriz (Thightly Coupled) OOP tarafında mümkün mertebe nesneler arası bağımlılıkları azaltmaya çalışırız.
Buda Losely Coupled olarak geçer. Yani amaç Terminal sınıfının sadece Console ile çalışması değil örneğin bir IoT terminali ile de
çalışması olabilir.
Arada gelen soru üzerine sonrası için bakmamız gereken ilkeler;
SOLID
Single Responsibility
Open Closed
Liskov Substituation
Interface Segregation
Dependency Inversion
Terminal sınıfının tüm üyeleri static olarak tanımlandığından kendisinin de static olması önerilir.
*/
internal static class Terminal
{
/*
SplashScreen herhangibir parametre almayan ve değer döndürmeyen (void) bir metottur.
Main metodu static tanımlanmış bir metot olduğundan, Program sınıfı içindeki SplashScreen metodunun
çağırlabilmesi için onun da static tanımlanması gerekir.
Bir metodu, parametre yapısını farklılaştırarak çoğaltabilir ve aynı isimle kullanabiliriz(Overloading)
Overloading işleminde kural parametre sayısı ve türleri ile alakalıdır(Method Signature)
Eğer aksini belirtmezsek, sınıf üyeleri private erişim belirleyicisine sahiptir (Access Modifiers)
private, public, internal, protected ve protected internal şeklinde 5 temel erişim belirleyicisi vardır.
internal erişim belirleyici sadece tanımlı olduğu proje için kullanımı serbest bırakır.
public ise her yerden erişilebilir anlamındadır.
Aynı/benzer amaca hizmet eden tipleri (class, struct, enum, interface, delegate) aynı namespace çatısında toplamak
veya aynı/benzer amaca hizmet eden üyeleri/members (field, property, method, event, constructor...) aynı tip altında
toplamak, domain anlamında bütünsellik sağlamak için önemlidir.
Örneğin, terminal ekranı ile ilgili yapılacak işleri Terminal isimli bir sınıf altında topladığımız gibi.
*/
internal static void SplashScreen()
{
Console.ForegroundColor = ConsoleColor.Yellow;
Console.WriteLine("************************");
Console.WriteLine("***Wellcome Stranger****");
Console.WriteLine("************************");
Console.ForegroundColor = ConsoleColor.White;
}
internal static void SplashScreen(string playerName)
{
Console.ForegroundColor = ConsoleColor.Yellow;
// Console.WriteLine(new String('*', 24));
Console.Write(GetSmartText('+', 24));
Console.WriteLine("Wellcome {0}", playerName);
Console.WriteLine(new string('*', 24));
Console.WriteLine();
Console.ForegroundColor = ConsoleColor.White;
Console.ReadLine();
}
internal static void ShowMenu()
{
Console.Clear();
Console.WriteLine("Başlat(B)");
Console.WriteLine("Puan Tablosu(P)");
Console.WriteLine("Ayarlar(A)");
Console.WriteLine(GetSmartText('_', 24));
Console.WriteLine("Çıkış(E)");
Console.WriteLine("Bir seçim yapar mısın?");
}
internal static void GetUserInput()
{
/*
Terminal ekranından girdi almanın bir yolu ReadLine metodunu kullanmaktır.
B, A, E, P gibi harfler hiç bilmeyen için bu oyunda neyi ifade ediyor acaba?
*/
var input = Console.ReadLine();
var userInput = input.ToUpper();
switch (userInput)
{
case "B":
Console.WriteLine("Oyun başlıyor...");
break;
case "P":
// Score tablosu çizilen bir metot çağrılır örneğin
Console.WriteLine("Puan Tablosu");
break;
case "A":
// Ayarlar menüsü gösterilir vs
Console.WriteLine("Ayarlar");
break;
case "E":
Console.WriteLine("Oyun sonlandırılıyor");
break;
default:
Console.WriteLine("Seçimini anlayamadım. Lütfen tekrar gel!");
break;
}
//if (userInput == "B")
//{
// Console.WriteLine("Oyun başlıyor...");
//}
//else if (userInput == "P")
//{
// Console.WriteLine("Puan Tablosu");
//}
//else if (userInput == "A")
//{
// Console.WriteLine("Ayarlar");
//}
//else if (userInput == "E")
//{
// Console.WriteLine("Oyun sonlandırılıyor");
//}
//else
//{
// Console.WriteLine("Seçimini anlayamadım. Lütfen tekrar gel!");
//}
}
/*
GetSmartText metodu parametrelere göre bir string üretip döndürür.
*/
static string GetSmartText(char c, int count)
{
string result = string.Empty; // Geriye bir string döneceği için başlangıçta tanımladık.
// count sayısı kadar ileri hareket edecek bir döngü başlattık
//TODO@everyone for döngüsü yerine while, do while döngüleri ile aynı işi yapar mısınız?
for (int i = 0; i < count; i++)
{
result += c; // String'e += ile c argümanını ekledik
}
result += "\n"; // Newline karakteri de ekledik. new line, tab gibi karakterler Escape Character olarak ifade edilip \ ile yazılır.
return result;
}
}
}