Thuật toán

Một phần của tài liệu Báo cáo Java Lập trình game trúc xanh (Trang 28 - 32)

CHƯƠNG 3 PHÂN TÍCH THIẾT KẾ

3.2.3. Thuật toán

Hình 3.4: Sơ đồ thuật toán xử lý các sự kiện trong phần hai người chơi.  Diễn giải chi tiết

• Các biến sử dụng:

− Biến click: kiểm tra lần click là 1 hay 2 trong một lượt mở.

− Biến Count: đếm số ô còn lại chưa mở. Trò chơi kết thúc khi Count =0.

a, b: địa chỉ hàng cột của ô trong lượt click thứ nhất.

c, d: địa chỉ hàng cột của ô trong lượt click thứ hai.

− Biến diem: lưu tổng số điểm của màn chơi.

− Biến solanclick: lưu số lần click để mở hết các ô trong màn chơi.

• Diễn giải sơ đồ:

Khi trò chơi bắt đầu các biến được reset như trong sơ đồ.

Vấn đề là phải làm sao để xác định được khi người chơi lật mở một ô là lần thứ nhất hay thứ hai để xử lý.

Nếu là lần mở đầu tiên thì tiến hành mở ô, hủy sự kiện nhấn nút vào ô được chọn. Kiểm tra nếu là ấn nút đầu tiên của lượt mở từ thứ hai trở đi thì phải xác định trường hợp có hai ô được mở nhưng không đúng ở lượt mở trước do đó ta phải lật úp lại hai ô này.

Nếu là lần mở thứ hai trong lượt mở thì tiến hành mở ô, sau đó so sánh với hình ảnh đã mở ở lượt click thứ nhất. Nếu giống nhau thì lật hai ô, hủy sự kiện nhấn nút vào hai ô này. Giảm biến đếm số ô còn lại đi 2. Đưa c= -1,d= -1. Tăng điểm thêm 10. Nếu không giống nhau giảm điểm đi 5, lấy lại sự kiện cho nút đã mở ở lượt click thứ nhất, lấy vị trí ô hiện tại để lật lại gán vào c, d. Kiểm tra xem số ô còn lại có bằng 0 không, nếu bằng kết thúc màn chơi và thông báo điểm. nếu không lặp lại các lượt click đến khi nào count =0.

Sơ đồ thuật toán hai người chơi cũng gần tương tự như phần thứ nhất, ở đây các biến điểm cũng như số lần click ta không quan tâm, ta chỉ quan tâm tời số cặp ô mà người chơi mở được.

 Các khó khăn và hướng giải quyết

• Khó khăn 1:

Làm sao để đưa các ảnh vào button một cách ngẫu nhiên và các ảnh phải đi với nhau từng đôi một.

• Hướng giải quyết:

Sử dụng 2 mảng, một mảng giatri gồm sohang*socot phần tử để lưu các giá trị hình ảnh, các giá trị này được chia thành các cặp giá trị giống nhau(ví dụ 2 ảnh có cùng nội dung). Mục đích của mảng giatri là lưu trữ ảnh để cho vào button kia, tuy nhiên như vậy thì các giá trị này chưa được đưa ngẫu nhiên vào các button. Vì vậy, chúng ta sử dụng thêm một mảng vitri cũng gồm

sohang*socot phần tử để tạo ra các vị trí ảnh trong mảng. Mảng vị trí này được tạo ra nhờ sử dụng

hàm random, do vậy sẽ tạo ra được mảng vị trí có giá trị ngẫu nhiên. Sử dụng 2 mảng này ta sẽ đưa được các ảnh trong mảng giatri vào các button một cách ngẫu nhiên.

• Xây dựng:

String giatri[ ]={"Images/anh10.png", "Images/anh10.png", "Images/anh1.png", "Images/anh1.png", "Images/anh2.png", "Images/anh2.png", "Images/anh3.png", "Images/anh3.png", "Images/anh4.png", "Images/anh4.png", "Images/anh5.png", "Images/anh5.png", "Images/anh6.png", "Images/anh6.png", "Images/anh7.png", "Images/anh7.png", "Images/anh8.png", "Images/anh8.png", "Images/anh9.png", "Images/anh9.png"}; for(int i=0;i<vitri.length;i++) { do{ tg=random(20); }while(testonly(vitri, vitri.length,tg)); vitri[i]=tg; } • Khó khăn 2:

Làm sao để khi kết thúc trò chơi, nếu điểm của người chơi thuộc vào top 10 người cao điểm nhất thì mới ghi vào file tên người chơi và điểm.

• Hướng giải quyết:

+ Sử dụng FileInputStream để đọc file. + Sử dụng FileOutputStream để ghi file.

+ Tiến hành duyệt file diem.txt, nếu gặp chỗ nào mà có điểm của người chơi hiện tại lớn hơn điểm của người chơi đã có trong file thì chèn điểm của người chơi hiện tại vào chỗ đó. Lưu ý là file

diem chỉ chứa 10 người chơi cao nhất, do vậy sử dụng 1 biến đếm để đếm đủ 10 người.

• Xây dựng:

String str="", text=""; int dem = 0;

FileInputStream fos = new FileInputStream(pathFile); Reader r = new java.io.InputStreamReader(fos,"UTF-8"); BufferedReader reader = new BufferedReader(r);

// StringBuilder text = new StringBuilder(); String line = null;

boolean in = false;

while((line = reader.readLine()) != null && dem < 10) {

dem++;

if( diem >= Integer.parseInt((line.substring(line.length() - 3)).trim()) && in == false)

{

str = JOptionPane.showInputDialog(null, "Điền tên vào ô dưới đây:","Thông báo",1); text += str + " " + diem + "\r\n"; in = true; dem ++; } text += line + "\r\n"; System.out.println(dem + " " +text);

//writeFile("./diem.txt", str + " " + diem , false); }

if((dem == 0 || in == false) && dem <= 10) {

System.out.println(dem);

str = JOptionPane.showInputDialog(null, "Điền tên vào ô dưới đây:","Thông báo",1);//neu bam vao ok thi moi duoc

text += str + " " + diem + "\r\n"; }

FileOutputStream fop = new FileOutputStream(pathFile); Writer out = new OutputStreamWriter(fop, "UTF8"); out.write(text);

out.close(); reader.close();

Một phần của tài liệu Báo cáo Java Lập trình game trúc xanh (Trang 28 - 32)

Tải bản đầy đủ (DOCX)

(36 trang)
w