1. Trang chủ
  2. » Công Nghệ Thông Tin

Bài giảng Lập trình nâng cao: Tìm kiếm và đếm - Trần Quốc Long

54 16 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 54
Dung lượng 193,44 KB

Nội dung

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.

Simple AI - Tìm kiếm đế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 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ỏ ○ Đếm Đặt vấn đề Lập trình cho máy chơi trị Hangman: ● Người nghĩ từ ● Máy đoán chữ ● Người trả lời vị trí chữ đốn … Người - chủ trò (host); Máy - người chơi (player) Các thành phần Giao diện tương tác (UI) Lõi trí tuệ nhân tạo (AI core) ● Nhập số chữ từ người chơi nghĩ (dễ) ● Hiển thị phán đoán, lịch sử phán đoán máy giá treo (đã làm) ● Nhập trả lời người chơi ● Dựa vào phán đoán đưa secretWord thời ○ Đưa phán đoán ○ Liệu máy tính chơi Hangman giỏi người ? Nhập trả lời người chơi Khi máy đưa phán đoán, người chơi trả lời xâu mặt nạ (mask) ● Một xâu ký tự toàn dấu gạch ngang ● Chỉ hiển thị vị trí đốn Ví dụ: người nghĩ từ “h an g m an ” 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 -amá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ạ // genm ask.cpp // M ask generating toolfor H angm an gam e # include < iostream > # include < cctype> u sin g n am esp ace std; in t m ain (in t argc,ch ar* argv[]) { if (argc < 3) { cout < < "U sage: genm ask < w ord> < char> " < < endl; retu rn 1; } string w ord = argv[1]; ch ar guess = tolow er(argv[2][0]); for (u n sig n ed in t i= 0; i< w ord.length(); i+ + ) if (tolow er(w ord[i]) != guess) w ord[i] = '-'; else w ord[i] = guess; cout < < w ord < < endl; retu rn 0; } Chuyển word sang mặt nạ, ký tự khác guess biến thành dấu gạch ngang Mã giả - chia để trị w ordLength = getU serW ordLength(); secretW ord = string(w ordLength, '-'); incorrectG uess = 0; previousG uesses = em pty set of characters; stop = false; { guess = getN extG uess(previousG uesses, secretW ord); Trí tuệ nhân tạo (AI) m ask = getU serAnsw er(guess); update(guess, m ask, incorrectG uess, previousG uesses, secretW ord, stop); render(incorrectG uess, previousG uesses, secretW ord); } w hile (!stop); playAnim ation(incorrectG uess = = M AX_G U ESSES, secretW ord); Lập trình nhóm ● Dự án phức tạp nhiều người ○ Mỗi người làm phần ● Dự án ○ Một người làm giao diện ○ Một người làm phần lõi AI (getNextGuess) ■ Đây phần khó, chưa biết làm ● Nếu đợi → làm chậm dự án ■ Cần hàm getNextGuess() đơn giản để bên làm giao diện phát triển độc lập ■ Đồng thời, bên làm AI 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" main.cpp # pragm a once guesser.h # include < string> # include < set> ch ar g etN extG u ess(con st std::set< ch ar> & previousG uesses, st std::string& secretW ord); Giới thiệu thư viện ● previousGuesses cần lưu tập hợp chữ đoán ● : tập hợp giá trị kiểu ○ set: tập hợp (con) số nguyên ○ set: tập hợp ký tự ○ set: tập hợp xâu ký tự ● Các phần tử tập hợp đảm bảo khác (!=) getSuitableWords() Duyệt mảng wordList để tìm từ phù hợp vector< string> getSuitableW ords(con st vector< string> & w ordList, st string& secretW ord, st set< ch ar> & rem ainingChars) { vector< string> result; for (u n sig n ed in t i= 0; i< w ordList.size(); i+ + ) if (isSuitableW ord(w ordList[i], secretW ord, rem ainingChars)) result.push_back(w ordList[i]); retu rn result; } thỏa mãn điều kiện đưa vào kết getSuitableWords() Dùng lệnh for vector< string> getSuitableW ords(con st vector< string> & w ordList, st string& secretW ord, st set< ch ar> & rem ainingC hars) { vector< string> result; for (con st string& w ord : w ordList) if (isSuitableW ord(w ord, secretW ord, rem ainingChars)) result.push_back(w ord); retu rn result; } thỏa mãn điều kiện đưa vào kết isSuitableWord() ● Có độ dài secretWord ● Các chữ secretWord vị trí word ● Các chữ lại nằm remainingChars b ool isS u itab leW ord (con st string& w ord, st string& secretW ord, st set< ch ar> & rem ainingChars) { if (w ord.length() != secretW ord.length()) retu rn false; for (u n sig n ed in t i= 0; i< w ord.length(); i+ + ) { if (secretW ord[i] != '-') { if (tolow er(w ord[i]) != tolow er(secretW ord[i])) retu rn false; } else if (rem ainingChars.fi n d(w ord[i]) = = rem ainingChars.end()) retu rn false; } retu rn true; } chữ chữ chưa getSuitableWords() Bài tập: tách lọc riêng vector< string> getSuitableW ords(con st vector< string> & w ordList, st string& secretW ord, st set< ch ar> & rem ainingC hars) { vector< string> result; result = fi lterW ordListByLen(secretW ord.length(), w ordList); result = fi lterW ordListByM ask(secretW ord, result); result = fi lterW ordListByRem ainingC hars( rem ainingC hars, secretW ord, result); retu rn result; } làm hàm B2: lọc từ chọn chữ ● Chọn chữ ○ Đếm số lần xuất chữ (chưa đốn) ○ Chọn chữ có số lần xuất cao ● Chức auto-complete Google ○ Chọn từ / ngữ phù hợp có số lần xuất cao occurenceCount = getO ccurenceC ount(rem ainingC hars, fi lteredW ordList); retu rn g etM axO ccu ren ceC h ar(rem ainingChars, occurenceCount); Thư viện ● Mỗi chữ cần lưu số lần xuất ○ Ánh xạ từ ký tự (char) số nguyên (int) ○ Trong C++: map ○ Thư viện : http://www.cplusplus.com/reference/map/map/ Thư viện ● Các thao tác với map: ○ map['a']=1: cho 'a' ánh xạ tới ■ 'a' gọi key, value ○ map['a']: lấy giá trị ánh xạ tới 'a' ○ map.insert('a', 1): tương tự Duyệt phần tử map ● Mỗi phần tử map có dạng ○ struct pair { first, second } ○ first key ○ second value ● Duyệt qua map for (auto p: my_map) cout & w ordList) { m ap< ch ar, in t> count; for (ch ar c: rem ainingChars) count[c] = 0; for (u n sig n ed in t i= 0; i< w ordList.size(); i+ + ) { st string& w ord = w ordList[i]; for (u n sig n ed in t j= 0; j< w ord.length(); j+ + ) if (count.fi nd(w ord[j]) != count.end()) count[w ord[j]]+ + ; } retu rn count; } getOccurenceCount() Chuyển hết qua lệnh for m ap< ch ar,in t> getO ccurenceCount(con st set< ch ar> & rem ainingChars, st vector< string> & w ordList) { m ap< ch ar, in t> count; for (ch ar c: rem ainingChars) count[c] = 0; for (con st string& w ord : w ordList) { for (ch ar c : w ord) if (count.fi nd(c) != count.end()) count[c]+ + ; } retu rn count; } getMaxOccurenceChar() Duyệt cặp (key, value) count Nếu value > best_count gán best c best_count value ch ar g etM axO ccu ren ceC h ar(con st set< ch ar> & rem ainingChars, st m ap< ch ar, in t> & count) { ch ar best = 0; in t best_count = 0; for (au to p : count) if (p.second > best_count) { best = p.fi rst; best_count = p.second; } retu rn best; } Simple AI 1.0 https://github.com/tqlong/advprogram/archive/9bc66 14903304407ddee771d30cad02cf5051ecb.zip ch ar g etN extG u ess(con st set< ch ar> & previousG uesses, st string& secretW ord) { static vector< string> w ordList = readW ordListFrom File("data/O gden_Picturable_200.txt"); set< ch ar> rem ainingChars = getRem ainingChars(previousG uesses); if (rem ainingChars.size() = = 0) retu rn 0; if (isAllD ash(secretW ord)) retu rn getVow elG uess(rem ainingChars); vector< string> fi lteredW ordList = getSuitableW ords(w ordList,secretW ord, rem ainingChars); m ap< ch ar, in t> occurenceCount = getO ccurenceCount(rem ainingChars,fi lteredW ordList); retu rn getM axO ccurenceChar(rem ainingChars, occurenceCount); } // ỉcó hàm khaibáo ỉ g u esser.h ,các hàm khác ỉnằm g u esser.cp p Bài tập ● Dùng chương trình chuyển nguồn sau https://github.com/dwyl/english-words/blob/master/words.txt https://github.com/mrdziuban/Hangman/blob/master/dictionary.txt http://stackoverflow.com/questions/4456446/dictionary-text-file http://www.gwicks.net/dictionaries.htm để readWordListFromFile() đọc được, thử chơi với tập từ vựng ● Có nhận xét khả SimpleAI thay đổi từ vựng Bài tập ● Có bỏ phần getVowelGuess() không ? ● Xử lý trường hợp từ cần đốn khơng có từ vựng, tức filteredWordList.size() == ● Kết thúc ván chơi, hỏi có muốn chơi tiếp ? Cho chơi tiếp người chơi đồng ý ● Nếu khơng đốn từ (guess == 0) thua cuộc, hỏi từ người chơi thêm vào vốn từ vựng ghi xuống file (giúp lần chơi sau) ... http://stackoverflow.com/questions/3052788/how-to-select-a-random-el ement-in-stdset ch ar selectR an d om C h ar(con st set< ch ar> & s) { in t r = rand() % s.size(); for (char c : s) { if (r = = 0) return c; } retu rn 0; } Lập trình. .. 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 vector, set, map ○ Tìm kiếm ■ Tìm kiếm. .. điều kiện ■ Tìm kiếm lớn nhất, nhỏ ○ Đếm Đặt vấn đề Lập trình cho máy chơi trị Hangman: ● Người nghĩ từ ● Máy đoán chữ ● Người trả lời vị trí chữ đốn … Người - chủ trị (host); Máy - người chơi

Ngày đăng: 08/05/2021, 12:19