Mục lục:

Minesweeper-Raspberry-Pi-Edition: 7 bước (có hình ảnh)
Minesweeper-Raspberry-Pi-Edition: 7 bước (có hình ảnh)

Video: Minesweeper-Raspberry-Pi-Edition: 7 bước (có hình ảnh)

Video: Minesweeper-Raspberry-Pi-Edition: 7 bước (có hình ảnh)
Video: SCP-261 Пан-мерное Торговый и эксперимент Войти 261 объявление Де + полный + 2024, Tháng bảy
Anonim
Minesweeper-Raspberry-Pi-Edition
Minesweeper-Raspberry-Pi-Edition
Minesweeper-Raspberry-Pi-Edition
Minesweeper-Raspberry-Pi-Edition

Dự án cuối cùng của tôi cho dòng CSC 130 tại Đại học Công nghệ Louisiana là Minesweeper Raspberry Pi Edition. Trong dự án này, tôi đã tìm cách tạo lại trò chơi quét mìn cổ điển bằng cách sử dụng thư viện Tkinter của ngôn ngữ lập trình Python. Lưới mà trò chơi quét mìn bao gồm tám ô chiều rộng và năm ô cao. Định dạng của dự án đã phù hợp và hoàn thiện để sử dụng Raspberry Pi được cài đặt với Python 2.7.

Mã và hình ảnh cho dự án cuối cùng của Minesweeper Raspberry Pi Edition có thể được tải xuống tại liên kết sau:

Minesweeper-Raspberry-Pi-Edition

Quân nhu

x1 Raspberry Pi

Python 2.7 được cài đặt trên Raspberry Pi

Microsoft Powerpoint (hoặc một phần mềm khác để tạo hình ảnh cho các nút)

Bước 1: Tạo hình ảnh nút

Tạo hình ảnh nút
Tạo hình ảnh nút

GIẢI TRÌNH:

Mỗi nút tạo nên GUI sẽ cần được tạo. Đối với tác vụ này, tôi đã sử dụng Microsoft Powerpoint để tạo các hình ảnh tôi cần để hiển thị trên các nút.

Đầu tiên, tôi đã tạo mười nút ô cần thiết để tạo lưới quét mìn (trống, bob, không, một, hai, ba, bốn, năm, sáu, bảy và tám) bằng Microsoft Powerpoint.

Thứ hai, tôi tạo bốn hình ảnh cần thiết cho màn hình menu (hiển thị menu, nút độ khó dễ, nút độ khó trung bình và nút độ khó khó) bằng Microsoft Powerpoint.

Thứ ba, tôi đã tạo hình ảnh cần thiết cho nút khởi động lại và hình ảnh cần thiết cho các nút hiển thị khác nhau (màn hình "trò chơi kết thúc", màn hình "bạn thắng" và màn hình "quy tắc") bằng Microsoft Powerpoint.

Thứ tư, bạn sẽ phải thay đổi kích thước hình ảnh của mình để vừa với màn hình của bạn. Đối với Rasberry Pi của tôi, tôi đã sử dụng các kích thước sau cho cửa sổ (đề cập đến pixel chiều dài và chiều rộng): 432x576.

Bước 2: Định dạng chương trình

Định dạng chương trình
Định dạng chương trình

GIẢI TRÌNH:

Trước khi bất kỳ chương trình thực tế nào có thể diễn ra, chúng ta phải nhập các thư viện chúng ta cần và viết phần chính của chương trình của chúng ta.

Đầu tiên, chúng ta cần nhập * từ thư viện Tkinter và xáo trộn từ thư viện ngẫu nhiên. Thứ hai, chúng ta sẽ cần hoàn thành các bước sau trong mã trong phần chính của chương trình: tạo cửa sổ, đặt cửa sổ tiêu đề, tạo GUI và hiển thị GUI và chờ tương tác của người dùng. Mã này được viết ở định dạng thích hợp đối với thư viện Tkinter (xem mã được cung cấp trong hướng dẫn để xem định dạng phù hợp).

Bước 3: Tạo GUI (Menu & Minesweeper Grid)

Tạo GUI (Menu & Minesweeper Grid)
Tạo GUI (Menu & Minesweeper Grid)
Tạo GUI (Menu & Minesweeper Grid)
Tạo GUI (Menu & Minesweeper Grid)
Tạo GUI (Menu & Minesweeper Grid)
Tạo GUI (Menu & Minesweeper Grid)
Tạo GUI (Menu & Minesweeper Grid)
Tạo GUI (Menu & Minesweeper Grid)

