Բովանդակություն:

Minesweeper-Raspberry-Pi-Edition: 7 Steps (With Pictures)
Minesweeper-Raspberry-Pi-Edition: 7 Steps (With Pictures)

Video: Minesweeper-Raspberry-Pi-Edition: 7 Steps (With Pictures)

Video: Minesweeper-Raspberry-Pi-Edition: 7 Steps (With Pictures)
Video: Minesweeper in Minecraft for Raspberry Pi 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 գրադարանը: Minանցը, որն ընդգրկում է ականանետերի խաղը, ունի ութ սալիկ լայնություն և հինգ սալիկ բարձրություն: Նախագծի ձևաչափումը հարմարեցված և կատարելագործված է Python 2.7 -ով տեղադրված Raspberry Pi- ի օգտագործման համար:

Minesweeper Raspberry Pi Edition- ի վերջնական նախագծի ծածկագիրն ու պատկերները կարելի է ներբեռնել հետևյալ հղումով.

Minesweeper-Raspberry-Pi-Edition

Պարագաներ

x1 Ազնվամորի Պի

Python 2.7 Տեղադրված է Raspberry Pi- ի վրա

Microsoft Powerpoint (կամ կոճակների համար պատկերներ ստեղծելու այլ ծրագիր)

Քայլ 1: Ստեղծեք կոճակի պատկերներ

Ստեղծեք կոճակի պատկերներ
Ստեղծեք կոճակի պատկերներ

Բացատրություն:

GUI- ն կազմող յուրաքանչյուր կոճակ պետք է ստեղծվի: Այս առաջադրանքի համար ես օգտագործել եմ Microsoft Powerpoint- ը ՝ կոճակներին ցուցադրելու համար անհրաժեշտ պատկերներ պատրաստելու համար:

Նախ, ես ստեղծեցի տասը սալիկների կոճակներ, որոնք անհրաժեշտ են ականազերծիչ ցանցը (դատարկ, բոբ, զրո, մեկ, երկու, երեք, չորս, հինգ, վեց, յոթ և ութ) `օգտագործելով Microsoft Powerpoint- ը:

Երկրորդ, ես պատրաստեցի ընտրացանկի էկրանի համար անհրաժեշտ չորս պատկերները (ընտրացանկի ցուցադրում, հեշտության դժվարության կոճակ, միջին դժվարության կոճակ և կոշտ դժվարության կոճակ) `օգտագործելով Microsoft Powerpoint:

Երրորդ, ես ստեղծեցի վերագործարկման կոճակի համար անհրաժեշտ պատկերը և ցուցադրման այլ տարբեր կոճակների համար անհրաժեշտ պատկերները («ցուցադրվող խաղ», «դու հաղթում ես» և «կանոններ» ցուցադրում) ՝ օգտագործելով Microsoft Powerpoint- ը:

Չորրորդ, դուք պետք է չափափոխեք ձեր պատկերները `ձեր էկրանին տեղավորվելու համար: Իմ Rasberry Pi- ի համար ես պատուհանի համար օգտագործել եմ հետևյալ չափերը (երկարության և լայնության պիքսելներին վերաբերող) ՝ 432x576:

Քայլ 2: Ձևաչափի ծրագիր

Ձևաչափման ծրագիր
Ձևաչափման ծրագիր

Բացատրություն:

Նախքան որևէ իրական ծրագրավորում սկսելը, մենք պետք է ներմուծենք մեզ անհրաժեշտ գրադարանները և գրենք մեր ծրագրի հիմնական մասը:

Նախ, մենք պետք է ներմուծենք * Tkinter գրադարանից և խառնենք պատահական գրադարանից: Երկրորդ, մենք պետք է ծրագրի հիմնական մասում կատարենք ծածկագրում հետևյալ քայլերը. Ստեղծեք պատուհան, սահմանեք վերնագրի պատուհանը, ստեղծեք GUI և ցուցադրեք GUI և սպասեք օգտվողի փոխազդեցությանը: Այս ծածկագիրը գրված է պատշաճ ձևաչափմամբ `կապված Tkinter գրադարանի հետ (նայեք հրահանգում տրված ծածկագրին` համապատասխան ձևաչափումը տեսնելու համար):

Քայլ 3: Ստեղծեք GUI (ընտրացանկ և ականազերծիչ ցանց)

Ստեղծեք GUI (ընտրացանկ և ականազերծիչ ցանց)
Ստեղծեք GUI (ընտրացանկ և ականազերծիչ ցանց)
Ստեղծեք GUI (ընտրացանկ և ականազերծիչ ցանց)
Ստեղծեք GUI (ընտրացանկ և ականազերծիչ ցանց)
Ստեղծեք GUI (ընտրացանկ և ականազերծիչ ցանց)
Ստեղծեք GUI (ընտրացանկ և ականազերծիչ ցանց)
Ստեղծեք GUI (ընտրացանկ և ականազերծիչ ցանց)
Ստեղծեք GUI (ընտրացանկ և ականազերծիչ ցանց)

Բացատրություն:

Startրագրի գործարկումից հետո բացվում է ընտրացանկի էկրանը: Դժվարությունը ընտրվելուց հետո (ընտրացանկի էկրանին դժվարության կոճակներից մեկին սեղմելով) GUI- ն կթարմացվի ականահանման ցանցի, ցուցադրման և վերագործարկման կոճակի միջոցով: Քանի որ դուք նոր եք սկսում աշխատել GUI- ի վրա, մեզ հարկավոր է միայն սկսել ընտրացանկը, գործարկել մենյուի դժվարության կոճակները և GUI- ն թարմացնել ականապատման ցանցի խաղային էկրանին:

Նախ, մենք կարող ենք ցանկի էկրանն ինքնուրույն ցուցադրել ծրագրի գործարկման ժամանակ ՝ կանչելով «setupMenu» մեթոդը MainGUI դասի կոնստրուկտորի ներսում:

Երկրորդ, մենք կարող ենք ցանկի դժվարությունների կոճակներից յուրաքանչյուրը կատարել կոդի որոշակի տողեր, երբ կտտացնելով ՝ ավելացնելով «գործընթացի» մեթոդը (նաև պետք է ավելացնել հրամանը lambda: յուրաքանչյուր դժվարության կոճակի ստեղծման մեջ): «Այլ» երեք հայտարարություններ կստեղծվեն «գործընթացի» մեթոդով և կիրականացնեն լրացուցիչ կոդի որոշ այլ մեթոդներ և տողեր ՝ կախված նրանից, թե ինչին է հավասար կոճակը (կոճակը հավասար է վերջին գրանցված կոճակի անունին):

Երրորդ, մինչ ընտրացանկի էկրանը բացված է, և եթե օգտագործողը կտտացնում է դժվարության կոճակներից մեկին, ապա ծրագիրը որոշակի արժեք կպահի «դժվարության» փոփոխականին (դժվարությունը հավասար է «հեշտ», «միջին» կամ «ծանր») դժվարության կոճակը սեղմված է): Կոճակի այս կտտոցը գիտի, թե եթե հակառակ դեպքում ո՞ր հայտարարությանը պետք է հետևել ՝ հիմնվելով վերջին կոճակի անվան վրա (ինչ կոճակին է հավասար): Բացի այդ, «դժվարության» փոփոխականին վերանշանակելու համար մեզ անհրաժեշտ է առաջինը այն դասից դուրս է: Այսպիսով, մենք «դժվարություն» փոփոխականը կդնենք դատարկ տող, նախքան «MainGUI» դասի ստեղծումը:

Չորրորդ, մաքրեք GUI- ը «setupMenu» մեթոդով պատրաստված կոճակներից ՝ դարձնելով «clearMenu» մեթոդը (օգտագործելով button.destroy () գործառույթը բազմաթիվ դեպքերում) և «clearMenu» մեթոդը կանչելով «գործընթացի» մեթոդով (ներքևում դժվարության կոճակներից յուրաքանչյուրը գրանցվում է դժվարության փոփոխականի նշանակումից հետո):

Հինգերորդ ՝ թարմացրեք GUI- ն ՝ կազմելով «setSLASHresetGUI» մեթոդը (կոճակները պատրաստվում են այնպես, ինչպես «setupMenu» մեթոդով) և «setSLASHresetGUI» մեթոդը կանչելով «գործընթացի» մեթոդով (դժվարության կոճակից յուրաքանչյուրի ներքո գրանցվում է փոփոխականի նշանակման դժվարություն և «clearMenu» մեթոդը կանչելը):

Բացի այդ, նախքան «setSLASHresetGUI» մեթոդով բոլոր կոճակները նշանակելը, մենք պետք է կազմաձևենք ցանցի տողերն ու սյուները, իսկ «setSLASHresetGUI» մեթոդով բոլոր կոճակները նշանակվելուց հետո մենք պետք է փաթեթավորենք ցանցի ամբողջ բովանդակությունը (նայեք հրահանգի մեջ տրված ծածկագիրը ՝ համապատասխան ձևաչափումը տեսնելու համար):

Քայլ 4. Գործարկեք խաղային էկրանի կոճակները

Խաղի խաղի էկրանի կոճակները գործարկեք
Խաղի խաղի էկրանի կոճակները գործարկեք
Գործող դարձրեք խաղի էկրանի կոճակները
Գործող դարձրեք խաղի էկրանի կոճակները
Խաղի խաղի էկրանի կոճակները գործարկեք
Խաղի խաղի էկրանի կոճակները գործարկեք
Խաղի խաղի էկրանի կոճակները գործարկեք
Խաղի խաղի էկրանի կոճակները գործարկեք

Բացատրություն:

Կոճակներին կտտացնելիս կոդի որոշակի տողեր գործադրելու համար մենք ստիպված կլինենք կատարել մեթոդներ «գործընթացի» մեթոդի շրջանակներում: Այս առաջադրանքի համար մենք ստիպված կլինենք կատարել բազմաթիվ նոր մեթոդներ, փոփոխականներ և ցուցակներ:

Նախ, մենք կկազմենք երկու ցուցակ: Կլինի ցուցակ, որը կոչվում է «ցանց»: Այս «ցանցային» ցուցակը բաղկացած կլինի միայն 9 և 0. ամբողջ թվերից: Այս ցուցակում ինը կներկայացնեն ռումբեր, իսկ զրոները `ոչ ռումբեր: Այսպես է ծրագիրը տարբերելու ՝ սալիկը ռումբ է, թե ոչ: Կկազմվի երկրորդ ցուցակը, որը կկոչվի «կարգավիճակ»: Այս «կարգավիճակի» ցուցակը բաղկացած է միայն մեկ նիշ տողից («0», «1», «2», «3», «4», «5», «6», «7», «8», «բ ): Այս ցուցակում յուրաքանչյուր նիշ տող կհամապատասխանի որոշակի պատկերի: Այսպես ծրագիրը կիմանա, թե ինչ պատկեր ցուցադրի ականազերծիչ ցանցի յուրաքանչյուր կոճակի վրա: Հանքահավաք ցանցի յուրաքանչյուր կոճակ կունենա համապատասխան ցուցիչ յուրաքանչյուր ցուցակում `ելնելով ցանցում տեղադրությունից: Համապատասխան ինդեքսը կնշանակվի հետևյալ ընթացակարգով (կոճակի համարը ՝ 1): Օրինակ, յուրաքանչյուր ցուցակում կոճակի մեկի համապատասխան ինդեքսը ինդեքս զրո է: Վերջապես, այս երկու ցուցակները կիրականացվեն նախքան «MainGUI» դասի կատարումը և կստեղծվեն «MainGUI» դասից դուրս: «Idանց» դասը կստեղծվի որպես դատարկ ցուցակ (grid = ) և «կարգավիճակ» ցուցակը կստեղծվի ընդգրկույթի գործառույթով («n» - ի քառասուն նիշ տողեր ավելացնելով «կարգավիճակի» ցուցակին):

Երկրորդ, մենք կկատարենք տարբեր մեթոդներ, որոնք կարող են հայտնաբերել շրջապատող հանքերի քանակը և որոնք կարող են կանչվել կոճակին սեղմելիս (որ մեթոդի որոշումը պետք է որոշվի կոճակի տեղադրմամբ): Հենց այս մեթոդները կկոչվեն մեր հանքի անալիզատորներ: Այս մեթոդները կավելացնեն «NumOfMines» կոչվող հաշվիչը և կօգտագործեն որոշակի ինդեքսներ «ցանց» ցուցակի մեջ `որոշելու, թե քանի ռումբեր են շրջապատում սալիկը: Տողը, որը կպահվի «NumOfMines» փոփոխականի ներսում, կօգտագործվի «կարգավիճակ» ցուցակի նույն համապատասխան ինդեքսը փոխարինելու համար: Այժմ կարող եք մտածել, թե ինչպես ծրագիրը կիմանա, թե որ ինդեքսն օգտագործել: Երբ կոճակը գրանցվում է «գործընթացի» մեթոդով, ապա փոփոխական «ինդեքս» կստեղծվի/վերանշանակվի որոշակի ամբողջ թվին (հիմնվելով, թե որ տողն է գրանցում կոճակը): Ստեղծված մեթոդներից մեկը կօգտագործի այդ նշանակված ինդեքսը, որպեսզի իմանա սալիկի տեղադրությունը և այն շրջապատող սալիկների ինդեքսները (մեթոդի ալգորիթմը դա պարզելու է): Բացի այդ, «ինդեքս» փոփոխականին վերանշանակելու համար մենք պետք է այն նախօրոք հաստատենք դասից դուրս: Այսպիսով, մենք «ինդեքսի» փոփոխականը կսահմանենք որպես ամբողջ զրո, մինչև «MainGUI» դասի ստեղծումը:

Երրորդ ՝ կստեղծվեն «շահագործման» մեթոդներ: Ամեն անգամ, երբ կոճակը գրանցվում է, կկիրառվի «գործողություն» մեթոդը: Այս «գործողության» մեթոդները կիրականացվեն «գործընթացի» մեթոդով: «Գործընթացի» մեթոդով, եթե այլ բանաձևերը որոշեն, թե որ կոճակին են սեղմել (հիմնվելով կոճակի հավասարության վրա): Այստեղ է, որ կանչվի որոշակի «գործողության» մեթոդ (եթե այլ բան հայտարարություններում):

Չորրորդ, մենք իրականում կանդրադառնանք, թե ինչպես են կոճակները գործում: Ինչպես արդեն նշվեց, եթե այլ բաների հայտարարությունները տեղակայված են «գործընթացի» մեթոդում և կատարում են լրացուցիչ կոդի որոշակի այլ մեթոդներ և տողեր ՝ կախված նրանից, թե ինչին է հավասար կոճակը (կոճակը հավասար է վերջին գրանցված տողին): Այս այլ հայտարարությունների մեջ հաջորդը հաջորդաբար տեղի է ունենալու. ամբողջ թիվ ինը), կկիրառվի համապատասխան «գործողության» մեթոդը (եթե «ցանց» ցուցակի համապատասխան ինդեքսը հավասար է զրոյի), ապա «կարգավիճակ» ցուցակի այդ համապատասխան ինդեքսը կվերանշանակվի տողի, որը հավասար է փոփոխականին «NumOfMines» (եթե «ցանց» ցուցակի համապատասխան ինդեքսը հավասար է ամբողջ զրոյի), իսկ GUI- ն կթարմացվի ՝ կանչելով «setSLASHresetGUI» մեթոդը:

Քայլ 5. «setDifficarity» մեթոդը և «վերագործարկումը» մեթոդը

Պատկեր
Պատկեր
Պատկեր
Պատկեր

Բացատրություն:

Հաջորդը, պետք է ստեղծվի «setDifficulty» մեթոդը, և խաղի էկրանի ներքևում գտնվող վերագործարկման կոճակը պետք է գործարկվի (ստեղծելով «վերագործարկման» մեթոդ ՝ այն գործարկելու համար, երբ այն կտտացնում է օգտվողը):

Նախ, «setDifficarity» մեթոդը պետք է կիրառվի «գործընթացի» մեթոդի և «վերագործարկման» մեթոդի դժվարության կոճակների եթե-այլ հայտարարություններում: Այս մեթոդով կատարված ծածկագրի և մեթոդների տողերը բավականին պարզ են: «SetDifficulty» մեթոդով մենք որոշակի քանակությամբ զրոներ (ոչ ռումբեր) և ինը (ռումբեր) կցենք «ցանց» ցուցակին (յուրաքանչյուր դեպքում, եթե այլ բանաձևի երկու տիրույթի գործառույթների միջոցով), այնուհետև մենք դրանք կխառնենք «ցանցի» ցուցակ (պատահական գրադարանի խառնման գործառույթով) «setDifficulty» մեթոդի շրջանակներում (եթե այլ բանաձևերը կատարվելուց հետո): Erրոյների և ինների հարաբերակցությունը որոշվելու է, թե որ լարով է սահմանվում «դժվարություն» փոփոխականը («հեշտ» ՝ 34-6, «միջին» ՝ 28-12, «ծանր» ՝ 16-24):

Երկրորդ ՝ «վերագործարկման» մեթոդով մենք «ինդեքս» և «NumOfMinesLEFT» փոփոխականները կդարձնենք զրոյական գլոբալ, դատարկելու ենք «կարգավիճակի» և «ցանցի» ցուցակները գլոբալ մակարդակում, «կարգավիճակի» ցուցակը զրոյական գործառույթով վերականգնելու միջոցով (ավելացնելով. քառասուն մեկ նիշ տող «n» «կարգավիճակ» ցուցակին) և կանչեք «setDifficulty» մեթոդը:

Քայլ 6: Խաղի ավարտի սցենարներ

Խաղի ավարտի սցենարներ
Խաղի ավարտի սցենարներ
Խաղի ավարտի սցենարներ
Խաղի ավարտի սցենարներ
Խաղի ավարտի սցենարներ
Խաղի ավարտի սցենարներ
Խաղի ավարտի սցենարներ
Խաղի ավարտի սցենարներ

Բացատրություն:

Ականազերծման յուրաքանչյուր խաղ ունի խաղի ավարտի երկու սցենար ՝ հաղթանակ և պարտություն: Այս ծրագրի շրջանակներում մենք կիրականացնենք խաղի ավարտի այս երկու սցենարները երկու նոր մեթոդներով ՝ «You_A_Winner_Son» մեթոդով և «GameOver» մեթոդով: Նախքան GUI- ի թարմացումը «գործընթացի» մեթոդի շրջանակներում և խաղերի ավարտման երկու սցենարներով փոխված ցուցանիշների հիման վրա ցուցադրման կոճակը կփոխվի `արդյունքը ճիշտ ներկայացնելու համար:

Նախ, երբ օգտագործողը կտտացնում է վերջին թաքնված ոչ ռումբի սալիկին, ապա պետք է կատարվի «You_A_Winner_Son» մեթոդը: Այս առաջադրանքը մենք կավարտենք ՝ կանչելով «You_A_Winner_Son» մեթոդը ամեն անգամ, երբ սալիկը կտտացվում է, և պարզվում է, որ սալիկը ոչ ռումբի սալիկ է («գործընթացի» մեթոդով կատարված «գործողության» մեթոդների շրջանակներում): Եթե հաղթող պայմանները բավարարված են, ապա «You_A_Winner_Son» մեթոդի երկու եթե-այլ հայտարարություններ կկատարվեն: Եթե այլ բան է, առաջին հայտարարությունը միշտ կգործի անկախ այն բանից, թե խաղացողը կհաղթի՞, թե՞ ոչ, երբ այս մեթոդը կանչվի: Հիման վրա, թե ինչի է հավասար փոփոխական «դժվարությունը», որոշակի ալգորիթմ, որը կորոշի, թե քանի ական/ռումբ է թաքնված մնացել: Այս ալգորիթմի միջոցով գտնված ամբողջ թիվը կպահվի «NumOfMinesLEFT» փոփոխականում: Հաջորդը, եթե այլ բանաձևի միջև այլ ալգորիթմ կկիրառվի ՝ մնացած ձախ սալիկների թիվը (չսեղմված սալիկներ) գտնելու համար: Այս ալգորիթմի միջոցով գտնված ամբողջ թիվը կպահվի «NumOfStartingTilesLEFT» փոփոխականում: Երկրորդ եթե այլ բանաձևը միշտ կգործի անկախ այն բանից, թե խաղացողը կհաղթի՞, թե՞ ոչ, երբ այս մեթոդը կանչվի: Ելնելով այն բանից, թե ինչի է հավասար «դժվարություն» փոփոխականը, եթե այլ պայմաններից երեքը կարող են կատարվել, եթե դրանց պայմանները բավարարվեն: Պայմանները հիմնված կլինեն այն բանի վրա, ինչին հավասար են երկու «NumOfMinesLEFT» և «NumOfStartingTilesLEFT» փոփոխականները: Այս երեք այլ հայտարարությունների շրջանակում կիրականացվի ալգորիթմ, որն անիմաստ կդարձնի յուրաքանչյուր կոճակ (խաղն ավարտված է):

Երկրորդ, երբ օգտագործողը կտտացնում է թաքնված ռումբի սալիկներից մեկին, ապա «GameOver» մեթոդը պետք է կատարվի: Մենք կավարտենք այս առաջադրանքը ՝ «GameOver» մեթոդով կանչելով ամեն անգամ, երբ սալիկը կտտացվում է, և սալիկը հայտնաբերվում է որպես ռումբի սալիկ («գործընթացի» մեթոդով կատարված «գործողության» մեթոդների շրջանակներում): Երբ կոչվի «GameOver» մեթոդը, կիրականացվի ալգորիթմ, որը յուրաքանչյուր մեկնարկային սալիկն անօգուտ կդարձնի (խաղն ավարտված է), և թաքնված ռումբի սալիկները կբացահայտվեն («ցանցի ցուցակի» համապատասխան ցուցանիշների հիման վրա, որոշակի ինդեքսներ) «կարգավիճակ» ցուցակում կվերանշանակվի «բ» մեկ նիշ տողին):

Երրորդ, խաղի էկրանի ցուցադրումը կթարմացվի ամեն անգամ, երբ GUI- ն թարմացվում է ՝ «setSLASHresetGUI» մեթոդի շատ փոքր փոփոխություններ կատարելով: GUI- ի ցանցի կազմաձևումից հետո մենք կտեղադրենք երեք այլ հայտարարություն, որտեղ տեղադրված է ներկայիս ցուցադրման կոճակի առաջադրանքը: Եթե այլ բաների երեք հայտարարություններից մեկը կկատարվի ՝ հաշվի առնելով հետևյալ փոփոխականները ՝ «GameOverDETECTOR», «դժվարություն», «NumOfMinesLEFT» և «NumOfStartingTilesLEFT»: փոփոխական: Այս փոփոխականը կստեղծվի անմիջապես, եթե այլ բանաձևերը կատարվեն «setSLASHresetGUI» մեթոդով: «GameOverDETECTOR» փոփոխականը հավասար կլինի այն ամբողջ թվին, որը գտնվում է ալգորիթմի միջոցով, որը գտնում է «ցանցում» քանի ինդեքս: ցուցակը վերանշանակվել է իննսունինը ամբողջ թվին (ինչպես են կոճակները դառնում անօգուտ): Ըստ որի `հակառակ դեպքում, եթե այլ պայմանի պայմանները բավարարված են, էկրանին համապատասխան վերանշանակում տեղի կունենա:

Քայլ 7: Վերագործարկման կոճակը գործնական դարձնելը

Վերագործարկման կոճակը գործառնական դարձնելը
Վերագործարկման կոճակը գործառնական դարձնելը

Բացատրություն:

Այս քայլը պատահում է ամենակարճը: Այս քայլի համար աշխատանքների մեծ մասն արդեն կատարված է: Այն, ինչ մենք պետք է անենք հիմա, գործարկել է «վերագործարկման» մեթոդը ամեն անգամ, երբ օգտագործողը սեղմում է վերագործարկման կոճակը:

Նախ և վերջ, մենք «վերագործարկման» մեթոդը կիրականացնենք «գործընթացի» մեթոդով, եթե այլ բան հայտարարությամբ: Եթե տողը "!" գրանցված է, այնուհետև պետք է կատարվի «վերագործարկման» մեթոդը: Մենք նաև ստիպված կլինենք «setSLASHresetGUI» մեթոդի վերջում ստեղծել վերագործարկում կոչվող կոճակ, մինչև ցանցի բովանդակությունը միասին փաթեթավորված լինի: Այս վերագործարկման կոճակը մշակելու է տողը "!" (հրաման lambda: self.process ("!")) և կատարեք համապատասխան "վերագործարկման" մեթոդը "գործընթացի" մեթոդի շրջանակներում:

Խորհուրդ ենք տալիս: