Xem thêm

Hướng dẫn Lập trình Game Rắn Săn Mồi với Python

Huy Erick
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...

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.

Game rắn săn mồi 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.

Module Pygame 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()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_changey1_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.

Màn hình hiển thị game rắn săn mồi với Python Hình 3. Màn hình hiển thị game Rắn Săn Mồi với Python

1