P1.pdf

‫ﻣﺒﺎﻧ ﺑﺮﻧﺎﻣﻪﺳﺎزی‬
‫ﻧﯿﻢﺳﺎل دوم ‪٩٢-٩١‬‬
‫ﻣﺪرس‪ :‬ﺣﻤﯿﺪ ﺿﺮاﺑ زاده‬
‫داﻧﺸ ﺪهی ﻣﻬﻨﺪﺳ ﮐﺎﻣﭙﯿﻮﺗﺮ‬
‫ﭘﺮوژهی درس ‪ -‬ﺑﺨﺶ اول‬
‫ﻣﯿﻦروب‬
‫ﻣﻬﻠﺖ ارﺳﺎل‪ ١۵ :‬اردیﺑﻬﺸﺖ‬
‫ﻣﻘﺪﻣﻪ‬
‫در اﯾﻦ ﭘﺮوژه ﻗﺼﺪ دارﯾﻢ در ﻗﺎﻟﺐ ﭘﯿﺎدهﺳﺎزی ﯾ ﺑﺎزی ﺑﻪ ﻧﺎم ﻣﯿﻦروب‪ ،‬ﻣﻔﺎﻫﯿﻤ ﮐﻪ در درس ﯾﺎد ﮔﺮﻓﺘﻪاﯾﺪ را ﻣﺮور‬
‫ﮐﻨﯿﻢ‪ .‬اﯾﻦ ﭘﺮوژه ﺷﺎﻣﻞ دو ﺑﺨﺶ اﺳﺖ ﮐﻪ ﺑﺨﺶ اول آن را در زﯾﺮ ﻣ ﺑﯿﻨﯿﺪ‪.‬‬
‫ﺑﺎزی ﻣﯿﻦروب )‪ (MineSweeper‬ﯾ ﺑﺎزی ﻓ ﺮی ﺗ ﻧﻔﺮه اﺳﺖ‪ .‬اﯾﻦ ﺑﺎزی ﺷﺎﻣﻞ ﯾ ﺻﻔﺤﻪی ﻣﺮﺑﻊ )ﯾﺎ ﻣﺴﺘﻄﯿﻞ(‬
‫ﺷ ﻞ اﺳﺖ ﮐﻪ در ﺗﻌﺪادی از ﺧﺎﻧﻪﻫﺎی آن ﻣﯿﻦ ﻗﺮار داده ﺷﺪه اﺳﺖ‪ .‬اﺑﺘﺪا ﻫﻤﻪی ﺧﺎﻧﻪﻫﺎ ﭘﻨﻬﺎن ﻫﺴﺘﻨﺪ و ﺑﺎزیﮐﻦ‬
‫ﺑﺎﯾﺪ ﺗﻤﺎم ﻣﯿﻦﻫﺎ را ﭘﯿﺪا ﮐﻨﺪ‪ .‬در ﻫﺮ ﺣﺮﮐﺖ ﻣﺎ ﻣ ﺗﻮاﻧﯿﻢ ﯾ ﺧﺎﻧﻪ را ﮐﻪ ﺣﺪس ﻣ زﻧﯿﻢ ﺷﺎﻣﻞ ﻣﯿﻦ ﻧﯿﺴﺖ آﺷ ﺎر‬
‫ﮐﻨﯿﻢ‪ .‬اﮔﺮ ﺣﺪس ﻣﺎ درﺳﺖ ﺑﺎﺷﺪ‪ ،‬ﻣﺠﻤﻮع ﺗﻌﺪاد ﻣﯿﻦﻫﺎی ﻣﻮﺟﻮد در ﺧﺎﻧﻪﻫﺎی ﻫﻤﺴﺎﯾﻪی آن ﺧﺎﻧﻪ ﻧﻤﺎﯾﺶ داده‬
‫ﻣ ﺷﻮد‪ .‬اﮔﺮ ﺑﻪ اﺷﺘﺒﺎه ﺧﺎﻧﻪای ﮐﻪ ﺷﺎﻣﻞ ﻣﯿﻦ اﺳﺖ را آﺷ ﺎر ﮐﻨﯿﻢ‪ ،‬ﺑﺎزی را ﺧﻮاﻫﯿﻢ ﺑﺎﺧﺖ‪ .‬در ﺣﯿﻦ ﺑﺎزی‪ ،‬ﺧﺎﻧﻪﻫﺎﯾ‬
‫را ﮐﻪ ﺣﺪس ﻣ زﻧﯿﻢ ﺷﺎﻣﻞ ﻣﯿﻦ ﻫﺴﺘﻨﺪ ﺑﺎ ﭘﺮﭼﻢ ﻣﺸﺨﺺ ﻣ ﮐﻨﯿﻢ‪ .‬اﮔﺮ ﺑﺘﻮاﻧﯿﻢ ﺗﻤﺎم ﻣﯿﻦﻫﺎی ﻣﻮﺟﻮد در ﺻﻔﺤﻪ را‬
‫ﺑﻪ درﺳﺘ ﺑﯿﺎﺑﯿﻢ‪ ،‬ﺑﺮﻧﺪهی ﺑﺎزی ﺧﻮاﻫﯿﻢ ﺑﻮد‪ .‬ﺑﺮای آﺷﻨﺎﯾ ﺑﯿﺶﺗﺮ ﺑﺎ اﯾﻦ ﺑﺎزی‪ ،‬ﻣ ﺗﻮاﻧﯿﺪ ﺑﻪ ﻧﺴﺨﻪی آﻧﻼﯾﻦ آن در‬
‫‪ MineSweeperOnline.com‬ﻣﺮاﺟﻌﻪ ﮐﻨﯿﺪ‪.‬‬
‫ﺷ ﻞ ‪ :١‬ﻧﻤﺎی ﮐﻠ ﺑﺎزی‬
‫در اداﻣﻪی ﻣﻄﻠﺐ‪ ،‬ﺗﻼش ﮐﺮدﯾﻢ ﺗﺎ ﮔﺎم ﺑﻪ ﮔﺎم ﺷﻤﺎ را وارد ﻓﻀﺎی ﭘﺮوژه ﮐﻨﯿﻢ‪ .‬ﺷﻤﺎ ﻫﻢ ﺗﻼش ﮐﻨﯿﺪ ﺑﺎ دﻗﺖ ﺻﻮرت‬
‫ﭘﺮوژه را ﻣﻄﺎﻟﻌﻪ ﮐﺮده و ﺑﺎ ﻫﺮ ﮔﺎم‪ ،‬ﺗﺼﻮﯾﺮ ذﻫﻨ ﺧﻮد را از ﭘﺮوژه واﺿﺢﺗﺮ ﮐﻨﯿﺪ‪.‬‬
‫ﻣﻮﻓﻖ ﺑﺎﺷﯿﺪ!‬
‫‪١‬‬
‫‪١‬‬
‫ﺟﺪول ﺑﺎزی‬
‫ﺑﺮای ﭘﯿﺎدهﺳﺎزی ﺑﺎزی‪ ،‬ﻧﯿﺎز دارﯾﻢ ﮐﻪ اﻃﻼﻋﺎت ﺧﺎﻧﻪﻫﺎی ﺟﺪول را ﺑﻪ ﮔﻮﻧﻪای ذﺧﯿﺮه ﮐﻨﯿﻢ‪ .‬ﺑﺮای ﻣﺜﺎل‪ ،‬وﺟﻮد ﻣﯿﻦ‪،‬‬
‫وﺟﻮد ﭘﺮﭼﻢ‪ ،‬آﺷ ﺎر ﺑﻮدن و ﯾﺎ ﭘﻨﻬﺎن ﺑﻮدن‪ ،‬ﻫﻤ وﯾﮋﮔ ﻫﺎی ﻣﺨﺘﻠﻔ در ﻣﻮرد ﺧﺎﻧﻪﻫﺎ ﻫﺴﺘﻨﺪ ﮐﻪ ﺑﺎﯾﺪ ﺑﻪ ﮔﻮﻧﻪای ﺗﻤﺎم‬
‫آنﻫﺎ را ذﺧﯿﺮه ﮐﻨﯿﺪ‪ .‬ﻫﺮﮐﺪام از اﯾﻦ وﯾﮋﮔ ﻫﺎ را ﻣ ﺗﻮان در ﻣﺘﻐﯿﺮﻫﺎﯾ از ﻧﻮع ﻟﯿﺴﺖ دوﺑﻌﺪی )ﻟﯿﺴﺘ از ﻟﯿﺴﺖﻫﺎ(‬
‫ذﺧﯿﺮه ﮐﻨﯿﺪ‪ .‬از آن ﺟﺎﯾ ﮐﻪ ﺗﻤﺎم ﺗﻮاﺑﻌ ﮐﻪ ﺑﻌﺪاً ﻣﻌﺮﻓ ﻣ ﺷﻮﻧﺪ‪ ،‬ﺑﻪ اﯾﻦ اﻃﻼﻋﺎت ﻧﯿﺎز ﺧﻮاﻫﻨﺪ داﺷﺖ‪ ،‬ﺑﺎﯾﺪ ﻣﺘﻐﯿﺮﻫﺎی‬
‫ﻣﺮﺑﻮط ﺑﻪ ﺟﺪول ﺑﺎزی ﻫﻤ ﺑﻪ ﺻﻮرت ‪ global‬ﺗﻌﺮﯾﻒ ﺷﻮﻧﺪ‪.‬‬
‫ﻧﻤﻮﻧﻪای از ﻣﺘﻐﯿﺮﻫﺎی ﻻزم ﺑﺮای ﺑﺎزی در زﯾﺮ ﺗﻌﺮﯾﻒ ﺷﺪهاﻧﺪ‪ .‬اﻟﺒﺘﻪ ﺷﻤﺎ ﻣ ﺗﻮاﻧﯿﺪ در ﻃﻮل ﭘﺮوژه ﻫﺮ ﺗﻌﺪاد دﯾ ﺮی از‬
‫ﻣﺘﻐﯿﺮﻫﺎ ﮐﻪ ﻧﯿﺎز دارﯾﺪ ﺑﻪ اﯾﻦ ﺑﺨﺶ اﺿﺎﻓﻪ ﮐﻨﯿﺪ‪ ،‬و ﯾﺎ دادهﻫﺎ را ﺑﻪ ﻫﺮ ﺷ ﻞ ﻣﻨﻄﻘ دﯾ ﺮی ﻧ ﻪداری ﮐﻨﯿﺪ‪.‬‬
‫‪# global variables‬‬
‫‪global size , board , mines‬‬
‫در ﻧﻤﻮﻧﻪ ﮐﺪ ﺑﺎﻻ‪ ،‬ﻣﺘﻐﯿﺮ اول اﻧﺪازهی ﺟﺪول‪ ،‬ﯾﻌﻨ ﺗﻌﺪاد ﺳﻄﺮﻫﺎ و ﺳﺘﻮنﻫﺎ را ﻧ ﻪداری ﻣ ﮐﻨﺪ‪ .‬در اﯾﻦ ﭘﺮوژه ﻣﺎ‬
‫ﻓﺮض ﻣ ﮐﻨﯿﻢ ﮐﻪ ﺟﺪول ﺑﺎزی ﻣﺮﺑﻌ ﺷ ﻞ اﺳﺖ و ﺑﻨﺎﺑﺮاﯾﻦ ﺗﻌﺪاد ﺳﻄﺮﻫﺎ و ﺳﺘﻮنﻫﺎی آن ﺑﺮاﺑﺮ اﺳﺖ‪ .‬ﻣﺘﻐﯿﺮ ‪board‬‬
‫ﺑﺮای ﻧ ﻪداری وﺿﻌﯿﺖ ﺧﺎﻧﻪﻫﺎ از ﻟﺤﺎظ آﺷ ﺎرﺳﺎزی و ﻗﺮارﮔﺮﻓﺘﻦ ﭘﺮﭼﻢ اﺳﺘﻔﺎده ﻣ ﺷﻮد‪ .‬ﺑﻪ ﻃﻮر ﻣﺜﺎل‪ ،‬ﻫﺮ ﺧﺎﻧﻪ از‬
‫اﯾﻦ ﺟﺪول ﻣ ﺗﻮاﻧﺪ ﺷﺎﻣﻞ ﻋﺪد ‪ ٠‬ﺑﻪ ﻣﻌﻨ ﭘﻨﻬﺎن ﺑﻮدن‪ ١ ،‬ﺑﻪ ﻣﻌﻨ آﺷ ﺎر ﮔﺮدﯾﺪن‪ ،‬و ‪ ٢‬ﺑﻪ ﻣﻌﻨ ﻗﺮار ﮔﺮﻓﺘﻦ ﭘﺮﭼﻢ‬
‫ﺑﺎﺷﺪ‪ .‬ﻣﺘﻐﯿﺮ ‪ mines‬ﻧﯿﺰ ﺑﺮای ﻧ ﻪداری ﻣ ﺎنﻫﺎی ﻣﯿﻦ ﻣﻮرد اﺳﺘﻔﺎده ﻗﺮار ﻣ ﮔﯿﺮد‪.‬‬
‫‪٢‬‬
‫ﺗﻮﻟﯿﺪ ﺟﺪول ﺗﺼﺎدﻓ‬
‫ﭘﯿﺶ از ﺷﺮوع ﺑﺎزی‪ ،‬ﺑﺎﯾﺪ ﺟﺪول ﺑﺎزی را اﯾﺠﺎد ﮐﺮده و ﻣﯿﻦﻫﺎ را ﺑﻪ ﺻﻮرت ﺗﺼﺎدﻓ در ﺧﺎﻧﻪﻫﺎی آن ﻗﺮار دﻫﯿﺪ‪ .‬ﺑﺮای‬
‫اﯾﻦ ﮐﺎر ﺗﺎﺑﻌ ﺑﻪ ﺷ ﻞ زﯾﺮ ﺑﻨﻮﯾﺴﯿﺪ ﮐﻪ اﻧﺪازهی ﺟﺪول و ﺗﻌﺪاد ﻣﯿﻦﻫﺎ را ﺑﻪ ﻋﻨﻮان ورودی ﮔﺮﻓﺘﻪ و ﺟﺪول ﺑﺎزی را‬
‫ﺑﺴﺎزد‪ .‬ﺷﻤﺎ ﺑﺎﯾﺪ ﻫﻤﻪی ﻣﺘﻐﯿﺮﻫﺎی ﻣﺮﺑﻮط ﺑﻪ ﺟﺪول ﺑﺎزی را در اﯾﻦ ﺗﺎﺑﻊ ﻣﻘﺪاردﻫ ﮐﻨﯿﺪ‪.‬‬
‫‪def create_board ( board_size , num_mines ):‬‬
‫''' ‪'''Create a random board of given size with given number of mines‬‬
‫‪٣‬‬
‫ﻧﻤﺎﯾﺶ ﺟﺪول‬
‫ﺑﺮای ﻧﻤﺎﯾﺶ ﺟﺪول ﺑﺎزی در ﺧﺮوﺟ ﺗﺎﺑﻊ زﯾﺮ را ﺗﻌﺮﯾﻒ ﻣ ﮐﻨﯿﻢ‪.‬‬
‫‪def print_board ( show_mines = False ):‬‬
‫''' ‪'''Print game board ; also show mines if show_mines is True‬‬
‫اﯾﻦ ﺗﺎﺑﻊ‪ ،‬ﺑﻪ ازای ﻫﺮ ﺧﺎﻧﻪی ﺑﺪون ﭘﺮﭼﻢ ﯾ ﮐﺎراﮐﺘﺮ '‪ '#‬و ﺑﻪ ازای ﻫﺮ ﺧﺎﻧﻪی ﭘﺮﭼﻢدار ﯾ‬
‫ﻣ ﮐﻨﺪ‪ .‬ﺑﻪ ﻃﻮر ﻣﺜﺎل در ﺟﺪول ‪ ۴ × ۴‬زﯾﺮ ﺧﺎﻧﻪﻫﺎی )‪ (٢, ٠‬و )‪ (٢, ٢‬ﺣﺎوی ﭘﺮﭼﻢ ﻫﺴﺘﻨﺪ‪.‬‬
‫ﮐﺎراﮐﺘﺮ '‪ 'p‬ﭼﺎپ‬
‫‪#‬‬
‫‪#‬‬
‫‪#‬‬
‫‪#‬‬
‫‪٢‬‬
‫‪#‬‬
‫‪#‬‬
‫‪p‬‬
‫‪#‬‬
‫‪#‬‬
‫‪#‬‬
‫‪#‬‬
‫‪#‬‬
‫‪#‬‬
‫‪#‬‬
‫‪p‬‬
‫‪#‬‬
‫ﭘﺎراﻣﺘﺮ ورودی اﯾﻦ ﺗﺎﺑﻊ ﻣﺸﺨﺺ ﻣ ﮐﻨﺪ ﮐﻪ آﯾﺎ ﻣﯿﻦﻫﺎ ﻧﯿﺰ ﺑﺎﯾﺪ در ﺟﺪول ﻧﺸﺎن داده ﺷﻮﻧﺪ ﯾﺎ ﺧﯿﺮ‪ .‬در ﺻﻮرﺗ ﮐﻪ‬
‫ﻣﻘﺪار اﯾﻦ ﭘﺎراﻣﺘﺮ ‪ False‬ﺑﺎﺷﺪ‪ ،‬ﻣﯿﻦﻫﺎ ﻫﻢ ﻣﺜﻞ ﺧﺎﻧﻪﻫﺎی ﺧﺎﻟ ﺑﺎ ﻫﻤﺎن ﮐﺎراﮐﺘﺮ '‪ ،'#‬و در ﺻﻮرﺗ ﮐﻪ ﻣﻘﺪار اﯾﻦ‬
‫ﭘﺎراﻣﺘﺮ ‪ True‬ﺑﺎﺷﺪ ﺑﺎ ﮐﺎراﮐﺘﺮ '@' ﻧﺸﺎن داده ﻣ ﺷﻮﻧﺪ‪) .‬ﺧﺎﻧﻪﻫﺎی ﻣﯿﻨ ﮐﻪ ﺑﺮ روی آنﻫﺎ ﭘﺮﭼﻢ ﮔﺬاﺷﺘﻪ ﺷﺪه اﺳﺖ‬
‫ﺑﺎ ﻫﻤﺎن '‪ 'p‬ﻧﺸﺎن داده ﺷﻮﻧﺪ‪ (.‬ﻣﺜﺎل زﯾﺮ را ﺑﺒﯿﻨﯿﺪ‪.‬‬
‫‪#‬‬
‫‪#‬‬
‫@‬
‫‪#‬‬
‫‪#‬‬
‫‪#‬‬
‫‪p‬‬
‫‪#‬‬
‫@‬
‫‪#‬‬
‫‪#‬‬
‫@‬
‫‪#‬‬
‫‪#‬‬
‫‪p‬‬
‫‪#‬‬
‫‪ ۴‬ﭘﺮﭼﻢ ﮔﺬاری‬
‫ﻫﻤﺎنﻃﻮر ﮐﻪ دﯾﺪﯾﻢ‪ ،‬ﺑﺎزیﮐﻦ ﻣ ﺗﻮاﻧﺪ در ﻃﻮل ﺑﺎزی ﺑﺮ روی ﺧﺎﻧﻪﻫﺎﯾ ﮐﻪ ﺣﺪس ﻣ زﻧﺪ ﺷﺎﻣﻞ ﻣﯿﻦ ﻫﺴﺘﻨﺪ‪ ،‬ﭘﺮﭼﻢ‬
‫ﻗﺮار دﻫﺪ‪ .‬در اﯾﻦ ﺑﺨﺶ ﺗﻮاﺑﻊ ﻣﻮردﻧﯿﺎز ﺑﺮای ﮔﺬاﺷﺘﻦ و ﺑﺮداﺷﺘﻦ ﭘﺮﭼﻢﻫﺎ را ﭘﯿﺎدهﺳﺎزی ﻣ ﮐﻨﯿﻢ‪.‬‬
‫ﺗﺎﺑﻊ زﯾﺮ در ﺳﻄﺮ و ﺳﺘﻮن دادهﺷﺪه ﯾ ﭘﺮﭼﻢ ﻗﺮار ﻣ دﻫﺪ‪.‬‬
‫‪def put_flag (row , col):‬‬
‫''' ‪'''Put a flag in the given cell‬‬
‫ﺗﺎﺑﻊ زﯾﺮ ﭘﺮﭼﻢ ﻣﻮﺟﻮد در ﺧﺎﻧﻪی دادهﺷﺪه را ﺣﺬف ﻣ ﮐﻨﺪ‪.‬‬
‫‪def remove_flag (row , col):‬‬
‫''' ‪'''Remove flag from the given cell if any exists‬‬
‫‪۵‬‬
‫آﺷ ﺎرﺳﺎزی‬
‫در اﯾﻦ ﺑﺨﺶ‪ ،‬ﺗﻮاﺑﻊ ﻣﺮﺑﻮط ﺑﻪ اﺟﺮای ﺑﺎزی را ﭘﯿﺎدهﺳﺎزی ﻣ ﮐﻨﯿﻢ‪ .‬اﺑﺘﺪا ﻻزم اﺳﺖ ﮐﻪ ﺑﺘﻮاﻧﯿﻢ ﺗﻌﺪاد ﻣﯿﻦﻫﺎی اﻃﺮاف‬
‫ﯾ ﺧﺎﻧﻪ از ﺟﺪول را ﻣﺤﺎﺳﺒﻪ ﮐﻨﯿﻢ‪ .‬ﺗﺎﺑﻊ ‪ count_mines‬اﯾﻦ ﮐﺎر را ﺑﺮای ﻣﺎ اﻧﺠﺎم دﻫﺪ‪ .‬ﺑﻪ اﯾﻦ ﺻﻮرت ﮐﻪ‬
‫ﻣﺨﺘﺼﺎت ﯾ ﺧﺎﻧﻪ را ﮔﺮﻓﺘﻪ و ﺗﻌﺪاد ﻣﯿﻦﻫﺎی ﻣﻮﺟﻮد در )ﺣﺪاﮐﺜﺮ( ﻫﺸﺖ ﺧﺎﻧﻪی اﻃﺮاف آن را ﺑﺮﻣ ﮔﺮداﻧﺪ‪.‬‬
‫‪def count_mines (row , col):‬‬
‫''' ‪'''Count the number of mines in cells adjacent to a given cell‬‬
‫ﺗﺎﺑﻊ زﯾﺮ ﺧﺎﻧﻪی دادهﺷﺪه از ﺟﺪول را آﺷ ﺎر ﻣ ﮐﻨﺪ )ﻣﺸﺎﺑﻪ ﮐﻠﯿ ﮐﺮدن ﺑﺮ روی ﯾ ﺧﺎﻧﻪ در ﺑﺎزی ﮔﺮاﻓﯿ (‪ .‬اﮔﺮ‬
‫ﺧﺎﻧﻪی اﻧﺘﺨﺎبﺷﺪه ﺧﺎﻟ ﺑﻮد‪ ،‬ﺧﺮوﺟ ﺗﺎﺑﻊ ﺗﻌﺪاد ﻣﯿﻦﻫﺎی ﻣﻮﺟﻮد در ﺧﺎﻧﻪﻫﺎی اﻃﺮاف آن ﺧﺎﻧﻪ ﺧﻮاﻫﺪ ﺑﻮد‪ .‬در‬
‫ﺻﻮرﺗ ﮐﻪ ﺧﺎﻧﻪی اﻧﺘﺨﺎبﺷﺪه ﺣﺎوی ﯾ ﻣﯿﻦ ﺑﻮد‪ ،‬ﺧﺮوﺟ ﺗﺎﺑﻊ ‪ −١‬اﺳﺖ‪.‬‬
‫‪def reveal_cell (row , col):‬‬
‫‪'''Reveal a cell. If it is bomb , return -1, else retuen number of‬‬
‫''' ‪mines around the cell‬‬
‫‪٣‬‬
‫ﻫﻨ ﺎم ﻓﺮاﺧﻮاﻧ ﺗﺎﺑﻊ ‪ print_board‬ﺑﻪ ازای ﺧﺎﻧﻪﻫﺎﯾ ﮐﻪ آﺷ ﺎر ﺷﺪهاﻧﺪ‪ ،‬ﺑﻪ ﺟﺎی '‪ '#‬ﺑﺎﯾﺪ ﺗﻌﺪاد ﻣﯿﻦﻫﺎﯾ ﮐﻪ در‬
‫اﻃﺮاف آن ﺧﺎﻧﻪ وﺟﻮد دارد ﮔﺬاﺷﺘﻪ ﺷﻮد‪ .‬ﺑﺮای ﻣﺜﺎل اﮔﺮ در ﺟﺪول ﻗﺒﻠ ‪ ،‬ﺗﺎﺑﻊ ‪ reveal_cell‬را ﺑﺮای ﺧﺎﻧﻪ )‪(١, ١‬‬
‫و ﺳﭙﺲ )‪ (٠, ٣‬ﻓﺮاﺧﻮاﻧ ﮐﻨﯿﻢ‪ ،‬ﺑﺎ ﺻﺪا زدن ﺗﺎﺑﻊ )‪ print_board(True‬ﺧﺮوﺟ زﯾﺮ را ﺧﻮاﻫﯿﻢ داﺷﺖ‪.‬‬
‫‪0‬‬
‫‪#‬‬
‫@‬
‫‪#‬‬
‫‪#‬‬
‫‪#‬‬
‫‪p‬‬
‫‪#‬‬
‫@‬
‫‪1‬‬
‫‪#‬‬
‫@‬
‫‪#‬‬
‫‪#‬‬
‫‪p‬‬
‫‪#‬‬
‫ﻧ ﺘﻪ‪ :‬ﻫﻤﺎنﻃﻮر ﮐﻪ ﻣﺸﺎﻫﺪه ﻣ ﮐﻨﯿﺪ‪ ،‬ﺧﺎﻧﻪی )‪ (٠, ٣‬دارای ﻣﻘﺪار ﺻﻔﺮ اﺳﺖ‪ .‬در ﺑﺎزی اﺻﻠ ﻣﯿﻦروب‪ ،‬ﻫﺮﮔﺎه ﺷﻤﺎ‬
‫ﺑﺮ روی ﺧﺎﻧﻪای ﮐﻪ ﻋﺪد آن ﺻﻔﺮ اﺳﺖ )ﯾﻌﻨ ﻧﻪ ﺧﻮدش و ﻧﻪ ﻫﯿﭻﮐﺪام از ﻫﻤﺴﺎﯾ ﺎﻧﺶ ﻣﯿﻦ ﻧﺪارﻧﺪ( ﮐﻠﯿ ﮐﻨﯿﺪ‪،‬‬
‫ﺧﺎﻧﻪﻫﺎی ﺟﺪول ﺗﺎ رﺳﯿﺪن ﺑﻪ ﻣﺮز ﺟﺪول ﯾﺎ ﺧﺎﻧﻪﻫﺎی ﻏﯿﺮﺻﻔﺮ ﻫﻤ آﺷ ﺎر ﻣ ﺷﻮﻧﺪ‪ .‬در اﯾﻦ ﻗﺴﻤﺖ از ﭘﺮوژه‪ ،‬ﺑﺮای‬
‫ﺳﺎدﮔ ﮐﺎر ﺷﻤﺎ‪ ،‬اﯾﻦ ﻗﺴﻤﺖ اﻣﺘﯿﺎزی ﺧﻮاﻫﺪ ﺑﻮد! اﮔﺮ ﻋﺪد ﺧﺎﻧﻪای ﮐﻪ آﺷ ﺎر ﻣ ﮐﻨﯿﺪ ﺻﻔﺮ ﺑﻮد‪ ،‬ﺑﻪ ﺻﻮرت ﺑﺎزﮔﺸﺘ‬
‫ﺗﻤﺎم ﺧﺎﻧﻪﻫﺎی ﻫﻤﺴﺎﯾﻪی آن را ﮐﻪ ﺻﻔﺮ ﻫﺴﺘﻨﺪ آﺷ ﺎر ﮐﻨﯿﺪ‪.‬‬
‫‪۶‬‬
‫وﺿﻌﯿﺖ ﺑﺮد‬
‫در اﯾﻦ ﻗﺴﻤﺖ ﻣ ﺧﻮاﻫﯿﻢ وﺿﻌﯿﺖ ﺑﺮدن ﺑﺎزی را ﭼ ﮐﻨﯿﻢ‪ .‬ﺑﺎزیﮐﻦ ﻣﻮﻗﻌ ﺑﺎزی را ﻣ ﺑﺮد ﮐﻪ ﻫﻤﻪی ﺧﺎﻧﻪﻫﺎی‬
‫ﺧﺎﻟ ﺟﺪول آﺷ ﺎر ﺷﺪه ﺑﺎﺷﻨﺪ و روی ﻫﻤﻪی ﺧﺎﻧﻪﻫﺎی ﺣﺎوی ﻣﯿﻦ در ﻧﻘﺸﻪ ﭘﺮﭼﻢ ﮔﺬاﺷﺘﻪ ﺷﺪه ﺑﺎﺷﺪ‪ .‬ﺗﺎﺑﻊ زﯾﺮ ﺑﺎﯾﺪ‬
‫ﺑﺮرﺳ ﮐﻨﺪ ﮐﻪ آﯾﺎ ﭼﻨﯿﻦ ﺣﺎﻟﺘ ﭘﯿﺶ آﻣﺪه اﺳﺖ ﯾﺎ ﺧﯿﺮ‪ .‬اﮔﺮ ﭘﯿﺶ آﻣﺪه ﺑﺎﺷﺪ ﺗﺎﺑﻊ ﻣﻘﺪار ‪ True‬و در ﻏﯿﺮ اﯾﻦ ﺻﻮرت‬
‫ﻣﻘﺪار ‪ False‬ﺑﺮﻣ ﮔﺮداﻧﺪ‪.‬‬
‫‪def won ():‬‬
‫''' ‪'''Check if the player has won or not‬‬
‫‪٧‬‬
‫ﺑﺎزی ﻧﻬﺎﯾ‬
‫ﺣﺎﻻ ﻣ ﺧﻮاﻫﯿﻢ ﺑﺎ اﺳﺘﻔﺎده از ﺗﺎﺑﻊﻫﺎﯾ ﮐﻪ ﻧﻮﺷﺘﯿﻢ‪ ،‬ﯾ‬
‫ﻧﻮﺷﺘﻪ ﻣ ﺷﻮد‪.‬‬
‫ﺑﺎزی ﮐﺎﻣﻞ و ﻗﺎﺑﻞ اﺟﺮا ﺑﺴﺎزﯾﻢ‪ .‬ﮐﺪ اﯾﻦ ﻗﺴﻤﺖ در ﺗﺎﺑﻊ زﯾﺮ‬
‫‪def main ():‬‬
‫''' ‪'''The main loop of the game‬‬
‫اﺑﺘﺪا از ورودی دو ﻋﺪد ﺑﺨﻮاﻧﯿﺪ ﮐﻪ ﺑﻪ ﺗﺮﺗﯿﺐ ﻣﺸﺨﺺﮐﻨﻨﺪهی اﻧﺪازهی ﺟﺪول )ﺗﻌﺪاد ﺳﻄﺮﻫﺎ و ﺳﺘﻮنﻫﺎی آن( و‬
‫ﺗﻌﺪاد ﻣﯿﻦﻫﺎی ﻣﻮﺟﻮد در ﺟﺪول اﺳﺖ‪ .‬ﺑﺎ اﺳﺘﻔﺎده از ﺗﺎﺑﻊ ﻧﻮﺷﺘﻪﺷﺪه در ﺑﺨﺶﻫﺎی ﻗﺒﻞ‪ ،‬ﯾ ﺟﺪول ﺗﺼﺎدﻓ ﺑﺎ‬
‫ﻣﺸﺨﺼﺎت دادهﺷﺪه ﺗﻮﻟﯿﺪ ﮐﻨﯿﺪ‪ .‬ﺳﭙﺲ ﺗﺎ ﺗﻤﺎم ﺷﺪن ﺑﺎزی‪ ،‬دﺳﺘﻮرﻫﺎی ﮐﺎرﺑﺮ را از ورودی ﺑ ﯿﺮﯾﺪ و آن را اﺟﺮا ﮐﻨﯿﺪ‪.‬‬
‫دﺳﺘﻮرﻫﺎﯾ ﮐﻪ ﮐﺎرﺑﺮ وارد ﻣ ﮐﻨﺪ در ﻗﺎﻟﺐ زﯾﺮ ﻫﺴﺘﻨﺪ‪:‬‬
‫> ‪[r|f|u|x] <row > <col‬‬
‫ﻫﺮ دﺳﺘﻮر ﺑﺎ ﯾ از ﮐﺎراﮐﺘﺮﻫﺎی ‪ u, f, r‬و ‪ x‬ﺷﺮوع ﺷﺪه و ﺳﭙﺲ ﻣﺨﺘﺼﺎت ﯾ ﺧﺎﻧﻪ از ﻧﻘﺸﻪ داده ﻣ ﺷﻮد‪ .‬ﺷﻤﺎ‬
‫ﺑﺎﯾﺪ دﺳﺘﻮری ﮐﻪ ﮐﺎراﮐﺘﺮ دادهﺷﺪه ﻣﺸﺨﺺ ﻣ ﮐﻨﺪ را ﺑﺮ روی آن ﺧﺎﻧﻪ اﺟﺮا ﮐﻨﯿﺪ‪ .‬دﺳﺘﻮرﻫﺎ ﺑﻪ ﺻﻮرت زﯾﺮ ﻫﺴﺘﻨﺪ‪:‬‬
‫• ‪ :r‬دﺳﺘﻮر آﺷ ﺎرﺳﺎزی اﺳﺖ‪ .‬ﯾﻌﻨ ﺑﺎﯾﺪ روی ﺧﺎﻧﻪی دادهﺷﺪه ﺗﺎﺑﻊ ‪ reveal_cell‬را ﺻﺪا ﺑﺰﻧﯿﺪ‪.‬‬
‫‪۴‬‬
‫• ‪ :f‬دﺳﺘﻮر ﮔﺬاﺷﺘﻦ ﭘﺮﭼﻢ اﺳﺖ‪ .‬ﯾﻌﻨ ﺑﺎﯾﺪ روی ﺧﺎﻧﻪی دادهﺷﺪه ﺗﺎﺑﻊ ‪ put_flag‬را ﺻﺪا ﺑﺰﻧﯿﺪ‪.‬‬
‫• ‪ :u‬دﺳﺘﻮر ﺑﺮداﺷﺘﻦ ﭘﺮﭼﻢ اﺳﺖ‪ .‬ﯾﻌﻨ ﺑﺎﯾﺪ روی ﺧﺎﻧﻪی دادهﺷﺪه ﺗﺎﺑﻊ ‪ remove_flag‬را ﺻﺪا ﺑﺰﻧﯿﺪ‪.‬‬
‫• ‪ :x‬دﺳﺘﻮر ﺧﺮوج از ﺑﺮﻧﺎﻣﻪ اﺳﺖ‪ .‬در ﺻﻮرت ورود اﯾﻦ دﺳﺘﻮر‪ ،‬ﻧﯿﺎزی ﺑﻪ ذﮐﺮ ﻣﺨﺘﺼﺎت ﺧﺎﻧﻪای از ﺟﺪول‬
‫ﻧﯿﺴﺖ‪.‬‬
‫ﺑﻪ ﻋﻨﻮان ﻣﺜﺎل‪ ،‬دﺳﺘﻮر زﯾﺮ ﺑﻪ اﯾﻦ ﻣﻌﻨ اﺳﺖ ﮐﻪ ﺧﺎﻧﻪی ﻣﻮﺟﻮد در ﺳﻄﺮ ‪ ٣‬و ﺳﺘﻮن ‪ ٢‬را آﺷ ﺎر ﮐﻨﯿﺪ‪.‬‬
‫‪r 3 2‬‬
‫ﺑﻌﺪ از ورود ﻫﺮ ﯾ از دﺳﺘﻮرﻫﺎی ﺑﺎﻻ و اﺟﺮای آن ﺗﻮﺳﻂ ﺑﺮﻧﺎﻣﻪ‪ ،‬ﺑﺎﯾﺪ ﻧﻘﺸﻪی ﺑﺎزی را )ﺑﺪون ﻧﺸﺎن دادن ﻣﺤﻞ ﻣﯿﻦﻫﺎ(‬
‫ﭼﺎپ ﮐﻨﯿﺪ‪ .‬در ﺻﻮرﺗ ﮐﻪ دﺳﺘﻮر دادهﺷﺪه ﺗﻮﺳﻂ ﮐﺎرﺑﺮ ﻣﻌﺘﺒﺮ ﻧﺒﻮد‪ ،‬ﻣﺜﻼ ﮐﺎراﮐﺘﺮﻫﺎی واردﻧﺸﺪه ﻫﯿﭻ ﯾ از ﭼﻬﺎر‬
‫ﮐﺎرﮐﺘﺮ ﻣﻮردﻧﻈﺮ ﻧﺒﻮده‪ ،‬ﯾﺎ ﻣﺨﺘﺼﺎت دادهﺷﺪه ﺻﺤﯿﺢ ﻧﺒﻮد‪ ،‬ﻋﺒﺎرت زﯾﺮ را ﭼﺎپ ﮐﺮده و ﺑﻪ ﺳﺮاغ دﺳﺘﻮر ﺑﻌﺪی ﺑﺮوﯾﺪ‪.‬‬
‫! ‪Invalid Command‬‬
‫ﺑﻌﺪ از اﺟﺮای ﻫﺮ دﺳﺘﻮر ﺑﺎﯾﺪ ﺑﺮرﺳ ﮐﻨﯿﺪ ﮐﻪ آﯾﺎ ﺑﺎزی ﺗﻤﺎم ﺷﺪه اﺳﺖ ﯾﺎ ﺧﯿﺮ‪ .‬در ﺻﻮرﺗ ﮐﻪ ﺑﺎزیﮐﻦ ﺑﺎﺧﺘﻪ ﺑﺎﺷﺪ‬
‫)ﯾﻌﻨ دﺳﺘﻮر آﺷ ﺎرﺳﺎزی ﺧﺎﻧﻪی ﮐﻪ در آن ﻣﯿﻦ اﺳﺖ را وارد ﮐﺮده ﺑﺎﺷﺪ( ﻋﺒﺎرت زﯾﺮ را ﭼﺎپ ﮐﻨﯿﺪ‪:‬‬
‫!‪You Lost‬‬
‫در ﺻﻮرﺗ ﮐﻪ ﺑﺎزیﮐﻦ ﺑﺎزی را ﺑﺮده ﺑﺎﺷﺪ‪ ،‬ﻋﺒﺎرت زﯾﺮ را ﭼﺎپ ﮐﻨﯿﺪ‪:‬‬
‫!‪You Won‬‬
‫ﺑﻌﺪ از ﭼﺎپ ﻫﺮ ﮐﺪام از ﻋﺒﺎرتﻫﺎی ﺑﺎﻻ‪ ،‬اﺟﺮای ﺑﺮﻧﺎﻣﻪ را ﺗﻤﺎم ﮐﻨﯿﺪ‪.‬‬
‫‪۵‬‬