Trong bài viết này, chúng ta sẽ học cách code game "Rắn săn mồi" bằng lập trình python' class='hover-show-link replace-link-1687'> ngôn ngữ lập trình python . Từ việc cài đặt thư viện Pygame cho đến tạo ra chuyển động cho con rắn và hiển thị số điểm, tất cả đều sẽ được hướng dẫn chi tiết.
Bước 1: Cài đặt Pygame
Đầu tiên, bạn cần cài đặt thư viện Pygame lên máy tính của mình. Bạn có thể truy cập trang web pygame.org/download.shtml để tải và cài đặt phiên bản Pygame phù hợp với phiên bản Python trên máy của bạn.
Bước 2: Tạo màn hình game
Để tạo màn hình cho game "Rắn săn mồi" bằng Pygame, bạn sẽ sử dụng hàm display.set_mode()
. Ngoài ra, bạn cũng cần sử dụng hàm init()
và quit()
để khởi tạo và kết thúc chương trình. Hàm update()
được sử dụng để cập nhật bất kỳ thay đổi nào trên màn hình.
import pygame pygame.init() dis = pygame.display.set_mode((400, 300)) pygame.display.update() pygame.quit() quit()
Màn hình ban đầu của game Rắn săn mồi
Tuy nhiên, màn hình này sẽ đóng lại ngay lập tức. Để khắc phục vấn đề này, bạn cần tạo một vòng lặp cho game bằng cách sử dụng while
trước khi thực sự thoát game.
import pygame pygame.init() dis = pygame.display.set_mode((400, 300)) pygame.display.update() pygame.display.set_caption('Snake game by Edureka') game_over = False while not game_over: for event in pygame.event.get(): print(event) # in ra tất cả các hành động xuất hiện trên màn hình pygame.quit() quit()
Khi bạn chạy đoạn mã này, bạn sẽ thấy màn hình giống như ở trên nhưng nó không đóng lại. Với việc có thêm hàm event.get()
, màn hình sẽ trả về tất cả các hành động xuất hiện trên nó. Bạn cũng có thể đặt tiêu đề cho màn hình bằng cách sử dụng hàm display.set_caption()
.
Màn hình game hiện đã có tiêu đề
Bây giờ, bạn đã có màn hình cho game "Rắn săn mồi" của mình nhưng khi nhấp vào nút đóng (dấu X), màn hình không đóng lại. Lý do là bạn chưa thiết lập màn hình phải đóng khi bạn nhấn nút đóng. Để làm điều này, Pygame cung cấp cho bạn một lệnh có tên QUIT
và bạn có thể sử dụng nó như sau:
import pygame pygame.init() dis = pygame.display.set_mode((400, 300)) pygame.display.update() pygame.display.set_caption('Snake game by Edureka') game_over = False while not game_over: for event in pygame.event.get(): if event.type == pygame.QUIT: game_over = True pygame.quit() quit()
Bây giờ, màn hình đã được thiết lập xong. Phần tiếp theo là tạo ra con rắn.
Bước 3: Tạo ra con rắn
Để tạo con rắn, trước tiên bạn cần xác định một số màu cho rắn, con mồi, màn hình,... Bảng màu được sử dụng trong Pygame là RGB (Red Green Blue). Trong trường hợp này, nếu bạn thiết lập giá trị là 0 cho cả R, G, B, bạn sẽ nhận được màu đen, và nếu bạn thiết lập giá trị là 255 cho cả R, G, B, bạn sẽ nhận được màu trắng.
Thực tế, con rắn của chúng ta là một hình chữ nhật. Để vẽ hình chữ nhật trong Pygame, bạn cần sử dụng hàm draw.rect()
và cung cấp tọa độ, kích thước và màu sắc.
import pygame pygame.init() dis = pygame.display.set_mode((400, 300)) pygame.display.update() pygame.display.set_caption('Snake game by Edureka') game_over = False while not game_over: for event in pygame.event.get(): if event.type == pygame.QUIT: game_over = True pygame.draw.rect(dis, (0, 0, 255), [200, 150, 10, 10]) pygame.display.update() pygame.quit() quit()
Con rắn đã được thiết lập xong
Như bạn thấy, con rắn màu xanh da trời đã xuất hiện trên màn hình. Bước tiếp theo là tạo ra chuyển động cho con rắn.
Bước 4: Tạo chuyển động cho con rắn
Để di chuyển con rắn, bạn cần tạo ra các sự kiện trong hàm KEYDOWN
của Pygame. Các sự kiện được sử dụng ở đây là K_LEFT
, K_RIGHT
, K_UP
và K_DOWN
, tương ứng với di chuyển sang trái, sang phải, lên trên và xuống dưới của con rắn. Từ bước này, màn hình game cũng sẽ được thay đổi từ màu đen mặc định sang màu xanh da trời bằng cách sử dụng hàm fill()
. Từ bước này, con rắn cũng được chuyển sang màu đen và màn hình game cũng lớn gấp đôi.
Bạn cũng cần tạo ra hai biến mới là x1_change
và y1_change
để lưu trữ các giá trị được cập nhật của tọa độ x và y. Dưới đây là đoạn mã mẫu cho bước này:
import pygame pygame.init() dis = pygame.display.set_mode((400, 300)) pygame.display.update() pygame.display.set_caption('Snake game by Edureka') game_over = False while not game_over: for event in pygame.event.get(): if event.type == pygame.QUIT: game_over = 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((255, 255, 255)) pygame.draw.rect(dis, (0, 0, 0), [x1, y1, 10, 10]) pygame.display.update() pygame.quit() quit()
Kết quả khi chạy chương trình:
Đây là con rắn sau khi được gán chuyển động theo điều khiển bàn phím
Bước 5: Tạo giới cơ chế Game Over khi con rắn đâm vào rìa màn hình
Trong game rắn săn mồi, người chơi sẽ thua nếu con rắn đâm vào rìa màn hình. Để làm điều này, bạn thêm một lệnh if
để xác định giới hạn cho tọa độ x và y sao cho nó nhỏ hơn hoặc bằng với chiều rộng và chiều cao của màn hình. Bạn cũng không nên sử dụng các giá trị cố định mà thay bằng các biến để dễ dàng sửa đổi sau này nếu cần.
Đoạn mã mẫu như sau:
import pygame pygame.init() dis = pygame.display.set_mode((400, 300)) pygame.display.update() pygame.display.set_caption('Snake game by Edureka') game_over = False while not game_over: for event in pygame.event.get(): if event.type == pygame.QUIT: game_over = True x1 += x1_change y1 += y1_change if x1 >= 400 or x1 < 0 or y1 >= 300 or y1 < 0: game_over = True dis.fill((255, 255, 255)) pygame.draw.rect(dis, (0, 0, 0), [x1, y1, 10, 10]) pygame.display.update() pygame.quit() quit()
Bước này sẽ kết quả như sau:
Bạn sẽ thua nếu điều khiển rắn đâm đầu vào màn hình
Bước 6: Thêm con mồi
Tại bước này, bạn sẽ thêm con mồi cho con rắn và khi con rắn ăn mồi, một thông báo "Yummy!!" sẽ hiển thị. Game cũng được điều chỉnh để cho phép người chơi thoát hoặc chơi lại sau khi thua. Ban đầu, con mồi được thiết lập là màu xanh da trời.
Code mẫu:
import pygame import time import random pygame.init() white = (255, 255, 255) black = (0, 0, 0) red = (255, 0, 0) blue = (0, 0, 255) dis_width = 800 dis_height = 600 dis = pygame.display.set_mode((dis_width, dis_height)) pygame.display.set_caption('Snake Game by Edureka') clock = pygame.time.Clock() snake_block = 10 snake_speed = 30 font_style = pygame.font.SysFont(None, 50) def message(msg,color): mesg = font_style.render(msg, True, color) dis.blit(mesg, [dis_width/2, dis_height/2]) def gameLoop(): game_over = False game_close = False x1 = dis_width/2 y1 = dis_height/2 x1_change = 0 y1_change = 0 foodx = round(random.randrange(0, dis_width - snake_block) / 10.0) * 10.0 foody = round(random.randrange(0, dis_width - snake_block) / 10.0) * 10.0 while not game_over: while game_close == True: dis.fill(white) message("You Lost! Press Q-Quit or C-Play Again", red) pygame.display.update() for event in pygame.event.get(): if event.type == pygame.KEYDOWN: if event.key == pygame.K_q: game_over = True game_close = False if event.key == pygame.K_c: gameLoop() for event in pygame.event.get(): if event.type == pygame.QUIT: game_over = 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(white) pygame.draw.rect(dis, blue, [foodx, foody, snake_block, snake_block]) pygame.draw.rect(dis, black, [x1, y1, snake_block, snake_block]) pygame.display.update() if x1 == foodx and y1 == foody: print("Yummy!!") clock.tick(snake_speed) pygame.quit() quit() gameLoop()
Đây là kết quả của bước này:
Con mồi màu xanh da trời đã được thêm vào
Bước 7: Tăng độ dài của con rắn
Ở bước này, chúng ta sẽ thêm vào đoạn mã giúp tăng độ dài của con rắn sau khi nó ăn mồi. Ngoài ra, một đoạn mã nữa được thêm vào để khi con rắn va chạm với thân của nó, một thông báo sẽ hiện ra cho biết người chơi đã thua, và người chơi có thể nhấn Q để thoát hoặc nhấn C để chơi lại. Độ dài của con rắn về cơ bản được lưu trữ trong một danh sách và kích thước ban đầu được chỉ định trong đoạn mã sau:
import pygame import time import random 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_width = 600 dis_height = 400 dis = pygame.display.set_mode((dis_width, dis_height)) pygame.display.set_caption('Snake Game by Edureka') clock = pygame.time.Clock() snake_block = 10 snake_speed = 15 font_style = pygame.font.SysFont("bahnschrift", 25) score_font = pygame.font.SysFont("comicsansms", 35) def our_snake(snake_block, snake_list): for x in snake_list: pygame.draw.rect(dis, black, [x[0], x[1], snake_block, snake_block]) def message(msg, color): mesg = font_style.render(msg, True, color) dis.blit(mesg, [dis_width / 6, dis_height / 3]) def gameLoop(): game_over = 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_over: while game_close == True: dis.fill(blue) message("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_over = True game_close = False if event.key == pygame.K_c: gameLoop() for event in pygame.event.get(): if event.type == pygame.QUIT: game_over = 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(white) 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 our_snake(snake_block, snake_List) 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()
Kết quả cuối cùng khi chạy chương trình:
Kết quả cuối cùng
Như vậy là chúng ta đã hướng dẫn các bạn cách code game "Rắn săn mồi" bằng Python cùng với code mẫu. Hy vọng rằng bài viết đã mang lại cho bạn những kiến thức bổ ích về ngôn ngữ lập trình Python.
Để tìm hiểu thêm về Python, bạn có thể truy cập: Python là gì? Tại sao nên chọn Python? và để tìm hiểu thêm về các hàm của Python mời các bạn vào: Hàm trong Python là gì? Các hàm trong Python.