Мазмуну:

Minesweeper-Raspberry-Pi-Edition: 7 кадам (Сүрөттөр менен)
Minesweeper-Raspberry-Pi-Edition: 7 кадам (Сүрөттөр менен)

Video: Minesweeper-Raspberry-Pi-Edition: 7 кадам (Сүрөттөр менен)

Video: Minesweeper-Raspberry-Pi-Edition: 7 кадам (Сүрөттөр менен)
Video: windows 7 End 😭😭😭 2024, Июль
Anonim
Minesweeper-Raspberry-Pi-Edition
Minesweeper-Raspberry-Pi-Edition
Minesweeper-Raspberry-Pi-Edition
Minesweeper-Raspberry-Pi-Edition

Луизиана Техникалык Университетиндеги CSC 130 сериясындагы акыркы долбоорум - Minesweeper Raspberry Pi Edition. Бул долбоордо мен Python программалоо тилинин Tkinter китепканасын колдонуу менен классикалык мина тазалоочу оюнду кайра жаратууга аракет кылдым. Миналар ташуучу оюн камтыган сетка туурасы сегиз плитка жана бийиктиги беш плитка. Долбоордун форматталышы Python 2.7 менен орнотулган Raspberry Pi колдонуу үчүн ылайыкташтырылган жана өркүндөтүлгөн.

Minesweeper Raspberry Pi Edition акыркы долбоорунун кодун жана сүрөттөрүн төмөнкү шилтемеден көчүрүп алсаңыз болот:

Minesweeper-Raspberry-Pi-Edition

Жабдуулар

x1 Raspberry Pi

Python 2.7 Raspberry Piге орнотулган

Microsoft Powerpoint (же баскычтар үчүн сүрөттөрдү түзүү үчүн башка программа)

1 -кадам: Баскычтын сүрөттөрүн түзүү

Сүрөт баскычын түзүү
Сүрөт баскычын түзүү

ТҮШҮНДҮРМӨ:

GUIди түзгөн ар бир баскычты түзүү керек болот. Бул тапшырманы аткаруу үчүн мен Microsoft Powerpointти колдонуп, баскычтарда чагылдыруу үчүн керектүү сүрөттөрдү жасадым.

Биринчиден, мен Microsoft Powerpointтин жардамы менен мина тазалоочу сетканы (бош, боб, нөл, бир, эки, үч, төрт, беш, алты, жети жана сегиз) жасоо үчүн керектүү болгон он плитканын баскычтарын түздүм.

Экинчиден, мен Microsoft Powerpoint аркылуу меню экраны үчүн зарыл болгон төрт сүрөттү (меню дисплейи, оңой кыйынчылык баскычы, орто кыйынчылык баскычы жана кыйын кыйынчылык баскычы) жасадым.

Үчүнчүдөн, мен Microsoft Powerpointти колдонуп, өчүрүп -күйгүзүү баскычына керектүү сүрөттү жана башка дисплей баскычтарына керектүү сүрөттөрдү ("оюн үстүнөн" дисплейи, "сен жеңесиң" дисплейи жана "эрежелер" дисплейи) түздүм.

Төртүнчүдөн, экраныңызга туура келиши үчүн сүрөттөрүңүздүн өлчөмүн өзгөртүүгө туура келет. Менин Rasberry Pi үчүн мен терезенин төмөнкү өлчөмдөрүн колдондум (узундугу жана туурасы боюнча пикселдерге таянуу менен): 432x576.

2 -кадам: Программаны форматтоо

Формат программасы
Формат программасы

ТҮШҮНДҮРМӨ:

Чыныгы программалоо боло электе, биз керектүү китепканаларды импорттоп, программабыздын негизги бөлүгүн жазышыбыз керек.

Биринчиден, биз Ткинтер китепканасынан импорттообуз керек * жана туш келди китепканадан аралаштыруубуз керек. Экинчиден, биз программанын негизги бөлүгүндөгү коддогу төмөнкү кадамдарды аткарышыбыз керек: терезени түзүү, аталыш терезесин коюу, GUIди түзүү жана GUIди көрсөтүү жана колдонуучунун өз ара аракетин күтүү. Бул код Ткинтер китепканасына карата туура форматта жазылган (туура форматтоону көрүү үчүн нускамада берилген кодду караңыз).

3 -кадам: GUI түзүү (Меню жана мина тазалоочу тор)