GIẢI TRÌNH:

Khi khởi động chương trình, màn hình menu sẽ được khởi chạy. Sau khi độ khó được chọn (bằng cách nhấp vào một trong các nút độ khó trên màn hình menu), GUI sẽ được làm mới với lưới quét mìn, màn hình hiển thị và nút khởi động lại. Vì bạn chỉ mới bắt đầu làm việc trên GUI, chúng tôi sẽ chỉ cần khởi chạy menu, các nút độ khó của menu hoạt động và làm mới GUI cho màn hình trò chơi với lưới quét mìn.

Đầu tiên, chúng ta có thể tự hiển thị màn hình menu khi khởi động chương trình bằng cách gọi phương thức "setupMenu" trong hàm tạo của lớp MainGUI.

Thứ hai, chúng ta có thể yêu cầu mỗi nút độ khó của menu thực thi một số dòng mã nhất định bất cứ khi nào được nhấp bằng cách thêm phương thức "process" (cũng sẽ phải thêm lệnh lambda: self.process ("returnButtonName") trong các tham số của hàm nút được sử dụng trong việc tạo ra mỗi nút khó khăn). Ba câu lệnh if-else sẽ được tạo trong phương thức "process" và thực thi một số phương thức và dòng mã bổ sung khác tùy thuộc vào nút bằng gì (nút bằng bất kỳ tên nút nào được đăng ký lần cuối).

Thứ ba, trong khi màn hình menu hiện lên và nếu người dùng nhấp vào một trong các nút độ khó, thì chương trình sẽ lưu một giá trị nhất định vào biến "độ khó" (độ khó bằng "dễ", "trung bình" hoặc "khó" tắt nút độ khó nào được nhấp). Lần nhấp vào nút này sẽ biết câu lệnh if-else nào cần tuân theo dựa trên tên nút nào được đăng ký lần cuối (nút nào bằng). Ngoài ra, để gán lại biến "độ khó", trước tiên chúng ta sẽ cần khởi tạo nó bên ngoài lớp. Vì vậy, chúng tôi sẽ đặt biến "khó khăn" là một chuỗi rỗng trước khi lớp "MainGUI" được tạo.

Thứ tư, xóa GUI của các nút được tạo bởi phương thức "setupMenu" bằng cách tạo phương thức "clearMenu" (sử dụng hàm button.destroy () trong nhiều trường hợp) và gọi phương thức "clearMenu" trong phương thức "process" (dưới mỗi nút khó đăng ký sau khi gán biến độ khó).

Thứ năm, làm mới GUI bằng cách tạo phương thức "setSLASHresetGUI" (các nút được tạo theo cách giống như trong phương thức "setupMenu") và gọi phương thức "setSLASHresetGUI" trong phương thức "process" (dưới mỗi nút khó đăng ký sau gán biến độ khó và gọi phương thức "clearMenu").

Ngoài ra, trước khi tất cả các nút được gán trong phương thức "setSLASHresetGUI", chúng ta phải định cấu hình các hàng và cột trong lưới và sau khi tất cả các nút được gán trong phương thức "setSLASHresetGUI", chúng ta phải đóng gói tất cả nội dung trong lưới (xem mã được cung cấp trong hướng dẫn để xem định dạng thích hợp).

Bước 4: Thực hiện hoạt động của các nút trên màn hình trong trò chơi

Hoạt động các nút trên màn hình trong trò chơi
Hoạt động các nút trên màn hình trong trò chơi
Hoạt động các nút trên màn hình trong trò chơi
Hoạt động các nút trên màn hình trong trò chơi
Hoạt động các nút trên màn hình trong trò chơi
Hoạt động các nút trên màn hình trong trò chơi
Hoạt động các nút trên màn hình trong trò chơi
Hoạt động các nút trên màn hình trong trò chơi

GIẢI TRÌNH:

Để làm cho các nút thực thi các dòng mã nhất định khi được nhấp vào, chúng ta sẽ phải thực thi các phương thức trong phương thức "process". Đối với nhiệm vụ này, chúng ta sẽ phải tạo nhiều phương thức, biến và danh sách mới.

Đầu tiên, chúng tôi sẽ lập hai danh sách. Sẽ có một danh sách được gọi là "lưới". Danh sách "lưới" này sẽ chỉ bao gồm các số nguyên 9 và 0. Trong danh sách này, các số 9 sẽ đại diện cho các quả bom và các số không sẽ đại diện cho các quả không phải là bom. Đây là cách chương trình sẽ phân biệt một ô có phải là bom hay không. Danh sách thứ hai sẽ được lập, và nó sẽ được gọi là "trạng thái". Danh sách "trạng thái" này chỉ bao gồm một chuỗi ký tự ("0", "1", "2", "3", "4", "5", "6", "7", "8", "b "). Trong danh sách này, mỗi một chuỗi ký tự sẽ tương ứng với một hình ảnh nhất định. Đây là cách chương trình sẽ biết hình ảnh nào sẽ hiển thị trên mỗi nút trong lưới quét mìn. Mỗi nút trong lưới quét mìn sẽ có một chỉ số tương ứng trong mỗi danh sách dựa trên vị trí của nó trong lưới. Chỉ mục tương ứng sẽ được ấn định theo quy trình sau (nút số - 1). Ví dụ: chỉ mục tương ứng của một nút trong mỗi danh sách là chỉ số không. Cuối cùng, hai danh sách này sẽ được thực thi trước khi lớp "MainGUI" được thực thi và sẽ được tạo bên ngoài lớp "MainGUI". Lớp "lưới" sẽ được tạo dưới dạng danh sách trống (lưới = ) và danh sách "trạng thái" sẽ được tạo bởi một hàm phạm vi (thêm bốn mươi chuỗi ký tự đơn của "n" vào danh sách "trạng thái").

Thứ hai, chúng tôi sẽ thực hiện các phương pháp khác nhau có thể phát hiện số lượng mìn xung quanh nó và có thể được gọi khi một nút được nhấp vào (quyết định phương pháp nào sẽ được thực hiện sẽ được xác định bởi vị trí của nút). Chính những phương pháp này sẽ được gọi là máy phân tích mỏ của chúng tôi. Các phương pháp này sẽ tăng một bộ đếm được gọi là "NumOfMines" và sẽ sử dụng các chỉ mục nhất định trong danh sách "lưới" để xác định có bao nhiêu quả bom bao quanh ô. Chuỗi sẽ được lưu trữ trong biến "NumOfMines" sẽ được sử dụng để thay thế cùng một chỉ mục tương ứng trong danh sách "trạng thái". Bây giờ, bạn có thể tự hỏi làm thế nào chương trình sẽ biết chỉ mục nào để sử dụng. Khi một nút được đăng ký trong phương thức "process", thì một biến "index" sẽ được tạo / gán lại cho một số nguyên nhất định (dựa trên chuỗi mà nút đăng ký). Một trong các phương thức được tạo sẽ sử dụng chỉ mục được chỉ định đó để biết vị trí của ô và chỉ số của các ô xung quanh nó (thuật toán trong phương pháp sẽ tìm ra điều này). Ngoài ra, để gán lại biến "index", trước tiên chúng ta sẽ cần khởi tạo nó bên ngoài lớp. Vì vậy, chúng tôi sẽ đặt trước biến "chỉ mục" là số nguyên 0 trước khi lớp "MainGUI" được tạo.

Thứ ba, các phương thức "hoạt động" sẽ được tạo. Phương thức "hoạt động" sẽ được thực hiện mỗi khi một nút được đăng ký. Các phương thức "hoạt động" này sẽ được thực thi trong phương thức "tiến trình". Trong phương pháp "process", nhiều câu lệnh if-else sẽ xác định nút nào đã được nhấp (dựa trên giá trị của nút). Đây là nơi một phương thức "hoạt động" nhất định sẽ được gọi (trong các câu lệnh if-else).

Thứ tư, chúng ta sẽ thực sự tìm hiểu về cách các nút hoạt động. Như đã nêu trước đây, nhiều câu lệnh if-else nằm trong phương thức "process" và thực thi một số phương thức và dòng mã bổ sung khác tùy thuộc vào nút bằng gì (nút bằng với bất kỳ chuỗi nào được đăng ký lần cuối). Trong các câu lệnh if-else này, điều sau sẽ xảy ra theo thứ tự: chỉ mục sẽ được gán trên toàn cục, chỉ mục tương ứng trong danh sách "trạng thái" sẽ được gán lại cho chuỗi "b" (nếu chỉ mục tương ứng của danh sách "lưới" bằng số nguyên chín), một phương thức "hoạt động" tương ứng sẽ được thực thi (nếu chỉ mục tương ứng của danh sách "lưới" bằng số nguyên 0), chỉ mục tương ứng trong danh sách "trạng thái" sẽ được gán lại thành một chuỗi bằng biến "NumOfMines" (nếu chỉ số tương ứng của danh sách "lưới" bằng số nguyên 0) và GUI sẽ được làm mới bằng cách gọi phương thức "setSLASHresetGUI".

Bước 5: Phương pháp "setDifficulty" & "restart" Method

Hình ảnh
Hình ảnh
Hình ảnh
Hình ảnh

GIẢI TRÌNH:

Tiếp theo, một phương thức "setDifficulty" sẽ cần được tạo và nút khởi động lại nằm ở cuối màn hình trong trò chơi sẽ cần phải hoạt động (bằng cách tạo phương thức "khởi động lại" để nó thực thi khi người dùng nhấp vào).

Đầu tiên, phương thức "setDifficulty" sẽ cần được triển khai trong các câu lệnh if-else của các nút độ khó trong phương thức "process" và trong phương thức "restart". Các dòng mã và phương thức được thực thi trong phương thức này khá đơn giản. Trong phương thức "setDifficulty", chúng tôi sẽ thêm một số lượng nhất định số 0 (không phải bom) và số ni (bom) vào danh sách "lưới" (thông qua hai hàm phạm vi trong mỗi câu lệnh if-else), và sau đó chúng tôi sẽ xáo trộn danh sách "lưới" (với chức năng xáo trộn của thư viện ngẫu nhiên) trong phương thức "setDifficulty" (sau khi các câu lệnh if-else được thực thi). Tỷ lệ số không và số ni sẽ được xác định bởi chuỗi mà biến "độ khó" được đặt thành ("dễ": 34-6, "trung bình": 28-12, "khó": 16-24).

Thứ hai, trong phương pháp "khởi động lại", chúng tôi sẽ đặt các biến "chỉ mục" và "NumOfMinesLEFT" thành 0 trên toàn cầu, làm trống cả danh sách "trạng thái" và "lưới" trên toàn cầu, đặt lại danh sách "trạng thái" bằng một hàm phạm vi (thêm bốn mươi chuỗi ký tự đơn của "n" vào danh sách "trạng thái") và gọi phương thức "setDifficulty".

Bước 6: Kịch bản kết thúc trò chơi

Kịch bản kết thúc trò chơi
Kịch bản kết thúc trò chơi
Kịch bản kết thúc trò chơi
Kịch bản kết thúc trò chơi
Kịch bản kết thúc trò chơi
Kịch bản kết thúc trò chơi
Kịch bản kết thúc trò chơi
Kịch bản kết thúc trò chơi

GIẢI TRÌNH:

Mỗi trò chơi quét mìn đều có hai kịch bản kết thúc trò chơi: thắng và thua. Trong chương trình này, chúng tôi sẽ triển khai hai kịch bản kết thúc trò chơi này bằng hai phương thức mới: phương thức "You_A_Winner_Son" và phương thức "GameOver". Trước khi GUI được làm mới trong phương thức "process" và dựa trên các chỉ mục được thay đổi bởi hai phương pháp kịch bản kết thúc trò chơi, nút hiển thị sẽ được thay đổi để thể hiện đúng kết quả.

Đầu tiên, khi người dùng nhấp vào ô không bom ẩn cuối cùng, thì phương thức "You_A_Winner_Son" phải được thực thi. Chúng tôi sẽ hoàn thành nhiệm vụ này bằng cách gọi phương thức "You_A_Winner_Son" mỗi khi một ô được nhấp và ô được tìm thấy là ô không phải bom (trong các phương thức "hoạt động" được thực thi trong phương thức "quy trình"). Nếu các điều kiện chiến thắng được đáp ứng, thì hai câu lệnh if-else trong phương thức "You_A_Winner_Son" sẽ được thực thi. Câu lệnh if-else đầu tiên sẽ luôn thực hiện bất kể người chơi có thắng hay không khi phương thức này được gọi. Dựa trên biến "độ khó" tương đương với nhau, một thuật toán nhất định sẽ xác định có bao nhiêu quả mìn / bom được giấu đi. Số nguyên được tìm thấy bởi thuật toán này sẽ được lưu trong biến "NumOfMinesLEFT". Tiếp theo, giữa hai câu lệnh if-else, một thuật toán khác sẽ được thực thi để tìm số ô bắt đầu còn lại (ô chưa nhấp). Số nguyên được tìm thấy bằng thuật toán này sẽ được lưu trong biến "NumOfStartingTilesLEFT". Câu lệnh if-else thứ hai sẽ luôn thực hiện bất kể người chơi có thắng hay không khi phương thức này được gọi. Dựa trên giá trị của biến "độ khó", một trong ba câu lệnh if-else có thể được thực thi nếu các điều kiện của chúng được đáp ứng. Các điều kiện sẽ dựa trên giá trị của hai biến "NumOfMinesLEFT" và "NumOfStartingTilesLEFT". Trong ba câu lệnh if-else này, một thuật toán sẽ được thực thi khiến mỗi nút trở nên vô dụng (trò chơi kết thúc).

Thứ hai, khi người dùng nhấp vào một trong các ô bom ẩn, thì phương thức "GameOver" phải được thực thi. Chúng tôi sẽ hoàn thành nhiệm vụ này bằng cách gọi phương thức "GameOver" mỗi khi một ô được nhấp và ô được tìm thấy là ô bom (trong các phương thức "hoạt động" được thực thi trong phương thức "quy trình"). Khi phương thức "GameOver" được gọi, một thuật toán sẽ được thực thi sẽ làm cho mỗi ô bắt đầu trở nên vô dụng (trò chơi kết thúc) và các ô bom ẩn sẽ được tiết lộ (dựa trên các chỉ số tương ứng trong "danh sách lưới, một số chỉ mục nhất định trong danh sách "trạng thái" sẽ được gán lại cho chuỗi ký tự đơn "b").

Thứ ba, hiển thị của màn hình trong trò chơi sẽ được cập nhật mỗi khi GUI được làm mới bằng cách thực hiện một số chỉnh sửa nhỏ đối với phương thức "setSLASHresetGUI". Sau khi lưới của GUI được định cấu hình, chúng tôi sẽ đặt ba câu lệnh if-else ở nơi đặt nút hiển thị hiện tại. Một trong ba câu lệnh if-else sẽ thực thi dựa trên giá trị của các biến sau: "GameOverDETECTOR", "khó khăn," NumOfMinesLEFT "và" NumOfStartingTilesLEFT ". Có thể bạn đang thắc mắc, biến" GameOverDETECTOR "là một biến mới biến. Biến này sẽ được tạo ngay trước khi các câu lệnh if-else được thực thi trong phương thức "setSLASHresetGUI". Biến "GameOverDETECTOR" sẽ bằng số nguyên được tìm thấy bằng cách sử dụng thuật toán tìm bao nhiêu chỉ mục trong "lưới" danh sách đã gán lại cho số nguyên chín mươi chín (cách các nút hiển thị vô dụng). Dựa trên điều kiện của câu lệnh if-else được đáp ứng, việc gán lại tương ứng cho màn hình sẽ xảy ra.

Bước 7: Thực hiện hoạt động của nút khởi động lại

Làm cho nút khởi động lại hoạt động
Làm cho nút khởi động lại hoạt động

GIẢI TRÌNH:

Bước này xảy ra là ngắn nhất. Hầu hết công việc cho bước này đã được thực hiện. Tất cả những gì chúng ta cần làm bây giờ là thực hiện phương thức "khởi động lại" mỗi khi người dùng nhấp vào nút khởi động lại.

Đầu tiên và cuối cùng, chúng ta sẽ thực hiện phương thức "khởi động lại" trong phương thức "tiến trình" với câu lệnh if-else. Nếu chuỗi "!" được đăng ký, sau đó phương thức "khởi động lại" sẽ được thực hiện. Chúng tôi cũng sẽ phải tạo một nút được gọi là khởi động lại ở cuối phương thức "setSLASHresetGUI" trước khi nội dung của lưới được đóng gói lại với nhau. Nút khởi động lại này sẽ xử lý chuỗi "!" (lệnh lambda: self.process ("!")) và thực thi phương thức "khởi động lại" tương ứng trong phương thức "process".

Đề xuất: