Tạo ứng dụng hoặc lập trình game là một mục tiêu mà nhà phát triển chuyên nghiệp trong ngôn ngữ Python phải theo đuổi. Bài viết này sẽ giúp bạn tạo game Rắn Săn Mồi với Python một cách đơn giản nhưng thú vị.
Giới thiệu về game Rắn Săn Mồi với Python
Game Rắn Săn Mồi là trò chơi không còn xa lạ với chúng ta từ khi còn nhỏ. Trò chơi này xuất hiện lần đầu vào năm 1970 và đến năm 1990, nó trở nên phổ biến. Nội dung của game là người chơi điều khiển một con rắn và cố gắng ăn những mồi để con rắn trở nên dài hơn. Tuy nhiên, con rắn cũng phải tránh va chạm vào tường hoặc các vật cản.
Hình 1. Game rắn săn mồi
Cách lập trình game Rắn Săn Mồi với Python
Sau khi đã hiểu về game Rắn Săn Mồi, chúng ta sẽ hướng dẫn bạn cách tạo game này bằng Python. Đầu tiên, chúng ta sẽ sử dụng thư viện pygame và định nghĩa các đối tượng trong game như rắn, mồi và vật cản. Bạn sẽ điều khiển con rắn thông qua bốn phím mũi tên.
Dưới đây là các bước cơ bản để tạo game này. Hãy tiếp tục theo dõi!
Cài đặt module Pygame
Trước tiên, bạn cần cài đặt module Pygame. Để làm điều này, hãy chạy lệnh sau trong terminal.
pip install pygame
Khi quá trình cài đặt hoàn tất, bạn có thể nhập "pygame" và bắt đầu viết mã cho dự án của mình.
Hình 2. Module Pygame
Khởi tạo màn hình game
Sử dụng hàm display.set_mode()
để tạo màn hình game Rắn Săn Mồi. Sau đó, bạn cần sử dụng phương thức init()
và quit()
để khởi tạo và loại bỏ các thành phần không cần thiết trong chương trình.
Tiếp theo, sử dụng phương thức update()
để cập nhật các thay đổi trên màn hình game. Bạn cũng có thể sử dụng phương thức flip()
để thay thế phương thức update()
. Cả hai phương thức này đều có chức năng cập nhật màn hình với các thay đổi liên tục. Tuy nhiên, update()
chỉ cập nhật thay đổi được thực hiện (trong trường hợp không truyền tham số). Trong khi đó, flip()
sẽ cập nhật toàn bộ màn hình với bất kỳ thay đổi nào.
import pygame pygame.init() # Tạo một màn hình hiển thị game với kích thước chiều rộng là 400 và chiều cao là 300 dis = pygame.display.set_mode((400, 300)) # Cho phép cập nhật một số thành phần của màn hình pygame.display.update() # Loại bỏ tất cả những thứ không cần thiết còn sót lại trong chương trình pygame.quit() quit()
Khi chạy đoạn mã này, màn hình sẽ chạy liên tục và hiển thị các tác vụ diễn ra trên đó. Điều này đơn giản là do chúng ta sử dụng phương thức event.get()
. Bạn cũng có thể sử dụng hàm display.set_caption()
để đặt tên cho màn hình là "Snake game".
Vậy là màn hình game Rắn Săn Mồi đã hoàn tất. Tuy nhiên, một vấn đề là khi bạn nhấn nút đóng cửa sổ, màn hình không thoát. Lý do là bạn đã không ra lệnh cho màn hình thoát khi thực hiện thao tác đóng. Để khắc phục điều này, chúng ta sẽ sử dụng sự kiện "Quit" từ Pygame.
import pygame pygame.init() dis=pygame.display.set_mode((400,300)) pygame.display.update() pygame.display.set_caption('Snake game') game_end=False while not game_end: for event in pygame.event.get(): # Phát hiện thao tác thoát khỏi trò chơi của người dùng if event.type==pygame.QUIT: game_end=True pygame.quit() quit()
Như vậy, vấn đề đã được giải quyết và quá trình khởi tạo màn hình của trò chơi đã thành công.
1. Tạo và hiển thị con rắn trên màn hình
Tiếp theo là tạo hình dạng cho con rắn và hiển thị nó trên màn hình. Đầu tiên, ta cần chỉ định các màu để tô màu cho con rắn và các thành phần liên quan. Thông thường, ta sẽ sử dụng bảng màu RGB. Nếu bạn chỉnh các thành phần này thành 0, màu chính sẽ là màu trắng hoặc đen.
Thực tế, con rắn chỉ là một hình chữ nhật. Sử dụng hàm draw.rect()
để vẽ hình chữ nhật với màu và kích thước tùy chỉnh.
import pygame pygame.init() dis=pygame.display.set_mode((400,300)) pygame.display.set_caption('Snake game') # Tạo màu cho con rắn blue=(0,0,255) red=(255,0,0) game_end=False while not game_end: for event in pygame.event.get(): if event.type==pygame.QUIT: game_end=True # Vẽ một ô hình vuông màu xanh nước biển (đại diện cho đầu con rắn) trên màn hình # với vị trí (x, y) là (200, 150) và kích thước là 10 pygame.draw.rect(dis,blue,[200,150,10,10]) pygame.display.update() pygame.quit() quit()
Khi bạn chạy đoạn mã này, đầu con rắn sẽ có màu xanh lam. Sau đó, hãy thực hiện di chuyển con rắn trên màn hình.
Để di chuyển con rắn trong game, chúng ta sẽ sử dụng sự kiện KEYDOWN từ Pygame. Sự kiện này bao gồm các phím mũi tên lên, xuống, trái và phải để con rắn có thể di chuyển.
Màn hình cũng sẽ được thay đổi từ màu đen sang trắng thông qua hàm fill()
. Hãy nhớ tạo ra các biến mới x1_change
và y1_change
để lưu giữ giá trị cập nhật của các tọa độ mà bạn muốn thay đổi trong trò chơi.
import pygame pygame.init() white = (255, 255, 255) black = (0, 0, 0) red = (255, 0, 0) green = (0, 255, 0) blue = (0, 0, 255) dis = pygame.display.set_mode((800, 600)) pygame.display.set_caption('Snake game') game_end = False x1 = 300 y1 = 300 x1_change = 0 y1_change = 0 clock = pygame.time.Clock() while not game_end: for event in pygame.event.get(): if event.type == pygame.QUIT: game_end = True if event.type == pygame.KEYDOWN: if event.key == pygame.K_LEFT: x1_change = -10 y1_change = 0 elif event.key == pygame.K_RIGHT: x1_change = 10 y1_change = 0 elif event.key == pygame.K_UP: y1_change = -10 x1_change = 0 elif event.key == pygame.K_DOWN: y1_change = 10 x1_change = 0 x1 += x1_change y1 += y1_change dis.fill(white) pygame.draw.rect(dis, blue, [x1, y1, 10, 10]) pygame.display.update() clock.tick(30) pygame.quit() quit()
Lúc này, game Rắn Săn Mồi sẽ kết thúc nếu con rắn va chạm vào ranh giới hiển thị trên màn hình. Trong trò chơi này, có một quy tắc rằng khi người chơi chạm vào ranh giới của màn hình, trò chơi sẽ kết thúc và người chơi sẽ thua.
Vì vậy, chúng ta sẽ sử dụng lệnh "IF" để xác định giới hạn của các tọa độ x và y của con rắn so với màn hình. Bạn cũng có thể sử dụng biến game_end
để thoát khỏi trò chơi hay chơi lại khi bạn thua.
import pygame pygame.init() white = (255, 255, 255) black = (0, 0, 0) red = (255, 0, 0) green = (0, 255, 0) blue = (0, 0, 255) dis = pygame.display.set_mode((800, 600)) pygame.display.set_caption('Snake game') game_end = False x1 = 300 y1 = 300 x1_change = 0 y1_change = 0 clock = pygame.time.Clock() while not game_end: while game_close == True: dis.fill(blue) message_func("You Lost! Press C-Play Again or Q-Quit", red) pygame.display.update() for event in pygame.event.get(): if event.type == pygame.KEYDOWN: if event.key == pygame.K_q: game_end = True game_close = False if event.key == pygame.K_c: gameLoop() for event in pygame.event.get(): if event.type == pygame.QUIT: game_end = True if event.type == pygame.KEYDOWN: if event.key == pygame.K_LEFT: x1_change = -10 y1_change = 0 elif event.key == pygame.K_RIGHT: x1_change = 10 y1_change = 0 elif event.key == pygame.K_UP: y1_change = -10 x1_change = 0 elif event.key == pygame.K_DOWN: y1_change = 10 x1_change = 0 if x1 >= dis_width or x1 < 0 or y1 >= dis_height or y1 < 0: game_close = True x1 += x1_change y1 += y1_change dis.fill(blue) pygame.draw.rect(dis, green, [foodx, foody, snake_block, snake_block]) pygame.draw.rect(dis, black, [x1, y1, snake_block, snake_block]) score_func(snake_length - 1) pygame.display.update() if x1 == foodx and y1 == foody: foodx = round(random.randrange(0, dis_width - snake_block) / 10.0) * 10.0 foody = round(random.randrange(0, dis_height - snake_block) / 10.0) * 10.0 snake_length += 1 clock.tick(snake_speed) pygame.quit() quit()
2. Cung cấp đồ ăn cho con rắn
Chúng ta có thể cung cấp thức ăn cho con rắn, và khi nó ăn thức ăn đó, thông báo "Yummy" sẽ hiển thị để người chơi biết rằng con rắn đã ăn thức ăn đó. Bên cạnh đó, chúng ta cũng thay đổi một chút phần này để cho phép người chơi thoát khỏi trò chơi hoặc chơi lại khi thua. Để làm điều này, chúng ta cần sử dụng vòng lặp While để hỗ trợ chơi lại khi thua.
import pygame pygame.init() white = (255, 255, 255) yellow = (255, 255, 102) black = (0, 0, 0) red = (213, 50, 80) green = (0, 255, 0) blue = (50, 153, 213) dis = pygame.display.set_mode((dis_width, dis_height)) pygame.display.set_caption('Snake game') clock = pygame.time.Clock() def gameLoop(): game_end = False game_close = False x1 = dis_width / 2 y1 = dis_height / 2 x1_change = 0 y1_change = 0 snake_List = [] Length_of_snake = 1 foodx = round(random.randrange(0, dis_width - snake_block) / 10.0) * 10.0 foody = round(random.randrange(0, dis_height - snake_block) / 10.0) * 10.0 while not game_end: while game_close == True: dis.fill(blue) message_func("You Lost! Press C-Play Again or Q-Quit", red) pygame.display.update() for event in pygame.event.get(): if event.type == pygame.KEYDOWN: if event.key == pygame.K_q: game_end = True game_close = False if event.key == pygame.K_c: gameLoop() for event in pygame.event.get(): if event.type == pygame.QUIT: game_end = True if event.type == pygame.KEYDOWN: if event.key == pygame.K_LEFT: x1_change = -snake_block y1_change = 0 elif event.key == pygame.K_RIGHT: x1_change = snake_block y1_change = 0 elif event.key == pygame.K_UP: y1_change = -snake_block x1_change = 0 elif event.key == pygame.K_DOWN: y1_change = snake_block x1_change = 0 if x1 >= dis_width or x1 < 0 or y1 >= dis_height or y1 < 0: game_close = True x1 += x1_change y1 += y1_change dis.fill(blue) pygame.draw.rect(dis, green, [foodx, foody, snake_block, snake_block]) snake_Head = [] snake_Head.append(x1) snake_Head.append(y1) snake_List.append(snake_Head) if len(snake_List) > Length_of_snake: del snake_List[0] for x in snake_List[:-1]: if x == snake_Head: game_close = True snake_func(snake_block, snake_List) score_func(Length_of_snake - 1) pygame.display.update() if x1 == foodx and y1 == foody: foodx = round(random.randrange(0, dis_width - snake_block) / 10.0) * 10.0 foody = round(random.randrange(0, dis_height - snake_block) / 10.0) * 10.0 Length_of_snake += 1 clock.tick(snake_speed) pygame.quit() quit() gameLoop()
3. Tùy chỉnh kích thước con rắn
Dưới đây là đoạn mã để con rắn tăng kích thước sau khi ăn thức ăn. Tuy nhiên, nếu con rắn đập vào bộ phận cơ thể của chính nó, trò chơi sẽ kết thúc và thông báo "You Lost! Press C-Play Again or Q-Quit" hiển thị.
Chú ý rằng chiều dài của con rắn sẽ được lưu trữ trong danh sách và kích thước ban đầu sẽ là một khối.
import pygame pygame.init() white = (255, 255, 255) yellow = (255, 255, 102) black = (0, 0, 0) red = (213, 50, 80) green = (0, 255, 0) blue = (50, 153, 213) dis = pygame.display.set_mode((dis_width, dis_height)) pygame.display.set_caption('Snake game') clock = pygame.time.Clock() def gameLoop(): game_end = False game_close = False x1 = dis_width / 2 y1 = dis_height / 2 x1_change = 0 y1_change = 0 snake_List = [] Length_of_snake = 1 foodx = round(random.randrange(0, dis_width - snake_block) / 10.0) * 10.0 foody = round(random.randrange(0, dis_height - snake_block) / 10.0) * 10.0 while not game_end: while game_close == True: dis.fill(blue) message_func("You Lost! Press C-Play Again or Q-Quit", red) pygame.display.update() for event in pygame.event.get(): if event.type == pygame.KEYDOWN: if event.key == pygame.K_q: game_end = True game_close = False if event.key == pygame.K_c: gameLoop() for event in pygame.event.get(): if event.type == pygame.QUIT: game_end = True if event.type == pygame.KEYDOWN: if event.key == pygame.K_LEFT: x1_change = -snake_block y1_change = 0 elif event.key == pygame.K_RIGHT: x1_change = snake_block y1_change = 0 elif event.key == pygame.K_UP: y1_change = -snake_block x1_change = 0 elif event.key == pygame.K_DOWN: y1_change = snake_block x1_change = 0 if x1 >= dis_width or x1 < 0 or y1 >= dis_height or y1 < 0: game_close = True x1 += x1_change y1 += y1_change dis.fill(blue) pygame.draw.rect(dis, green, [foodx, foody, snake_block, snake_block]) snake_Head = [] snake_Head.append(x1) snake_Head.append(y1) snake_List.append(snake_Head) if len(snake_List) > Length_of_snake: del snake_List[0] for x in snake_List[:-1]: if x == snake_Head: game_close = True snake_func(snake_block, snake_List) score_func(Length_of_snake - 1) pygame.display.update() if x1 == foodx and y1 == foody: foodx = round(random.randrange(0, dis_width - snake_block) / 10.0) * 10.0 foody = round(random.randrange(0, dis_height - snake_block) / 10.0) * 10.0 Length_of_snake += 1 clock.tick(snake_speed) pygame.quit() quit() gameLoop()
4. Hiển thị kết quả thông qua điểm số
Để hiển thị điểm số của người chơi trong trò chơi, chúng ta cần tạo một phương thức mới "score_func". Phương thức này sẽ hiển thị chiều dài của con rắn sau khi trừ đi kích thước ban đầu.
import pygame pygame.init() white = (255, 255, 255) yellow = (255, 255, 102) black = (0, 0, 0) red = (213, 50, 80) green = (0, 255, 0) blue = (50, 153, 213) dis = pygame.display.set_mode((dis_width, dis_height)) pygame.display.set_caption('Snake game') clock = pygame.time.Clock() def gameLoop(): game_end = False game_close = False x1 = dis_width / 2 y1 = dis_height / 2 x1_change = 0 y1_change = 0 snake_List = [] Length_of_snake = 1 foodx = round(random.randrange(0, dis_width - snake_block) / 10.0) * 10.0 foody = round(random.randrange(0, dis_height - snake_block) / 10.0) * 10.0 while not game_end: while game_close == True: dis.fill(blue) message_func("You Lost! Press C-Play Again or Q-Quit", red) pygame.display.update() for event in pygame.event.get(): if event.type == pygame.KEYDOWN: if event.key == pygame.K_q: game_end = True game_close = False if event.key == pygame.K_c: gameLoop() for event in pygame.event.get(): if event.type == pygame.QUIT: game_end = True if event.type == pygame.KEYDOWN: if event.key == pygame.K_LEFT: x1_change = -snake_block y1_change = 0 elif event.key == pygame.K_RIGHT: x1_change = snake_block y1_change = 0 elif event.key == pygame.K_UP: y1_change = -snake_block x1_change = 0 elif event.key == pygame.K_DOWN: y1_change = snake_block x1_change = 0 if x1 >= dis_width or x1 < 0 or y1 >= dis_height or y1 < 0: game_close = True x1 += x1_change y1 += y1_change dis.fill(blue) pygame.draw.rect(dis, green, [foodx, foody, snake_block, snake_block]) snake_Head = [] snake_Head.append(x1) snake_Head.append(y1) snake_List.append(snake_Head) if len(snake_List) > Length_of_snake: del snake_List[0] for x in snake_List[:-1]: if x == snake_Head: game_close = True snake_func(snake_block, snake_List) score_func(Length_of_snake - 1) pygame.display.update() if x1 == foodx and y1 == foody: foodx = round(random.randrange(0, dis_width - snake_block) / 10.0) * 10.0 foody = round(random.randrange(0, dis_height - snake_block) / 10.0) * 10.0 Length_of_snake += 1 clock.tick(snake_speed) pygame.quit() quit() gameLoop()
Lời kết
Bài viết đã giới thiệu và hướng dẫn chi tiết cách lập trình game Rắn Săn Mồi với Python. Hy vọng các bạn đã có cái nhìn tổng quan và đủ kiến thức để thực hiện dự án này. Chúng tôi mong nhận được ý kiến đóng góp từ các bạn để cải thiện nội dung trong tương lai.
Hình 3. Màn hình hiển thị game Rắn Săn Mồi với Python