GUI түзүү (Меню жана мина тазалоочу тор)
GUI түзүү (Меню жана мина тазалоочу тор)
GUI түзүү (Меню жана мина тазалоочу тор)
GUI түзүү (Меню жана мина тазалоочу тор)
GUI түзүү (Меню жана мина тазалоочу тор)
GUI түзүү (Меню жана мина тазалоочу тор)
GUI түзүү (Меню жана мина тазалоочу тор)
GUI түзүү (Меню жана мина тазалоочу тор)

ТҮШҮНДҮРМӨ:

Программаны ишке киргизгенден кийин меню экраны ачылат. Кыйынчылык тандалгандан кийин (меню экранындагы кыйынчылык баскычтарынын бирин басуу менен), GUI мина тазалоочу тор, дисплей жана өчүрүп күйгүзүү баскычы менен жаңыртылат. Сиз жаңы эле GUIде иштей баштаганыңыз үчүн, менюду ишке киргизишибиз керек, менюдагы кыйынчылык баскычтары иштей башташы керек жана мина ташуучу сетка менен GUI оюн экранына жаңыртылышы керек.

Биринчиден, меню экраны программанын башталышында MainGUI классынын конструкторунун ичиндеги "setupMenu" ыкмасын чакырып өзүбүздү көрсөтө алабыз.

Экинчиден, менюдагы кыйынчылык баскычтарынын ар бирине "процесстин" ыкмасын кошуу менен басылганда, коддун кээ бир линияларын аткара алабыз (ошондой эле колдонулган баскыч функциясынын параметрлеринин ичинде lambda: self.process ("returnButtonName") командасын кошууга туура келет) ар бир кыйынчылык баскычын түзүүдө). Үч if-else билдирүүсү "процесс" ыкмасында түзүлөт жана баскычтын барабардыгына жараша башка коддордун башка ыкмаларын жана саптарын аткарат (баскыч акыркы катталган баскычтын атына барабар).

Үчүнчүдөн, менюнун экраны өйдө турганда жана эгерде колдонуучу кыйынчылык баскычтарынын бирин чыкылдатса, анда программа белгилүү бир маанини "кыйынчылык" өзгөрмөсүнө сактап калат (кыйынчылык "жеңил", "орто" же "катуу" негизделген) Кайсы кыйынчылык баскычы басылат). Бул баскычты чыкылдатуу кайсы if-else операторунун акыркы жолу кайсы баскычтын аталышына негизделгенин билиши керек (кайсы баскыч барабар). Андан тышкары, "кыйынчылык" өзгөрмөсүн кайра дайындоо үчүн, биз адегенде аракет кылышыбыз керек. Бул класстын сыртында. Ошентип, "MainGUI" классы түзүлгөнгө чейин "кыйынчылык" өзгөрмөсүн бош сап катары коёбуз.

Төртүнчүдөн, "setupMenu" ыкмасы менен жасалган баскычтардын GUI'син тазалап, "clearMenu" ыкмасын жасаңыз (button.destroy () функциясын бир нече учурларда колдонуңуз) жана "clearMenu" ыкмасын "процесс" ыкмасында чакырыңыз (астында) кыйынчылык баскычынын ар бири кыйынчылыктын өзгөрмөлүүлүгүнөн кийин катталат).

Бешинчиден, "setSLASHresetGUI" ыкмасын жасоо (баскычтар "setupMenu" методундагыдай жасалат) жана "процесс" ыкмасында "setSLASHresetGUI" ыкмасын чакырып, ар бир кыйынчылык баскычынын астында катталгандан кийин GUIди жаңыртыңыз. кыйынчылык өзгөрмөлүү дайындоо жана "clearMenu" ыкмасын чакыруу).

Кошумча катары, бардык баскычтар "setSLASHresetGUI" методунда дайындалганга чейин, биз тордун ичиндеги саптарды жана мамычаларды конфигурациялашыбыз керек, ал эми бардык баскычтар "setSLASHresetGUI" методунда дайындалгандан кийин, биз бардык мазмунду тордун ичинде топтошубуз керек (караңыз туура форматтоо үчүн нускамада берилген код).

4-кадам: Оюндагы экрандын баскычтарын иштеткиле

Оюндагы экрандын баскычтарын иштеткиле
Оюндагы экрандын баскычтарын иштеткиле
Оюндагы экрандын баскычтарын иштеткиле
Оюндагы экрандын баскычтарын иштеткиле
Оюндагы экрандын баскычтарын иштеткиле
Оюндагы экрандын баскычтарын иштеткиле
Оюндагы экрандын баскычтарын иштеткиле
Оюндагы экрандын баскычтарын иштеткиле

