Mục lục:

Space Invaders trong Micropython trên Micro: bit: 5 bước
Space Invaders trong Micropython trên Micro: bit: 5 bước

Video: Space Invaders trong Micropython trên Micro: bit: 5 bước

Video: Space Invaders trong Micropython trên Micro: bit: 5 bước
Video: if __name__ == "__main__" là gì ? Cách Lập Trình Python CHUẨN | Lập Trình Python Cơ Bản #3 2024, Tháng bảy
Anonim
Image
Image

Trong các bài viết trước, chúng ta đã khám phá cách làm trò chơi trên GameGo, một máy chơi game cổ điển di động được phát triển bởi tổ chức giáo dục TinkerGen. Các trò chơi mà chúng tôi thực hiện gợi nhớ đến các trò chơi Nintendo cũ. Trong bài viết hôm nay, chúng ta sẽ quay trở lại thời kỳ hoàng kim của game arcade. Chúng tôi sẽ tạo lại trò chơi Space Invaders trong Micropython trên vi điều khiển Micro: bit - và để thay đổi, chúng tôi cũng sẽ sử dụng phần mở rộng BitPlayer Micro: bit, cho phép chúng tôi chơi trò chơi thuận tiện hơn.

Vì hướng dẫn này là về cách viết mã trò chơi trong Micropython, thay vì trình tự từng giai đoạn truyền thống mà chúng tôi đã sử dụng trước đây cho các hướng dẫn lập trình đồ họa, chúng tôi sẽ đi qua từng khối mã - đi qua các hàm, lớp quan trọng và chính vòng. Bạn có thể tải xuống mã đầy đủ trong kho lưu trữ GitHub của dự án này. Thắt dây an toàn và bắt đầu!

Quân nhu

TinkerGen BitPlayer

BBC Micro: bit

Bước 1: Vòng lặp chính

Cần điều khiển
Cần điều khiển

Trong hướng dẫn này, tôi sẽ sử dụng từ "method" khá thường xuyên. Một phương thức trong python hơi giống với một hàm, ngoại trừ nó được liên kết với đối tượng / các lớp. Vì vậy, để đơn giản hóa, bạn có thể đọc nó là "một hàm trong lớp". Bạn có thể đọc thêm về các phương pháp tại đây.

Chúng tôi vào vòng lặp chính với

trong khi không phải game_over:

tình trạng. Bên trong, chúng tôi nhận được số lượng kẻ xâm lược, cơ hội xuất hiện của chúng và số lượng cần thiết để lên cấp độ tiếp theo từ từ điển cấp độ. Tiếp theo, chúng tôi kiểm tra chuyển động từ trái sang phải bằng các phương thức cá thể Listen_Dir của cá thể lớp JoyStick. Nếu một trong các điều kiện được đánh giá là Đúng, chúng tôi tăng / giảm giá trị x của nhân vật có thể chơi của chúng tôi. Chúng tôi giới hạn nó ở [-2, 2] với hai điều kiện if. Sau đó, chúng tôi khởi tạo một thể hiện của lớp DisplayBuffer và kiểm tra các lần nhấn nút "khiên" hoặc "đạn lửa". Chúng tôi sử dụng phương thức DisplayBuffer.set () để thiết lập các đối tượng để hiển thị sau này. Để hiển thị lá chắn, chúng tôi sử dụng DisplayBuffer.set () trực tiếp, nhưng đối với đạn và kẻ xâm lược, chúng tôi thêm chúng vào danh sách tương ứng và đặt () chúng từng cái một trong vòng lặp với mã sau để hiển thị sau với DispBuffer.render ():

đối với b trong dấu đầu dòng: b.render (dispBuf) đối với v trong vaders: v.render (dispBuf)

Tất cả những kẻ xâm lược, đạn và lá chắn được hiển thị sau mỗi lần lặp lại vòng lặp chính với

dispBuf.render ()

Trước khi kết thúc vòng lặp chính, chúng tôi kiểm tra xem có viên đạn nào của những kẻ xâm lược đã đến cuối màn hình hay không và nếu có, chúng tôi sẽ xóa chúng khỏi danh sách tương ứng.

Bước 2: Cần điều khiển

Cần điều khiển
Cần điều khiển

BitPlayer rất dễ cầm và sử dụng, với cần điều khiển 2 trục như bộ điều khiển Gameboy hoặc PSP, nó cũng bao gồm 6 nút có thể lập trình khác được gắn nhãn là L, R, A, B, C và D. Để có trải nghiệm nhập vai và tương tác, BitPlayer Bản thân nó có bộ rung, động cơ rung và cổng Grove I2C để kết nối các thiết bị ngoại vi bổ sung như màn hình OLED.

Chúng tôi chỉ sử dụng nút điều khiển bên trái-phải của cần điều khiển cho trò chơi này, ví dụ đầy đủ về việc sử dụng tất cả các nút BitPlayer, bạn có thể xem tại Joystick_example.py trong kho lưu trữ GitHub của dự án này. Khi tạo phiên bản của lớp JoyStick, chúng tôi kiểm tra việc đọc mặc định trục X và lưu trữ giá trị đó trong self. Read_X. Sau đó, trong hàm Listen_Dir, chúng tôi kiểm tra xem độ lệch từ giá trị mặc định đó có cao hơn biến độ nhạy hay không (hãy thử tự điều chỉnh, nếu bạn cảm thấy JoyStick quá nhạy cảm) và trả về True of False theo hướng được phát hiện.

Hãy xem ví dụ cụ thể về cách hoạt động của điều này:

Giả sử số đọc trục X mặc định của chúng ta là 0. Sau đó, nếu chúng ta di chuyển Cần điều khiển sang phải:

New_X = JoyStick_X.read_analog () # New_X = 200

Right = New_X - self. Read_X #Right = 200 Left = self. Read_X - New_X #Left = -200

Sau đó, khi chúng tôi kiểm tra hướng:

Precision = 150if Right> Precision: # 200> 150 True Get_Rocker = DIR ['R'] elif Left> Precision: # -200> 150 False Get_Rocker = DIR ['L'] else: Get_Rocker = DIR ['NONE'] nếu Dir == Get_Rocker: trả về Đúng khác: trả về Sai

Bước 3: Hiển thị bộ đệm

Bộ đệm hiển thị
Bộ đệm hiển thị

Lớp DisplayBuf chịu trách nhiệm điều khiển màn hình LED. Nó được thực hiện bằng hai phương thức set () và render (). Phương thức set () thay đổi các giá trị tương ứng với các pixel màn hình LED. Bạn có thể nhớ rằng các pixel trên màn hình LED Micro: bit có thể được biểu thị dưới dạng chuỗi hoặc danh sách - "00000: 00000: 00000: 00000: 00000" là màn hình trống. "00000: 00000: 00000: 00000: 00100" là màn hình có pixel thiếu sáng ở chính giữa hàng dưới cùng.

00000:

00000

:00000

:00000:

00100"

Ký hiệu này có thể dễ dàng hơn để xử lý:)

Vì vậy, những gì chúng tôi làm trong vòng lặp chính là gọi phương thức set () của DisplayBuf để thiết lập tất cả các đối tượng của chúng tôi cần được hiển thị trên màn hình. Sau đó, chúng tôi sử dụng phương thức render () để thực sự hiển thị tất cả chúng trên màn hình cùng một lúc.

Bước 4: Kẻ xâm lược, Bullets và người chơi

Kẻ xâm lược, Viên đạn và Người chơi
Kẻ xâm lược, Viên đạn và Người chơi

Bullets and Invaders thuộc lớp Mover. Các cá thể của lớp Mover có vị trí x, y và tốc độ, cũng như độ sáng. Lớp Mover có hai phương thức thể hiện, set () và move (). Phương thức set () chỉ đơn giản gọi phương thức DisplayBuf set () với các tọa độ được cập nhật để lưu lại cho việc hiển thị sau này trên ma trận LED. Phương thức move () cập nhật tọa độ phiên bản theo tốc độ phiên bản - điều này rất hữu ích sau này, khi chúng ta cần thay đổi tốc độ của những kẻ xâm lược khi các cấp độ tiến triển.

Class Bullet và class Invader là các lớp con của lớp Mover. Ở đây chúng tôi sử dụng một thứ gọi là kế thừa. Chức năng của super () cho phép chúng ta gọi các phương thức của lớp cha trong lớp con mà không cần lặp lại mã.

Bước 5: Biến nó thành của riêng bạn

Biến nó thành của riêng bạn
Biến nó thành của riêng bạn

Xin chúc mừng! Bạn vừa tạo lại trò chơi Space Invaders cổ điển trên Micro: bit với một số phần cứng chơi game thú vị. Tất nhiên, bạn có thể cải thiện mã trò chơi từ đây - ví dụ: hiện tại, trò chơi chỉ có một cấp độ - bạn có thể thêm nhiều cấp độ thử thách hơn. Ngoài ra, như bạn có thể nhớ lại, trò chơi gốc có những tảng đá nổi trước mặt người chơi, bạn cũng có thể thêm đá vào.

Nếu bạn thực hiện một phiên bản cải tiến của trò chơi, hãy chia sẻ nó trong phần bình luận bên dưới! Để biết thêm thông tin về BitPlayer và các phần cứng khác dành cho các nhà sản xuất và giáo dục STEM, hãy truy cập trang web của chúng tôi, https://tinkergen.com/ và đăng ký nhận bản tin của chúng tôi.

TinkerGen gần đây đã tạo chiến dịch Kickstarter cho MARK (Make A Robot Kit), một bộ robot để dạy mã hóa, robot, AI!

Mã Micropython ban đầu từ hexkcd / micro-vaders, đã được thay đổi để hoạt động với TinkerGen BitPlayer.

Đề xuất: