Hôm nay chúng ta sẽ nghiên cứu phần bên trong của trò chơi Tetris được viết dưới nền tảng arduino và ma trận LED.
Tác giả của sản phẩm tự chế này là AlexGyver, tác giả của kênh YouTube cùng tên. Chào mừng bạn đến với thế giới tuyệt vời của pixel vuông.
Hãy bắt đầu với câu chuyện. Tetris là một trò chơi trong đó các hình bao gồm 4 hình vuông rơi từ trên xuống dưới. Trong các kết hợp khác nhau, những hình dạng này có thể được xoay và di chuyển sang trái và phải. Mục tiêu của trò chơi là thu thập các cấp độ ngang được xóa và điểm được trao cho bạn. Mất mát được coi là thời điểm mà con số mới không có nơi nào để rơi. Tetris được phát minh bởi lập trình viên Liên Xô Alexei Leonidovich Pazhitnov.
Phiên bản Pascal gốc xuất hiện vào ngày 6 tháng 6 năm 1984. Kể từ đó, Tetris đã đi được một chặng đường dài và đã được chuyển đến tất cả các nền tảng mà trên đó thường có thể chơi trò chơi, cũng như các thiết bị không dành cho trò chơi, ví dụ như máy tính kỹ thuật, máy hiện sóng và, bạn sẽ không tin, một chiếc bàn ủi hàn.
Theo số lượng phiên bản thương mại được bán, Tetris vượt trội hơn bất kỳ trò chơi nào khác trong lịch sử nhân loại. Chỉ với một Game Boy, 35 triệu bản đã được bán, chưa kể đến Trò chơi cục gạch di động, mà hầu như tất cả đều có cùng một lúc.
Chúng tôi sẽ bắt đầu triển khai tetris trên arduino và ma trận màu với phân tích của crutches. Ma trận bao gồm các đèn LED địa chỉ ba màu. Vấn đề với loại ma trận này là nó quá tuyệt. Màu của mỗi pixel được mã hóa với 24 bit, nghĩa là 8 bit cho mỗi thành phần: đỏ, xanh lá cây và xanh dương. Không có loại dữ liệu như vậy trên arduino, có loại sau - 32 bit.
Màu sắc của tất cả các đèn LED nên được lưu trữ trong RAM, vì chúng ta sẽ thay đổi chúng. Và ngoài ra, đối với ma trận 16 x 16, chúng ta có chính xác 1 KB bộ nhớ động chiếm dụng và nano arduino chỉ có 2 trong số chúng.
Thêm một vài thư viện và bắt đầu viết mã, bộ nhớ sẽ kết thúc. Tác giả về cơ bản không sử dụng, ví dụ, arduino mega, nơi có nhiều bộ nhớ hơn. Mục tiêu là tạo ra trò chơi trên arduino nano, sử dụng các công cụ đơn giản, tiêu chuẩn và nổi tiếng, nhưng đồng thời cũng là cách tiếp cận không chuẩn và nạng nạng, và với sự giúp đỡ của họ để đạt được mã tối ưu nhất.
Cái nạng đầu tiên của người nghèo sẽ là sự từ chối lưu trữ riêng trong bộ nhớ vị trí của các hình và nói chung, mọi thứ đang diễn ra trên màn hình.Chúng ta cần lưu trữ tọa độ của các điểm của hình cho ăn và tọa độ của các điểm của các hình đã bỏ, nghĩa là tối đa, chúng ta cần thêm 1 mảng, hai chiều 16 x 16, và con số này là 256 byte.
Bạn và tôi đã có một mảng màu cho tất cả các pixel, hãy sử dụng nó. Thật vậy, ngoài việc chúng ta có thể đặt một chấm màu trên ma trận, chúng ta có thể đo ánh sáng của một điểm hiện có để chúng ta làm việc với màu sắc.
Tetris bắt đầu với một khối rơi, được điều khiển bởi các nút và có 2 tọa độ trong hệ tọa độ ma trận. Nó rất đơn giản, chúng tôi xây dựng một bộ đếm thời gian, theo đó khối sẽ rơi. Đây là thư viện tác giả, bạn có thể đọc trên trang web.
Để xử lý các nút, tác giả cũng sử dụng thư viện của mình. Sơ đồ kết nối của các nút rất đơn giản: 4 nút, 8 dây.
Mỗi bước của bộ đếm thời gian, chúng ta vẽ một điểm pixel bên dưới điểm cũ và vẽ điểm cũ bằng màu đen, nghĩa là tắt đèn LED. Bằng cách nhấp vào nút, chúng tôi làm tương tự, nhưng với tọa độ ngang. Vâng, đối với độ chính xác, chúng tôi sẽ giới hạn kích thước của ma trận để điểm không vượt ra ngoài trường.
Xem, không có gì phức tạp. Nhưng điều này không lâu vì đã đến lúc vẽ số liệu. Chúng tôi sẽ làm việc như sau: chúng tôi sẽ giữ tham chiếu đến điểm cung cấp, mà chúng tôi đã viết, chúng tôi sẽ gọi nó là điểm chính hoặc khối chính. Khối chính di chuyển trong hệ tọa độ ma trận, chúng tôi đã thực hiện điều này. Tất cả các số liệu của Tetris bao gồm 4 khối, đó là lý do tại sao, nó được gọi là Tetris.
Theo đó, chúng tôi vẫn hoàn thành việc thêm 3 khối nữa vào khối chính. Hãy viết tọa độ của chúng trong hệ tọa độ của khối chính, sao cho khối chính luôn ở dưới. Nó rất đơn giản, lấy hình của chữ T. ngược Khối chính từ dưới lên giữa có tọa độ 0,0 trong hệ tọa độ của nó.
Khối trên là 0,1, bên phải là 1,1 và bên trái là -1,1.
Lấy chữ G. Khối dưới là 0,0, 0,1 tiếp theo, 0,2 tiếp theo và cạnh của chữ 1.2.
Chúng tôi viết các tọa độ này vào mảng theo dạng sau: {0.1, 0.2, 1.2} và thả mảng vào bộ nhớ flash để không lãng phí bộ nhớ động. Đối với vòng quay của các số liệu. Không thể xoay các số liệu. Rất khó để giải thích cho vi điều khiển làm thế nào để làm điều này. Để làm điều này, bạn cần đặt tâm xoay, bằng cách nào đó phân tách hình thành các phần và tìm tọa độ mới cho từng phần, tính đến pixel mạnh, điều này rõ ràng sẽ dẫn đến lỗi và nó sẽ biến thành vô nghĩa. Vấn đề được giải quyết rất đơn giản, chúng tôi sẽ giữ trong bộ nhớ cả 4 vị trí cho tất cả các số liệu và tất cả.
Trên thực tế, bây giờ vẫn còn để chọn ngẫu nhiên số hình và vẽ nó xung quanh khối rơi. Ở đây, đối với cả 3 khối còn lại, chúng tôi lấy tọa độ từ bộ nhớ flash, dịch chúng thành tọa độ tổng thể của ma trận và bật đèn LED. Nhân tiện, màu sắc cũng được chọn ngẫu nhiên trong số 6 màu đơn giản và tươi sáng nhất của không gian rgb. Góc quay của hình ở đầu vòng cũng được đặt ngẫu nhiên và khi bạn nhấn nút lên, chỉ cần lấy bộ tọa độ tiếp theo để vẽ và xoay theo chiều kim đồng hồ. Di chuyển một hình dạng hoạt động tất cả như nhau. Đầu tiên, chúng ta xóa hình ở vị trí trước đó, nghĩa là vẽ nó bằng màu đen, sau đó ở vị trí mới vẽ màu hiện tại của hình. Khi rẽ, một lần nữa, chúng tôi xóa vị trí cũ và chỉ vẽ một vị trí mới.
Phần sụn có thể được tải xuống tại. Chúng tôi sẽ chỉ phân tích bản chất. Hãy bắt đầu bằng cách kiểm tra các bức tường bên trái và bên phải và phía dưới. Mọi thứ rất đơn giản với đáy, chúng ta nhìn vào từng bước của mùa thu, có đơn vị cơ sở đạt đến độ cao bằng 0, điều này không khó, nhưng mỗi lần nhấn nút điều khiển chúng ta cần xem điểm cực của hình có chạm vào thành bên của ma trận không.
Nếu chạm vào, không di chuyển con số. Điều tương tự cũng xảy ra đối với vòng quay của các số liệu. Ví dụ: nếu vị trí mới của hình vượt ra ngoài các bức tường, thì việc quay vòng bị cấm và vì tất cả các hình chúng ta có hình dạng khác nhau, nên các khối cực đoan đối với chúng đều khác nhau. Có thể vẽ các khối cực riêng lẻ cho mỗi hình để đơn giản hóa công việc của vi điều khiển, nhưng hãy xem xét rằng họ đã phát minh ra nó cho việc này.
Mọi thứ rất đơn giản. Nhưng nhiệm vụ tiếp theo thú vị hơn nhiều. Chúng ta cần kiểm tra va chạm với các khối đã nằm bên dưới.Nếu chúng ta có một mảng chứa trạng thái của tất cả các ô trong trường, nó sẽ dễ dàng hơn, nhưng chúng ta sẽ sử dụng một mảng màu cho các pixel của băng, vì vậy chúng ta sẽ có một cái nạng tuyệt nhất. Vấn đề thực tế là gì. Mọi thứ dường như đơn giản, một con số màu xanh lá cây sẽ rơi xuống, và mỗi bước đi của mùa thu, mọi sự dịch chuyển sang một bên và mọi nỗ lực để kiểm tra xem liệu con số ở vị trí mới có nằm trên những con số đã nằm hay không. Nếu đối với tất cả các khối, màu xung quanh bằng màu đen hoặc bằng màu của hình, thì chúng ta cho phép di chuyển theo hướng mong muốn. Điều này sẽ hoạt động cho đến khi hình dạng bên dưới chúng ta cùng màu với hình dạng rơi xuống. Đó thực sự là một cái nạng khác: chúng tôi sẽ sơn lại hình dạng rơi xuống bằng một màu khác. Sơn lại không rõ ràng cho mắt, nhưng đáng chú ý cho chương trình. Tất cả những gì bạn cần làm là tăng nhẹ độ sáng của màu hiện tại của hình và tất cả.
Con số rơi xuống đáy hoặc hình khác, độ sáng của nó không tăng đáng kể và trong vòng mới, các hình rơi sẽ không còn nhầm lẫn màu của nó với màu của chúng nữa, chúng sẽ rơi trên đó và chỉ như cố định, thêm độ sáng.
Nhân tiện, khi bạn nhấn nút xuống, con số sẽ lao xuống với tốc độ cao và thế chỗ của nó.
Tetris của chúng tôi được để lại với liên lạc cuối cùng, cụ thể là kiểm tra và xóa các mức đầy theo chiều ngang. Mọi thứ đều đơn giản ở đây. Sau khi sửa hình trong vòng hiện tại, chúng tôi di chuyển dọc theo các đường và so sánh màu của các pixel với màu đen. Nếu không có một pixel đen nào trong toàn bộ dòng, thì chúng tôi sẽ xóa toàn bộ dòng.
Các dòng được phát hiện được lấp đầy bằng màu trắng, sau đó độ sáng giảm dần về 0 và hình ảnh động thu được. Hơn nữa, tất cả các pixel, bắt đầu từ dòng đầy đầu tiên đến trên cùng, được chuyển xuống và số lượng dòng đã bị xóa. Quá trình này được lặp lại cho đến khi không có mức hoàn thành. Chúng tôi cũng kiểm tra nếu chúng tôi đã đạt đến đỉnh, có nghĩa là mất. Trong trường hợp này, một tài khoản bằng với số mức đã xóa được hiển thị.
Tài khoản được hiển thị theo số, được lưu trữ trong bộ nhớ dưới dạng tập hợp số và số 0, sau đó đèn LED được bật hoặc tắt. Đây là những gì Tetris viết trong ma trận địa chỉ. Cảm ơn bạn đã quan tâm. Hẹn gặp lại
Video: