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
.png)
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é!

Các kiểu dữ liệu trong C ( int - float - double - char ...)
Thuật toán tìm ước chung lớn nhất trong C/C++
Cấu trúc lệnh switch case trong C++ (có bài tập thực hành)
ComboBox - ListBox trong lập trình C# winforms
Random trong Python: Tạo số random ngẫu nhiên
Lệnh cin và cout trong C++
Cách khai báo biến trong PHP, các loại biến thường gặp
Download và cài đặt Vertrigo Server
Thẻ li trong HTML
Thẻ article trong HTML5
Cấu trúc HTML5: Cách tạo template HTML5 đầu tiên
Cách dùng thẻ img trong HTML và các thuộc tính của img
Thẻ a trong HTML và các thuộc tính của thẻ a thường dùng