Bài giảng Lập trình nâng cao: Tìm kiếm và đếm - Trần Quốc Long
lượt xem 5
download
Bài giảng "Lập trình nâng cao: Tìm kiếm và đếm" cung cấp cho người học các kiến thức: Máy chơi Hangman, chương trình phức tạp, thư viện tập hợp, thư viện ánh xạ, vòng lặp for trên vector,... Mời các bạn cùng tham khảo nội dung chi tiết.
Bình luận(0) Đăng nhập để gửi bình luận!
Nội dung Text: Bài giảng Lập trình nâng cao: Tìm kiếm và đếm - Trần Quốc Long
- Simple AI 9 - Tìm kiếm và đếm https://github.com/tqlong/advprogram
- Nội dung Máy chơi Hangman Chương trình phức tạp → Mã giả + chia để trị AI = Dữ liệu + Tìm kiếm + Đếm (thống kê) Kỹ thuật: Thư viện tập hợp , thư viện ánh xạ Vòng lặp for trên vector, set, map Tìm kiếm Tìm kiếm thỏa mãn điều kiện Tìm kiếm lớn nhất, nhỏ nhất Đếm
- Đặt vấn đề Lập trình cho máy chơi trò Hangman: Người nghĩ từ Máy đoán các chữ cái Người trả lời các vị trí chữ cái đoán đúng … Người - chủ trò (host); Máy - người chơi (player)
- Các thành phần Giao diện tương Lõi trí tuệ nhân tác (UI) tạo (AI core) Nhập số chữ cái của từ người Dựa vào các phán đoán đã chơi nghĩ (dễ) đưa ra và secretWord hiện Hiển thị phán đoán, lịch sử phán thời đoán của máy và giá treo (đã làm) Đưa ra phán đoán tiếp Nhập trả lời của người chơi theo Liệu máy tính có thể chơi Hangman giỏi hơn con người ?
- Nhập trả lời của người chơi Khi máy đưa ra phán đoán, người chơi trả lời bằng xâu mặt nạ (mask) Một xâu ký tự toàn dấu gạch ngang Chỉ hiển thị các vị trí đoán đúng Ví dụ: người nghĩ từ “hangman” máy đoán p, người trả lời ------- máy đoán tiếp a, người trả lời tiếp -a---a- máy đoán tiếp g, người trả lời tiếp -a-g-a-
- Tiện ích sinh xâu mặt nạ // genmask.cpp // Mask generating tool for Hangman game #include #include using namespace std; int main(int argc, char* argv[]) { if (argc < 3) { cout
- Mã giả - chia để trị wordLength = getUserWordLength(); secretWord = string(wordLength, '-'); incorrectGuess = 0; previousGuesses = empty set of characters; stop = false; do { guess = getNextGuess(previousGuesses, secretWord); Trí tuệ nhân tạo (AI) mask = getUserAnswer(guess); update(guess, mask, incorrectGuess, previousGuesses, secretWord, stop); render(incorrectGuess, previousGuesses, secretWord); } while (!stop); playAnimation(incorrectGuess == MAX_GUESSES, secretWord);
- Lập trình nhóm Dự án phức tạp nhiều người Mỗi người làm một phần Dự án này Một người làm giao diện Một người làm phần lõi AI (getNextGuess) Đây là phần khó, chưa biết làm thế nào Nếu đợi → làm chậm dự án Cần một hàm getNextGuess() đơn giản để bên làm giao diện có thể phát triển độc lập Đồng thời, bên làm AI có thể tìm cách cải tiến
- Tạo Project Trong CodeBlocks tạo Project SimpleAI Tạo tệp guesser.h, guesser.cpp thêm vào Project Thêm hàm char getNextGuess(string, string) vào guesser.* #include "guesser.h" trong main.cpp #pragma once guesser.h #include #include char getNextGuess(const std::set& previousGuesses, const std::string& secretWord);
- Giới thiệu thư viện previousGuesses cần lưu tập hợp các chữ cái đã đoán : tập hợp các giá trị cùng kiểu set: tập hợp (con) các số nguyên set: tập hợp các ký tự set: tập hợp các xâu ký tự Các phần tử trong tập hợp đảm bảo luôn khác nhau (!=)
- Giới thiệu thư viện Các phép toán tập hợp: s.insert('a'): thêm phần tử 'a' vào tập s s.erase('a'): xóa phần tử 'a' khỏi tập s s.find('a') != s.end(): phần tử 'a' thuộc tập s s.find('a') == s.end(): phần tử 'a' không thuộc tập s for (char c : s): duyệt các phần tử trong tập s http://www.cplusplus.com/reference/set/set/
- getNextGuess đơn giản Chọn ngẫu nhiên 1 ký tự chưa đoán bao giờ guesser.cpp #include Thêm util.* vào #include "guesses.h" Project #include "util.h" #include "util.h" trong guesser.cpp using namespace std; char getNextGuess(const set& previousGuesses, const string& secretWord) { set remainingChars = getRemainingChars(previousGuesses); if (remainingChars.size() == 0) return 0; else return selectRandomChar(remainingChars); }
- getRemainingChars() Bắt đầu, remainChars = tập chữ cái từ a → z sau đó xóa các chữ cái trong previousGuesses set getRemainingChars(const set& previousGuesses) { set remainingChars; for (char c = 'a'; c
- selectRandomChar() Google “c++ select random element from set” http://stackoverflow.com/questions/3052788/how-to-select-a-random-elemen char selectRandomChar(const set& s) { int r = rand() % s.size(); for (char c : s) { if (r-- == 0) return c; } return 0; }
- Lập trình giao diện Đã có lõi AI đơn giản Có thể phát triển giao diện riêng rẽ Phát triển thêm từ code Hangman cũ Người làm AI tiếp tục tìm hiểu để cải tiến cách phán đoán (thuật toán)
- main(): chuyển từ mã giả sang Chia để trị int main() { Viết mã int wordLength; string secretWord; lần lượt int incorrectGuess; set previousGuesses; cho các bool stop; initialize(wordLength, secretWord, incorrectGuess, previousGuesses, hàm stop); render(incorrectGuess, previousGuesses, secretWord); do { char guess = getNextGuess(previousGuesses, secretWord); string mask = getUserAnswer(guess); update(guess, mask, incorrectGuess, previousGuesses, secretWord, stop); render(incorrectGuess, previousGuesses, secretWord); } while (!stop); playAnimation(incorrectGuess == MAX_GUESSES, secretWord); return 0; }
- getUserWordLength() Nhập độ dài từ người chơi nghĩ int getUserWordLength() { int wordLength; cout wordLength; return wordLength; }
- getUserAnswer() Nhập (mặt nạ) trả lời của người chơi, chuyển qua chữ thường string getUserAnswer(char guess) { string answer; cout
- initialize() Khởi tạo các trạng thái của trò chơi void initialize(int& wordLength, string& secretWord, int& incorrectGuess, set& previousGuesses, bool& stop) { wordLength = getUserWordLength(); secretWord = string(wordLength, '-'); incorrectGuess = 0; previousGuesses = set(); stop = false; }
- render() Sử dụng lại các hàm trong draw.* (nhớ include) for (char c: previousGuesses) in các phần tử void render(int incorrectGuess, const set& previousGuesses, const string& secretWord) { clearScreen(); cout
CÓ THỂ BẠN MUỐN DOWNLOAD
-
Bài giảng Lập trình nâng cao với Java
170 p | 99 | 14
-
Bài giảng Lập trình nâng cao: Giới thiệu môn học - Trần Quốc Long
16 p | 79 | 7
-
Bài giảng Lập trình nâng cao: Hoạt hình, tách file - Trần Quốc Long
28 p | 66 | 6
-
Bài giảng Lập trình nâng cao: Phát triển chương trình - Trần Quốc Long
38 p | 79 | 6
-
Bài giảng Lập trình nâng cao: Hàm - Trần Quốc Long
34 p | 63 | 6
-
Bài giảng Lập trình nâng cao: Bài 7 - Lý Anh Tuấn
33 p | 68 | 5
-
Bài giảng Lập trình nâng cao: Hướng đối tượng - Nguyễn Thị Tú Mi
117 p | 65 | 5
-
Bài giảng Lập trình nâng cao - Chương 3: Mảng
48 p | 67 | 5
-
Bài giảng Lập trình nâng cao - Chương 0: Giới thiệu môn học
6 p | 81 | 4
-
Bài giảng Lập trình nâng cao: Bài 6 - Lý Anh Tuấn
28 p | 48 | 4
-
Bài giảng Lập trình nâng cao: Bài 0 - Hoàng Thị Điệp
7 p | 86 | 3
-
Bài giảng Lập trình nâng cao: Chương 5 - Lý Anh Tuấn
54 p | 27 | 2
-
Bài giảng Lập trình nâng cao: Chương 1 - Lý Anh Tuấn
26 p | 35 | 2
-
Bài giảng Lập trình nâng cao - Chương 0: Giới thiệu môn học, Warm up Game over
16 p | 5 | 1
-
Bài giảng Lập trình nâng cao - Chương 1: Simple Calculator (Ôn tập)
18 p | 7 | 1
-
Bài giảng Lập trình nâng cao - Chương 2: Game Guess it (Hàm)
34 p | 6 | 1
-
Bài giảng Lập trình nâng cao - Chương 3: Game Hangman (Phát triển chương trình)
38 p | 10 | 1
Chịu trách nhiệm nội dung:
Nguyễn Công Hà - Giám đốc Công ty TNHH TÀI LIỆU TRỰC TUYẾN VI NA
LIÊN HỆ
Địa chỉ: P402, 54A Nơ Trang Long, Phường 14, Q.Bình Thạnh, TP.HCM
Hotline: 093 303 0098
Email: support@tailieu.vn