Rate this post

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:

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");
  });
}

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *

Contact Me on Zalo
Call now