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 1
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"); }
Bài tập 2
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ẻ"); } }
Bài tập 3
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]); }
Bài tập 4
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); } } }
Bài tập 5
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()); }
Bài tập 6
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"); }
Bài tập 7
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]); }
Bài tập 8
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; } } }
Bài tập 9
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; } } }
Bài tập 10
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ố"); }
Bài tập 11
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]; }
Bài tập 12
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; }
Bài tập 13
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(); }
Bài tập 14
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); }
Bài tập 15
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"); } }
Bài tập 16
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"); } }
Bài tập 17
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"); }
Bài tập 18
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]] ]; }
Bài tập 19
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); }
Bài tập 20
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; }
Bài tập 21
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); }
Bài tập 22
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; }
Bài tập 23
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; } } }
Bài tập 24
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" """); }
Bài tập 25
Đố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"); }
Bài tập 26
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"); } }
Bài tập 27
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"); }); }