Tải bản đầy đủ (.docx) (32 trang)

Báo cáo tin học ứng dung Matlab Game dò mìn

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (518.67 KB, 32 trang )

LỜI CẢM ƠN
Trên thực tế không có sự thành công nào mà không gắn liền với những sự hỗ trợ,
giúp đỡ dù ít hay nhiều, dù trực tiếp hay gián tiếp của người khác. Trong suốt thời gian
từ khi bắt đầu học tập ở giảng đường đại học đến nay, em đã nhận được rất nhiều sự
quan tâm, giúp đỡ của quý thầy cô, gia đình và bạn bè. Nhân cơ hội này, em muốn bày
tỏ lòng biết ơn sâu sắc của em tới họ.
Đầu tiên, em muốn cảm ơn người hướng dẫn của em, thầy Lê Hoàn vì sự hướng
dẫn tận tình và khoa học. Đó là một cơ hội lớn cho em để được nghiên cứu và làm việc
dưới sự hướng dẫn của thầy. Cảm ơn rất nhiều tới thầy vì sự hướng dẫn em và cách đặt
ra các câu hỏi nghiên cứu giúp em tìm hiểu các vấn đề.
Em xin gửi lời cảm ơn chân thành đến các cán bộ, giảng viên trong khoa Công
nghệ thông tin – Trường Đại học Điện Lực đã cùng với tri thức và tâm huyết của mình
để truyền đạt vốn kiến thức quý báu cho chúng em – những thành viên trong lớp D6-
Tin trong suốt thời gian học tập tại trường.
Em muốn cảm ơn những thành viên lớp D6-Tin – Trường Đại học Điện Lực.
Những người bạn luôn chia sẻ và cổ vũ em trong những lúc khó khăn và em luôn ghi
nhớ điều đó.
Cuối cùng, em xin bày tỏ lòng biết ơn vô hạn đối với cha mẹ và gia đình đã luôn
ủng hộ, giúp đỡ em.
Hà Nội, tháng 06 năm 2015
Sinh viên thực hiện
GVHD: ThS. Ngô Ngọc Thành
MỤC LỤC
GVHD: ThS. Ngô Ngọc Thành
DANH MỤC CÁC HÌNH
DANH MỤC CÁC BẢNG
GVHD: ThS. Ngô Ngọc Thành
LỜI MỞ ĐẦU
Hiện nay, khi cuộc sống vật chất của con người trở lên đầy đủ hơn, con người ta
sẽ có nhu cầu về tinh thần cũng cao hơn. Có rất nhiều cách để đáp ứng nhu cầu tinh
thần của con người như nghe nhạc, đọc sách báo, xem phim, du lịch, ăn uống… nhưng


có một lĩnh vực mà chắc hẳn ai cũng đam mê và quan tâm đó chính là giải trí bằng
những trò chơi. Cùng với sự phát triển của công nghệ thông tin, trí tuệ con người phát
triển cao, hàng loạt các trò chơi ra đời phục vụ nhu cầu giải trí của con người.
Xuất phát từ lý do đó nhóm chúng em đã quyết định thực hiện làm game “Dò
Mìn” làm báo cáo môn học Lập Trình Matlab đồng thời mục đích cũng là làm ra game
phục vụ nhu cầu của con người.
Game Dò mìn là một game có giao diện đơn giản, có nhiều mức độ chơi cho
người chơi chọn lựa. Game đòi hỏi người chơi có một chút suy luận. Vì vậy trò chơi
vừa giúp giải trí vừa có thể luyện khả năng tư duy logic. Tuy nhiên khi chơi quen trò
chơi trở nên khá là nhẹ nhàng.
Do kinh nghiệm, kiến thức và thời gian hạn chế nên chắc chắn bài tập này còn có
nhiều thiếu sót, mong được sự góp ý của các bạn. Và đặc biệt em rất mong được nghe
ý kiến đánh giá và chỉ bảo của thầy giáo Ngô Ngọc Thành, người nhiệt tình giảng dạy
và trực tiếp hướng dẫn nhóm làm bài tập. Xin chân thành cảm ơn thầy!
Nội dung bài báo cáo gồm 4 chương:
Chương 1: Tổng quan về bài toán.
Chương 2: Cơ sở lý thuyết.
Chương 3: Xây dựng chương trình.
Chương 4: Kết quả đạt được.
GVHD: ThS. Ngô Ngọc Thành
CHƯƠNG 1: TỔNG QUAN VỀ BÀI TOÁN
1.1 Tổng quan:
Khi rảnh rỗi hoặc sau một giờ làm việc căng thẳng thì mỗi người trong chúng ta
đều muốn tìm cho mình một trò chơi hoặc một hoạt động để giảm căng thẳng cũng
như lấy lại tinh thần. Có thể đó là các hoạt động thể thao, hoặc cũng có thể là các trò
chơi giải trí tùy thuộc vào quỹ thời gian của từng người. Với những ai có ít thời gian
việc tình đến những trò chơi giải trí trên điện thoại máy tính là rất phù hợp. Một trong
những trò chơi điện tử đáp ứng được nhu cầu này là game dò mìn. Một trò chơi rất
quen thuộc với những người sử dụng máy tính.
Dò mìn hay gỡ mìn là một trò chơi trên máy tính dành cho một người chơi. Trò

chơi được xây dựng như một chương trình giải trí cài đặt trên hệ điều hành Microsoft
Windows. Hiện nay trò chơi Dò mìn rất phổ biến.
Hình 1.1 Giao diện trò chơi dò mìn.
5
Mục tiêu chính của trò chơi là giúp người chơi tăng tính suy luận logic, nhạy bén
và cảm thấy thoải mái tinh thần sau khi đã chinh phục được trò chơi.
Trò chơi có 3 mức chơi: dễ, trung bình và khó. Tùy theo khả năng của mỗi người
chơi mà lựa chọn mức độ khó khác nhau. Với mỗi cấp độ khó giao diện của trò chơi sẽ
thay đổi, cụ thể là độ rộng của bảng dò mìn sẽ tăng lên đồng thời số bom cũng sẽ tăng
lên.
Đồ án nêu ra chi tiết các bước thực hiện xây dựng trò chơi “Dò mìn” sử dụng
ngôn ngữ Matlab và các cách tiếp cận để giải quyết các vấn đề trong trò chơi cũng
những kết quả đã đạt được dựa trên một số những ví dụ thử nghiệm trong khi lập trình.
1.2 Phạm vi nghiên cứu và phạm vi ứng dụng:
• Phạm vi nghiên cứu: tự nghiên cứu.
• Phạm vi ứng dụng: cá nhân.
1.3 Chức năng công việc đã làm được:
Bảng 1.1 Chức năng công việc đã làm được.
ST
T
Chức năng, công việc Đã làm được
1 Tạo giao diện thân thiện, dễ sử dung.

2 Chọn mức độ dễ, trung bình, khó, tùy chọn(tùy
chỉnh số ô và số bom)

3 Tính thời gian và hiển thị số bom

4 Liên hệ trợ giúp


5 Hiển thị thắng và thua cuộc

6 Xếp hạng người chơi

7 Chơi lại

6
CHƯƠNG 2: CƠ SỞ LÝ THUYẾT
1.4 Công cụ và ngôn ngữ
1.4.1 Khái niệm Về Matlab
Matlab là một ngôn ngữ lập trình thực hành bậc cao được sử dụng để giải các bài
toán về kỹ thuật. Matlab tích hợp đc việc tính toán, thể hiện kết quả, cho phép lập
trình, giao diện làm việc rất dễ dàng cho người sử dụng. Dữ liệu cùng với thư viện
được lập trình sẵn cho phép người sử dụng có thể có được những ứng dụng sau đây.
• Sử dụng các hàm có sẵn trong thư viện, các phép tính toán học thông
thường.
• Cho phép lập trình tạo ra những ứng dụng mới.
• Cho phép mô phỏng các mô hình thực tế.
• Phân tích, khảo sát và hiển thị dữ liệu.
• Với phần mềm đồ họa cực mạnh.
• Cho phép phát triển, giao tiếp với một số phần mềm khác như C++,
Fortran.
1.4.2 Tổng quan về cấu trúc dữ liệu của Matlab, các ứng dụng.
Matlab là một hệ thống tương giao, các phần tử dữ liệu là một mảng (mảng này
không đòi hỏi về kích thước). Chúng cho phép giải quyết các vấn đề liên quan đến lập
trình bằng máy tính, đặc biệt sử dụng các phép tính về ma trận hay vecto và có thể sử
dụng ngôn ngữ C học Fortran lập trình rồi thực hiện ứng dụng lập trình đó bằng các
câu lệnh gọi từ Matlab. Matlab được viết tắt từ chữ “MATrix LABoratory” tức là thư
viện về ma trận, từ đó phần mềm Matlab được viết nhằm cung cấp cho việc truy cập
vào phần mềm ma trận một cách dễ dàng, phần mềm ma trận này được phát triển bởi

các công trình Linpack và Eispack. Ngày nay Matlab được phát triển bởi Lapack tạo
nên một nghệ thuật phần mềm cho ma trận.
1.4.2.1 Dữ liệu
Dữ liệu của Matlab thể hiện dưới dạng ma trận (hoặc mảng – tổng quát), và có
các kiểu dữ liệu được liệt kê sau đây:
• Kiểu đơn single, kiểu này có lợi về bộ nhớ dữ liệu vì nó đòi hỏi ít byte
nhớ hơn, kiểu dữ liệu này không sử dụng trong các phép tính toán học, độ
chính xác kém hơn.
• Kiểu double: kiểu này là kiểu thông dụng nhất của các biến trong Matlab.
• Kiểu Sparse.
• Kiểu uint8, uint16, uint64…
7
• Kiểu char ví dụ “Hello”
• Kiểu cell
• Kiểu Structure.
Trong Matlab kiểu dữ liệu double là kiểu mặc định sử dụng trong các phép tính
số học.
1.4.2.2 Ứng dụng
Matlab tạo điều kiện thuận lợi cho:
• Các khóa học về toán học
• Các kỹ sư, các nhà nghiên cứu khoa học.
• Dùng Matlab để tính toán nghiên cứu tạo ra các sản phẩm tốt nhất trong
sản xuất.
1.4.2.3 Toolbox là một công cụ quan trọng trong Matlab
Công cụ này được Matlab cung cấp cho phép bạn ứng dụng các kỹ thuật để phân
tích, thiết kế, mô phỏng các mô hình.
Ta có thể tìm thấy toolbox ở trong môi trường làm việc của:
• Mạng noron
• Logic mờ.
• Simulink

1.4.3 Hệ thống Matlab
Hệ thống giao diện của Matlab được chia thành 5 phần:
• Môi trường phát triển: Đây là nơi đặt các thanh công cụ, các phương tiện
giúp chúng ta sử dụng các lệnh và các file, ta có thể liệt kê một số như
sau:
o Desktop
o Command Window
o Command History
o Browsers for viewinghelp
• Thư viện, các hàm toán học bao gồm các cấu trúc như tính tổng, sin, cosin
atan, atan2 …, các phép tính đơn giản đến các phép tính phức tạp như tính
ma trận nghịch đảo, trị riêng, chuyển đổi fourier, laplace, symbolic library.
• Ngôn ngữ Matlab. Đó là các ngôn ngữ cao về ma trận và mảng, với các
dòng lệnh, các hàm, cấu trúc dữ liệu vào, có thể lập trình hướng đối tượng.
8
• Đồ họa trong Matlab. Bao gồm các câu lệnh thể hiện đồ họa trong mô
trường 2D và 3D, tạo các hình ảnh chuyển động, cung cấp các giao diện
tương tác giữa người sử dụng và máy tính.
• Giao diện với các ngôn ngữ khác. Matlab cho phép tương tác với các ngôn
gnuwx khác như C, Fortran…
1.4.4 Làm quen với Matlab
Trước tiên để khởi động Matlab click vào biểu tượng file Matlab.exe, trên màn
hình xuất hiện cửa sổ như hình 2.1. Cửa sổ đó chứa các thanh công cụ (giao diện
người và máy) cần thiết cho việc quản lý các files, các biến, cửa sổ lệnh, có thể coi
desktop là các panel gòm các ô, vùng, quản lý và tác dụng của từng cửa sổ nhỏ được
quản lý bởi desktop.
Hình 2.2 Cửa sổ làm việc của Matlab
1.4.5 Các cửa sổ làm việc của Matlab
1.4.5.1 Cửa sổ Command Window
Là cửa sổ giao tiếp chính của Matlab bởi đây là nơi nhập giá trị các biến, hiển thị

giá trị, tính toán giá trị của biểu thức, thực thi các hàm có sẵn trong thư viện (dạng
lệnh), hoặc các hàm (dạng function) do người dùng lập trình ra trong M-file.
9
Các lệnh được nhập sau dấu nhắc “>>”, và nếu có sai sót trong quá trình gõ
(nhập) lệnh thì hãy nhấn phím Enter cho đến khi nhận được dấu nhắc “>>”. Thực thi
lệnh bằng nhấn phím Enter. Gõ các lệnh sau:
>>A=pi/2;
>>B=sin(A)
B=
1
Hoặc chương trình soạn thảo trong M-file dưới đây:
% Chuong trinh trong M-file
X= 0: pi/6:2*pi;
Y=sin(x) ;
Plot(x,y) ;
% chuong trinh duoc luu voi ten file la “ve_sin.m”
1.4.5.2 Cửa sổ Command History
Các dòng nhập vào trong cửa sổ Command Window (các dòng này cí thể là dòng
nhập biến, hoặc có thể là dòng lệnh thực hiện hàm nào đó) được giữ lại trong cửa sổ
Command History, và cửa sổ này cho phép ta sử dụng lại những lệnh đó bằng cách
click chuột lên các lệnh đó hoặc các biến, nếu muốn sử dụng lại biến đó. Xem hình 1.2
10
Hình 2.3 Cửa sổ Command History.
1.4.5.3 Cửa sổ WorkSpace
Là cửa sổ thể hiện tên các biến bạn sử dụng cùng với kích thước vùng nhớ (số
bytes), kiểu dữ liệu (lớp), các biến được giải phóng sau mỗi lần tắt chương trình.
Hình 2.4 Cửa sổ Workspace
Ngoài ra nó cho phép thay đổi giá trị, cũng như kích thước của biến bằng cách
click chuột lên các biến. Hoawcnj click vào nút bên trái ngay cạnh nút save. Ví dụ :
Khi chọn biến (giả sử là biến b) rồi click (hoặc click chuột vào nút cạnh nút save) ta

được cửa sổ sau gọi là Variable Editor
11
Hình 2.5 Cửa sổ Variable Editor
Tiêu đề là tên biến b, định dang dữ liệu ở ô có tên là: Numeric format, mặc định
là dạng short, kích thước size là 1 by 3 (tức là một hàng và 3 cột) ta có thể thay đổi
kích thước này bằng cách thay đổi giá trị có trong ô kích thước size. Dùng cửa sổ này
để lưu các biến ở dưới là dữ liệu của biến b, ta có thể thay đổi chúng bằng cách thay
đổi giá trị trong các ô đó. Tất cả các biến đều được lưu trong Workspace trong đó thể
hiện cả kích thước (Size), số Bytes và kiểu dữ liệu (class) (8 bytes cho mỗi phần tử dữ
liệu kiểu double cụ thể là 24 bytes dành cho b và 8 bytes dành cho a)
1.4.5.4 Cửa sổ M-file
Là cửa sổ dùng để soạn thảo chương trình ứng dụng, để thực thi chương trình
viết trong M-file bằng cách gõ tên của file chứa chương trình đó trong cửa sổ
Commandwindow. Khi một chương trình viết trong M-file, thì tùy theo ứng dụng cụ
thể, tùy theo người lập trình mà chương trình có thể viết dưới dạng sau :
• Dạng Script file : Tức là chương trình gồm tập hợp các câu lệnh viết dưới
dạng liệt kê, không có biến dữ liệu vào và biến lấy giá trị ra.
• Dạng hàm function : có biến dữ liệu vào và biến ra.
1.5 Mô hình tổng quát
Vấn đề thiết kế và xử lí các chế độ khi chơi phải trải qua rất nhiều bước. Việc
thiết kế và xử lý các chế độ khi chơi có thể tóm gọn lại trong mô hình sau:
12
Hình 2.1 Mô hình tổng quát các bước xử lí trò chơi
13
1.5.1 Người dùng chọn chế độ chơi:
Ở giai đoạn này, các công việc xử lý bao gồm:
Thiết kế giao diện lựa chọn chế độ chơi: Ở đây trò chơi được thiết kế sao cho
người dùng có thể dễ dàng chọn lựa chế độ chơi thích hợp dễ trung bình, khó hoặc tùy
chọn.Với chế độ tùy chọn, người chơi có thể tủy chỉnh số ô vuông và số mìn trong trò
chơi.

