Animation, Modules 6 - Hoạt hình, tách file

Tài liệu tương tự
Chương trình dịch

Trường ĐHBK Hà Nội Khoa Điện Bộ môn Điều khiển Tự động Tài liệu hướng dẫn thực hành: KĨ THUẬT LẬP TRÌNH C/C++ Bài 1: Lập trình cơ sở 1 Mục đích bài th

Ví dụ về duyệt đồ thị ưu tiên chiều sâu DFS và ứng dụng Đồ thị ví dụ: Nguyễn Hữu Tuân vimaru.edu.vn Hình 1: Đồ thị vô hướng có 8 đỉnh Với đồ thị trên,

Bài 7. Con trỏ Mục tiêu: 1. Luyện tập sử dụng con trỏ và địa chỉ của các biến 2. Sử dụng con trỏ khi thao tác với mảng. Giới hạn: không dùng các thư v

Bài tập thực hành Chuyên đề 1 CNPM - Java Khoa CNTT- Trường ĐH Công nghệ TP.HCM Lab 01: LẬP TRÌNH JAVA CƠ BẢN VỚI NET BEANS A. MỤC TIÊU: Hướng dẫn tải

Tìm hiểu ngôn ngữ lập trình Visual Basic Tìm hiểu ngôn ngữ lập trình Visual Basic Bởi: Khuyet Danh Tìm hiểu ngôn ngữ lập trình Visual Basic Tổng quan

OpenStax-CNX module: m Giới thiệu về ngôn ngữ C và môi trường turbo C 3.0 ThS. Nguyễn Văn Linh This work is produced by OpenStax-CNX and licens

Microsoft Word - bo_tien_xu_ly_trong_c.docx

Chiến lược kiểm thử Chiến lược kiểm thử Bởi: Khoa CNTT ĐHSP KT Hưng Yên Các công đoạn kiểm thử Quá trình kiểm thử có thể chia làm các giai đoạn : Kiểm

Lập trình và ngôn ngữ lập trình

TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI VIỆN CÔNG NGHỆ THÔNG TIN VÀ TRUYỀN THÔNG TIN HỌC ĐẠI CƯƠNG Bài 13. Hàm Nội dung 1. Khái niệm hàm 2. Khai báo và sử dụn

Hướng dẫn Bài thực hành 7 SGK Tin học 6 | Giải bài tập SGK Tin lớp 6

HỘI THI TIN HỌC TRẺ TỈNH AN GIANG ĐỀ CHÍNH THỨC ĐỀ THI LÝ THUYẾT BẢNG A - KHỐI TIỂU HỌC Khóa ngày: Thời gian : 20 phút (không kể thời gian

Lớp và đối tượng-các hàm và các lớp friend Lớp và đối tượng-các hàm và các lớp friend Bởi: Thanh Hiền Vũ CÁC HÀM VÀ CÁC LỚP friend Một hàm friend của

TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI VIỆN CÔNG NGHỆ THÔNG TIN VÀ TRUYỀN THÔNG TIN HỌC ĐẠI CƯƠNG Bài 9. Vào ra dữ liệu trong C Các lệnh vào ra dữ liệu C cun

Câu lệnh (statement) Câu lệnh (statement) Bởi: Khuyet Danh Trong C# một chỉ dẫn lập trình đầy đủ được gọi là câu lệnh. Chương trình bao gồm nhiều câu

PowerPoint Presentation

Những cơ sở của ngôn ngữ C# Những cơ sở của ngôn ngữ C# Bởi: phamvanviet truonglapvy Trong chương này sẽ trình bày về hệ thống kiểu trong C#; phân biệ

Cách viết một ứng dụng trên microsoft windows Cách viết một ứng dụng trên microsoft windows Bởi: Khuyet Danh CÁCH VIẾT MỘT ỨNG DỤNG TRÊN MICROSOFT WIN

Hàm và lớp template trong Lập trình hướng đối tượng Hàm và lớp template trong Lập trình hướng đối tượng Bởi: unknown Trong phần này, chúng ta tìm hiểu

Bài thực hành 6 trang 106 SGK Tin học 10


Template and Exception Template and Exception Bởi: Thanh Hiền Vũ TEMPLATE Trong phần này, chúng ta tìm hiểu về một trong các đặc tính còn lại của C++,

Slide 1

Chuỗi Chuỗi Bởi: phamvanviet truonglapvy Chuỗi (string) trong C# là một kiểu dựng sẵn như các kiểu int, long, có đầy đủ tính chất mềm dẻo, mạnh mẽ và

Hướng dẫn sử dụng Adobe Presenter Pro 7.0

Microsoft Word - Bai 7.1.docx

Microsoft Word - su_dung_sqlite_voi_php.docx

Copyright vietjack.com Chuỗi (String) trong C# Trong C#, bạn có thể sử dụng các chuỗi (string) như là mảng các ký

Lớp đối tượng String Lớp đối tượng String Bởi: Khuyet Danh Ngôn ngữ C# hỗ trợ khá đầy đủ các chức năng của kiểu chuỗi mà chúng ta có thể thấy được ở c

Nhúng mã-cách khai báo biến Nhúng mã-cách khai báo biến Bởi: Khoa CNTT ĐHSP KT Hưng Yên Nhúng mã javascript trong trang HTML Bạn có thể nhúng JavaScri

Microsoft Word - tao_ung_dung_hello_world_trong_android.docx

Slide 1

Microsoft Word - jsp_syntax.docx

Ch­ng I

Slide 1

TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI VIỆN CÔNG NGHỆ THÔNG TIN VÀ TRUYỀN THÔNG TIN HỌC ĐẠI CƯƠNG Bài 5. Kiểu dữ liệu và biểu thức trong C Nội dung 1. Các ki

HƯỚNG DẪN SỬ DỤNG 1) Các thông số cài đặt client (MS Outlook, Outlook Express, Thunder Bird ) 2) Hướng dẫn đổi password 3) Hướng dẫn

Lớp đối tượng trong.net Framework Lớp đối tượng trong.net Framework Bởi: Khuyet Danh Trong chương này chúng ta sẽ tìm hiểu các lớp cơ sở mà.net cung c

Xử lý ngoại lệ

Nội dung chương 3 IT1110 Tin học đại cương Phần I: Tin học căn bản Chương 3: Hệ thống máy tính 3.1. Giới thiệu 3.2. Chức năng và các thành phần của má

Lập trình cấu trúc trong Visual Basic Lập trình cấu trúc trong Visual Basic Bởi: Nguyễn Sơn Học xong chương này, sinh viên phải nắm bắt được các vấn đ

TRƯỜnG ĐẠI HỌC BÁCH KHOA HÀ nội VIỆn CÔnG nghệ THÔnG TIn VÀ TRUYỀn THÔnG TIN HỌC ĐẠI CƯƠNG Bài 10. Các cấu trúc lập trình trong C Nội dung 1. Cấu trúc

Bài 1:

Chương trình dịch

Microsoft Word - LedCenterM_HDSD.doc

CÀI ĐẶ T ANDROID TRÊN NETBEAN Yêu cầ u:trong quá trình cài đặ t phả i kế t nố i mạ ng,và phiên bả n này đượ c cài trên windows. 1.Download Netbean(6.7

NGÔN NGƯ LÂ P TRIǸH Biên tập bởi: nguyenvanlinh

Microsoft Word - TaiLieuTNKTD1PhanPLC-05[1].2008.doc

Huong dan su dung phan mem Quan ly chat luong cong trinh GXD

Microsoft PowerPoint - 02_Address_Book

Chương 1:

Chương trình dịch

TẬP ĐOÀN VIỄN THÔNG QUÂN ĐỘI VIETTEL TRUNG TÂM CÔNG NGHỆ THÔNG TIN 1 HƯỚNG DẪN SỬ DỤNG HỆ THỐNG QUẢN LÝ VÀ ĐIỀU HÀNH VĂN BẢN ĐIỆN TỬ Đối tượng Văn thư

Kiểu dữ liệu văn bản Kiểu dữ liệu văn bản Bởi: PGS. TS. NGƯT Phạm Văn Huấn Ngoài những dữ liệu số như các số nguyên, số thực, máy tính còn có thể lưu

Thực hành trên Rose Thực hành trên Rose Bởi: Đoàn Văn Ban Xây dựng biểu đồ thành phần + Tạo lập mới hoặc mở một biểu đồ thành phần đã được tạo lập trư

Slide 1

BÀI MỞ ĐẦU BÀI MỞ ĐẦU Bởi: Vũ Khánh Quý Bài 1: GIỚI THIỆU MÔN HỌC 1. Giới thiệu môn học Với xu thế ứng dụng hệ thống thông tin vào tất cả các hoạt độn

(Tái bản lần thứ hai)

Chương trình dịch

HƯỚNG DẪN SỬ DỤNG HỆ THỐNG E-LEARNING Version 2.9 Công Ty TNHH Uratek Website: TP.HCM, 7/2018

asqw

CÔNG TY TNHH PHẦN MỀM H2SOFT 38/1 Đường Đồi 82 Hòn Nghê Vĩnh Ngọc Nha Trang- Khánh Hòa Website: TÀI LIỆU

HƯỚNG DẪN SỬ DỤNG CÁC SẢN PHẨM CỦA OFFICE 365 Hợp đồng số: 25/KTQD-FPT Cung cấp hệ thống Office trực tuyến và thư điện tử Trường Đại Học Kinh Tế Quốc

TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI VIỆN CÔNG NGHỆ THÔNG TIN VÀ TRUYỀN THÔNG TIN HỌC ĐẠI CƯƠNG Bài 11. Mảng và xâu kí tự Nội dung 1. Mảng 2. Xâu kí tự 2 1

NGÔN NGỮ THỐNG KÊ R

Microsoft Word - mot_so_tool_trong_android.docx

Dell UltraSharp U2518D Trình Quản Lý Màn Hình Dell Sổ tay hướng dẫn sử dụng

Làm quen với chương trình Microsoft Excel Làm quen với chương trình Microsoft Excel Bởi: unknown Làm quen với chương trình Những thao tác đầu tiên với

Hướng dẫn sử dụng phần mềm MISA Panda.NET 2011

9-KiemThu

Microsoft Word - Tin hoc dai cuong 2015

Microsoft Word - danh-sach-lien-ket-doi-trong-c.docx

Array, Indexer và Collection Array, Indexer và Collection Bởi: phamvanviet truonglapvy Mảng (Array) Mảng là một tập hợp các phần tử có cùng kiểu, được

Trung Tâm Gia Sư Tài Năng Việt A.PHẦN TRẮC NGHIỆM: (6,0 điểm) ĐỀ 1 I. Hãy điền đáp án đúng vào bảng đáp án ở phần bài làm:

PHẦN LÝ THUYẾT Câu 1 : Trong Windows Explorer để đánh dấu chọn tất cả các đối tượng ta sử dụng? a. ấn Alt + Click chuột c. Tổ hợp phím Ctrl + A b. Ấn

Microsoft Word - action_trong_jsp.docx

Phụ lục 2: HỒ SƠ NĂNG LỰC NĂM 2014

UART0

Chương II - KIẾN TRÚC HỆ ĐIỀU HÀNH

Microsoft Word - Phan 1 - Kien thuc co so IFS-HANU 2011.doc

Hướng dẫn sử dụng

Microsoft Word - cai_dat_android_studio.docx

[MUP Armadillo v5.42 Case Study]

TẬP ĐOÀN VIỄN THÔNG QUÂN ĐỘI DỊCH VỤ CHỨNG THỰC CHỮ KÝ SỐ VIETTEL-CA SỔ TAY HƯỚNG DẪN SỬ DỤNG CHỨNG THƯ SỐ VIETTEL-CA MỤC LỤC 1. GIỚI THIỆU VỀ DỊCH VỤ

ESET Mobile Security

Hướng dẫn Bắt đầu Nhanh Microsoft Publisher 2013 trông khác với các phiên bản trước, vì vậy chúng tôi tạo ra hướng dẫn này để giúp bạn dê dàng nắm bắt

Hướng dẫn Cài đặt NOTEBOOK Hướng dẫn Cài đặt Windows Đọc kỹ tài liệu này trước khi cài đặt. Sau khi đọc Hướng dẫn Cài đặt này, cất ở nơi dễ lấy để tất

HƯỚNG DẪN SỬ DỤNG CỔNG THÔNG TIN CÁN BỘ ( Cổng thông tin cán bộ là phần mềm nằm trong Hệ thống thông tin tổng thể của Trườ

Phụ lục 2: HỒ SƠ NĂNG LỰC NĂM 2014

(Tái bản lần thứ hai)

1 Tạo slide trình diễn với Microsoft Powerpoint Tạo slide trình diễn với Microsoft Powerpoint Người thực hiện Hoàng Anh Tú Phạm Minh Tú Nội dung 1 Mục

000.FF50VI. Trang bia 1 - bia ngoai

TÀI LIỆU HƯỚNG DẪN CÀI ĐẶT HƯỚNG DẪN CÀI ĐẶT VÀ KIỂM TRA ỨNG DỤNG QUẢN LÝ BÁN HÀNG

Operating Instructions

MCSA 2012: Distributed File System (DFS) MCSA 2012: Distributed File System (DFS) Cuongquach.com Ở bài học hôm nay, mình xin trình bày về Distributed

mySQL - Part 1 - Installation

Copyright vietjack.com Nạp chồng toán tử trong C# Operator Overloading là Nạp chồng toán tử. Bạn có thể tái định

Nh?ng cách cha?y Android trên máy tính

Bài 15: QUẢN LÝ BẢNG TÍNH 15.1 Các khái niệm Ô (cell) là đơn vị cơ sở của bảng tính, mỗi ô có địa chỉ riêng, địa chỉ gồm Chỉ số cột Chỉ số dòng, ví dụ

Bản ghi:

Animation, Modules 6 - Hoạt hình, tách file https://github.com/tqlong/advprogram

Hoạt hình Các trò chơi trên máy tính thường không thể thiếu hoạt hình https://www.quora.com/why-is-animation-important Trực quan, sinh động, vui Dễ dàng truyền đạt thông tin, khái niệm Cách làm: Vẽ hình Đợi một lúc cho hình ảnh đọng lại trong mắt Xóa màn hình và lặp lại vẽ hình kế tiếp

Hangman 2.2 : Hoạt hình Khi thua: hình giá treo cổ đung đưa Khi thắng: hình người nhảy múa

Bắt đầu sửa từ hàm main() int main() {... while (badguesses.length() < MAX_BAD_GUESSES && word!= guessedword); rendergame(guessedword, badguesses); if (badguesses.length() < MAX_BAD_GUESSES) cout << "Congratulations! You win!"; else cout << "You lost. The correct word is " << word; return 0;

Bắt đầu sửa từ hàm main() int main() Vùng code thông báo kết quả tại Hangman bản cũ 2.1 {... while (badguesses.length() < MAX_BAD_GUESSES && word!= guessedword); rendergame(guessedword, badguesses); if (badguesses.length() < MAX_BAD_GUESSES) cout << "Congratulations! You win!"; else cout << "You lost. The correct word is " << word;...

Bắt đầu sửa từ hàm main() int main() {... while (badguesses.length() < MAX_BAD_GUESSES && word!= guessedword); displayfinalresult(badguesses.length() < MAX_BAD_GUESSES, word);... Bắt đầu Hangman 2.2 void displayfinalresult(bool won, const string& word) { rendergame(guessedword, badguesses); if (won) else cout << "Congratulations! You win!"; cout << "You lost. The correct word is " << word; Tạm chuyển, sẽ thay bằng nội dung hoạt hình

Cơ chế hoạt hình Vẽ hình kế tiếp Đợi một lúc (500 milli giây) Xóa màn hình

Cơ chế hoạt hình text cout << nextimage; this_thread::sleep_for( chrono::milliseconds(500)); #include <thread> #include <chrono> for (int i = 0; i < 30; i++) cout << endl;

Thử thư viện #include <iostream> #include <thread> #include <chrono> using namespace std; int main () { int i = 0; while (i<100) { Thử tạm hoạt hình các số từ 10 xuống 1 xem thế nào Cần dùng chuẩn C++11. - Chỉnh setting CodeBlock (Setting Compiler... Compiler Flags) - Hoặc nếu biên dịch dòng lệnh cần tham số C:\> g++ -std=c++11 test.cpp for (int i = 0; i < 30; i++) cout << endl; // xóa màn hình cout << i++; // vẽ hình kế tiếp this_thread::sleep_for(chrono::milliseconds(500)); // đợi

Phân chia mã nguồn Chương trình Hangman đã khá dài Bắt đầu khó quản lý Phần tạo animation sẽ còn dài thêm nữa. Phân chia mã nguồn thành nhiều mô-đun (file) Dễ quản lý (mỗi mô-đun = 1 tập các hàm) Có thể sử dụng lại mô-đun cho chương trình khác Giảm thời gian biên dịch Các tệp mã nguồn được biên dịch riêng rẽ Chia mô đun theo chức năng. VD: <string> chuyên xử lý xâu <iostream> chuyên xử lý input, output

Phân chia mã nguồn trong C++ Mỗi mô-đun thường gồm 02 phần: Tệp tiêu đề - header (*.h, *.hpp) Khai báo hàm, khai báo kiểu, khai báo lớp Nên viết chi tiết phạm vi để tránh nhầm lẫn Ví dụ: std::string, std::vector Tệp cài đặt - implementation (*.cpp) Cài đặt mã lệnh cho các hàm, phương thức của lớp Có thể sử dụng lệnh using ở đây do biên dịch riêng Ví dụ: using namespace std; using std::string;

Tách code Hangman: draw.cpp Chuyển các định nghĩa hàm vẽ và dữ liệu vẽ từ hangman.cpp vào file mới draw.cpp void rendergame() {... string FIGURE[] =... void displayfinalresult() {... Chép các include cần thiết và khai báo namespace vào draw.cpp để giải nghĩa cho string, cout đang được dùng tại draw.cpp File nào trong chương trình C++ cũng cần có đủ các include và khai báo namespace

Tách code Hangman: draw.cpp #include <iostream> using namespace std; const string FIGURE[] = { " ------------- \n"... ; void rendergame(const string& guessedword, const string& badguesses) {... void displayfinalresult(bool won, const string& word) {...

Tách code Hangman: draw.h Chuyển các khai báo của các hàm vẽ từ hangman.cpp vào file mới draw.h void rendergame(...); void displayfinalresult(...); Chép các include cần thiết và khai báo namespace vào draw.cpp để giải nghĩa cho string, cout đang được dùng tại draw.h #include <iostream> using namespace std; void rendergame(const string& guessedword, const string& badguesses); void displayfinalresult(bool won, const string& word);

Biên dịch Nếu biên dịch thử draw.cpp: Lỗi đại loại undefine reference to WinMain@16 - nghĩa là không thấy hàm main, nhưng xuất hiện file draw.o vậy là ổn Nếu biên dịch thử hangman.cpp Lỗi không hiểu rendergame(), displaygameresult(). Tất nhiên, chúng được viết tại tại mô đun draw chứ không phải tại hangman.cpp. Trình biên dịch không nhìn thấy. Cách xử lý: nối hangman.cpp với draw 1. Bổ sung #include "draw.h" tại main 2. Dịch kèm draw.cpp, chẳng hạn bằng lệnh sau tại console: a. g++ hangman.cpp draw.cpp

Tạo Project Ta có thể tự gõ lệnh dịch phức tạo để biên dịch chương trình nhiều file. Nhưng tạo project là cách thuận tiện hơn. Cách làm với CodeBlocks: File / New / Project... Console Application (chương trình chạy trên cửa sổ lệnh) Ấn Go Ấn Next Ấn Next

Tạo Project Chọn Project title: hangman Chọn Thư mục chứa Hangman.cpp Ấn Next Ấn Finish

Tạo Project Thêm các file Hangman.cpp, draw.cpp, draw.h vào Project: - Chọn menu Project Add Files.. Chọn lấy - Xóa main.cpp khỏi project: chuột phải vào main.cpp rồi Remove - Kết quả như hình bên

Tạo Project Thử dịch sẽ thấy kết quả là file hangman.exe tại thư mục hangman\bin\debug Nhớ chạy thử xem có trục trặc gì không!

Đưa hoạt hình vào hangman #include <iostream> void displayfinalresult(bool won, const string #include <thread> if (badguesses.length() < MAX_BAD_GUESSES) #include <chrono> cout << "Congratulations! You win!"; using namespace std; else int main () { cout << "You lost. The correct word is " << w int i = 0; while (i<100) { for (int i = 0; i < 30; i++) cout << endl; cout << i++; this_thread::sleep_for(chrono::milliseconds(500)); draw.h

Đưa hoạt #include hình <chrono> vào hangman #include <iostream> #include <thread> #include <chrono> using namespace std; int main () { int i = 0; while (i<100) { #include <thread>... void displayfinalresult(bool won, const string& word) { while (true) { for (int i = 0; i < 30; i++) cout << endl; if (won) cout << "Congratulations! You win!"; else cout << "You lost. The correct word is " << word << cout << (won? getnextdancingman() : getnexthangman()) this_thread::sleep_for(chrono::milliseconds(500)); for (int i = 0; i < 30; i++) cout << endl; cout << i++; this_thread::sleep_for(chrono::milliseconds(500)); draw.h

const string& getnexthangman() { const static string figure[] = { "fig1", "fig2", "fig3", "fig4" ; giữ const int NUMBER_OF_FIGURES = currentfigure sizeof(figure) / sizeof(string); trong bộ nhớ... static int currentfigure = 0; void displayfinalresult(bool return won, const figure[(currentfigure++) string& word) { % NUMBER_OF_FIGURES]; while (true) { getnexthangman() chuẩn bị currentfigure cho lần gọi sau for (int i = 0; i const < 30; string& i++) cout getnextdancingman() << endl; if (won) { cout << "Congratulations! // tương You tự win!"; getnexthangman() else cout << "You lost. The correct word is " << word << endl; cout << (won? getnextdancingman() : getnexthangman()); this_thread::sleep_for(chrono::milliseconds(500)); draw.cpp

Biến static - Phạm vi nằm trong hàm - Vòng đời dài hơn lời gọi hàm - Giữ nguyên giá trị giữa các lần gọi hàm. void test() { static int count = 0; cout << count++; int main(int argc, char* argv[]) { while (true) test(); output 0 1 2 3 4...

Biến figure của getnexthangman() const static string figure[] = { " ------------+ \n" " / \n" " O \n" " / \\ \n" " / \\ \n" " \n" " ----- \n", " ------------+ \n" " \n" " O \n" " / \\ \n" " / \\ \n" " \n" " ----- \n", ; " ------------+ \n" " \\ \n" " O \n" " / \\ \n" " / \\ \n" " \n" " ----- \n", " ------------+ \n" " \n" " O \n" " / \\ \n" " / \\ \n" " \n" " ----- \n",

Biến figure của getnextstandingman() static string figure[] = { " O \n" " / \\ \n" " \n", " O \n" " / \\ \n" " / \\ \n", " O \n" " \n" " / \\ \n", " \\O/ \n" " \n" " / \\ \n", " O \n" " \n" " / \\ \n", Chạy thử sẽ thấy hoạt hình đẹp hơn :-) ; " O \n" " / \\ \n" " / \\ \n", " O \n" " / \\ \n" " / \\ \n", " O \n" " / \\ \n" " / \\ \n", " O \n" " / \\ \n" " / \\ \n", " O \n" " / \\ \n" " / \\ \n",

... draw.h void clearscreen(); void rendergame(const string& guessedword, const string& badguesses); void displayfinalresult(bool won, const string& word); Refactor Phiên bản 2.2 với hoạt hình đơn giản đã chạy. Đến lúc dọn dẹp code phiên bản 2.2.1 Lặp code tại rendergame() và displaygameresult(), nên tách ra thành hàm clearscreen() const int PATCH_LINES = 30; for (int i = 0; i < PATCH_LINES; i++) cout << endl; Nếu muốn gọi clearscreen() từ ngoài draw.cpp, cần bổ sung khai báo vào trong draw.h

Refactor Code tại getnexthangman() và getnextdancingman() chỉ khác nhau ở biến figure[], nên gộp lại? Ví dụ const string& getnextimage(const string images[], int imagecount){ static int currentfigure = 0; return images[(currentfigure++) % imagecount]; Hoặc có thể bỏ hẳn và dùng kĩ thuật tại hàm rendergame()

Bài tập 1. Tìm hiểu tiền xử lý #ifdef #else để phân biệt Windows và hệ điều hành khác Trong Windows, còn có thể dùng system("cls") xóa console Làm theo hướng dẫn trong http://stackoverflow.com/questions/34842526/update-console-without-f lickering-c/34843181 để xóa màn hình mà không gây nháy trong Windows 2. Sửa hàm playanimation() để chạy hoạt hình trong 10 giây