ТҮШҮНДҮРМӨ:

Баскычтар басылганда коддун белгилүү бир саптарын аткарышы үчүн, биз "процесс" методунун ичиндеги ыкмаларды аткарышыбыз керек болот. Бул тапшырма үчүн биз бир нече жаңы ыкмаларды, өзгөрмөлөрдү жана тизмелерди түзүшүбүз керек болот.

Биринчиден, биз эки тизме түзөбүз. "Grid" деп аталган тизме болот. Бул "сетка" тизмеси 9 жана 0 бүтүн сандарынан гана турат. Бул тизмеде тогузу бомбаны, нөлү болсо бомбаны билдирет. Плитка бомба же бомба экенин программа ушинтип айырмалайт. Экинчи тизме түзүлөт жана ал "статус" деп аталат. Бул "статус" тизмеси бир гана символдон турат ("0", "1", "2", "3", "4", "5", "6", "7", "8", "b" "). Бул тизмеде ар бир белги сабы белгилүү бир сүрөттөлүшкө туура келет. Программа мина тазалоочу сеткадагы ар бир баскычта кандай сүрөттү көрсөтүү керек экенин ушундайча билет. Кен казуучу сеткадагы ар бир баскычтын торго жайгаштырылышынын негизинде ар бир тизмеде тиешелүү индекси болот. Тиешелүү индекс төмөнкүдөй жол менен дайындалат (баскычтын номери - 1). Мисалы, баскычтын ар бир тизмедеги индекси нөлгө барабар. Акырында, бул эки тизме "MainGUI" классы аткарыла электе аткарылат жана "MainGUI" классынын сыртында түзүлөт. "Grid" классы бош тизме (grid = ) катары түзүлөт жана "status" тизмеси диапазон функциясы менен түзүлөт ("status" тизмесине "n" кырк бир тамга саптарын кошуу).

Экинчиден, биз аны курчап турган миналардын санын аныктай турган жана баскыч басылганда чакырыла турган ар кандай ыкмаларды жасайбыз (кайсы методдун аткарылышы чечими баскычтын жайгашуусу менен аныкталат). Бул ыкмалар биздин кен анализаторлорубуз деп аталат. Бул ыкмалар "NumOfMines" деп аталган эсептегичти көбөйтөт жана плитканы курчап турган канча бомбаны аныктоо үчүн "тор" тизмесиндеги айрым индекстерди колдонот. "NumOfMines" өзгөрмөсүндө сактала турган сап "статус" тизмесиндеги ошол эле тиешелүү индексти алмаштыруу үчүн колдонулат. Эми сиз программа кайсы индексти колдонууну кантип билерин ойлонушуңуз мүмкүн. "Процесс" ыкмасында баскыч катталганда, "индекс" өзгөрмөсү түзүлөт/белгилүү бир бүтүн санга кайра дайындалат (баскыч катталган катардын негизинде). Түзүлгөн методдордун бири плитканын жайгашуусун жана аны курчап турган плиткалардын индекстерин билүү үчүн ошол дайындалган индексти колдонот (методдун ичиндеги алгоритм муну түшүнөт). Кошумчалай кетсек, "индекстин" өзгөрмөсүн кайра дайындоо үчүн, биз аны алгач класстын сыртында иштетишибиз керек. Ошентип, биз "индекстин" өзгөрмөсүн "MainGUI" классы түзүлгөнгө чейин бүтүн нөл катары алдын ала орнотобуз.

Үчүнчүдөн, "операция" ыкмалары түзүлөт. Баскыч катталган сайын "операция" ыкмасы аткарылат. Бул "операция" ыкмалары "процесс" ыкмасында аткарылат. "Процесс" ыкмасында, if-else бир нече билдирүүлөрү кайсы баскыч басылганын аныктайт (баскыч эмнеге барабар экендигинин негизинде). Бул жерде белгилүү бир "операция" ыкмасы чакырылат (if-else билдирүүлөрүндө).

Төртүнчүдөн, биз иш жүзүндө кнопкалар иштей баштайт. Жогоруда айтылгандай, if-else деген бир нече билдирүүлөр "процесс" ыкмасында жайгашкан жана баскычтын барабардыгына жараша башка коддордун башка ыкмаларын жана линияларын аткарышат (баскыч акыркы катталган сапка барабар). Бул if-else билдирүүлөрүнүн ичинде төмөнкүдөй тартипте болот: индекс глобалдык түрдө дайындалат, "статус" тизмесиндеги тиешелүү индекс "b" сапына кайра дайындалат (эгер "торчо" тизмесинин тиешелүү индекси барабар болсо) бүтүн тогуз), тиешелүү "операция" ыкмасы аткарылат (эгер "торчо" тизмесинин тиешелүү индекси нөлгө барабар болсо), "статус" тизмесиндеги тиешелүү индекс өзгөрмөгө барабар сапка кайра дайындалат "NumOfMines" (эгер "сетка" тизмесинин тиешелүү индекси нөлгө барабар болсо) жана GUI "setSLASHresetGUI" ыкмасын чакырып жаңыртылат.

