BÁO CÁO ĐỀ TÀI GAME PIKACHU
Sử dụng ngôn ngữ Python
Môn
Giáo viên
Lớp
: Lập trình nâng cao
: Ngơ Thế Quyền
: MAT3376 2 + 3 CLCMTKHTT
THÀNH VIÊN CỦA NHÓM 17
MSV
Họ và tên
19000418
Đinh Thị Hà
19000427
Lê Thị Hoa
19000490
Đặng Thị Phương Thúy
Hà Nội 2021
Báo cáo project game Pikachu bằng Python
MỤC LỤC
2|Page
Báo cáo project game Pikachu bằng Python
Lời nói đầu
Python là ngơn ngữ lập trình hướng đối tượng thơng dụng dùng để viết các tiện
ích hệ thống. Nó cũng được sử dụng như ngơn ngữ kết dính đóng vai trị tích hợp
C và C++. Python là một ngơn ngữ lập trình dễ học, dễ đọc. Python tăng cường
sử dụng từ khóa tiếng Anh, hạn chế các ký hiệu và cấu trúc cú pháp so với các
ngôn ngữ khác.
Các nền tảng xã hội và các loại game 4.0 ngày càng phát triển. Tính cởi mở và
dễ dàng tương tác với các giao diện đẹp mắt từ cả máy tính để bàn và thiết bị
cầm tay cho phép người chơi trải nghiệm game với chi phí rất thấp. Điều này có
cả mặt tích cực và tiêu cực. Những trò chơi cổ điển thời xưa đã bị qn lãng thay
vào đó là những trị bạo lực dần trở nên phổ biến. Bên cạnh đó việc lập trình
game bằng ngơn ngữ Python ngày càng phổ biến và được ứng dụng nhiều. Với
mục đích học tập và sáng tạo nên bọn em đã dựa trên gợi ý nhiệt tình, bổ ích của
thầy nên đề tài game Pikachu là lựa chọn giúp bọn em tìm hiểu và nâng cao hơn
về kĩ năng lập trình của mình cũng như phát triển tính sáng tạo thơng qua mơn
học lập trình nâng cao.
Trong quá trình làm bài tập lớn dù đã cố gắng tìm hiểu nhưng cũng khơng tránh
khỏi những sai sót mong thầy góp ý để nhóm em có thể hoàn thành bài tập lớn
tốt hơn.
Để hoàn thành được báo cáo này, nhóm chúng em xin được gửi lời cảm ơn chân
thành đến Thầy giáo hướng dẫn đề tài – ThS. Ngơ Thế Quyền , giảng viên Khoa
Tốn – Cơ – Tin học Trường Đại học Khoa Học Tự Nhiên Hà Nội - đã hết lòng
giúp đỡ, hướng dẫn, góp ý tận tình để nhóm em hồn thành được đề tài này.
3|Page
Báo cáo project game Pikachu bằng Python
1. Tổng quan về đề tài
1.1 Thông tin đề tài
Đặc tả đề tài :
Sử dụng ngơn ngữ lập trình Python làm game Pikachu
Nội dung game: Nhiệm vụ của người chơi là tìm ra những hình cặp
Pokemon giống nhau để nối chúng lại, cứ mỗi lần nối thành cơng thì
sẽ nhận được 100 điểm, thời gian cho mỗi lần thử thách là 3 phút.
STT
Tên mục
Nội dung
1
Tên đề tài
Game Pikachu
2
Mô tả đề tài
Sử dụng ngôn ngữ Python làm game
Pikachu
3
Mô tả game
Game Pikachu xếp hình với luật chơi
người chơi làm nhiệm vụ tìm những cặp
Pokemon giống nhau và nối chúng lại bởi
tối đa 3 đường thẳng mà không bị cản trở
bởi con vật khác.
4
Mục tiêu đề tài
Xây dựng Game Pikachu
5
Dữ liệu đầu vào
•
•
Hình ảnh các Pokemon
Ngơn ngữ Python
6
Dữ liệu đầu ra
•
•
Game Pikachu
Xây dựng được giao diện chương trình
Pikachu
• Tính điểm cho người chơi
1.2 Phạm vi nghiên cứu, 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
4|Page
Báo cáo project game Pikachu bằng Python
1.3 Các vấn đề cần phải giải quyết
Hệ thống phải đáp ứng các chức năng sau:
o
Giao diện thân thiện: giao diện thân thiện, dễ dử dụng, hình ảnh bắt mắt
o
Chức năng tính điểm: sẽ tính tổng số điểm cho người chơi.
o
Chức năng âm thanh sinh động: âm thanh sau khi kết thúc trò chơi, nối
đúng hay nối sai, âm thanh chúc mừng người chơi khi đạt điểm cao
o
Vẽ đường bao quanh thẻ được chọn: hiển thị rõ thẻ được chọn giúp
người chơi dễ phân biệt hơn so với những thẻ khác.
o
Vẽ đường ăn cho các thẻ: Ở màn hình hiển thị đường nối của 2 thẻ với
vị trí đường đi tương ứng.
2. Phương pháp thực hiện
2.1 Các cách giải quyết vấn đề của bài toán
a. Hiển thị các ảnh pokemon
Tạo ra một mảng PIKACHUIMGS = [] để lưu trữ ảnh các pokemon.
Dùng vòng lặp for chạy từ 1 - > số ảnh pokemon + 1. Trong vòng lặp
này, sẽ tạo một biến để gán từng ảnh tương ứng như sau:
o pikachuImage = pygame.image.load('%s.jpg' % i)
o Dùng pygame.transform.smoothscale() để scale lại tất cả các
o
ảnh pokemon với kích thước width & height là 50 x 50
Sau đó sẽ append tất cả các ảnh vào mảng PIKACHUIMGS
b. Xác định 2 con pokemon giống nhau
Coi mỗi hình pokemon là 1 số nguyên dương tương ứng và random
các hình để tạo ra một ma trận 2 chiếu có tọa độ x,y với x, y là số
hàng và cột của các hình pokemon được tạo ra. Mỗi con pokemon sẽ
chứa địa chỉ là số nguyên dương của nó, tọa độ x và tọa độ y. Bằng
việc tạo ra ma trận này, chúng ta có thể xử lý những thuật toán của
game gián tiếp qua các con số và vị trí của chúng trong ma trận.
5|Page
Báo cáo project game Pikachu bằng Python
Để xác định 2 pokemon có giống nhau. Đầu tiên, tùy chọn 1 ví trí tọa
độ x,y chứa 1 con pokemon bất kỳ. Nếu khơng có bất kỳ pokemon
nào đc chọn thì tọa độ sẽ mặc định x = y = -1.
Hàm selectPikachu(x,y) sẽ kiểm tra x, y có phải là một cặp giống
nhau với pokemon phía trên hay khơng.
o Nếu tọa độ pokemon thứ 1 với x = y = -1
o Pokemon thứ 1 khác id với pokemon 2
o Đường nối giữa 2 con pokemon quá 3 đoạn
o chương trình sẽ trả về False. Ngược lại trả về True.
c. Thuật toán game Pikachu
Toàn bộ các pokemon được sắp xếp theo mơ hình của một ma trận.
Ở đây game Pikachu chúng em sẽ xét trên ma trận vuông 10*10.
Để thực hiện giải thuật của game Pikachu bọn em sẽ chia làm các
trường hợp từ đơn giản đến phức tạp để tìm đường đi (đường mà có
thể ăn) 2 con pokemon.
Tổng quan thì có 3 trường hợp chính và mỗi trường hợp sẽ có 2
nhánh nhỏ là xét theo chiều ngang, chiều đọc.
o Trường hợp cùng nằm trên một hàng hoặc cột
TH1: Xem xét hai điểm nằm trên cùng 1 hàng ngang (x1 = x2))
TH2: Xem xét hai điểm nằm trên cùng 1 hàng dọc (y1 = y2).
• Xét trường hợp 2 hình pokemon nằm trên cùng 1 hàng
ngang (x1 = x2), chúng em xét 2 tọa độ cịn lại
là y1 và y2 để tìm ra điểm có hoành độ nhỏ hơn (giả sử trả
về y1 < y2), rồi xét liên tục các ô theo hàng ngang x1 từ vị
trí y1 đến y2, nếu các ơ được xét đều là ơ trống (có giá trị
là 0), thì đây là 2 hình pokemon nằm ở vị trí thỏa mãn.
•
Tương tự ta xét như vậy đối với hàng dọc.
Hai cặp pokemon theo chiều ngang và chiều dọc giống
nhau được tô đỏ và tơ đen như hình: hai con pokemon
giống nhau và nằm cùng hàng dọc hoặc cùng hàng ngang
khơng có con pokemon nào chen giữa.
6|Page
Báo cáo project game Pikachu bằng Python
•
o
Phương án code:
Đối với hai tình huống này cơ bản, chúng em dùng vòng lặp for từ
điểm đầu đến điểm cuối và kiểm tra xem đường thẳng đó có thơng
với nhau được khơng. Nếu đúng, coi như hoàn thành, nếu chưa đúng,
chúng ta tiếp tục sử dụng khai thác theo chiều ngang hoặc chiều dọc.
Xem xét này hai trường hợp, hai hàm này sử dụng hai lần lượt là
checkLineX (y1, y2, x) và checkLineY (x1, x2, y) tương ứng là xét
về hàng và cột. Nếu đi được giữa 2 điểm, hàm return true, ngược lại,
nó trả về false.
Xét duyệt các đường đi theo chiều ngang và dọc bên trong chữ nhật
Xét 2 điểm chỉ trong phạm vi được bọc bởi giới hạn từ 2 tọa độ của 2
hình pokemon ứng với 2 đầu của hình chữ nhật. Với trường hợp này,
chúng em cũng chia làm 2 trường hợp nhỏ: xét đường đi theo chiều
ngang và chiều dọc
Trước tiên chúng ta sẽ xem bên trong chữ nhật được tạo bởi 2 điểm
này, đây là TH kiểm tra đường đi theo hình chữ Z.
2 trường hợp dùng để có thể bao quát toàn bộ các con đường với các
hướng đi khác nhau. Chúng ta có 4 hướng đi, và muốn biết hướng đi
nào dẫn đến đích, chúng ta cần bao quát được con đường từ cả 4
hướng.
TH3: Xét duyệt các đường đi theo chiều ngang trong phạm vi
hình chữ nhật
• Lấy ra 2 hoành độ của 2 điểm: y1 và y2. Sau đó so sánh 2
hồnh độ, tìm ra hồnh độ nhỏ hơn, và bắt đầu tịnh tiến từ
ơ có hồnh độ nhỏ hơn sang phía ơ có hồnh độ lớn hơn
với vòng for và giá trị tăng là 1. Với mỗi lần tịnh
tiến y thêm 1 đơn vị ấy, ta liên tục kiểm tra xem ơ nằm tại
vị trí kiểm tra có phải là ơ trống khơng. Nếu đó là ô trống,
7|Page
Báo cáo project game Pikachu bằng Python
mình sẽ kiểm tra thêm 2 đoạn thẳng còn lại để nối 2 điểm
ấy có thỏa mãn khơng. Nếu được sẽ nối hình.
• Như hình minh họa 2 con pokemon giống nhau có đường
đi nối với nhau tối đa là 3 đường và đường nối không gặp
con pikachu khác:
o
Phương án code :
Xây dựng hàm checkRectX (p1, p2) dùng để kiểm tra bên trong chữ
nhật có dạng ngang được tạo bởi 2 điểm p1 và p2.
Với p1 , p2 là tọa độ của 2 hình pokemon (vị trí pokemon)
Đầu tiên chúng ta sẽ tìm điểm nào có cột nhỏ hơn (y) (pMinY) và
điểm nào lớn hơn (pMaxY). Tiếp theo, chúng em cho y chạy từ nhỏ
nhất đến lớn nhất (từ trái sang phải), với mỗi cột (y), chúng ta sẽ sử
dụng checkLineX và checkLineY để xem 3 đường nhỏ được xây
dựng liền mạch hay khơng. Nếu có một cơng cụ cột có thể kết nối 3
dịng này, thì chúng ta sẽ có một đường đi giữa 2 điểm và sẽ trả về
giá trị của y của cột đó. Nếu khơng, nó trả về -1.
TH4: Xét duyệt các đường đi theo chiều dọc
8|Page
Báo cáo project game Pikachu bằng Python
•
Xây dựng hàm checkRectY(p1,p2) tuơng tự như TH3 đã
làm nhưng xét theo chiều dọc.
• Hàm checkRectY(p1, p2) được xây dựng tương tự như
những gì TH3 thực hiện, nhưng theo chiều dọc. Kiểm tra
bên trong chữ nhật hình dạng ngang được tạo bởi 2 điểm
p1 và p2.
• Đầu tiên chúng ta sẽ tìm ra các điểm có tọa độ hàng (y)
nhỏ hơn (pMinY) và điểm nào lớn hơn (pMaxY). Tiếp
theo, chúng tôi cho y chạy từ nhỏ nhất đến lớn nhất (từ trái
sang phải), với mỗi cột (y), chúng ta sẽ sử dụng
checkLineX và checkLineY để xem 3 đường nhỏ được xây
dựng liền mạch hay khơng. Nếu có một cơng cụ cột có thể
kết nối 3 dịng này, thì chúng ta sẽ có một đường đi giữa 2
điểm và sẽ trả về giá trị của y của cột đó. Nếu khơng, nó
trả về -1.
Xem xét mở rộng theo chiều ngang và chiều dọc
Cuối cùng, nếu 4 TH không thành công, sẽ xem xét 2 TH mở rộng.
•
Đó là trường hợp được nối bằng tối đa 3 đoạn thẳng vượt ra ngồi
phạm vi hình chữ nhật hình thành từ tọa độ của 2 hình pokemon.Tức
là chúng ta phải xét đến trường hợp đường đi có hình dạng chữ U
hoặc chữ L. Như hình minh họa 2con pokemon giống nhau ở vị trí
hình chữ L đường nối với nhau không gặp phải con pokemon khác.
9|Page
Báo cáo project game Pikachu bằng Python
TH5: Xét mở rộng theo chiều ngang
• Đối với trường hợp này, chúng ta sẽ xét mở rộng chiều
ngang về phía bên trái hoặc bên phải bằng hàm
checkMoreLineX(p1,p2, type) để giải quyết vấn đề đoạn
thẳng vượt ra ngồi hình chữ nhật hình thành từ đọa độ
của 2 hình pokemon, tạo ra biến type trong tham số truyền
vào của hàm checkMoreLineX()
• Trong đó p1, p2 là 2 điểm cần kiểm tra, tìm đường đi, type
là loại, type sẽ nhận 2 giá trị là 1 (đi về phải) hoặc -1 (đi
về trái).
• So sánh 2 hình pokemon rồi tìm ra hình pokemon có
hồnh độ nhỏ hơn tương ứng là pMinY và pMaxY.
• Vì khi xét trong phạm vi hình chữ nhật hoặc trên đường
thẳng thì 2 điểm đều khơng đến được với nhau, do đó
chúng ta mở rộng nó ra bằng cách xét về bên trái từ cột
pMaxY[1] (cột của điểm chứa cột lớn hơn) và về bên phải
từ cột pMinY. Và cứ tăng hoặc giảm dần chỉ số cột lên khi
2 điểm (pMinY[0], y) và (pMaxY[0], y) không phải
chướng ngại vật. Nếu gặp giá trị y nào mà làm cho đường
thẳng đứng được thơng thì chứng tỏ đã tìm thấy đường đi.
10 | P a g e
Báo cáo project game Pikachu bằng Python
Khi đó hàm trả về giá trị là cột y tìm được, nếu khơng thì
trả về -1. Tuy nhiên trước khi xét từng cột như vậy chúng
ta cần xét đoạn từ pMinY đến pMaxY (doạn màu xanh lá)
có thơng khơng đã.
TH6: Xét mở rộng theo chiều dọc
• Thực hiện hàm checkMoreLineY(p1,p2, type) tương tự
như trên nhưng duyệt theo từng hàng.
•
Cuối cùng chúng ta sẽ viết hàm checkTwoPoint(p1, p2) để
kiểm tra và tìm đường đi gữa 2 điểm p1, p2 bất kỳ. Hàm
sẽ trả về đối tượng là MyLine gồm 2 điểm p1 và p2. Trong
TH đường thẳng giữa 2 điểm p1, p2 được thông thì trả về
MyLine gồm p1 và p2, trong TH đường đi là gấp khúc thì
trả về MyLine gồm 2 điểm ở đoạn gấp khúc.
d. Vẽ đường nối hai con pokemon giống nhau
Sau khi xác định được 2 con pokemon giống nhau và tìm đc
đường đi hợp lí thì ta sẽ dùng pygame.draw.rect để vẽ đường đi
nối 2 con với nhau.
2.2 Các thư viện, kĩ thuật, công nghệ được lựa chọn sử dụng
STT
Tên ứng dụng
Nội dung/Note
1
Visual Studio Code
chỉnh sửa và chạy code
2
Word
Báo cáo công việc
3
Github
Báo cáo công việc hàng tuần và trao đổi code với
11 | P a g e
Báo cáo project game Pikachu bằng Python
thành viên trong nhóm
4
Development language
Python
5
Thư viện :
Công dụng :
random
Chứa các hàm tạo số nguyên ngẫu nhiên, tạo ra
Pygame
số float giữa 0,0 và 1,0.
Dùng để lập trình video games
Time
Xử lý các tác vụ liên quan đến thời gian
os
Làm việc với các tập tin và thư mục
cv2
Xử lí ảnh và video trong game
sys
Truy cập các tham số và chức năng cụ thể của hệ
thống.
2.3 Xây dựng dữ liệu
Dữ liệu trong game pikachu:
Có 10 hàng x 10 cột gồm 25 con pokemon khác nhau tạo thành ma trận vng
Có âm nhạc sơi động tạo cảm hứng cho người chơi
Có các hiệu ứng ơ vng khi chọn
Xây dựng hàm tính đểm cho người chơi: mỗi lần đúng được 100đ
o Dữ liệu của một pokemon:
o Mỗi hình pokemon có kích cỡ : 50*50
12 | P a g e
Báo cáo project game Pikachu bằng Python
Xây dựng source code:
13 | P a g e
Báo cáo project game Pikachu bằng Python
Giao diện trò chơi demo:
Để có giao diện pikachu như màn hình, chúng em tạo ra một packpage images
gồm các hình pokemon được đặt tên rõ ràng từ 1đến 25 ( có 25 hình pokemon
khác nhau).Và những con pokemon đều được chọn ngẫu nhiên.
14 | P a g e
Báo cáo project game Pikachu bằng Python
Tạo file cfg.py lưu các biến mặc định được sử dụng xuyên suốt trong project:
File game.py là file chứa tồn bộ thuật tốn và các hàm hiển thị những hình
pokemon:
15 | P a g e
Báo cáo project game Pikachu bằng Python
File Pikachu.py là file gọi hàm main.
2.4 Một số sơ đồ mô tả hoạt động
Sơ đồ hệ thống mỗi khi nhận được lệnh ghép 2 pokemon
Sơ đồ tác vụ người chơi với hệ thống
16 | P a g e
Báo cáo project game Pikachu bằng Python
3. Tài liệu tham khảo
Các bài giảng, tài liệu colab trên lớp học của giáo viên
Tham khảo thuật toán và code ở nhiều tài liệu nguồn trên google
o />o /> Một số nguồn tham khảo thuật toán và source code:
o />o />
game-pokemon-pikachu/
Do tài liệu về code pikachu bằng python còn khá ít nên toàn bộ tham khảo
của bọn em đều dựa trên code java và những kiến thức tìm hiểu và học
tập trên mạng.
4. Làm việc nhóm
Tất cả mọi người trong nhóm đều tự tìm hiểu trước, nghiêm cứu về đề tài được
cho và họp trực tuyến thông qua meet. Cùng nhau nhận nhiệm vụ phù hợp với
từng khả năng của mỗi bạn:
o Đinh Thị Hà: Nghiên cứu tài liệu, thuật toán, code.
o Lê Thị Hoa: Nghiên cứu tài liệu, thuật toán, làm báo cáo, code.
o Đặng Thị Phương Thúy: Nghiên cứu tài liệu, thuật toán, code.
Một tuần 3 buổi họp online trực tuyến code với nhau ghép code:
17 | P a g e
Báo cáo project game Pikachu bằng Python
Xây dựng thuật toán: Chia nhỏ các hàm với nhiệm vụ của từng thành viên
trong nhóm
Các thành viên cùng nhau code và phân chia rõ ràng công việc nhiệm của từng
người theo từng buổi họp.
Đưa ra những hạn dealine phù hợp với từng thời gian thầy đã đề.
Luôn đảm bảo các bạn đều phải làm công việc như nhau và đầy đủ.
18 | P a g e