Run code
- Tải xuống Dart SDK từ đây và cài đặt.
- Viết code trong các file mở rộng .dart
- Chạy code trên terminal
PowerShell 6.2.4 Copyright (c) Microsoft Corporation. All rights reserved. PS C:\Users\Desktop dart code-file.dart
hoặc
Bạn có thể chạy mã trên DartPad hoặc Repl.it (chọn Dart từ các tùy chọn).
Tuy nhiên, hãy nhớ rằng DartPad không cho phép thao tác I/O, trong khi Repl.it thì có
Các bài viết liên quan:
- HTML DOM trong Dart
- Unit testing trong Dart
- Async trong ngôn ngữ Dart
- Isolates trong Dart
- Dart Callable Classes
- Dart Libraries – Thư viện Dart
Bài tập về kiểu dữ liệu
- Tạo biến với các kiểu dữ liệu khác nhau và gán giá trị cho chúng.
- Tạo một mảng và gán giá trị cho mảng đó.
- Tìm kiếm một giá trị trong mảng.
- Sắp xếp một mảng tăng dần hoặc giảm dần.
- Tạo một Map và gán giá trị cho Map đó.
- Tìm kiếm một giá trị trong Map.
- Thêm một phần tử mới vào Map.
- Xóa một phần tử trong Map.
- Sử dụng dynamic để chuyển đổi giữa các kiểu dữ liệu.
- Sử dụng var để tạo một biến với kiểu dữ liệu tự động.
- Tạo biến kiểu chuỗi và in giá trị của biến này.
- Tạo biến kiểu boolean và in giá trị của biến này.
- Tạo biến kiểu List và in giá trị của biến này.
- Tạo biến kiểu Map và in giá trị của biến này.
- Tạo biến kiểu Set và in giá trị của biến này.
- Sử dụng phép gán nhiều biến và in giá trị của các biến này.
- Sử dụng hằng số (constants) và in giá trị của hằng số này.
- Sử dụng toán tử và gán giá trị cho biến sử dụng toán tử và in giá trị của biến này.
Xem thêm 100+ bài tập python
Bài tập sử dụng Các toán tử và các biểu thức trong Dart
Dưới đây là một số bài tập về việc sử dụng các toán tử và các biểu thức trong Dart:
- Tính tổng của hai số nguyên a và b và in ra kết quả.
- Tìm giá trị nhỏ nhất của ba số nguyên a, b, và c.
- Tìm giá trị lớn nhất của ba số nguyên a, b, và c.
- Tìm giá trị trung bình của ba số nguyên a, b, và c.
- Viết chương trình kiểm tra xem một số nguyên có phải là số chẵn hay không.
- Viết chương trình kiểm tra xem một số nguyên có phải là số nguyên tố hay không.
- Viết chương trình tính bậc hai của một số nguyên.
- Viết chương trình tính giai thừa của một số nguyên.
- Viết chương trình kiểm tra xem một năm có phải là năm nhuận hay không.
- Viết chương trình kiểm tra xem một chuỗi có phải là chuỗi palindrome hay không.
10 + Bài tập Dart về conditionals
- Viết một chương trình Dart để kiểm tra xem một số có phải là số chẵn hay là số lẻ.
- Viết một chương trình Dart để kiểm tra xem một số có phải là số âm hay là số dương.
- Viết một chương trình Dart để kiểm tra xem một số có lớn hơn hoặc bằng 0 hay không.
- Viết một chương trình Dart để tính tổng của hai số và kiểm tra xem tổng của hai số có lớn hơn hoặc bằng 0 hay không.
- Viết một chương trình Dart để tìm ra số lớn nhất trong ba số.
- Viết một chương trình Dart để tính diện tích hình tròn dựa trên bán kính và kiểm tra xem diện tích của hình tròn có lớn hơn 0 hay không.
- Viết một chương trình Dart để tính tiền thuế dựa trên tổng thu nhập và mức thuế.
- Viết một chương trình Dart để tìm ra số nhỏ nhất trong một mảng các số.
- Viết một chương trình Dart để kiểm tra xem một chuỗi có phải là chuỗi rỗng hay không.
- Viết một chương trình Dart để kiểm tra xem
10 bài tập Dart về data structures
- Tạo một danh sách số nguyên và in ra màn hình các phần tử trong danh sách.
- Tạo một map của các đôi tượng với các trường tên và giá trị, in ra màn hình các đối tượng trong map.
- Tạo một set của các chuỗi và in ra màn hình tất cả các phần tử trong set.
- Tạo một queue và thực hiện các hoạt động thêm phần tử vào queue, xóa phần tử khỏi queue, và in ra màn hình các phần tử trong queue.
- Tạo một stack và thực hiện các hoạt động thêm phần tử vào stack, xóa phần tử khỏi stack, và in ra màn hình các phần tử trong stack.
- Tạo một linked list và thực hiện các hoạt động thêm phần tử vào linked list, xóa phần tử khỏi linked list, và in ra màn hình các phần tử trong linked list.
- Tạo một binary tree và thực hiện các hoạt động thêm phần tử vào binary tree, xóa phần tử khỏi binary tree, và in ra màn hình các phần tử trong binary tree.
- Tạo một graph và thực hiện các hoạt động thêm cạnh vào graph, xóa cạnh khỏi graph, và in ra màn hình các đỉnh và cạnh trong graph.
10+ bài tập về loop trong Dart
- Tìm tổng của các số từ 1 đến n.
- Tìm tổng của các số chẵn từ 1 đến n.
- Tìm tổng của các số lẻ từ 1 đến n.
- In ra các số từ 1 đến n theo thứ tự ngược.
- In ra một tam giác Pascal.
- In ra một bảng cửu chương.
- In ra một bảng cửu chương theo thứ tự ngược.
- Tìm số lớn nhất trong một danh sách.
- Tìm số nhỏ nhất trong một danh sách.
- Tìm số xuất hiện nhiều nhất trong một danh sách.
- Tìm các số hoàn thiện trong một khoảng từ n đến m.
- Tìm số nguyên tố trong một khoảng từ n đến m.
10 + bài tập OOP, interface, Object trong Dart
- Tạo một lớp Sinh viên có các thuộc tính như tên, tuổi, điểm trung bình, chuyên ngành và phương thức tính điểm trung bình.
- Tạo một lớp Khoa có các thuộc tính như tên khoa, danh sách các môn học và phương thức in ra danh sách môn học.
- Tạo một lớp Giáo viên có các thuộc tính như tên giáo viên, danh sách các môn dạy và phương thức in ra danh sách môn dạy.
- Tạo một interface Shape với phương thức tính diện tích và chu vi.
- Tạo lớp hình tròn, hình chữ nhật và hình tam giác kế thừa từ interface Shape.
- Tạo một lớp Animal có các thuộc tính như tên động vật, số chân và phương thức giống nhau.
- Tạo lớp Dog, Cat kế thừa từ lớp Animal và có các phương thức riêng.
- Tạo một lớp Vehicle có các thuộc tính như tên phương tiện, số bánh và phương thức chạy.
- Tạo lớp ô tô, xe máy kế thừa từ lớp Vehicle và có các phương thức riêng.
10 bài tập Dart về exception handling
Dưới đây là 10 bài tập về exception handling trong Dart:
- Tạo một exception class mới và ném nó khi xảy ra lỗi nhất định.
- Viết một hàm xử lý ngoại lệ để gọi hàm có thể gây ra ngoại lệ.
- Tìm cách kiểm tra một số nguyên có phải là số chẵn hay lẻ bằng cách sử dụng exception handling.
- Viết một hàm tìm kiếm từ điển bằng cách sử dụng exception handling để xử lý trường hợp tìm kiếm không thành công.
- Viết một hàm để kiểm tra xem một chuỗi có phải là số hay không bằng cách sử dụng exception handling.
- Tìm cách sử dụng exception handling để xử lý lỗi trong quá trình ghi file.
- Viết một hàm để tính toán giá trị trung bình cộng của một mảng số bằng cách sử dụng exception handling để xử lý trường hợp mảng trống.
- Sử dụng exception handling để xử lý trường hợp nhập sai dữ liệu từ người dùng.
- Sử dụng exception handling để xử lý trường hợp kết nối mạng không thành công.
Bài tập Dart về File và API
- Đọc một tập tin văn bản và in nội dung của nó ra màn hình.
- Ghi một chuỗi vào một tập tin văn bản mới.
- Sử dụng thư viện http để truy cập một API RESTful và in ra màn hình dữ liệu đầu ra.
- Tạo một form đăng ký cho người dùng với các trường tên, email, mật khẩu và gửi dữ liệu đến một API.
- Sử dụng thư viện http để truy cập API và lấy về dữ liệu về thời tiết và hiển thị nó trên màn hình.
Bài tập tổng hợp
- Tạo một chương trình yêu cầu người dùng nhập tên và tuổi của họ. In ra một thông báo cho biết họ phải sống 100 tuổi trong bao nhiêu năm nữa.
import 'dart:io';// khai báo thư viện void main() { // xuất ra màn hình stdout.write("tên của bạn là gì? "); // nhập vào dòng đưa vào string name String name = stdin.readLineSync(); // xuất ra màn hình , yêu cầu nhập tuổi print("Xin chào, $name! bạn bao nhiêu tuổi?"); // convert String nhập từ màn hình chuyển sang interger và nhập vào age int age = int.parse(stdin.readLineSync()); // tính toán trừ int yearsToHunderd = 100 - age; // xuất ra màn hình print("$name, bạn có $yearsToHunderd đến 100"); }
- Yêu cầu người dùng cho một số. Tùy theo số chẵn hay lẻ mà in ra thông báo thích hợp cho người dùng.
import 'dart:io'; void main() { stdout.write("xin hãy chọn một số: "); int number = int.parse(stdin.readLineSync()); if (number % 2 == 0) { print("số này là số chẵn"); } else { print("số này là số lẻ"); } }
- Lấy một danh sách, ví dụ như danh sách này:
a = [1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]
và viết chương trình in ra tất cả các phần tử của danh sách nhỏ hơn 5.
void main() { //danh sách integer List<int> a = [1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]; //vòng for chạy từng phần tử for (var i in a) { if (i < 5) { print(i); } } // viết ngắn gọn 1 dòng print([for (var i in a) if (i < 5) i]); }
- Tạo một chương trình yêu cầu người dùng nhập một số và sau đó in ra danh sách tất cả các ước của số đó.
Nếu bạn không biết số chia là gì, thì đó là một số chia hết cho một số khác. Ví dụ: 13 là ước của 26 vì 26/13 không có số dư.
import 'dart:io'; void main() { // xuât ra màn hình stdout.write("chọn một số bất kỳ: "); // chuyển string nhập từ màn hình --> number int number = int.parse(stdin.readLineSync()); // chạy vòng for từ 1 đến số bất kỳ for (var i = 1; i <= number; i++) { //xuất ra số có ước chung if (number % i == 0) { print(i); } } }
- Lấy hai danh sách, ví dụ:
a = [1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]
b = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]
và viết chương trình trả về một danh sách chỉ chứa các phần tử chung giữa chúng (không trùng lặp). Đảm bảo rằng chương trình của bạn hoạt động trên hai danh sách có kích cỡ khác nhau.
void main() { //danh sách thứ nhất List<int> a = [1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]; //danh sách thứ 2 List<int> b = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 89]; // khai báo danh sách chứa các phần tử chung Set<int> c = {}; // chạy 2 vòng for duyệt các phần từ list 1 và 2 for (var i in a) { for (var j in b) { // nếu phần tử thuộc list 1 trùng với list 2 thì thêm vào danh sách C if (i == j) { c.add(i); } } } // xuất danh sách c print(c.toList()); // toán tử sử dụng 1 hàng print(Set.from(a).intersection(Set.from(b)).toList()); }
- Yêu cầu người dùng cung cấp một chuỗi và in ra xem chuỗi này có phải là một chuỗi Palindrome hay không.
Palindrome là một chuỗi đọc xuôi và ngược giống nhau.
import 'dart:io'; void main() { //xuất ra chữ nhập vào một từ stdout.write("Nhập vào một từ: "); //đọc từ từ màn hình và đưa vào biến input String input = stdin.readLineSync().toLowerCase(); // sử dụng đảo ngược chuỗi String revInput = input.split('').reversed.join(''); // so sánh chuỗi xuôi và ngược input == revInput ? print("Chuỗi này là palindrome") : print("Chuỗi này không phải là palindrome"); }
- Giả sử bạn được cung cấp một danh sách được lưu trong một biến:
a = [1, 4, 9, 16, 25, 36, 49, 64, 81, 100].
Viết mã Dart lấy danh sách này và tạo một danh sách mới chỉ có các phần tử chẵn của danh sách này trong đó.
void main() { // khởi tạo danh sách List<int> a = [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]; // khai báo 1 biến i giá trị o int i = 0; List<int> l = []; // chạy vòng for từng phần tử for (var e in a) { //kiểm tra chẵn if (++i % 2 == 0) { // thêm giá trị chẵn vào danh sách l l.add(e); } } // xuất danh sách l print(l); // Toán tử 1 dòng print([for (var e in a) if (++i % 2 == 0) e]); }
- Tạo trò chơi Oẳn tù tì hai người chơi với máy tính.
Yêu cầu đầu vào của người chơi, so sánh chúng, in ra một tin nhắn cho người chiến thắng.
import 'dart:io'; import 'dart:math'; void main() { print("Chào mừng đến game Oẳn tù tì"); // tạo giá trị random final random = Random(); // Tạo Map chứ tổ hợp giá trị của máy và người chơi Map<String, String> rules = { "rock": "scissors", "scissors": "paper", "paper": "rock" }; // khởi tạo điểm số int user = 0; int comp = 0; // Danh sách kết quả búa kéo bao List<String> options = ["rock", "paper", "scissors"]; // Game chạy while (true) { // random giá trị của máy String compChoice = options[random.nextInt(options.length)]; //xuất ra dòng lệnh stdout.write("\nNhập giá trị : rock, paper, scissor "); // đưa giá trị người chọn vào String String userChoice = stdin.readLineSync().toLowerCase(); // nếu chọn exit -> thì thoát if (userChoice == "exit") { print("\nYou: $user Computer: $comp\nBye Bye!"); break; } // nếu chọn không đúng các trường hợpf if (!options.contains(userChoice)) { print("nhập sai"); continue; } // nếu giá trị = nhay else if (compChoice == userChoice) { print("hòa!"); } else if (rules[compChoice] == userChoice) { print("Computer thắng: $compChoice vs $userChoice"); comp += 1; } else if (rules[userChoice] == compChoice) { print("Bạn thắng: $userChoice vs $compChoice"); user += 1; } } }
- Tạo một số ngẫu nhiên trong khoảng từ 1 đến 100. Yêu cầu người dùng đoán số, sau đó cho họ biết họ đã đoán quá thấp, quá cao hay chính xác.
Theo dõi xem người dùng đã đoán được bao nhiêu lần và khi trò chơi kết thúc, hãy in thông tin này ra.
import 'dart:io'; import 'dart:math'; void main() { print("Nhập Exit để thoát game"); guessingGame(); } guessingGame() { // tạo một giá trị random final random = Random(); // random 1 số từ 0 đến 100 int randNumber = random.nextInt(100); int attempt = 0; while (true) { // tạo biến nhớ số lần chọn attempt += 1; stdout.write("hãy chọn số từ 0 đến 100: "); String chosenNumber = stdin.readLineSync(); // Nếu gõ Exit thì thoát chương trình if (chosenNumber.toLowerCase() == "exit") { print("\nBye"); break; } else if (int.parse(chosenNumber) > 100) { // nếu giá trị nhập >100 thì xuất ra print("bạn nhập số > 100"); continue; } // Logic game if (int.parse(chosenNumber) == randNumber) { // nếu số đúng thì xuất ra số lần đoán print("chọn đúng bạn đã đoán $attempt lần\n"); continue; } else if (int.parse(chosenNumber) > randNumber) { // nếu số lớn hơn thì xuất ra print("bạn chọn số lớn hơn"); continue; } else { // nếu số nhỏ hơn thì xuất ra print("bạn chọn số nhỏ hơn"); continue; } } }
- Hỏi người dùng một số và xác định xem số đó có phải là số nguyên tố hay không.
Làm điều đó bằng cách sử dụng một chức năng
import 'dart:io'; void main() { //xuất ra console stdout.write("nhập vào một số: "); int chosenNumber = int.parse(stdin.readLineSync()); //hàm kiểm tra số nguyên tố checkPrime(chosenNumber); } void checkPrime(int number) { // danh sách a là tất cả các số chia hết bởi number List<int> a = [ for (var i = 1; i <= number; i++) if (number % i == 0) i ]; // nếu danh sách số này =2 thì a.length == 2 ? print("đây là số nguyên tố") : print("đây không phải là số nguyên tố"); }
- Viết chương trình lấy một danh sách các số chẳng hạn
a = [5, 10, 15, 20, 25]
và tạo một danh sách mới chỉ gồm các phần tử đầu tiên và cuối cùng của danh sách đã cho. Để thực hành, hãy viết mã này bên trong một hàm.
import 'dart:math'; void main() { // khởi tạo biến random final random = Random(); //random 10 phần tủ của List List<int> randList = List.generate(10, (_) => random.nextInt(100)); // xuất ra màn hình mảng print(randList); //gọi hàm newlist print(newList(randList)); } // Ham newlist tạo mảng từ 2 phần từ đầu và cuối của mảng cũ List<int> newList(List<int> initialList) { return [initialList.first, initialList.last]; }
- Viết một chương trình hỏi người dùng có bao nhiêu số Fibonnaci để tạo và sau đó tạo chúng.
Đảm bảo yêu cầu người dùng nhập số lượng các số trong dãy để tạo.
import 'dart:io'; void main() { stdout.write("Nhập vào giá trị N? "); int chosenNumber = int.parse(stdin.readLineSync()); //gọi hàm fibonaci và gán giá trị trả về cho result List<int> result = fibonacciNumbers(chosenNumber); //xuat ra danh sách số fibonachi print(result); } // hàm Fibonaci List<int> fibonacciNumbers(int chosenNumber) { //khởi tạo 2 giá trị ban đầu f0 và f1 List<int> fibList = [1, 1]; for (var i = 0; i < chosenNumber; i++) { //thêm vào list số tiếp theo của fibonaci fibList.add(fibList[i] + fibList[i + 1]); } return fibList; }
- Viết một chương trình (hàm) lấy một danh sách và trả về một danh sách mới chứa tất cả các phần tử của danh sách đầu tiên trừ đi tất cả các phần trùng lặp.
import 'dart:math'; //hàm main chạy Dart void main() { // tạo giá trị random final random = Random(); //tạo danh sách các số random từ 1-10 List<int> randList = List.generate(10, (_) => random.nextInt(10)); // xuất ra giá trị ban đầu print("Danh sách ban đầu $randList\n"); print("Danh sách đã xóa trùng lặp ${removeDuplicates(randList)}"); } // hàm xóa đi giá trị trùng lặp List<int> removeDuplicates(List<int> initialList) { //toset là hàm chuyển sang thành tập hợp, tập hợp không có phần tử trùng return initialList.toSet().toList(); }
- Viết chương trình (dùng hàm!) hỏi người dùng một chuỗi dài chứa nhiều từ. In lại cho người dùng cùng một chuỗi, ngoại trừ các từ theo thứ tự ngược.
Ví dụ: giả sử chúng ta gõ chuỗi:
Tên tôi là test
Sau đó, sẽ thấy chuỗi:
Test là tên của tôi
import 'dart:io'; void main() { // xuất ra màn hình stdout.write("Nhập một câu: "); String sentence = stdin.readLineSync(); // sử dụng hàm hoán đổi từ trong câu reverseSentence(sentence); } //hàm hoán đổi từ trong câu void reverseSentence(String sentence) { /* tách từ trong câu, sau đó đảo ngược */ String a = sentence.split(" ").reversed.toList().join(" "); // in ra giá trị print(a); }
- Viết trình tạo mật khẩu trong Dart trong ngôn ngữa Dart. Bao gồm mã thời gian chạy của bạn trong một phương thức chính.
Hỏi người dùng xem họ muốn mật khẩu của họ mạnh đến mức nào. Đối với mật khẩu yếu, hãy chọn một hoặc hai từ trong danh sách.
import 'dart:convert'; import 'dart:io'; import 'dart:math'; void main() { // xuất ra màn hình độ khó của password stdout.write("bạn muốn password của bạn = Weak, Medium hoặc Strong: "); // lấy giá trị từ màn hình String choice = stdin.readLineSync().toLowerCase(); // gọi hàm tạo password passwordGenerator(choice); } // hàm hoán đổi theo giá trị streng void shuffleGenerator(int strength) { //tạo giá trị ngẫu nhiên final random = Random.secure(); //tạo random với danh sách có độ lớn 5,15,25 và giá trị random từ 0-255 List<int> intList = List.generate(strength, (_) => random.nextInt(255)); //loại trừ ký tự đặc biệt bằng base64URL và join lại List charList = base64UrlEncode(intList).split('').toList(); //hoán vị thêm lần nữa charList.shuffle(); print("\npassword là: ${charList.join('')}\n"); } //hàm tạo password void passwordGenerator(String strength) { if (strength == "weak") { //gọi hàm hoán vị password với streng = 5 shuffleGenerator(5); } else if (strength == "medium") { //gọi hàm hoán vị password với streng = 15 shuffleGenerator(15); } else if (strength == "strong") { //gọi hàm hoán vị password với streng = 25 shuffleGenerator(25); } else { print("không có giá trị này"); } }
- Tạo một chương trình sẽ chơi trò chơi “cows and bulls”. Trò chơi hoạt động như thế này:
- Tạo ngẫu nhiên một số có 4 chữ số. Yêu cầu người dùng đoán một số có 4 chữ số. Đối với mỗi chữ số mà người dùng đoán đúng vào đúng vị trí, họ có một “cow”.
- Đối với mỗi chữ số nếu người dùng đoán sai chỗ là “bulls”.
- Mỗi khi người dùng đoán, hãy cho họ biết họ có bao nhiêu “cow” và “bulls”. Khi người dùng đoán đúng số, trò chơi kết thúc. Theo dõi số lần đoán của người dùng trong suốt trò chơi và cho người dùng biết khi kết thúc.
import 'dart:io'; import 'dart:math'; void main() { /* tạo số random từ 1000 đến 9999 */ final random = Random(); String randomNumber = (1000 + random.nextInt(9999 - 1000)).toString(); // xuất ra số random print(randomNumber); //xuất ra giao diện lời giới thiệu stdout.write("chào mừng đến với Cows and Bulls\nType 'exit' để thoát game\n"); int attempts = 0; // Logic của game Cows and Bulls while (true) { //khởi tại giá trị Cows và Bulls int cows = 0; int bulls = 0; attempts += 1; //nhập vào giá trị 4 số stdout.write("\nnhập vào số có 4 chữ cái "); String chosenNumber = stdin.readLineSync(); // Kiểm tra điều kiện trò chơi if (chosenNumber == randomNumber) { //nếu đoán đúng print("Chiến thắng $attempts lần chọn"); break; } else if (chosenNumber == "exit") { print("Xin chào!"); break; } else if (chosenNumber.length != randomNumber.length) { print("Bạn phải nhập số 4 chữ số"); continue; } /* xuất ra số Cows và Bull trong lần đoán*/ for (var i = 0; i < randomNumber.length; i++) { if (chosenNumber[i] == randomNumber[i]) { cows += 1; } else if (randomNumber.contains(chosenNumber[i])) { bulls += 1; } } //xuất ra kết quả Cows và Bulls print("\nlần chọn này có: $attempts \nCows: $cows, Bulls: $bulls"); } }
- Thời gian cho một số đồ họa giả! Giả sử chúng ta muốn vẽ các bảng trò chơi trông như thế này:
Hỏi người dùng xem họ muốn vẽ bảng trò chơi có kích thước như thế nào và vẽ bảng trò chơi đó cho họ trên màn hình bằng cách sử dụng câu lệnh in của Dart.
import 'dart:io'; void main() { //xuất ra màn hình giới thiệu stdout.write("Bạn muốn độ lớn của số ô bằng bao nhiêu: "); // nhập vào giá trị trên màn hình int userChoice = int.parse(stdin.readLineSync()); // xuất ra giá trị nhật print("số ô và cột $userChoice x $userChoice \n"); //gọi hàm vẽ bàn cờ drawBoard(userChoice); } //hàm vẽ bàn cờ void drawBoard(int squareSize) { // Tạo giá trị cơ bản của cột và hàng String rowLines = " ---"; String colLines = "| "; // Vẽ bàn cờ dựa theo số hàng và cột for (var i = 0; i < squareSize; i++) { print(rowLines * squareSize); print(colLines * (squareSize + 1)); } // Vẽ hàng cuối cùng print("${rowLines * squareSize}\n"); }
- Xây dựng luật chơi game Tic-tic-toe. Viết hàm kiểm tra xem ai đã THẮNG trò chơi hay chưa, không cần lo lắng về cách các nước đi được thực hiện.
Nếu một trò chơi Tic Tac Toe được biểu diễn dưới dạng một danh sách các danh sách, như sau:
trong đó số 0 có nghĩa là ô trống, số 1 có nghĩa là người chơi 1 đặt mã thông báo của họ vào ô đó và số 2 có nghĩa là người chơi 2 đặt mã thông báo của họ vào ô đó.
Nhiệm vụ của bạn: đưa ra một danh sách xếp theo thứ tự 3 x 3 đại diện cho một bảng trò chơi Tic Tac Toe, cho biết có ai đã thắng hay không và cho biết người chơi nào đã thắng, nếu có.
Chiến thắng Tic Tac Toe là 3 lần liên tiếp – theo hàng, theo cột hoặc theo đường chéo. Không có trường hợp HAI người đã thắng – giả sử rằng trong mỗi bàn cờ sẽ chỉ có một người chiến thắng.
void main() { //khởi tạo mảng 2 chiều List<List<int>> finalBoard = [ [1, 0, 0], [0, 1, 0], [2, 1, 0] ]; //gọi hàm kiểm tra game theGame(finalBoard); } void theGame(List<List<int>> board) { //kiểm tra có thắng về hàng if (rowCheck(board)) { print("Row wins"); } else if (rowCheck(transpose(board))) { //kiểm tra thắng về cột print("Column wins"); } else if (rowCheck(diagonals(board))) { //kiểm tra đường chéo print("Diagonal wins"); } else { print("Draw!"); } } bool rowCheck(List<List<int>> board) { //hàm kiểm tra hàng có thắng không for (List<int> row in board) { if (row.toSet().length == 1) { return true; } } return false; } //hàng kiểm tra cột có thắng không List<List<int>> transpose(List<List<int>> board) { //hoán vị cột thành hàng và kiểm tra return [ for (var i = 0; i < board.length; i++) [for (List<int> r in board) r[i]] ]; } //hàm kiểm tra đường chéo List<List<int>> diagonals(List<List<int>> board) { //trả ra đường chéo trên hàng return [ [for (var i = 0; i < board.length; i++) board[i][i]], [for (var i = 0; i < board.length; i++) board[i].reversed.toList()[i]] ]; }
- Trong bài tập trước, chúng ta đã khám phá ý tưởng sử dụng list làm “cấu trúc dữ liệu” để lưu trữ thông tin về trò chơi tic tac toe. Trong trò chơi tic tac toe, “máy chủ trò chơi” cần biết vị trí của X và Os trên bàn cờ, để biết người chơi 1 hay người chơi 2 (hoặc bất kỳ ai là X và O) thắng.
Khi một người chơi (giả sử người chơi 1, là X) muốn đánh dấu X trên màn hình, họ không thể chỉ cần gõ vào terminal. Vì vậy, bạn sẽ tính gần đúng lần nhấp này chỉ bằng cách yêu cầu người dùng cung cấp tọa độ nơi họ muốn đánh của mình.
import 'dart:io'; void main() { // bàn cờ tic tic toe rỗng với giá trị "" List<List<String>> initialBoard = List.generate(3, (_) => List.generate(3, (_) => ' ')); //gọi hàm vẽ bàn cờ drawBoard(initialBoard, 2); } // hàm vẽ bàn cờ void drawBoard(List<List<String>> board, int currentUser) { var move; // nếu current user =1 thì đánh x, ngược lại 0 currentUser == 1 ? move = 'X' : move = 'O'; stdout.write("chọn tọa độ đánh x,y: "); // lấy toa độ đánh x,y thông qua hàm split List choice = stdin.readLineSync().split(" "); //điền giá trị X, và O trên bản đồ board[int.parse(choice[0])][int.parse(choice[1])] = move; //in ra giá trị bàn cờ print(board); }
- Trong 3 bài tập trước, chúng ta đã xây dựng một số thành phần cần thiết để xây dựng trò chơi Tic Tac Toe trong Dart:
- Vẽ bảng trò chơi Tic Tac Toe
- Kiểm tra xem một bảng trò chơi có người chiến thắng không
- Xử lý di chuyển của người chơi từ đầu vào của người dùng
- Bước tiếp theo là kết hợp tất cả ba thành phần này lại với nhau để tạo thành trò chơi Tic Tac Toe hai người chơi!
Thách thức của bạn trong bài tập này là sử dụng tất cả các chức năng từ các bài tập trước trong cùng một chương trình để tạo một trò chơi hai người chơi mà bạn có thể chơi với một người bạn. Có rất nhiều lựa chọn bạn sẽ phải thực hiện khi hoàn thành bài tập này, vì vậy bạn có thể tiến xa hay ít tùy ý với nó.
Dưới đây là một số điều cần ghi nhớ:
- Bạn nên theo dõi xem ai đã thắng – nếu có người chiến thắng, hãy hiển thị thông báo chúc mừng trên màn hình.
- Nếu không còn nước đi nào nữa, đừng hỏi nước đi của người chơi tiếp theo!
import 'dart:io'; void main() { // tạo bàn cờ rỗng List<List<String>> theBoard = List.generate(3, (_) => List.generate(3, (_) => ' ')); // xuất ra màn hình luật và hướng dẫn startGame(theBoard); // tạo 2 biến lưu giá trị user int a = 1, user = 2, tmp; while (true) { // xác định giá trị user tmp = a; a = user; user = tmp; //gọi hàm bàn cờ hiện hành currentBoard(theBoard); // Nhập vào tọa độ đánh tương ứng với user stdout.write("User $user, chọn tọa độ: "); //lấy giá trị X,Y List userChoice = stdin.readLineSync().split(" "); if (userChoice.join(" ") == "exit") { print("\nThoát Game: "); break; } // Đánh X, O trong tọa độ theBoard = makeMove(theBoard, user, userChoice); // Kiểm tra luật lệ xem ai thắng if (rowCheck(theBoard)) { print("\nUser $user: chiến thắng hàng!"); break; } else if (rowCheck(transpose(theBoard))) { print("\nUser $user: chiến thắng cột!"); break; } else if (rowCheck(diagonals(theBoard))) { print("\nUser $user: chiến thắng đường chéo!"); break; } else if (drawGame(theBoard) == 1) { print("\nTrận đấu hòa!"); break; } } // gọi hàm bàn cờ hiện hành currentBoard(theBoard); } void startGame(List<List<String>> board) { print("""\n Chào mừng đến game Tic Tic Toe! Game có 2 User: User 1 (X) và User 2 (O). Tọa độ 0 0 là góc trái trên cùng, 1 1 là ô ở giữa 2 2 là góc phải dưới cùng. Thoát game thì gõ exit. """); } //hàm vẽ bàn cờ hiện hành void currentBoard(List<List<String>> board) { //vẽ ra bàn cờ Row 1,2,3 String row1 = "| ${board[0][0]} | ${board[0][1]} | ${board[0][2]} |"; String row2 = "| ${board[1][0]} | ${board[1][1]} | ${board[1][2]} |"; String row3 = "| ${board[2][0]} | ${board[2][1]} | ${board[2][2]} |"; String border = "\n --- --- ---\n"; // xuất ra màn hình print(border + row1 + border + row2 + border + row3 + border); } //hàm đánh user với tọa độ List<List<String>> makeMove( List<List<String>> board, int currentUser, List choice) { var move; //nếu user 1 đánh x, user 2 đánh o currentUser == 1 ? move = 'X' : move = 'O'; //điền giá trị và tọa độ board[int.parse(choice[0])][int.parse(choice[1])] = move; return board; } //kiểm tra hàng thắng hay thua bool rowCheck(List<List<String>> board) { for (List<String> row in board) { if (row.toSet().length == 1 && row.any((e) => e != ' ')) { return true; } } return false; } //hàm chuyển hàng thành cột List<List<String>> transpose(List<List<String>> board) { return [ for (var i = 0; i < board.length; i++) [for (List<String> r in board) r[i]] ]; } //hàm chuyển đường chéo thành hàng List<List<String>> diagonals(List<List<String>> board) { return [ [for (var i = 0; i < board.length; i++) board[i][i]], [for (var i = 0; i < board.length; i++) board[i].reversed.toList()[i]] ]; } // hàm đếm số ô chưa được đánh int drawGame(List<List<String>> board) { int count = 0; for (var row in board) { for (var e in row) { if (e == " ") { count += 1; } } } return count; }
- Triển khai một hàm lấy ba biến đầu vào và trả về giá trị lớn nhất trong ba biến. Thực hiện việc này mà không cần sử dụng hàm Dart max()!
void main() { //khai báo giá trị max var max; //khai báo 3 số a,b,c int a = 32; int b = 12; int c = 64; //nếu a> b thì ta gán max =a if (a > b) { max = a; } else { //gán max bằng b max = b; } //so sánh c với max if (c > max) { max = c; } print(max); //hàm khác sử dụng sort của Dart List l = [a, b, c, 4, 5, 2, 1]; l.sort(); print(l.last); }
- Trong bài tập này, nhiệm vụ là viết một hàm chọn một từ ngẫu nhiên từ danh sách các từ trong từ điển SOWPODS.
Tải xuống file này và lưu nó vào cùng thư mục với code Dart. Mỗi dòng trong file chứa một từ duy nhất.
Sử dụng thư viện ngẫu nhiên Dart để chọn một từ ngẫu nhiên.
import 'dart:io'; import 'dart:math'; void main() { //gọi hàm randomword String word = randomWord("sowpods.txt"); //in ra từ random print(word); } //hàm randomword String randomWord(String txt) { //khởi tạo giá trị random final random = Random(); //dọc file gán vào viến file var file = File(txt); //đọc file theo hàng List<String> wordList = file.readAsLinesSync(); //lấy giá trị random bất kỳ String word = wordList[random.nextInt(wordList.length)]; //trả lại biến lấy trong file return word; }
- Trong trò chơi Hangman, một từ gợi ý được đưa ra bởi chương trình mà người chơi phải đoán, từng chữ một. Người chơi đoán từng chữ cái một cho đến khi đoán được toàn bộ từ. (Trong trò chơi thực tế, người chơi chỉ có thể đoán sai 6 chữ cái trước khi thua cuộc).
Giả sử từ mà người chơi phải đoán là EVAPORATE.
- Viết logic yêu cầu người chơi đoán một chữ cái và hiển thị các chữ cái trong từ gợi ý đã được đoán đúng. Hiện tại, hãy để người chơi đoán vô số lần cho đến khi họ nhận được toàn bộ từ.
- Như một phần thưởng, hãy theo dõi các chữ cái mà người chơi đã đoán và hiển thị một thông báo khác nếu người chơi cố gắng đoán lại chữ cái đó.
- Hãy nhớ dừng trò chơi khi tất cả các chữ cái đã được đoán đúng! Đừng lo lắng về sự lựa chọn ngẫu nhiên một từ hoặc theo dõi số lần đoán còn lại của người chơi
import 'dart:io'; void main() { // chọn random từ String randomWord = "EVAPORATE"; // gọi function hangman hangman(randomWord); } //hàm thực thi hangman void hangman(String word) { List clue = ("___ " * word.length).split(" "); // khởi tạo giá trị count print(clue.join(" ")); int count = 0; // logic của Game while (true) { // yêu cầu nhập giá trị của người dùng count += 1; stdout.write("\nnhập vào ký tự: "); String choice = stdin.readLineSync().toUpperCase(); /* hàm logic kiểm tra kết quả */ if (choice == word) { //nếu đúng từ thì trả ra số lần đếm print("\đúng với số lần: $count"); break; } else if (choice == "EXIT") { //thoát nếu chọn Exit print("\nkết thúc game!\n"); break; } else if (choice.length > 1) { //nếu nhập < 1 ký tự thì không cho print("\nnhập ít nhất 2 ký tự!"); continue; } //kiểm tra từ user chọn for (var i = 0; i < word.length; i++) { if (clue[i] == choice) { continue; } else if (word[i] == choice) { clue[i] = choice; } } //hiển thị màn hình print(clue.join(" ")); // kết thúc game if (clue.join("") == word) { print("\nThành công! số lần:$count\n"); break; } } }
- Trong bài tập này, chúng ta sẽ hoàn thành việc xây dựng Hangman. Trong trò chơi Hangman, người chơi chỉ đoán sai 6 lần trước khi thua cuộc.
- Trong bài tập 22, chúng ta đã tải một danh sách từ ngẫu nhiên và chọn một từ trong đó.
- Trong bài tập 23, chúng tôi đã viết một logic để đoán chữ cái và hiển thị thông tin đó cho người dùng.
Trong bài tập này, chúng ta phải kết hợp tất cả lại với nhau và thêm logic để xử lý các dự đoán.
- Sao chép mã của bạn từ Phần 1 và 2 vào một tệp mới làm điểm bắt đầu. Bây giờ thêm các tính năng sau:
- Chỉ để người dùng đoán 6 lần và cho người dùng biết họ còn bao nhiêu lần đoán.
- Theo dõi các chữ cái người dùng đoán. Nếu người dùng đoán một chữ cái mà họ đã đoán, đừng phạt họ – hãy để họ đoán lại.
Bổ sung tùy chọn:
- Khi người chơi thắng hoặc thua, hãy để họ bắt đầu một trò chơi mới.
- Hiển thị với người dùng “Bạn còn 4 lần đoán sai”.
import 'dart:io'; import 'dart:math'; void main() { // Phọn một từ random từ file String theWord = randomWord("sowpods.txt"); //hàm in ra lời giới thiệu intro(); //hàm game hangman(theWord); } //Hàm game hangman void hangman(String word) { /* Lấy từ Yêu cầu người dùng đoán một chữ cái Kiểm tra xem chữ cái có trong từ không Nếu có, hãy đặt chữ cái trong cùng một chỉ mục của đầu mối */ List clue = ("___ " * word.length).split(" "); // khởi tạo từ print(clue.join(" ")); int count = 0; int attempts = word.length + 1; List history = []; // logic chạy game while (true) { //số lần đoán count += 1; attempts -= 1; // lấy giá trị nhập vào của người dùng stdout.write("\nnhập một ký tự: "); String choice = stdin.readLineSync().toUpperCase(); if (history.contains(choice)) { //nếu ký tự được nhập đã được nhập print("\nbạn đã chọn ký tự này!"); attempts += 1; } else { //thêm ký tự và ghi nhớ history.add(choice); } /* Cho phép người dùng nhập toàn bộ từ hoặc thoát khỏi trò chơi Bất kỳ trường hợp sai nào khác, yêu cầu một chữ cái */ if (choice == word) { print("\nThành công! số lần: $count"); break; } else if (choice == "EXIT") { print("\nThoat game!\n"); break; } else if (choice.length > 1) { attempts += 1; print("\nSai! số lần còn lại: $attempts"); continue; } else if (attempts < 1) { print("\nThua: $attempts. \nGame over!"); print("\nkết quả là: $word"); break; } // kiểm tra từ trong lựa chọn for (var i = 0; i < word.length; i++) { if (word[i] == choice) { clue[i] = choice; } } print("\nsố lần còn: $attempts"); // trạng thái hiện hành print(clue.join(" ")); // kết thúc game if (clue.join("") == word) { print("\nThắng! số lần:$count\n"); break; } } } String randomWord(String txt) { /* Đọc file đã cho dưới dạng danh sách Sau đó chọn một từ ngẫu nhiên từ nó */ final random = Random(); var file = File(txt); List<String> wordList = file.readAsLinesSync(); String word = wordList[random.nextInt(wordList.length)]; return word; } void intro() { print("""\n Chào mừng đến với hangman! Bạn có 6 lần để đoán đúng Bạn có thể nhập toàn bộ từ bất kỳ lúc nào trước khi kết thúc lần thử Để thoát khỏi trò chơi gõ "exit" """); }
- Đối với bài tập này, chúng ta sẽ theo dõi ngày sinh của bạn và có thể tìm thấy thông tin đó dựa trên tên của họ.
Tạo một từ điển (trong File của bạn) tên và ngày sinh. Khi bạn chạy chương trình của mình, nó sẽ yêu cầu người dùng nhập tên và trả lại ngày sinh của người đó cho họ.
import 'dart:io'; void main() { // tạo map chứa tên và ngày sinh Map<String, Object> birthdays = { "Lebanon": "14/03/1879", "Benjamin Bossman": "17/01/1706", "Ada avida": "10/12/1815", }; print("\nXin chào bạn có biết ngày sinh: \n"); // xuất ra danh sách các tên và ngày sinh birthdays.forEach((key, value) { print(key); }); stdout.write("\nNhập vào tên người muốn biết ngày sinh? "); String choice = stdin.readLineSync(); print("\n$choice sinh nhật là ngày ${birthdays[choice]}\n"); }
- Trong bài tập trước, chúng ta đã tạo một từ điển về ngày sinh của những người nổi tiếng.
Trong bài tập này, hãy sửa đổi chương trình của bạn từ bài 25 để tải từ điển sinh nhật từ tệp JSON trên đĩa, thay vì định nghĩa từ điển trong chương trình.
Yêu cầu người dùng cung cấp tên và ngày sinh của nhà khoa học khác để thêm vào từ điển và cập nhật file JSON trên máy. Nếu bạn chạy chương trình nhiều lần và tiếp tục thêm tên mới, thì tệp JSON của bạn sẽ ngày càng lớn hơn.
import 'dart:io'; import 'dart:convert'; void main() { //gọi hàm birthdays birthdays("birthdays.json"); } //hàm birthdays void birthdays(String txt) { // đọc file và encode Json var file = File(txt); Map<String, Object> data = json.decode(file.readAsStringSync()); // hiển thi danh sách người dùng print("\nđây là danh sách người trong Json: \n"); data.forEach((key, value) { // in dữ liệu data print(key); }); // xuất ra màn hình stdout.write("\nai là người bạn muốn biết ngày sinh? "); String choice = stdin.readLineSync(); //xuất ra màn hình print("\n$choice ngày sinh là ${data[choice]}\n"); stdout.write("\nbạn có muốn thêm ai không? "); String answer = stdin.readLineSync().toLowerCase(); // Cập nhật File Json if (answer == "yes") { stdout.write("Nhập tên người dùng: "); String name = stdin.readLineSync(); // xuất ra màn hình stdout.write("Ngày tháng năm sinh của người dùng (dd/mm/yyyy): "); String birthday = stdin.readLineSync(); // viết người dùng thêm vào Json data[name] = birthday; file.writeAsStringSync(json.encode(data)); data.forEach( (key, value) { print("$key: $value"); }, ); } else { print("\nExit !bye Bye\n"); } }
- Trong bài tập trước, chúng ta đã lưu thông tin về tên và ngày sinh của các người nổi tiếng vào File.
Trong bài tập này, hãy tải tệp JSON đó từ file, trích xuất các tháng có sinh nhật và đếm xem có bao nhiêu nhà khoa học có sinh nhật trong mỗi tháng.
import 'dart:io'; import 'dart:convert'; import 'package:intl/intl.dart'; void main() { // Dọc file json File file = File("birthdays.json"); Map<String, Object> data = json.decode(file.readAsStringSync()); // Trích xuất các tháng vào một danh sách DateFormat extractor = DateFormat("MMMM"); List<String> months = [ for (var d in data.values) extractor.format(formatter(d)) ]; // Đếm số lần xuất hiện mỗi tháng counter(months); } //hàm format DateTime formatter(String birthday) { /* Lấy một chuỗi và trả về một Object Datetime */ return DateFormat("dd/MM/yyyy").parse(birthday); } void counter(List m) { /* Lấy tháng và đếm số lần xuất hiện Lưu chúng vào Map và in kết quả */ Map<String, int> occurances = {}; m.forEach((e) { //kiểm tra tháng có xuất hiện if (!occurances.containsKey(e)) { occurances[e] = 1; } else { occurances[e] += 1; } }); print("\nSố lượng :\n"); occurances.forEach((key, value) { print("$key: $value"); }); }