Xử lý chọn lựa trò chơi: Xử lý các sự kiên khi người chơi lật ô, sự kiện đối với
các thao tác lật ô, đánh cờ và nhấn vào ô trống.
Truyền các biến cần thiết: Các biến được truyền vào và được lưu lai sử dụng.
1.5.2 Người chơi chơi:
Các công việc trong giai đoạn này bao gồm:
Thiết kế giao diện để khởi tạo và thông báo các thông tin khi chơi trò chơi, các
thông tin cần thiết tùy theo giao diện của từng mức độ chơi mà người chơi đã lựa
chọn.
Xử lý các sự kiện khi chơi: Nắm bắt được các sự kiện khi người chơi lật các ô, sự
kiện loang khi người chơi lật được các ô trống, ô số hoặc việc lật phải ô mìn kết thúc
trò chơi.
Tính toán thời gian chơi: Trò chơi kết thúc được tính theo việc người chơi đã
lật hết các ô số hoặc lật phải các ô mìn, thời gian sẽ dừng lại và kết quả được lưu khi 1
trong 2 sự kiên trên xảy ra và trò chơi kết thúc.
1.5.3 Kết thúc trò chơi:
Khi người chơi chơi xong một màn chơi, trò chơi sẽ kết thúc, chúng ta phải tính
được thời gian chơi và thông tin về việc người chơi thắng hay thua để hiển thị cho
người chơi sau đó xếp hạng người chơi trong vị trí của bảng xếp hạng.
14
1.6 Phân tích chương trình:
 Yêu cầu:
Chương trình phải có giao diện thân thiện, dễ sử dụng. Đảm bảo đủ các
chức năng cần thiết như chơi lại, chọn mức độ khó, tính thời gian, xếp hạng
người chơi…
Chương trình này được xây dựng gồm một menubar chứa các chức năng
của trò chơi, một panel để hiển thị số mìn, tính thời gian chơi, nút chức năng chơi
lại và một panel chính chứa các ô vuông cho người chơi click
Thanh menubar nằm ở trên cùng, tiếp theo đến 1 panel bao gồm nút chức
năng chơi lại, 1 textbox tính thời gian chơi và 1 textbox tính số mìn, cuối cùng là
panel chứa các ô vuông để người chơi lật.

Trong thanh menubar bao gồm các Jmenu là Trò chơi và Trợ giúp. Trong
Jmenu Trò chơi bao gồm các các checkbox để chọn chế độ chơi, tiếp theo là các
menuitem để xem bảng xếp hạng và thoát trò chơi. Trong Jmenu Trợ giúp có
Jmenu Trợ giúp để trợ giuso người chơi.
 Mục tiêu:
Chương trình phải đảm bảo các chức năng như chơi mới, xếp hạng người
chơi, trợ giúp, chọn chế độ chơi,
15
CHƯƠNG 3: XÂY DỰNG CHƯƠNG TRÌNH
1.7 Ý tưởng
- Tạo ma trận button để hiển thị giao diện trò chơi.
- Tạo 1 ma trận đánh dấu để quản lý ma trận button.
- Trạng thái của một ô:
• Có mìn: Được đặt ngẫu nhiên lúc khởi tạo.
• Đã mở: Khi người dùng nhấn chuột trái vào ô.
• Được cắm cờ: Khi người dùng chuột phải vào ô.
• Bình thường: Không có tất cả các trạng thái trên.
- Khi mở một ô nào đó, có 3 trường hợp xảy ra:
• Có mìn: Hiện lên tất cả mìn trong bảng và game over.
• Không có mìn nhưng 8 ô xung quanh có mìn: Hiện số mìn xung quanh
• Không có mìn và xung quanh cũng không có mìn: Gọi đệ quy các ô xung
quanh đến khi gặp 2 trường hợp trên.
- Bảng điểm: Lưu điểm cao nhất của người chơi.
• Người chơi chiến thắng thời gian thấp hơn bảng điểm thì sẽ cập nhật điểm
cao mới.
• Khi nhấn reset bảng điểm thì bảng điểm sẽ trở về trạng thái mặc định ban
đầu là 999.
16
1.8 Thực hiện
1.8.1 Tạo giao diện Guide

- Mô tả: Xây dựng giao diện chương trình
- Lưu đồ
Hình 3.6 Lưu đồ tạo giao diện GUI
17
- Mã nguồn
% Build the GUI
function fh = build_gui_image( obj )

% Create the figure and the axis
fh = figure( 'Color', obj.sprite_tc(30,9,:),
'Position', [ 0 0 obj.ncols*16+19 obj.nrows*16+30+32 ],
'MenuBar', 'figure',
'ToolBar', 'none',
'CreateFcn', 'movegui center',
'Name', 'Minesweeper',
'NumberTitle', 'off',
'WindowButtonUpFcn', @obj.buttonup,
'WindowButtonMotionFcn', @obj.buttonmotion,
'Resize', 'off',
'DockControls', 'off',
'DeleteFcn', @obj.deletefcn );
ax = axes( 'Parent', fh,
'XLim', [-9 obj.ncols*16+10-1],
'YLim', [1-10-32-10 obj.nrows*16+10-1],
'Units', 'Normalized',
'Position', [0 0 1 1] );
axis ij; axis image; axis off; hold( ax, 'on' );

% Change the icon
warning('off','MATLAB:HandleGraphics:ObsoletedProperty:JavaFrame');

jframe=get(fh,'javaframe');
jIcon=javax.swing.ImageIcon('minesweeper_icon.jpg');
jframe.setFigureIcon(jIcon);

18
% Determine the difficulty from the inputs
difficulty = find( all( bsxfun( @eq, obj.difficulties, [ obj.nrows obj.ncols
obj.nmines ] ), 2 ) );
checked = { 'off' 'off' 'off' 'off' };
if ~isempty( difficulty )
checked( difficulty ) = {'on'};
else
checked( 4 ) = {'on'};
end
% Generate the menubar
set( fh, 'MenuBar', 'none' );
mb.game = uimenu( 'Parent', fh, 'Label', 'Game' );
mb.new = uimenu( mb.game, 'Label', 'New',
'Accelerator', 'N',
'Callback', @obj.changedifficulty );
mb.beg = uimenu( mb.game, 'Label', 'Beginner',
'Separator', 'on',
'Checked', checked{1},
'Callback', @obj.changedifficulty );
mb.int = uimenu( mb.game, 'Label', 'Intermediate',
'Checked', checked{2},
'Callback', @obj.changedifficulty );
mb.exp = uimenu( mb.game, 'Label', 'Expert',
'Checked', checked{3},
'Callback', @obj.changedifficulty );

mb.cus = uimenu( mb.game, 'Label', 'Custom ',
'Checked', checked{4},
'Callback', {@obj.changedifficulty} );
uimenu( mb.game, 'Label', 'Best Times ',
'Separator', 'on',
'Callback', @obj.leaderboard_show );
19
uimenu( mb.game, 'Label', 'Exit',
'Separator', 'on',
'Callback', sprintf('close %d', fh) );
% Append the borders
image( -9:obj.ncols*16+10, -51:-42,
[obj.borders{1} repmat( obj.borders{5}, 1, obj.ncols ) obj.borders{2}] );
image( -9:0, -41:-10,
obj.borders{9} );
image( obj.ncols*16+(1:10), -41:-10,
obj.borders{9} );
image( -9:obj.ncols*16+10, -9:0,
[obj.borders{6} repmat( obj.borders{5}, 1, obj.ncols ) obj.borders{7}] );
image( -9:obj.ncols*16+10, obj.nrows*16+(1:10),
[obj.borders{3} repmat( obj.borders{5}, 1, obj.ncols ) obj.borders{4}]);
image( -9:0, 1:obj.nrows*16,
repmat( obj.borders{8}, obj.nrows, 1 ) );
image( obj.ncols*16+(1:10), 1:obj.nrows*16,
repmat( obj.borders{8}, obj.nrows, 1 ) );
% Image the Smiley
sm = image( obj.ncols*8 + (-12:13), -38:-13,
obj.smileys{1} );
set( sm, 'UserData', 1,
'ButtonDownFcn', @obj.smileydown );

% Add the bomb count and timer
bc = image( 7:45, -37:-15,
[obj.numbers{str2double(num2cell(sprintf('%03.0f', obj.nmines)))+1}] );
tc = image( obj.ncols*16 + (-45:-7), -37:-15,
[obj.numbers{[1 1 1]}] );
tm = timer( 'Period', 1,
'StartDelay', 1,
'ExecutionMode', 'FixedRate',
20
'UserData', fh,
'TimerFcn', @obj.timerfcn );
% Add the minefield
im = zeros( obj.nrows, obj.ncols );
for jrow = 1:obj.nrows
for jcol = 1:obj.ncols
im(jrow,jcol) = image( (1:16)+(jcol-1)*16,
(1:16)+(jrow-1)*16,
obj.button_images{1},
'Parent', ax );
set( im(jrow,jcol), 'ButtonDownFcn', @obj.buttondown_minefield,
'UserData', [ jrow, jcol ],
'Tag', 'Buttons' );
end end
% Save the necessary items in guidata
data.im = im;
data.fh = fh;
data.ax = ax;
data.sm = sm;
data.bc = bc;
data.tc = tc;

data.tm = tm;
data.mb = mb;
guidata( fh, data );
end
21
1.8.2 Tạo ma trận mìn
- Mô tả: Random vị trí mìn trong ma trận cho đến khi đủ số mìn.
- Lưu đồ
Hình 3.7 Lưu đồ tạo ma trận mìn
- Mã nguồn
% Randomly Generate minefield
function generate_minefield( obj )
obj.minefield = false( obj.nrows, obj.ncols );
while sum( obj.minefield(:) ) < obj.nmines
mine_row = randi( obj.nrows );
mine_col = randi( obj.ncols );
obj.minefield( mine_row, mine_col ) = true;
end
22
1.8.3 Tính số lượng mìn xung quanh
- Mô tả: Tính số bom xung quanh 1 ô số đã được mở.
- Lưu đồ
Hình 3.8 Lưu đồ tính số lượng mìn xung quanh 1 vị trí
- Mã nguồn
% Calculate the neighbors numbers
function neighbors = generate_neighbors( obj, minefield )
neighbors = conv2( double( minefield ), ones( 3 ), 'same' );
end
23
1.8.4 Thay đổi level

- Mô tả: Thay đổi độ khó của trò chơi
- Lưu đồ
Hình 3.9 Lưu đồ thay đổi level
- Mã nguồn:
% Change the difficulty level
function changedifficulty( obj, hObject, ~ )
data = guidata( hObject );
position = get( data.fh, 'Position' );
topleft = [ position(1) sum( position([2 4]) ) 0 0 ];
label = get( hObject, 'Label' );
switch label
case 'Beginner'
obj.nrows = obj.difficulties(1,1);
obj.ncols = obj.difficulties(1,2);
obj.nmines = obj.difficulties(1,3);
case 'Intermediate'
obj.nrows = obj.difficulties(2,1);
obj.ncols = obj.difficulties(2,2);
24
obj.nmines = obj.difficulties(2,3);
case 'Expert'
obj.nrows = obj.difficulties(3,1);
obj.ncols = obj.difficulties(3,2);
obj.nmines = obj.difficulties(3,3);
case 'Custom '
obj.custominput;
end
if obj.nrows + obj.ncols + obj.nmines ~= 0
new_obj = minesweeper( obj.nrows, obj.ncols, obj.nmines );
new_position = get( new_obj.fh, 'Position' );

new_topleft = [ new_position(1) sum( new_position([2 4]) ) 0 0 ];
set( new_obj.fh, 'Position', new_position - new_topleft + topleft );
set( findobj( new_obj.fh, 'Type', 'uimenu' ), 'Checked', 'off' );
set( findobj( new_obj.fh, 'Label', label ), 'Checked', 'on' );
close( data.fh );
end
end
25

×