Do đó, chúng tôi đã quyết định sử dụng thư viện Pygame của Python để xây dựng trò chơi Snake game con rắn, nhằm thấy rõ sức mạnh của nó.. Trong game con rắn, người chơi điều khiển một co
Trang 1TRƯỜNG ĐẠI HỌC SÀI GÒN
KHOA CÔNG NGHỆ THÔNG TIN
- -
BÁO CÁO ĐỒ ÁN MÔN HỌC NGÔN NGỮ LẬP TRÌNH PYTHON
ĐỀ TÀI: XÂY DỰNG ỨNG DỤNG TRÒ CHƠI CON RẮN VỚI
THƯ VIỆN PYGAME
Giảng viên hướng dẫn: Trương Tấn Khoa
Nhóm sinh viên thực hiện
Trang 2TP.Hồ Chí Minh 12/2023
NHẬN XÉT ĐÁNH GIÁ CỦA GIẢNG VIÊN
………
………
……….
………
………
……….
………
………
……….
………
………
……….
………
………
……….
………
………
……….
………
………
……….
………
………
……….
………
………
Trang 3………
MỤC LỤC LỜI CẢM ƠN 1
A MỞ ĐẦU 2
1 Lý do chọn đề tài 2
2 Mục đích – mục tiêu của đề tài 2
3 Bố cục của đề tài 3
B XÂY DỰNG ỨNG DỤNG TRÒ CHƠI CON RẮN VỚI THƯ VIỆN PYGAME 3
1 Giới thiệu về game con rắn (Snake) 3
2 Giới thiệu vấn đề 4
3 Tổng quan và phân tích 4
3.1 Khảo sát 4
3.2 Luật chơi 4
3.3 Sơ đồ dòng game 6
4 Môi trường cài đặt 7
5 Xây dựng game 7
5.1Tạo Screen 7
5.2 Tạo cỏ cho Screen 8
5.3 Tạo mục tiêu cho rắn: 9
5.4 Tạo con rắn : 11
5.5 Check fail: 15
5.6 Màn hình game (chưa start) 16
5.7 Demo màn hình vào game ( chưa start) : 19
5.8 Màn hình game over 20
5.9 Chọn cấp độ chơi lại khi ở màn hình over: (Nếu bấm Space thì chơi lại mode chọn trước đó) 21
5.10 Demo màn hình Over : 23
5.11 Demo màn hình chính game : 24
6 Tài liệu tham khảo 24
Trang 4Trang điện tử 24 Tài liệu khác 24
Trang 5LỜI CẢM ƠN
Em xin chân thành cảm ơn Khoa Công nghệ thông tin, Trường Đại học Sài Gòn đã tạo điều kiện cho em được thực hiện đồ án môn học “Ngôn ngữ lập trình Python” Em cũng xin cảm ơn thành Trương Tấn Khoa, thầy đã giảng dạy cho em những kiến thức cần thiết cho môn học này Những kiến thức đó dã giúp cho chúng em rất nhiều trong quá tình làm
đồ án báo cáo môn học Chúng em xin chân thành cảm ơn quý thầy cô trong khoa đã tận tình giảng dạy và trang bị cho chúng em những kiến thức cần thiết trong thời gian qua Mặc dùng đã cố găng hoàn thành đồ
án môn học với tất cả nổ lực, nhưng đồ án chắc chắn không tránh khỏi những thiếu sót nhất định, rất môn nhận được sự cảm thông, chia sẻ và tận tình đóng góp chỉ bảo của quý thầy cô.
Em xin chân thành cảm ơn thầy.
Trang 6A MỞ ĐẦU
1 Lý do chọn đề tài
Hiện nay ngành Công nghệ thông tin đang phát triển nhanh chóng và ứng dụng của nó lan rọng trong mọi lĩnh vực cuộc sống, cả trên toàn cầu và ở Việt Nam Công nghệ thông tin là một phần không thể thiếu, đóng vai trò quan trọng trong công cuộc công nghiệp hóa, hiện đại hóa và phát triển đất nước Việc ứng dụng khoa học và công nghệ vào đời sống và công tác là vô cùng thiết yếu Sự kết hợp giữa công nghệ thông tin và truyền thông là một yếu tố quan trọng trong hoạt động của các công ty và tổ chức Công nghệ thông tin và truyền thông góp phần thay đổi suy nghĩ và lối tư duy của con người, giúp con người trở nên năng động và kết nối nhanh chóng ở bất kỳ đâu, từ đó tăng cường hiệu quả và năng suất làm việc
Python là một ngôn ngữ lập trình hướng đối tượng cao cấp, được sử dụng để phát triển website và các ứng dụng đa dạng Python được tạo ra bởi Guido van Rossum và phát triển trong dự án mã nguồn mở Với cú pháp đơn giản và dễ hiểu, Python là lựa chọn hoàn hảo cho người mới học lập trình Nó có thể được
sử dụng để giải quyết các vấn đề về số học, xử lý văn bản, tạo game và nhiều công việc khác
Trong quá trình tìm hiểu, chúng tôi rất quan tâm đến các ứng dụng game được phát triển và lập trình bằng Python sử dụng thư viện Pygame Pygame là một bộcông cụ tiện ích trong ngôn ngữ lập trình Python và đã tạo ra nhiều trò chơi huyền thoại từ thời ban đầu Do đó, chúng tôi đã quyết định sử dụng thư viện Pygame của Python để xây dựng trò chơi Snake (game con rắn), nhằm thấy rõ sức mạnh của nó
2 Mục đích – mục tiêu của đề tài
- Mục đích:
+ Nắm chắc được được kỹ năng và kiến thức về lập trình
+ Tìm hiều về thư viện Pygame trong ngôn ngữ lập trình Python.+ Cũng cố, áp dụng, nâng cao kiến thức đã được học
Trang 7+ Nắm bắt được quy trình làm game cơ bản.
- Mục tiêu:
+ Vận dụng được tính chất của lập trình hướng đối tượng
+ Sử dụng thư viện Pygame vào việc xây dựng game con rắn
Phần II: Nội dung
Phần này bao gồm các thông tin về đề tài như:
+ Tìm hiểu về quy trình làm game
+ Xây dựng game
CON RẮN VỚI THƯ VIỆN PYGAME
1 Giới thiệu về game con rắn (Snake)
Game con rắn là một trò chơi điện tử kinh điển và được biết đến rộng rãi trên nhiều nền tảng Trò chơi này xuất hiện từ những năm 1970 và trở thành một trong những trò chơi điện tử đầu tiên được phát triển và phổ biến Trong game con rắn, người chơi điều khiển một con rắn di chuyển trên một mặt phẳng 2D, và mục tiêu của trò chơi là điều khiển con rắn ăn các mục tiêu nhỏ (thường là các mảnh thức ăn) để tăng độ dài của nó
Trang 8Trò chơi con rắn được xây dựng trên nguyên tắc đơn giản nhưng gây nghiện Người chơi phải tránh va chạm với các ranh giới và cơ thể của con rắn, trong khi cố gắng thu thập nhiều điểm số nhất có thể Mỗi khi con rắn ăn một mục tiêu, nó sẽ dài ra và tốc độ di chuyển của nó có thể tăng lên, tạo nên thử thách và độ khó ngày càng tăng.
Game con rắn đã trở thành một biểu tượng trong ngành công nghiệp game và đã có nhiều phiên bản và biến thể khác nhau được phát triển trêncác hệ điều hành và thiết bị khác nhau Nó được chơi trên máy tính, điện thoại di động và các thiết bị điện tử khác Game con rắn được yêu thích bởi sự đơn giản, tính gây nghiện và khả năng thách thức người chơi
2 Giới thiệu vấn đề
Yêu cầu chương trình của chúng ta ở đây là làm sao thiết kế được mộtchương trình game giống (hoặc gần giống) như game con rắn trên dựa vào các phương pháp lập trình đã học Cụ thể là sử dụng phương pháp lậptrình Python đang học kết hợp với các mẫu thiết kế và các giải thuật toán học
Trang 91 Bắt đầu trò chơi, con rắn được đặt tại một vị trí ban đầu trên màn hình.
2 Con rắn ban đầu chỉ có một phần đầu, thân, và đuôi
3 Mục tiêu của trò chơi là điều khiển con rắn di chuyển trên màn hình
và ăn các mục tiêu (quả táo)để tăng chiều dài của nó và điểm số
4 Con rắn có thể di chuyển lên, xuống, sang trái hoặc sang phải trên màn hình Người chơi sử dụng các nút điều hướng hoặc các phím tương ứng trên bàn phím để điều khiển con rắn
5 Khi con rắn ăn một mục tiêu, nó sẽ dài ra một đơn vị và một mục tiêu mới sẽ xuất hiện ở một vị trí ngẫu nhiên trên màn hình
6 Người chơi cần tránh va chạm với ranh giới của màn hình hoặc cơ thể của chính con rắn Nếu con rắn chạm vào ranh giới hoặc cơ thể của nó, trò chơi sẽ kết thúc
7 Điểm số được tính dựa trên số lượng mục tiêu mà con rắn đã ăn được Mỗi khi con rắn ăn một mục tiêu, điểm số tăng lên
8 Trò chơi tiếp tục cho đến khi con rắn không thể di chuyển tiếp và không có mục tiêu nào còn lại để ăn
9 Mục tiêu của người chơi là đạt được điểm số cao nhất có thể bằng cách ăn nhiều mục tiêu và tránh va chạm
Trang 103.3 Sơ đồ dòng game
(Ảnh 1: Sơ đồ điều khiển)
Trang 114 Môi trường cài đặt
- Visual Studio Code (64 bit)
- Điều đầu tiên cần làm để lập trình trò chơi trong Python là cài đặt đun Pygame Để thực hiện cài cho mô-đun này, có thể nhập câu lệnh như sau trong cdm:
mô-Pip install pygame
(Ảnh 2: Cài đặt pygame)
5 Xây dựng game
5.1Tạo Screen
Khai báo thứ viện cho game:
Tạo Screen game:
cell_size = 35
cell_number = 20
screen = pygame.display.set_mode((cell_size * cell_number, cell_size * cell_number))
from pygame.math import Vector2
import pygame, sys, random
Trang 12else:
for col in range (cell_number):
Trang 13Fill cỏ:
def draw_element (self):
self.draw_grass()
5.3 Tạo mục tiêu cho rắn:
Khỏi tạo Apple: (kết hợp hàm random để tạo vị trí mục tiêu ngẫu nhiên)
Trang 14def draw_fruit(self):
#Sửa lại độ lớn ảnh
apple_width = 35 # Chiều rộng mới
apple_height = 35 # Chiều cao mới
scaled_apple = pygame.transform.scale(apple, (apple_width,
self.x = random.randint(0, cell_number - 1)
self.y = random.randint(0, cell_number - 1)
self.pos = Vector2(self.x, self.y)
Trang 15pygame.image.load('Snake/img/dauduoi.png').convert_alpha() self.head_right =
pygame.image.load('Snake/img/dauphai.png').convert_alpha() self.head_left =
pygame.image.load('Snake/img/dautrai.png').convert_alpha()
- ‘self.body’ = [ ] để khỏi tạo phần thân cho rắn khi bắt đầu game
- ‘direction’ là biến lưu vector hướng di chuyển của con rắn, biết ‘directio’ được cập nhật thông qua sự kiện ‘pygame.KEYDOWN’
for event in pygame.event.get():
Trang 16main_game.snake.direction =
Vector2(0, -1)
if event.key == pygame.K_RIGHT:
if main_game.snake.direction.x != -1: main_game.snake.direction =
Vector2(1, 0)
if event.key == pygame.K_DOWN:
if main_game.snake.direction.y != -1: main_game.snake.direction =
Vector2(0, 1)
if event.key == pygame.K_LEFT:
if main_game.snake.direction.x != 1: main_game.snake.direction =
New_block’ là cờ hiệu để xác định con rắn có ăn quả táo không nếu có
‘new_block= true’ thì con rắn sẽ dài ra thêm một block
- Con rắn được khỏi tạo với phần đầu gồm các ảnh như sau:
Hướng lên Hướng xuống Hướng sang phải Hướng sang trái
(Ảnh 3: Ảnh đầu rắn)
- Vẽ con rắn lên màn hình:
def draw_snake(self):
self.update_head_graphics()
Trang 17self.update_tail_graphics()
for index, block in enumerate(self.body):
x_pos = int (block.x * cell_size)
y_pos = int (block.y * cell_size)
block_rect = pygame.Rect(x_pos, y_pos, cell_size, cell_size)
screen.blit(self.body_horizontal,block_rect) else:
if previous_block.x == -1 and next_block.y
== 1 or previous_block.y == 1 and next_block.x == 1:
screen.blit(self.body_tl,block_rect) elif previous_block.x == -1 and
next_block.y == 1 or previous_block.y == 1 and next_block.x == -1:
screen.blit(self.body_bl,block_rect) elif previous_block.x == 1 and next_block.y
== -1 or previous_block.y == -1 and next_block.x == 1:
screen.blit(self.body_tr,block_rect) elif previous_block.x == 1 and next_block.y
== 1 or previous_block.y == 1 and next_block.x == 1: screen.blit(self.body_br,block_rect)
Trang 18- Hàm ‘update_head_graphics()’ dùng để xác định hướng của con rắn nhằm update hình ảnh đầu của con rắn phù hợp với hướng của nó:
def update_head_graphics(self):
head_relation = self.body[1] - self.body[0]
if head_relation == Vector2(1,0): self.head =
Sử dụng một vòng lặp for để lặp qua các phần tử trong danh sách
`self.body` Trong mỗi vòng lặp, biến `block` sẽ lưu trữ giá trị của phần
tử hiện tại trong danh sách và biến `index` sẽ lưu trữ chỉ số tương ứng của phần tử đó trong danh sách
- Nếu `index = 0` thì vẽ đầu con rắn lên màn hình ở toạ độ của
`block_rect`- Nếu `index = len(self.body) - 1` (tức là phần tử cuối) thì vẽ đuôi con rắn tọa độ của `block_rect` lên màn hình
- Nếu tọa độ x của block thân con rắn trước và sau block hiện tại của thân con rắn bằng nhau thì vẽ thân con rắn nằm dọc lên màn hình theo tọa độ của `block_rect`
- Nếu tọa độ y của block thân con rắn trước và sau block hiện tại của thân con rắn bằng nhau thì vẽ thân con rắn nằm ngang lên màn hình theo tọa độ của `block_rect
- Nếu tọa độ x của block sau = -1 và tọa độ y block trước = -1 hoặc tọa độ y của block trước = -1 và toạ độ x của block sau = -1 thì vẽ thân con rắn chuyển hướng từ trái lên ở tọa độ của `block_rect`
- Nếu tọa độ x của block trước = -1 và toạ độ u của block sau = 1 hoặc tọa độ y của block trước = 1 và tọa đọ x của block sau = -1 thì vẽthân con rắn chuyển hướng từ trái xuống ở tọa độ của `block_rect`
Trang 19- Nếu tọa độ x của block trước = 1 và y của block sau = -1 hoặc y củablock trước = -1 và x của block sau = 1 thì vẽ thân con rắn chuyển hướng từ phải lên ở tọa độ của `block_rect`
- Nếu tọa độ x của block trước = 1 và y block sau = 1 hoặc y của block trước = 1 và x của block sau = 1 thì vẽ thân con rắn chuyển hướng từ phải xuống ở tọa độ của `block_rect`
+ Di chuyển con rắn và kết nối con rắn với quả táo
def move_snake(self):
if self.new_block == True:
body_copy = self.body[:]
body_copy.insert(0,body_copy[0] + self.direction) self.body = body_copy[:]
self.new_block = False
else:
body_copy = self.body[:-1]
body_copy.insert(0,body_copy[0] + self.direction) self.body = body_copy[:]
Trang 20game_start_font = pygame.font.Font('Snake/Font/Valoon.ttf', 40) game_start_snake_font = pygame.font.Font('Snake/Font/Valoon.ttf', 60)
game_start_snake_text = game_start_snake_font.render("SNAKE GAME", True, (255, 255, 255))
# Tạo văn bản cho các nút
easy_text = game_font.render("Easy", True, (0, 0, 0))
medium_text = game_font.render("Medium", True, (0, 0, 0))
Trang 21hard_text = game_font.render("Hard", True, (0, 0, 0))
# Tạo các hình chữ nhật cho các nút
easy_button_rect = easy_text.get_rect(center=(cell_size *
cell_number // 2 - 205, cell_size * cell_number // 2 + 50))
medium_button_rect = medium_text.get_rect(center=(cell_size * cell_number // 2 + 5, cell_size * cell_number // 2 + 50))
hard_button_rect = hard_text.get_rect(center=(cell_size *
cell_number // 2 + 215, cell_size * cell_number // 2 + 50))
# Mở rộng hình chữ nhật để tạo viền xung quanh văn bản
button_padding = 10
easy_button = pygame.Rect(easy_button_rect.left - button_padding, easy_button_rect.top - button_padding,
easy_button_rect.width + 2 * button_padding, easy_button_rect.height + 2 * button_padding)
medium_button = pygame.Rect(medium_button_rect.left -
button_padding, medium_button_rect.top - button_padding,
medium_button_rect.width + 2 * button_padding, medium_button_rect.height + 2 * button_padding)
hard_button = pygame.Rect(hard_button_rect.left - button_padding, hard_button_rect.top - button_padding,
hard_button_rect.width + 2 * button_padding, hard_button_rect.height + 2 * button_padding)
Trang 22for event in pygame.event.get():
# Lấy tọa độ chuột khi người dùng nhấn chuột
mouse_x, mouse_y = pygame.mouse.get_pos()
# Kiểm tra xem chuột có nằm trong các nút không
# Thêm code xử lý cho sự kiện "Easy" ở đây
elif medium_button.collidepoint(mouse_x, mouse_y): # Xử lý sự kiện khi người chơi nhấn nút "Medium" self.snake_speed = 8
# Thêm code xử lý cho sự kiện "Medium" ở đây
elif hard_button.collidepoint(mouse_x, mouse_y):
# Xử lý sự kiện khi người chơi nhấn nút "Hard"
self.snake_speed = 10
self.game_start = True
self.choose_music.play()
self.play_game()
print("Hard button clicked")
if event.type == pygame.KEYDOWN and event.key ==
pygame.K_SPACE:
Trang 23self.choose_music.play()
self.game_start = True
self.play_game()
Nếu bấm phím Space thì chơi chế độ mặc định (dễ)
5.7 Demo màn hình vào game ( chưa start) :
(Ảnh 4: Màn hình chọn mode lần đầu)
Trang 24replay_text = game_font.render("Play again", True, (0, 0, 0))
replay_text_rect = replay_text.get_rect(center=(cell_size * cell_number // 2 +
# Tạo văn bản cho các nút
easy_text = game_font.render("Easy", True, (0, 0, 0))
medium_text = game_font.render("Medium", True, (0, 0, 0))
hard_text = game_font.render("Hard", True, (0, 0, 0))