5 -кадам: "setDifficulty" ыкмасы & "restart" методу

Сүрөт
Сүрөт
Сүрөт
Сүрөт

ТҮШҮНДҮРМӨ:

Андан кийин, "setDifficulty" ыкмасын түзүү керек жана оюндагы экрандын ылдый жагында жайгашкан өчүрүп күйгүзүү баскычы иштей башташы керек (колдонуучу чыкылдатканда аны аткаруу үчүн "кайра баштоо" ыкмасын түзүү менен).).

Биринчиден, "setDifficulty" методу "процесс" методундагы кыйынчылык баскычтарынын if-else билдирүүлөрүндө жана "кайра баштоо" ыкмасында ишке ашырылышы керек. Бул ыкмада аткарылган коддор жана ыкмалар абдан жөнөкөй. "SetDifficulty" методунда биз нөлдүн (бомбасыз) жана тогуздун (бомбанын) белгилүү бир санын "сетка" тизмесине кошобуз (ар бир if-else билдирүүсүнүн ичинде эки диапазондогу функциялар аркылуу), анан биз аралаштырабыз "setDifficulty" методунун ичинде "grid" тизмеси (туш келди китепкананын аралаштыруу функциясы менен) (if-else билдирүүлөрү аткарылгандан кийин). Нөлдөрдүн тогузга болгон катышы "кыйынчылык" өзгөрмөсү кайсы сапка коюлганына жараша аныкталат ("оңой": 34-6, "орточо": 28-12, "катуу": 16-24).

Экинчиден, "кайра баштоо" ыкмасында биз "index" жана "NumOfMinesLEFT" өзгөрмөлөрүн глобалдуу түрдө нөлгө коебуз, "статус" жана "сетка" тизмелерин глобалдык түрдө бош коёбуз, диапазон функциясы менен "статус" тизмесин баштапкы абалга келтиребиз (кошуу) "статус" тизмесине "n" кырк бир тамга саптары), жана "setDifficulty" ыкмасына кайрылыңыз.

6-кадам: Оюнду аяктоочу сценарийлер

Оюнду аяктоочу сценарийлер
Оюнду аяктоочу сценарийлер
Оюнду аяктоочу сценарийлер
Оюнду аяктоочу сценарийлер
Оюнду аяктоочу сценарийлер
Оюнду аяктоочу сценарийлер
Оюнду аяктоочу сценарийлер
Оюнду аяктоочу сценарийлер

ТҮШҮНДҮРМӨ:

Ар бир мина тазалоочу оюнда оюндун аяктоочу эки сценарийи бар: жеңиш жана жоготуу. Бул программанын ичинде, биз бул эки жаңы ыкманы камтыган оюн аяктоочу сценарийлерди ишке ашырабыз: "You_A_Winner_Son" ыкмасы жана "GameOver" ыкмасы. GUI "процесс" методунун ичинде жаңыртылганга чейин жана оюн аяктаган эки сценарий ыкмасы менен өзгөртүлгөн индекстерге негизделгенден кийин, дисплей баскычы натыйжаны туура көрсөтүү үчүн өзгөртүлөт.

Биринчиден, колдонуучу акыркы катылган бомбасыз плитканы чыкылдатканда, анда "You_A_Winner_Son" методу аткарылышы керек. Биз бул тапшырманы "You_A_Winner_Son" ыкмасына чакырып, плитка чыкылдатылган сайын жана плитка бомба эмес плитка деп табылганда аткарабыз ("процесс" ыкмасында аткарылган "операция" методдорунун ичинде). Эгерде утуп алуу шарттары аткарылса, анда "You_A_Winner_Son" ыкмасы ичинде эки if-else билдирүүсү аткарылат. Биринчи if-else билдирүүсү, бул ыкма чакырылганда, оюнчу жеңдиби же жокпу, дайыма аткарылат. "Кыйынчылык" өзгөрмөсү эмнеге барабар экендигине таянып, канча мина/бомба катылганын аныктай турган белгилүү бир алгоритм. Бул алгоритм тарабынан табылган бүтүн сан "NumOfMinesLEFT" өзгөрмөсүндө сакталат. Андан кийин, if-else эки билдирүүсүнүн ортосунда калган плиталардын санын табуу үчүн башка алгоритм аткарылат (чыкылдатылбаган плиткалар). Бул алгоритм тарабынан табылган бүтүн сан "NumOfStartingTilesLEFT" өзгөрмөсүндө сакталат. Экинчи if-else билдирүүсү, бул ыкма чакырылганда, оюнчу жеңдиби же жокпу, дайыма аткарылат. "Кыйынчылык" өзгөрмөсү эмнеге барабар экендигинин негизинде, эгер алардын шарттары аткарылса, if-else үч операторунун бири аткарылышы мүмкүн. Шарттар "NumOfMinesLEFT" жана "NumOfStartingTilesLEFT" деген эки өзгөрмөнүн барабардыгына негизделет. Бул үч if-else билдирүүсүндө ар бир баскычты жараксыз кыла турган алгоритм аткарылат (оюн бүттү).

Экинчиден, колдонуучу жашырылган бомба плиткасынын бирин чыкылдатканда, анда "GameOver" методу аткарылышы керек. Биз бул тапшырманы плитканы чыкылдаткан сайын жана плитка бомба плитасы деп табылган сайын "GameOver" ыкмасын чакыруу менен аткарабыз ("процесс" ыкмасында аткарылган "операция" ыкмаларынын чегинде). "GameOver" ыкмасы чакырылганда, ар бир баштапкы плитканы жараксыз кыла турган алгоритм аткарылат (оюн бүттү) жана жашыруун бомба плиткалары ачылат ("тор тизмесиндеги тиешелүү индекстердин негизинде, айрым индекстер") "статус" тизмесинде "b" бир тамгадан турган сапка кайра дайындалат).

Үчүнчүдөн, оюндагы экрандын дисплейи GUI жаңыртылган сайын "setSLASHresetGUI" ыкмасына анча-мынча түзөтүүлөрдү киргизүү менен жаңыртылып турат. GUI торчосу конфигурациялангандан кийин, биз учурдагы дисплей баскычынын дайындалышы жайгаштырылган if-else үч билдирүүсүн жайгаштырабыз. Үч if-else билдирүүсүнүн бири төмөнкү өзгөрмөлөргө негизделет: "GameOverDETECTOR", "кыйынчылык", "NumOfMinesLEFT" жана "NumOfStartingTilesLEFT". Бул өзгөрмө if-else операторлору "setSLASHresetGUI" методунда аткарыла электе түзүлөт. "GameOverDETECTOR" өзгөрмөсү "сеткада" канча индекстерди тапкан алгоритмдин жардамы менен табылган бүтүн санга барабар болот тизме токсон тогуз бүтүн санга кайра дайындалды (баскычтар кантип жараксыз болуп калды). If-else операторунун шарттары аткарылганына жараша, дисплейге тиешелүү кайра дайындоо ишке ашат.

7 -кадам: Кайра баштоо баскычын иштетүү

Кайра баштоо баскычын иштиктүү кылуу
Кайра баштоо баскычын иштиктүү кылуу

ТҮШҮНДҮРМӨ:

Бул кадам эң кыска болот. Бул кадам үчүн иштердин көбү буга чейин аткарылган. Биз азыр эмне кылышыбыз керек, колдонуучу кайра жүктөө баскычын баскан сайын "кайра баштоо" ыкмасын аткаруу керек.

Биринчиден жана акырында, эгерде if-else билдирүүсү менен "процесс" ыкмасында "кайра баштоо" ыкмасын аткарабыз. Эгерде сап "!" катталган, андан кийин "кайра баштоо" ыкмасы аткарылат. Ошондой эле, "setSLASHresetGUI" методунун аягында, тордун мазмуну чогулганга чейин, кайра баштоо деп аталган баскычты түзүшүбүз керек болот. Бул өчүрүп күйгүзүү баскычы "!" Сапын иштетет. (команда lambda: self.process ("!")) жана "процесс" методунун ичинде тиешелүү "кайра баштоо" ыкмасын аткарыңыз.

Сунушталууда: