Thông báo: Download 4 khóa học Python từ cơ bản đến nâng cao tại đây.
Hướng dẫn viết Snake Game bằng Python
Trong hướng dẫn này, chúng ta sẽ xây dựng trò chơi "Rắn săn mồi" nổi tiếng bằng Python, sử dụng module curses
để tạo các ứng dụng chạy trong terminal. Đây là một dự án cơ bản nhưng rất thú vị, giúp bạn học về các cấu trúc dữ liệu như list, tuple, và cách triển khai logic điều khiển bằng vòng lặp while và câu lệnh điều kiện if.
Giới thiệu về curses
trong Python
curses
là một thư viện trong Python dùng để xây dựng giao diện trong terminal. Nó hỗ trợ tạo cửa sổ (window), đọc sự kiện bàn phím, vẽ các thành phần trên màn hình và nhiều tính năng khác phù hợp cho việc xây dựng game hoặc ứng dụng giao diện dòng lệnh.
Dưới đây là mã nguồn hoàn chỉnh cho game "Rắn săn mồi":
import curses from random import randint # Thiết lập cửa sổ (window) curses.initscr() win = curses.newwin(20, 60, 0, 0) # Tạo cửa sổ với kích thước (y=20, x=60) win.keypad(1) # Kích hoạt chế độ đọc bàn phím curses.noecho() # Tắt hiển thị ký tự khi nhập từ bàn phím curses.curs_set(0) # Tắt con trỏ win.border(0) # Vẽ đường viền xung quanh cửa sổ win.nodelay(1) # Không chờ phím (nodelay) # Khởi tạo rắn và thức ăn snake = [(4, 10), (4, 9), (4, 8)] # Rắn bắt đầu với 3 đoạn food = (10, 20) # Vị trí thức ăn win.addch(food[0], food[1], '#') # Vẽ thức ăn (#) # Khởi tạo điểm số score = 0 # Định nghĩa các phím ESC = 27 # Phím ESC để thoát key = curses.KEY_RIGHT # Bắt đầu đi sang phải # Vòng lặp chính while key != ESC: win.addstr(0, 2, 'Score ' + str(score) + ' ') # Hiển thị điểm # Tăng tốc độ khi rắn dài hơn win.timeout(150 - (len(snake)) // 5 + len(snake)//10 % 120) prev_key = key # Lưu phím trước đó event = win.getch() # Đọc phím nhập key = event if event != -1 else prev_key # Giữ nguyên hướng nếu không bấm phím mới # Xử lý phím không hợp lệ if key not in [curses.KEY_LEFT, curses.KEY_RIGHT, curses.KEY_UP, curses.KEY_DOWN, ESC]: key = prev_key # Tính toán vị trí tiếp theo của rắn y = snake[0][0] x = snake[0][1] if key == curses.KEY_DOWN: y += 1 if key == curses.KEY_UP: y -= 1 if key == curses.KEY_LEFT: x -= 1 if key == curses.KEY_RIGHT: x += 1 snake.insert(0, (y, x)) # Thêm đầu mới của rắn # Kiểm tra va chạm với biên if y == 0 or y == 19 or x == 0 or x == 59: break # Kiểm tra rắn tự cắn chính nó if snake[0] in snake[1:]: break # Kiểm tra nếu rắn ăn thức ăn if snake[0] == food: score += 1 food = () while food == (): # Tạo thức ăn ở vị trí ngẫu nhiên food = (randint(1, 18), randint(1, 58)) if food in snake: food = () win.addch(food[0], food[1], '#') # Vẽ thức ăn mới else: # Di chuyển rắn: xóa đoạn cuối last = snake.pop() win.addch(last[0], last[1], ' ') # Vẽ rắn win.addch(snake[0][0], snake[0][1], '*') # Kết thúc trò chơi curses.endwin() print(f"Điểm số cuối cùng của bạn là: {score}")
Giải thích mã nguồn
- Tạo cửa sổ: Dùng
curses.newwin()
để tạo cửa sổ có kích thước cố định. - Quản lý rắn: Rắn được biểu diễn bằng một danh sách chứa các tuple. Mỗi tuple đại diện cho một đoạn rắn (tọa độ x, y).
- Thức ăn: Tọa độ của thức ăn được lưu trong một tuple. Khi rắn "ăn" thức ăn, thức ăn mới sẽ được sinh ra ở vị trí ngẫu nhiên.
- Điểm số: Điểm tăng thêm mỗi lần rắn ăn thức ăn.
- Tăng tốc độ: Càng nhiều đoạn rắn, trò chơi càng nhanh, làm tăng độ khó.
- Va chạm: Kết thúc trò chơi khi rắn va vào tường hoặc chính nó.
Chạy trò chơi
Lưu mã vào một tệp, ví dụ: snake_game.py
.
Bài viết này được đăng tại [free tuts .net]
Chạy trò chơi bằng lệnh:
$ python snake_game.py
Kết bài
Hướng dẫn này không chỉ giúp bạn xây dựng trò chơi "Rắn săn mồi", mà còn cung cấp kiến thức cơ bản về:
- Làm việc với module
curses
. - Quản lý dữ liệu và logic trò chơi bằng list và tuple.
- Sử dụng vòng lặp và điều kiện để xử lý tương tác.
Chúc bạn chơi vui vẻ và thử thách bạn bè với điểm số cao nhất nhé!