[Game Maker Adventure] Chương 015: Lên trình: Console và string

Rất nhiều trò có thể làm với string, hãy tiếp tục cùng Kurobo tìm hiểu bí ẩn của nó nhé.

Tóm tắt chương trước

Bạn bắt đầu thuần thục hơn các kĩ năng của bản thân mình.

Kurobo cũng có thể trợ giúp bạn chiến đấu.

Giờ còn gì phải sợ nữa! Đến giờ thám hiểm rồi!

Kiến thức chương này

  • Tuỳ biến Console App với BackgroundColor, ForegroundColor, Clear, Title và Beep!
  • string và String về cơ bản có thể sử dụng tương đương nhau nhưng kiểu string được khuyên dùng hơn.
  • string literals chính là chuỗi các kí tự. Có thể được viết dưới ba dạng: Quoted, Verbatim và Raw.
  • Raw string literals chỉ có thể sử dụng từ bản C#11 (.NET 7.0) trở lên.
  • Format strings là đoạn string có nội dung động trong quá trình chạy.
  • Có hai phương pháp tạo Format strings: String interpolationComposite formatting.
  • Căn chỉnh string: số và chữ.

Cốt truyện

“Hoả lực thật mạnh!” – Kurobo cảm thán.

“Kurobo có thể sấy cả goblin king không biết chừng! Gehehe~” – Kurobo lại cảm thán.

“Chủ nhân, người đừng bắt Kurobo phải gánh đấy nhé.” – Kurobo lại tiếp tục.

Dường như, việc nâng cấp phần mềm cũng khiến Kurobo nói nhiều hơn.

Hoặc là.

Bạn làm sai ở đâu rồi!?

Các lệnh trong Console

Console.BackgroundColor và Console.ForegroundColor

Console.BackgroundColor là màu đằng sau chữ cái in lên trên màn hình console app. Màu mặc định là màu đen.

Console.ForegroundColormàu của chữ cái in lên trên màn hình console app. Màu mặc định là màu xám.

Cả 2 đều là Property. Ở chương này, có thể hiểu đơn giản property là biến cũng được. Để gán giá trị cho Property, 2 vế phải cùng kiểu.

Khác với Method, Property khi gọi ra không có dấu ngoặc đơn.

VD:

Console.WriteLine(">>>>>>>> Default: Black Background, Gray Text <<<<<<<<");
Console.BackgroundColor = ConsoleColor.Red;
Console.WriteLine(">>>>>>>> Set Background to Red <<<<<<<<");
Console.ForegroundColor = ConsoleColor.Black;
Console.WriteLine(">>>>>>>> Also set Text to Black <<<<<<<<");

Đoạn code trên sẽ có kết quả như sau:

Ngoài ra, Visual Studio cũng sẽ gợi ý rất nhiều các option khác, hãy tự thử nhé.

Console.Clear();

Method Console.Clear(); được sử dụng để xoá toàn bộ mọi thứ đã in trên màn hình.

Chẳng hạn:

Console.WriteLine("Before");
Console.Clear();
Console.WriteLine("After Clear");

Kết quả:

After Clear

Console.Title

Dùng để thay đổi tên Console App.

Console.Title = "GAME MAKER ADVENTURE!";

Kết quả:

Console.Beep()

Đến giờ sáng tạo rồi!

Một điều cực kì thú vị trong C# đó là bạn hoàn toàn có thể chơi những bản nhạc trong Console App bằng cách sử dụng Console.Beep();!

À thì… tất nhiên là không thể xập xình như nhạc hiện đại nhưng cũng rất thú vị đấy. Công thức: Console.Beep(<<tần số>>,<<độ dài theo ms>>);

Hãy chạy thử đoạn code dưới đây nhé.

Console.Beep(658, 125); Console.Beep(1320, 500); Console.Beep(990, 250); Console.Beep(1056, 250); Console.Beep(1188, 250); Console.Beep(1320, 125); Console.Beep(1188, 125); Console.Beep(1056, 250); Console.Beep(990, 250); Console.Beep(880, 500); Console.Beep(880, 250); Console.Beep(1056, 250); Console.Beep(1320, 500); Console.Beep(1188, 250); Console.Beep(1056, 250); Console.Beep(990, 750); Console.Beep(1056, 250); Console.Beep(1188, 500); Console.Beep(1320, 500); Console.Beep(1056, 500); Console.Beep(880, 500); Console.Beep(880, 500); Thread.Sleep(250); Console.Beep(1188, 500); Console.Beep(1408, 250); Console.Beep(1760, 500); Console.Beep(1584, 250); Console.Beep(1408, 250); Console.Beep(1320, 750); Console.Beep(1056, 250); Console.Beep(1320, 500); Console.Beep(1188, 250); Console.Beep(1056, 250); Console.Beep(990, 500); Console.Beep(990, 250); Console.Beep(1056, 250); Console.Beep(1188, 500); Console.Beep(1320, 500); Console.Beep(1056, 500); Console.Beep(880, 500); Console.Beep(880, 500); Thread.Sleep(500); Console.Beep(1320, 500); Console.Beep(990, 250); Console.Beep(1056, 250); Console.Beep(1188, 250); Console.Beep(1320, 125); Console.Beep(1188, 125); Console.Beep(1056, 250); Console.Beep(990, 250); Console.Beep(880, 500); Console.Beep(880, 250); Console.Beep(1056, 250); Console.Beep(1320, 500); Console.Beep(1188, 250); Console.Beep(1056, 250); Console.Beep(990, 750); Console.Beep(1056, 250); Console.Beep(1188, 500); Console.Beep(1320, 500); Console.Beep(1056, 500); Console.Beep(880, 500); Console.Beep(880, 500); Thread.Sleep(250); Console.Beep(1188, 500); Console.Beep(1408, 250); Console.Beep(1760, 500); Console.Beep(1584, 250); Console.Beep(1408, 250); Console.Beep(1320, 750); Console.Beep(1056, 250); Console.Beep(1320, 500); Console.Beep(1188, 250); Console.Beep(1056, 250); Console.Beep(990, 500); Console.Beep(990, 250); Console.Beep(1056, 250); Console.Beep(1188, 500); Console.Beep(1320, 500); Console.Beep(1056, 500); Console.Beep(880, 500); Console.Beep(880, 500); Thread.Sleep(500); Console.Beep(660, 1000); Console.Beep(528, 1000); Console.Beep(594, 1000); Console.Beep(495, 1000); Console.Beep(528, 1000); Console.Beep(440, 1000); Console.Beep(419, 1000); Console.Beep(495, 1000); Console.Beep(660, 1000); Console.Beep(528, 1000); Console.Beep(594, 1000); Console.Beep(495, 1000); Console.Beep(528, 500); Console.Beep(660, 500); Console.Beep(880, 1000); Console.Beep(838, 2000); Console.Beep(660, 1000); Console.Beep(528, 1000); Console.Beep(594, 1000); Console.Beep(495, 1000); Console.Beep(528, 1000); Console.Beep(440, 1000); Console.Beep(419, 1000); Console.Beep(495, 1000); Console.Beep(660, 1000); Console.Beep(528, 1000); Console.Beep(594, 1000); Console.Beep(495, 1000); Console.Beep(528, 500); Console.Beep(660, 500); Console.Beep(880, 1000); Console.Beep(838, 2000);

Credit: [Reddit]

Lên trình string

string và… String

Trong C#, string (viết thường chữ s) còn được biết đến cái tên System.String hoặc String (viết hoa chữ S).

Chúng khác nhau ở chỗ, 1 bên là kiểu string, 1 bên là class String. Khi gõ trong Visual Studio, bạn sẽ thấy màu sắc của chúng khác nhau.

Cả 2 đều có thể in ra như bình thường

string và String về cơ bản có thể sử dụng tương đương nhau nhưng kiểu string được khuyên dùng hơn vì không cần khai báo namespace System; (chúng ta sẽ học thêm về namespace ở các chương sau).

string literals (chuỗi string)

string literals chính là chuỗi các kí tự. Có thể được viết dưới ba dạng sau:

  1. Quoted (dịch ngựa: trích dẫn)
  2. Verbatim (dịch ngựa: nguyên bản)
  3. Raw (dịch ngựa: thô)
Quoted string literal (chuỗi string dạng Quote)

Quoted string literal bắt đầu và kết thúc bằng dấu ngoặc kép – quote (“) trên cùng một dòng. Đây chính là chuỗi string được sử dụng từ đầu tới giờ.

string example = "You are beautiful!";

Nếu bạn xuống dòng, Visual Studio sẽ tự động thêm “quote” cho bạn:

string example = "You" +
    " are " +
    "beautiful!";

Tuy vậy, nhiều kí tự đặc biệt mà quote string literal không thể hiển thị được. Chẳng hạn ” và \.

Đoạn code dưới đây sẽ không chạy được:

Để viết các kí tự đặc biệt, bạn sẽ cần thêm escape sequence (chuỗi thoát) theo bảng dưới:

Escape SequenceDùng đểUnicode UTF-16
\’viết dấu nháy đơn0027
\”viết dấu ngoặc kép0022
\\viết dấu gạch chéo ngược005C
\nxuống dòng000A
\ttab ngang0009
\vtab dọc000B
\u+mã unicode UTF-16 để viết kí tự có mã unicode UTF-16 tương ứng.
VD: \u0027 sẽ ra dấu nháy đơn.

Ta có thể viết lại đoạn code trên như sau:

string example = "You are beautiful! - \"GNL\" said";
string example2 = "C:\\Users\\GNL\\OneDrive\\Desktop\\GNL.txt";
Verbatim string literal (chuỗi string dạng nguyên bản)

Verbatim string literal cho phép bạn viết đoạn văn mà không cần các ký tự đặc biệt như \.

Verbatim string literal bắt đầu bằng @.

Để thể hiện dấu ngoặc kép, bạn sẽ cần 2 dấu ngoặc kép trong Verbatim string literal.

string quotedString = "This is a \n\"quoted\" string.";
string verbatimString = @"This is a 
""verbatim"" string.";

Console.WriteLine(quotedString);
Console.WriteLine(verbatimString);

Kết quả:

Verbatim string literal đặc biệt hữu dụng khi gọi đường dẫn file.

string fileLocation = @"C:\Users\GNL\OneDrive\Desktop\GNL.txt";
Raw string literal (chuỗi string dạng thô)

Khi tạo project, ta được chọn .NET6 (C#10) hoặc .NET7 (C#11). Chỉ từ C#11 (.NET7.0) trở lên mới hỗ trợ raw string literal.

Raw string literal có thể chứa bất kì đoạn văn nào, input và output của raw string literal sẽ giống nhau.

Raw string literal được đặt trong tối thiểu ba dấu ngoặc kép (“””):

string example = """There is no better place to learn about "games" than @Gamesnhalam """;
string example = """
    Hello!
    There is no better place to learn about games than @Gamesnhalam
    - certainly "GNL" said.
    """;

Console.WriteLine(example);

Kết quả:

Raw string literal có thể thể hiện chính xác các khoảng trống:

string jsonString = """
{
  "Enemy Ranger": {
    "HP": {
      "High": 50,
      "Low": 40
    },
            },
}
""";

Kết quả:

Format strings

Format strings là đoạn string có nội dung động trong quá trình chạy. Chẳng hạn nhập tên của người chơi sau đó in ra lời chào trên màn hình:

Console.WriteLine("Let me know your name:");
string name = Console.ReadLine();
string output = $"Welcome {name}";

Console.WriteLine(output);

Kết quả:

Format strings được tạo bằng cách đưa 1 biến vào giữa dấu ngoặc nhọn {…}. Khi khởi chạy, chương trình sẽ lấy giá trị của biến đó để in ra màn hình.

Có hai phương pháp tạo Format strings:

  1. String interpolation (kiểu nội suy)
  2. Composite formatting (kiểu tổng hợp)

String interpolation

String interpolation bắt đầu bằng $, sau đó đưa biến vào giữa dấu ngoặc nhọn trong đoạn văn bản (thí dụ bên trên).

Khi dùng string interpolation với verbatim string literal, chỉ cần thêm $ vào trước là được. VD:

string name = "GNL";
string output = $@"Welcome {name}";

Kết quả:

Đặc biệt, từ phiên bản C#11 trở lên, khi sử dụng string interpolation chung với Raw string literal, số lượng dấu $ sẽ phải bằng số lượng dấu ngoặc nhọn {…}.

string name = "GNL";
string output1 = $"""Welcome {name}""";
string output2 = $$"""Welcome {{name}}""";
string output3 = $$$"""Welcome {{{name}}}""";

Console.WriteLine(output1);
Console.WriteLine(output2);
Console.WriteLine(output3);

Kết quả:

Composite formatting

Ta có thí dụ sau:

string name = "GNL";
int age = 13;

Console.WriteLine("Welcome {0}, Y-Y-You! YOU ARE JUST {1}!?", name, age);

Kết quả:

Về cơ bản, composite formatting sẽ ném tất cả biến xuống cuối cùng. Khá khó đọc nếu bạn quen dùng string interpolation.

Composite formatting vẫn có thể kết hợp bình thường với verbatim string literal và raw string literal. Hệ thống sẽ tự động thay thế {0}, {1}… bằng các biến của bạn.

Alignment (căn chỉnh)

Format strings cũng hay đấy, nhưng bạn đã nghĩ tới việc căn chỉnh nó giống file word hay excel chưa?

Alignment cho phép bạn căn chỉnh string trong khu vực mong muốn. Cực kì phù hợp để khởi tạo danh sách hoặc bảng biểu:

string name1 = "The Badass";
string name2 = "A deadly Fish";
string name3 = "Broken mirror";

Console.WriteLine($"#1: {name1,20}");
Console.WriteLine($"#2: {name2,20}");
Console.WriteLine($"#3: {name3,20}");

Kết quả:

20 chính là số lượng kí tự mà chương trình tạo ra để viết name1, name2, name3, nếu không đủ nó sẽ tạo thêm khoảng trắng để lấp thêm cho đủ.

Còn với số thì sao?

Trong một số trường hợp, bạn có thể sẽ tạo ra những con số dài ngoài mong đợi. VD phần trăm hoàn thành map là 1/3 = 33.333333….%. Khi in chúng ra màn hình, bạn sẽ không thể kiểm soát độ dài của chúng.

Hãy giới hạn số lượng số như sau:

float number = 2.3123123f;
float percent = 1f / 3f;

Console.WriteLine($"Number: {number:#.###}");
Console.WriteLine($"Percent: {percent:#.##%}");

Kết quả:

Ngoài ra, C# cũng có các kí hiệu gõ tắt thông dụng. P là #.##%, F là #.##, F3 là #.###

Đoạn code trên có thể viết lại thành:

float number = 2.3123123f;
float percent = 1f / 3f;

Console.WriteLine($"Number: {number:F3}");
Console.WriteLine($"Percent: {percent:P}");

Quest: Thế giới trong sách (Lại)

Quest: Thế giới trong sách ✦✦✧✧✧

Cho tới nay, bạn không biết khi nào thì bản thân sẽ bị hút vào thế giới cổ thư.

Nhưng bạn lại xuất hiện ở đây rồi nè.

/3
You must log in to pass this quiz.

Chương Trước | Tổng quan | Chương Kế

Kurrwo

Công nhân👷gõ 💬 văn bản ⌨️ trò chơi 🎮 điện tử 📱 👏👏👏

Post navigation

Subscribe
Notify of
0 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments