HW3.pdf

‫ﯾﺎﻟﻄﯿﻒ‬
‫ﻫﻮش ﻣﺼﻨﻮﻋ‬
‫ﻧﯿﻢﺳﺎل دوم ‪٩٢٩١‬‬
‫ﻣﺪرس‪ :‬دﮐﺘﺮ ﺳﻠﯿﻤﺎﻧ‬
‫داﻧﺸ ﺪهی ﻣﻬﻨﺪﺳ ﮐﺎﻣﭙﯿﻮﺗﺮ‬
‫ﺗﻤﺮﯾﻦ ﺷﻤﺎرهی ﺳﻮم‬
‫ﻣﻬﻠﺖ ارﺳﺎل‪ ٣٠ :‬ﻓﺮوردﯾﻦ‬
‫ﺗﻮﺿﯿﺢ ﺗﻤﺮﯾﻦ‬
‫• ﺗﻤﺮﯾﻦ ﺷﻤﺎ دارای دو ﺑﺨﺶ اﺳﺖ‪ :‬ﺑﺨﺶ ﺗﺌﻮری و ﺑﺨﺶ ﻋﻤﻠ ‪ .‬در ﺑﺨﺶ ﺗﺌﻮری ﺑﺎﯾﺪ ﺑﻪ ﺗﻌﺪادی ﺳﻮال در راﺑﻄﻪ ﺑﺎ‬
‫ﻓﺼﻞ ﭘﻨﺠﻢ درسﺗﺎن ﭘﺎﺳﺦ دﻫﯿﺪ‪ .‬در ﺑﺨﺶ ﻋﻤﻠ ﺑﺎﯾﺪ ﺑﺮای ﺑﺎزی اﺗﻠﻮ ﯾ ﻋﺎﻣﻞ ﻫﻮﺷﻤﻨﺪ ﻃﺮاﺣ ﮐﻨﯿﺪ‪.‬‬
‫• اﯾﻦ ﺗﻤﺮﯾﻦ در ﻣﺠﻤﻮع ‪ ١١۵‬ﻧﻤﺮه دارد ﮐﻪ ‪ ١۵‬ﻧﻤﺮهی آن اﻣﺘﯿﺎزی اﺳﺖ و ﻣﺮﺑﻮط ﺑﻪ ﺑﺨﺶ ﻋﻤﻠ اﺳﺖ‪ .‬از ‪ ١٠٠‬ﻧﻤﺮهی‬
‫اﺟﺒﺎری‪ ٣٠ ،‬ﻧﻤﺮه ﻣﺮﺑﻮط ﺑﻪ ﺑﺨﺶ ﺗﺌﻮری اﺳﺖ و ‪ ٧٠‬ﻧﻤﺮه ﻣﺮﺑﻮط ﺑﻪ ﺑﺨﺶ ﻋﻤﻠ اﺳﺖ‪.‬‬
‫• در ﺻﻮرت ﻣﺸﺎﻫﺪهی ﺗﻘﻠﺐ ﺑﺮای ﻫﺮ دو ﻃﺮف ﻧﻤﺮهی ﺻﻔﺮ ﻣﻨﻈﻮر ﻣ ﺷﻮد‪.‬‬
‫• ﺑﻪ ازای ﻫﺮ روز دﯾﺮﮐﺮد در ﺗﺤﻮﯾﻞ ﺗﻤﺮﯾﻦ‪ ١٠٪ ،‬از ﻧﻤﺮهی آن ﮐﺎﺳﺘﻪ ﺧﻮاﻫﺪ ﺷﺪ‪.‬‬
‫• ﺟﻮاب ﺗﻤﺮﯾﻦﻫﺎی ﺧﻮد را ﺑﻪ آدرس ‪ [email protected]‬ﺑﺎ ﻣﻮﺿﻮع ]‪ HW3-[student-ID‬ارﺳﺎل‬
‫ﮐﻨﯿﺪ‪ .‬ﺑﺮای ﻫﺮ ﺑﺨﺶ ﻓﺎﯾﻞﻫﺎی ﻻزم ﺑﺮای ارﺳﺎل ﺗﻮﺿﯿﺢ داده ﺷﺪه اﺳﺖ‪.‬‬
‫• در ﺻﻮرﺗ ﮐﻪ در راﺑﻄﻪ ﺑﺎ ﺗﻤﺮﯾﻦ ﺳﻮاﻟ دارﯾﺪ آن را در ﮔﺮوه درس ﺑﻪ آدرس زﯾﺮ ﻣﻄﺮح ﮐﻨﯿﺪ‪:‬‬
‫‪https://groups.google.com/forum/#!forum/sharif_ai_91-92_2‬‬
‫‪ .١‬ﺑﺨﺶ ﻋﻤﻠ ‪ ١۵ + ٧٠ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .‬ﻧﻤﺮه‬
‫در اﯾﻦ ﺑﺨﺶ ﺷﻤﺎ ﺑﺎﯾﺪ ﺑﺮای ﺑﺎزی دو ﻧﻔﺮهی اﺗﻠﻮ )ﺑﺎ اﻧﺪﮐ ﺗﻐﯿﯿﺮ( ﺑﺎ اﺳﺘﻔﺎده از اﻟ ﻮرﯾﺘﻢ ‪ M inimax‬و روش ﺑﻬﯿﻨﻪﺳﺎزی‬
‫‪ Alpha − Beta‬ﯾ ﻋﺎﻣﻞ ﻫﻮﺷﻤﻨﺪ ﺑﻪ زﺑﺎن ﺟﺎوا ﻃﺮاﺣ ﮐﻨﯿﺪ‪http://en.wikipedia.org/wiki/Reversi :‬‬
‫ﻗﻮاﻧﯿﻦ‬
‫در ﻟﯿﻨ ﺑﺎﻻ‪ ،‬ﻗﻮاﻧﯿﻦ ﺑﺎزی ﺑﻪ ﻫﻤﺮاه ﻧ ﺎﺗ ﻣﻔﯿﺪ در راﺑﻄﻪ ﺑﺎ اﺳﺘﺮاﺗﮋیﻫﺎی ﺑﺎزی وﺟﻮد دارد‪ .‬در اﯾﻨﺠﺎ ﺑﻪ ﻃﻮر ﺧﻼﺻﻪ ﻗﻮاﻧﯿﻦ‬
‫ﺑﺎزی را ﻣﺮور ﻣ ﮐﻨﯿﻢ‪:‬‬
‫• ﺑﺎزی روی ﯾ‬
‫ﺟﺪول ‪ ٨ × ٨‬اﻧﺠﺎم ﻣ ﺷﻮد ﮐﻪ در اﺑﺘﺪا ‪ ۴‬ﺧﺎﻧﻪی ﻣﺮﮐﺰی آن ﻣﻄﺎﺑﻖ ﺷ ﻞ ‪ ١‬زﯾﺮ ﭘﺮ ﺷﺪه اﺳﺖ‪.‬‬
‫• ﺑﺎزﯾ ﻦ ﺳﯿﺎه ﺑﺎزی را آﻏﺎز ﻣ ﮐﻨﺪ‪ .‬او ﺑﺎﯾﺪ ﻣﻬﺮهاش را ﺟﺎﯾ ﺑ ﺬارد ﮐﻪ ﺣﺪاﻗﻞ در ﯾ از راﺳﺘﺎﻫﺎی ﻋﻤﻮدی‪ ،‬اﻓﻘ ﯾﺎ‬
‫ﻗﻄﺮی ﻣﻬﺮهی ﺳﯿﺎه دﯾ ﺮی ﺑﺎﺷﺪ و ﻓﺎﺻﻠﻪی ﺑﯿﻦ اﯾﻦ دو ﻣﻬﺮهی ﺳﯿﺎه را ﺗﻤﺎﻣﺎ ﻣﻬﺮهﻫﺎی ﺳﻔﯿﺪ )ﮐﻪ ﺗﻌﺪاد آﻧﻬﺎ ﺣﺪاﻗﻞ‬
‫ﯾ اﺳﺖ( ﭘﺮ ﮐﺮده ﺑﺎﺷﺪ‪ .‬ﺑﻌﺪ از اﯾﻦ ﺣﺮﮐﺖ ﺗﻤﺎﻣ اﯾﻦ ﻣﻬﺮهﻫﺎی ﺳﻔﯿﺪ )در ﻫﻤﻪی راﺳﺘﺎﻫﺎی ﻋﻤﻮدی‪ ،‬اﻓﻘ و ﻗﻄﺮی(‬
‫رﻧ ﺷﺎن ﺳﯿﺎه ﻣ ﺷﻮد‪.‬‬
‫• ﺑﻌﺪ از ﺑﺎزﯾ ﻦ ﺳﯿﺎه‪ ،‬ﻧﻮﺑﺖ ﺑﺎزﯾ ﻦ ﺳﻔﯿﺪ ﻣ ﺷﻮد و ﺑﻪ ﺷ ﻞ ﻣﺸﺎﺑﻪ ﺣﺮﮐﺖ ﺧﻮد را اﻧﺠﺎم ﻣ دﻫﺪ و ﻫﻤﯿﻨﻄﻮر ﺑﺎزی ﺑﻪ‬
‫ﺷ ﻞ ﻧﻮﺑﺘ اداﻣﻪ ﭘﯿﺪا ﻣ ﮐﻨﺪ‪.‬‬
‫• اﮔﺮ ﯾ‬
‫از ﺑﺎزﯾ ﻨﺎن ﻧﺘﻮاﻧﺪ ﺣﺮﮐﺘ اﻧﺠﺎم دﻫﺪ ﺑﺎزی را ﺑﺎزﯾ ﻦ دﯾ ﺮ اداﻣﻪ ﻣ دﻫﺪ‪.‬‬
‫• ﺑﺎزی وﻗﺘ ﺗﻤﺎم ﻣ ﺷﻮد ﮐﻪ ﻫﯿﭻ ﯾ از ﺑﺎزﯾ ﻨﺎن ﻧﺘﻮاﻧﺪ ﺣﺮﮐﺘ اﻧﺠﺎم دﻫﺪ‪ .‬در اﯾﻦ ﺻﻮرت ﺑﺮﻧﺪهی ﺑﺎزی ﮐﺴ اﺳﺖ‬
‫ﮐﻪ ﺗﻌﺪاد ﻣﻬﺮهﻫﺎی ﺑﯿﺸﺘﺮی داﺷﺘﻪ ﺑﺎﺷﺪ‪.‬‬
‫‪١‬‬
‫ﻗﺎﻧﻮن اﺿﺎﻓﻪ دارﯾﻢ و آن اﯾﻦ اﺳﺖ ﮐﻪ ﺣﻖ ﮔﺬاﺷﺘﻦ ﻣﻬﺮه در ‪ ۴‬ﺧﺎﻧﻪی ﮔﻮﺷﻪی ﺟﺪول را ﻧﺪارﯾﻢ‪.‬‬
‫• ﺑﺮای اﯾﻦ ﺗﻤﺮﯾﻦ‪ ،‬ﯾ‬
‫ﺷ ﻞ ‪ :١‬ﺻﻔﺤﻪی ﺑﺎزی در ﻟﺤﻈﻪی ﺷﺮوع‬
‫ﺗﻮﺿﯿﺢ ﮐﺪﻫﺎ و ﮐﻼسﻫﺎ‬
‫در ﻓﺎﯾﻞ ‪ othello.zip‬ﯾ‬
‫ﭘﺮوژهی ﺟﺎوا وﺟﻮد دارد ﮐﻪ از ﻗﺴﻤﺖﻫﺎی زﯾﺮ ﺗﺸ ﯿﻞ ﺷﺪه اﺳﺖ‪:‬‬
‫• ﭘ ﯿﺞ ‪ :othello.ai‬در اﯾﻦ ﭘﯿ ﯿﺞ ﮐﻼسﻫﺎی ﻣﺮﺑﻮط ﺑﻪ ﻫﻮشﻣﺼﻨﻮﻋ ﺑﺎزی وﺟﻮد دارد‪ .‬ﮐﻼس ‪MyPlayerAI.java‬‬
‫ﺟﺎﯾ اﺳﺖ ﮐﻪ ﺷﻤﺎ ﺑﺎﯾﺪ ﮐﺪ ﻋﺎﻣﻞ ﻫﻮﺷﻤﻨﺪ ﺧﻮد را ﭘﯿﺎدهﺳﺎزی ﮐﻨﯿﺪ و ﺗﻨﻬﺎ اﯾﻦ ﮐﻼس را ارﺳﺎل ﻣ ﮐﻨﯿﺪ‪ .‬در اداﻣﻪ در‬
‫ﻣﻮرد اﯾﻦ ﮐﻼس ﺗﻮﺿﯿﺢ ﺑﯿﺸﺘﺮی داده ﺧﻮاﻫﺪ ﺷﺪ‪ .‬ﮐﻼسﻫﺎی ‪ GreedyAI.java‬و ‪ RandomAI.java‬ﻫﻢ ﻋﺎﻣﻞﻫﺎی‬
‫ﻧﻤﻮﻧﻪ ﻫﺴﺘﻨﺪ ﮐﻪ ﻣ ﺗﻮاﻧﯿﺪ ﺑﺮای ﺗﺴﺖ ﻋﺎﻣﻞ ﻫﻮﺷﻤﻨﺪ ﺧﻮدﺗﺎن از آﻧﻬﺎ اﺳﺘﻔﺎده ﮐﻨﯿﺪ‪.‬‬
‫• ﭘ ﯿﺞ ‪ :othello.model‬در اﯾﻦ ﭘﯿ ﯿﺞ ﮐﻼس ‪ Board.java‬وﺟﻮد داردﮐﻪ ﺑﺮای ﻧ ﻪداری اﻃﻼﻋﺎت وﺿﻌﯿﺖ ﺑﺎزی اﺳﺖ‪.‬‬
‫• ﭘ ﯿﺞ ‪ :othello.controller‬در اﯾﻦ ﭘﯿ ﯿﺞ ﮐﻨﺘﺮﻟﺮﻫﺎی ﺑﺎزی ﻗﺮار دارﻧﺪ‪ .‬ﺷﻤﺎ ﺑﺎ اﺳﺘﻔﺎده از اﯾﻦ ﮐﻨﺘﺮﻟﺮﻫﺎ ﻣ ﺗﻮاﻧﯿﺪ در ‪٣‬‬
‫ﺣﺎﻟﺖ ﻣﺨﺘﻠﻒ ﺑﺎزی را اﺟﺮا ﮐﻨﯿﺪ ﮐﻪ در اداﻣﻪ ﺗﻮﺿﯿﺢ داده ﺧﻮاﻫﺪ ﺷﺪ‪.‬‬
‫• ﭘ ﯿﺞ ‪ :othello.view‬در اﯾﻦ ﭘﯿ ﯿﺞ ﮐﻼسﻫﺎی ﻣﺮﺑﻮط ﺑﻪ ﮔﺮاﻓﯿ‬
‫ﺑﺎزی ﻗﺮار دارد‪.‬‬
‫ﺑﺮای اﯾﻨ ﻪ ﺑﺘﻮاﻧﯿﺪ ﻋﺎﻣﻞ ﻫﻮﺷﻤﻨﺪ ﺧﻮد را ﭘﯿﺎدهﺳﺎزی ﮐﻨﯿﺪ‪ ،‬ﺗﻨﻬﺎ ﻻزم اﺳﺖ ﺑﺎ ﮐﻼسﻫﺎی ‪ MyPlayerAI.java‬و ‪Board.java‬‬
‫آﺷﻨﺎ ﺑﺎﺷﯿﺪ‪ ،‬اﻣﺎ ﻣﻄﺎﻟﻌﻪی ﺑﻘﯿﻪی ﻓﺎﯾﻞﻫﺎ )ﻣﺨﺼﻮﺻﺎ ﮐﻨﺘﺮﻟﺮﻫﺎ( ﺑﻪ ﺷﻤﺎ درک ﺑﻬﺘﺮی از ﭘﺮوژه ﻣ دﻫﺪ‪ .‬ﺗﻐﯿﯿﺮدادن ﻓﺎﯾﻞﻫﺎی ﭘﺮوژه‬
‫ﺑﺮای ﺗﺴﺖ ﮐﺮدن ﺗﻮﺻﯿﻪ ﻣ ﺷﻮد اﻣﺎ ﺑﻪ اﯾﻦ ﻧ ﺘﻪ ﺗﻮﺟﻪ ﮐﻨﯿﺪ ﮐﻪ ﺷﻤﺎ در اﻧﺘﻬﺎ‪ ،‬ﺗﻨﻬﺎ ﻓﺎﯾﻞ ‪ MyPlayerAI.java‬را ارﺳﺎل ﻣ ﮐﻨﯿﺪ‬
‫و ﻧﺒﺎﯾﺪ روی ﺗﻐﯿﯿﺮاﺗﺘﺎن در ﻓﺎﯾﻞﻫﺎی دﯾ ﺮ ﺣﺴﺎب ﮐﻨﯿﺪ‪.‬‬
‫در ﻓﺎﯾﻞ ‪ MyPlayerAI.java‬ﺷﻤﺎ ﺑﺎﯾﺪ دو ﺗﺎﺑﻊ را زﯾﺮ را ﭘﯿﺎدهﺳﺎزی ﮐﻨﯿﺪ‪.‬‬
‫• )(‪ :public String getName‬ﺧﺮوﺟ اﯾﻦ ﺗﺎﺑﻊ ﺑﺎﯾﺪ ﺷﻤﺎره داﻧﺸﺠﻮﯾ ﺷﻤﺎ ﺑﺎﺷﺪ‪.‬‬
‫• )‪ :public Point nextMove(Board b‬اﯾﻦ ﺗﺎﺑﻊ ﺑﻪ ﻋﻨﻮان ورودی وﺿﻌﯿﺖ ﻓﻌﻠ ﺑﺎزی را درﯾﺎﻓﺖ ﻣ ﮐﻨﺪ و ﺣﺮﮐﺖ‬
‫ﻋﺎﻣﻞ را ﺑﻪ ﺷ ﻞ ﯾ ‪ Point‬ﮐﻪ دارای ﻣﺨﺘﺼﺎت ‪ x‬و ‪ y‬اﺳﺖ ﺑﺮﻣ ﮔﺮداﻧﺪ‪.‬‬
‫ﺑﺮای ﭘﯿﺎدهﺳﺎزی ﺗﺎﺑﻊ )‪ nextMove(Board b‬ﺷﻤﺎ ﻣ ﺗﻮاﻧﯿﺪ ﺗﻮاﺑﻊ زﯾﺮ را روی ﻣﺘﻐﯿﺮ ‪ b‬ﺻﺪا ﺑﺰﻧﯿﺪ‪:‬‬
‫• )‪ :b.isCapturedByMe(x, y‬ﻧﺸﺎن ﻣ دﻫﺪ ﺧﺎﻧﻪی )‪ (x, y‬ﺑﺮای ﺷﻤﺎ ﻫﺴﺖ ﯾﺎ ﺧﯿﺮ‪.‬‬
‫‪٢‬‬
‫• )‪ :b.isCapturedByMyOppoenet(x, y‬ﻧﺸﺎن ﻣ دﻫﺪ ﺧﺎﻧﻪی )‪ (x, y‬ﺑﺮای ﺣﺮﯾﻒ ﻫﺴﺖ ﯾﺎ ﺧﯿﺮ‪.‬‬
‫• )‪ :b.isEmptySquare(x, y‬ﻧﺸﺎن ﻣ دﻫﺪ ﺧﺎﻧﻪی )‪ (x, y‬ﺧﺎﻟ ﻫﺴﺖ ﯾﺎ ﺧﯿﺮ‪.‬‬
‫• )‪ :b.move(x, y‬در ﺻﻮرت اﻣ ﺎن ﯾ ﻣﻬﺮه ﺑﺮای ﮐﺴ ﮐﻪ ﻧﻮﺑﺘﺶ اﺳﺖ در ﻣﺤﻞ ﻣﻮرد ﻧﻈﺮ ﻗﺮار ﻣ دﻫﺪ و ﻣﻘﺪار‬
‫‪ true‬ﺑﺮﻣ ﮔﺮداﻧﺪ‪ .‬در ﺻﻮرﺗ ﮐﻪ اﯾﻦﮐﺎر اﻣ ﺎنﭘﺬﯾﺮ ﻧﺒﺎﺷﺪ‪ ،‬ﻣﻘﺪار ‪ false‬ﺑﺮﻣ ﮔﺮداﻧﺪ‪.‬‬
‫• )(‪ :b.turn‬ﻧﻮﺑﺖ را ﺑﻪ ﺑﺎزﯾ ﻦ دﯾ ﺮ ﻣ دﻫﺪ‪.‬‬
‫• )(‪ :b.print‬ﺟﺪول ﺑﺎزی را ﺑﻪ ﺷ ﻞ ‪ ASCII‬ﭼﺎپ ﻣ ﮐﻨﺪ‪) .‬ﺑﺮای دﯾﺒﺎگ ﮐﺮدن(‬
‫• )(‪ :b.getActive‬در ﺻﻮرﺗ ﮐﻪ ﻧﻮﺑﺖ ﺑﺎزﯾ ﻦ ﺳﯿﺎه ﺑﺎﺷﺪ ﻣﻘﺪار ‪ Board.BLACK‬را ﺑﺮﻣ ﮔﺮداﻧﺪ‪ .‬در ﻏﯿﺮ اﯾﻦ‬
‫ﺻﻮرت ﻣﻘﺪار ‪ Board.WHITE‬را ﺑﺮﻣ ﮔﺮداﻧﺪ‪.‬‬
‫• )‪ :b.getMoveCount(true‬ﺗﻌﺪاد ﺣﺮﮐﺎت ﻣﻤ ﻦ ﺑﺮای ﺑﺎزﯾ ﻦ ﻓﻌﻠ را ﺑﺮﻣ ﮔﺮداﻧﺪ‪.‬‬
‫• )‪ :b.getMoveCount(false‬ﺗﻌﺪاد ﺣﺮﮐﺎت ﻣﻤ ﻦ ﺑﺮای ﺑﺎزﯾ ﻦ ﺑﻌﺪی را ﺑﺮﻣ ﮔﺮداﻧﺪ‪.‬‬
‫• )‪ :b.getTotal(true‬ﺗﻌﺪاد ﻣﻬﺮهﻫﺎی ﺑﺎزﯾ ﻦ ﻓﻌﻠ را ﺑﺮﻣ ﮔﺮداﻧﺪ‪.‬‬
‫• )‪ :b.getTotal(false‬ﺗﻌﺪاد ﻣﻬﺮهﻫﺎی ﺑﺎزﯾ ﻦ ﺣﺮﯾﻒ را ﺑﺮﻣ ﮔﺮداﻧﺪ‪.‬‬
‫ﺷﻤﺎ در ﺗﺎﺑﻊ ‪ nextMove‬ﻣ ﺗﻮاﻧﯿﺪ ﻣﺘﻐﯿﺮ ‪) b‬ﭘﺎراﻣﺘﺮ ورودی ﺗﺎﺑﻊ ‪ (nextMove‬را ﻫﺮﭼﻘﺪر ﮐﻪ ﺧﻮاﺳﺘﯿﺪ ﺗﻐﯿﯿﺮ دﻫﯿﺪ و ﻣﺜﻼ ﻗﺒﻞ‬
‫از ﺑﺮﮔﺮداﻧﺪن ﺧﺮوﺟ ‪ ،‬ﺗﺎ ﭘﻨﺞ ﻣﺮﺣﻠﻪ ﺑﺎزی را روی آن ﭘﯿﺶ ﺑﺒﺮﯾﺪ‪ .‬در واﻗﻊ اﯾﻦ ﻣﺘﻐﯿﺮ ﺻﺮﻓﺎ ﺑﺮای ﺗﺎﺑﻊ ﺷﻤﺎﺳﺖ و در ﺑﯿﺮون از آن‬
‫ﺗﺎﺛﯿﺮی ﻧﺪارد‪.‬ﺑﺮای ﻫﻤﯿﻦ ﺧﺮوﺟ ﺗﺎﺑﻊ ‪ ،nextMove‬ﻣﺴﺘﻘﻞ از ﮐﺎرﻫﺎﯾ ﮐﻪ روی ‪ b‬اﻧﺠﺎم دادهاﯾﺪ‪ ،‬ﺑﺎﯾﺪ اوﻟﯿﻦ ﺣﺮﮐﺖ ﻋﺎﻣﻞﺗﺎن‬
‫ﺑﺎﺷﺪ‪ .‬ﺑﻪ ﻋﻨﻮان ﻣﺜﺎل ﻋﺎﻣﻞ ‪ GreedyAI.java‬رو ﺑﺒﯿﻨﯿﺪ‪.‬‬
‫ﻧﺤﻮهی اﺟﺮای ﺑﺎزی‬
‫ﺷﻤﺎ ﻣ ﺗﻮاﻧﯿﺪ ﺑﺎ اﺳﺘﻔﺎده از ‪ ٣‬ﮐﻨﺘﺮﻟﺮ زﯾﺮ‪ ،‬ﺑﺎزی را در ﺳﻪ ﺣﺎﻟﺖ ﻣﺨﺘﻠﻒ اﺟﺮا ﮐﻨﯿﺪ‪:‬‬
‫• ‪ :TwoPlayerController.java‬اﯾﻦ ﮐﻨﺘﺮﻟﺮ ﺑﺮای اﻧﺠﺎم ﯾ ﺑﺎزی دوﻧﻔﺮه ﺑﺪون دﺧﺎﻟﺖ ﻋﺎﻣﻞﻫﺎی ﻣﺼﻨﻮﻋ اﺳﺖ!‬
‫ﭘﯿﺸﻨﻬﺎد ﻣ ﺷﻮد ﻗﺒﻞ از ﺷﺮوع ﮐﺪ زدن‪ ،‬ﺑﺎ ﻫﻢ ﭼﻨﺪﺑﺎزی اﻧﺠﺎم دﻫﯿﺪ ﺗﺎ ﺑﺎ اﺳﺘﺮاﺗﮋیﻫﺎی ﺑﺎزی آﺷﻨﺎ ﺷﻮﯾﺪ‪.‬‬
‫• ‪ :OnePlayerController.java‬اﯾﻦ ﮐﻨﺘﺮﻟﺮ ﺑﺮای اﻧﺠﺎم ﯾ‬
‫اﺳﺖ‪.‬‬
‫ﺑﺎزی ﺑﯿﻦ ﺷﻤﺎ و ﻋﺎﻣﻞ ﻫﻮﺷﻤﻨﺪﺗﺎن )‪MyPlayerAI.java‬‬
‫• ‪ :AIControllerSinglePlay.java‬اﯾﻦ ﮐﻨﺘﺮﻟﺮ ﺑﺮای اﻧﺠﺎم ﯾ ﺑﺎزی ﺑﯿﻦ دو ﻋﺎﻣﻞ ﻣﺼﻨﻮﻋ ﻣﺨﺘﻠﻒ اﺳﺖ‪ .‬ﺑﺎ‬
‫اﺟﺮای ﺗﺎﺑﻊ ‪ main‬اﯾﻦ ﮐﻨﺘﺮﻟﺮ‪ ،‬ﯾ ﺻﻔﺤﻪی ﮔﺮاﻓﯿ ﺑﺎز ﻣ ﺷﻮد ﮐﻪ ﺑﺮای ﻫﺮ ﯾ از رﻧ ﻫﺎ ﺷﻤﺎ ﻣ ﺗﻮاﻧﯿﺪ ﯾ‬
‫از ﻋﺎﻣﻞﻫﺎی ﻣﺼﻨﻮﻋ ﻣﻮﺟﻮد را اﻧﺘﺨﺎب ﮐﻨﯿﺪ‪ .‬ﻟﯿﺴﺖ اﯾﻦ ﻋﺎﻣﻞﻫﺎ در ﻓﺎﯾﻞ ‪ AIList‬ﻗﺮار دارد‪ .‬ﺷﻤﺎ ﻣ ﺗﻮاﻧﯿﺪ ﺑﻪ ﺟﺰ‬
‫‪ MyPlayerAI.java‬ﻋﺎﻣﻞ ﻫﻮﺷﻤﻨﺪ دﯾ ﺮی ﺑﻨﻮﯾﺴﯿﺪ و ﺑﺎ اﺿﺎﻓﻪ ﮐﺮدن اﺳﻢ آن ﺑﻪ اﯾﻦ ﻟﯿﺴﺖ‪ ،‬ﯾ ﺑﺎزی ﺑﯿﻦ ﻋﺎﻣﻞﻫﺎی‬
‫ﺧﻮدﺗﺎن اﺟﺮا ﮐﻨﯿﺪ‪.‬‬
‫ﻫﻤﻪی اﯾﻦ ﮐﻨﺘﺮﻟﺮﻫﺎ‪ ،‬ﮐﻼسﻫﺎﯾ ﻫﺴﺘﻨﺪ ﮐﻪ در آﻧﻬﺎ ﺗﺎﺑﻊ ‪ main‬وﺟﻮد دارد‪ .‬ﺑﻨﺎﺑﺮاﯾﻦ اﮔﺮ ﺷﻤﺎ ﺑﺎ ‪ eclipse‬ﭘﺮوژه را ﺑﺎز ﮐﻨﯿﺪ و‬
‫وﻗﺘ ﻓﺎﯾﻞ ﮐﻨﺘﺮﻟﺮ ﻣﻮرد ﻧﻈﺮ ﺑﺎز اﺳﺖ‪ ،‬دﮐﻤﻪی ‪ Ctrl + F ١١‬را ﻓﺸﺎر دﻫﯿﺪ‪ ،‬ﺑﺎزی در ﺣﺎﻟﺖ ﻣﻮرد ﻧﻈﺮ اﺟﺮا ﻣ ﺷﻮد‪.‬‬
‫ﻧﻤﺮهدﻫ ‪ ،‬ﺗﻮﺿﯿﺤﺎت ﺗ ﻤﯿﻠ و ﻧﺤﻮهی ارﺳﺎل ﺗﻤﺮﯾﻦ‬
‫• ‪ ٢٠‬ﻧﻤﺮهی اﯾﻦ ﺑﺨﺶ ﻣﺮﺑﻮط ﺑﻪ ﺗﺎﺑﻊ ارزﯾﺎﺑ ﺷﻤﺎ اﺳﺖ‪ .‬ﻟﻄﻔﺎ ﺗﻮﺿﯿﺢ ﻣﺨﺘﺼﺮی در ﺣﺪ دو‪-‬ﺳﻪ ﭘﺎراﮔﺮاف در ﻣﻮرد‬
‫ﺗﺎﺑﻊ ارزﯾﺎﺑ ﺧﻮد ﺑﺪﻫﯿﺪ و در ﯾ ﻓﺎﯾﻞ ‪ pdf‬ﺟﺪاﮔﺎﻧﻪ ارﺳﺎل ﮐﻨﯿﺪ‪ .‬ﻫﻤﭽﻨﯿﻦ در ﺻﻮرﺗ ﮐﻪ ﺗ ﻨﯿ ﺧﺎﺻ ﺑﺮای ﺑﻬﺒﻮد‬
‫ﺳﺮﻋﺖ ﺟﺴﺘﺠﻮ )ﻣﺜﻞ ‪ Move-Ordering‬ﯾﺎ ‪ ( Lookup Table‬اﻧﺠﺎم دادهاﯾﺪ در اﯾﻦ ﻓﺎﯾﻞ ذﮐﺮ ﮐﻨﯿﺪ‪.‬‬
‫• ‪ ۶۵‬ﻧﻤﺮهی اﯾﻦ ﺑﺨﺶ ﻣﺮﺑﻮط ﺑﻪ ﻋﻤﻠ ﺮد ﻋﺎﻣﻞ ﻫﻮﺷﻤﻨﺪ ﺷﻤﺎ در ﻣﻘﺎﺑﻞ ﻋﺎﻣﻞ ﺳﺎﯾﺮ دوﺳﺘﺎنﺗﺎن اﺳﺖ‪ .‬درواﻗﻊ ﻫﻤﻪی‬
‫ﻋﺎﻣﻞﻫﺎﯾ ﮐﻪ داﻧﺸﺠﻮﯾﺎن ارﺳﺎل ﻣ ﮐﻨﻨﺪ ﺑﺎ ﻫﻢ ﺑﺎزی ﻣ ﮐﻨﻨﺪ و ﺑﺮاﺳﺎس ﺗﻌﺪاد دﻓﻌﺎت ﺑﺮد ﻫﺮ ﻋﺎﻣﻞ‪ ،‬اﻣﺘﯿﺎزی ﺑﻪ آن‬
‫ﺗﻌﻠﻖ ﻣ ﮔﯿﺮد‪.‬‬
‫‪٣‬‬
‫• ﮐﺪ ﺷﻤﺎ ﺑﺎﯾﺪ ﻫﺮ ﺣﺮﮐﺖ ﺧﻮد را در زﻣﺎن ﺣﺪاﮐﺜﺮ ﯾ ﺛﺎﻧﯿﻪ )روی ﺳﯿﺴﺘﻤ ﺑﺎ ﭘﺮدازﺷ ﺮ ‪ core i7‬و ‪۴‬ﮔﯿ ﺎﺑﺎﯾﺖ رم(‬
‫اﻧﺠﺎم دﻫﺪ‪ .‬در ﻏﯿﺮ اﯾﻦ ﺻﻮرت ﺑﺎزﻧﺪهی ﺑﺎزی ﻣﺤﺴﻮب ﻣ ﺷﻮد‪ .‬ﺑﻪ ﻫﻤﯿﻦ ﻋﻠﺖ ﺑﺮای اﻃﻤﯿﻨﺎن ﺗﻮﺻﯿﻪ ﻣ ﺷﻮد ﺣﺪ‬
‫ﮐﻤﺘﺮی را درﻧﻈﺮ ﺑ ﯿﺮﯾﺪ‪.‬‬
‫• ﻋﺎﻣﻞ ﺷﻤﺎ ﻧﺒﺎﯾﺪ ﺑﻪ ﻫﯿﭻ ﻧﺤﻮی ﺑﻪ ﺷ ﻞ ‪ Multi Thread‬ﮐﺎر ﮐﻨﺪ‪ .‬ﻫﻤﭽﻨﯿﻦ ﻧﺒﺎﯾﺪ ﻗﺴﻤﺖﻫﺎی دﯾ ﺮ ﮐﺪ را ﺗﻐﯿﯿﺮ دﻫﺪ‬
‫)ﻣﺜﻼ ﺑﺎ اﺳﺘﻔﺎده از ‪ .( Reflection‬ﺑﻪ ﻃﻮر ﮐﻠ ﻫﯿﭻ ﮐﺎر ﻣﺸ ﻮک و ﺧﺎرج از ﻋﺮﻓ اﻧﺠﺎم ﻧﺪﻫﯿﺪ! ‪(:‬‬
‫• در ﺻﻮرﺗ ﮐﻪ در ﮐﺪﺗﺎن از ﻣﻮﻟﺪ اﻋﺪاد ﺗﺼﺎدﻓ اﺳﺘﻔﺎده ﻣ ﮐﻨﯿﺪ‪ ،‬ﺣﺘﻤﺎ ﺑﺮای آن ﯾ ‪ seed‬ﺛﺎﺑﺖ ﺗﻌﺮﯾﻒ ﮐﻨﯿﺪ ﺗﺎ‬
‫ﻋﺎﻣﻞﺗﺎن در اﺟﺮاﻫﺎی ﻣﺨﺘﻠﻒ ﺑﺮﻧﺎﻣﻪ‪ ،‬ﻋﻤﻠ ﺮد ﯾ ﺴﺎن داﺷﺘﻪ ﺑﺎﺷﺪ‪) .‬ﺑﻪ ﻋﻨﻮان ﻧﻤﻮﻧﻪ ﮐﺪ ‪ RandomAI.java‬را ﺑﺒﯿﻨﯿﺪ‪(.‬‬
‫• در ﺻﻮرت ﻣﺸﺎﻫﺪهی ﺑﺎگ و ﯾﺎ ﺑﺮوز ﻣﺸ ﻠ در ﮐﺪ ﭘﺮوژه‪ ،‬ﻟﻄﻔﺎ ﺑﻪ دﺳﺘﯿﺎر ﻣﺮﺑﻮﻃﻪی ﺗﻤﺮﯾﻦ )ﻋﻠ ﺑﺎﺑﺎﯾ ( ﻣﺮاﺟﻌﻪ ﮐﻨﯿﺪ‬
‫و ﯾﺎ ﺑﺎ ﻣﻮﺿﻮع ‪ HW3-prblem‬اﯾﻤﯿﻞ ﺑﺰﻧﯿﺪ‪.‬‬
‫• ﺑﺮای ﺑﺨﺶ ﻋﻤﻠ ﺑﺎﯾﺪ دو ﻓﺎﯾﻞ ارﺳﺎل ﮐﻨﯿﺪ‪ .‬ﯾ ﻓﺎﯾﻞ ‪ MyPlayerAI.java‬و دﯾ ﺮی ﯾ ﻓﺎﯾﻞ ‪ pdf‬ﮐﻪ در آن ﺗﺎﺑﻊ‬
‫ارزﯾﺎﺑ ﺧﻮد ﺑﻪ ﻫﻤﺮاه ﺑﻘﯿﻪی روشﻫﺎﯾ ﮐﻪ ﺑﺮای ﺑﻬﯿﻨﻪ اﺳﺘﻔﺎده ﮐﺮدهاﯾﺪ را ﺣﺪاﮐﺜﺮ در ﯾ ﺻﻔﺤﻪ ﺗﻮﺿﯿﺢ دادهاﯾﺪ‪.‬‬
‫‪ .٢‬ﺑﺨﺶ ﺗﺌﻮری ‪ ٣٠ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .‬ﻧﻤﺮه‬
‫ﺑﺮای اﯾﻦ ﺑﺨﺶ ﺗﻌﺪادی ﺳﻮال ﺗﺸﺮﯾﺤ وﺟﻮد دارد‪ .‬ﻟﻄﻔﺎ ﭘﺎﺳﺦ ﺑﻪ ﻫﻤﻪی ﺳﻮالﻫﺎ را در ﯾ‬
‫ﻓﺎﯾﻞﻫﺎی ﺑﺨﺶ ﻋﻤﻠ ارﺳﺎل ﮐﻨﯿﺪ‪ .‬ﻟﻄﻔﺎ ﺑﺮای ﻫﺮ ﺳﻮال ﺣﺪاﮐﺜﺮ ﯾ ﭘﺎرﮔﺮاف ﺗﻮﺿﯿﺢ دﻫﯿﺪ‪.‬‬
‫ﻓﺎﯾﻞ ‪ pdf‬ﺑﻨﻮﯾﺴﯿﺪ و ﺑﻪ ﻫﻤﺮاه‬
‫ﺳﻮال ‪:١‬‬
‫در ﻣﻮرد درﺳﺖ ﯾﺎ ﻧﺎدرﺳﺖ ﺑﻮدن اﯾﻦ ﻋﺒﺎرات زﯾﺮ ﺗﻮﺿﯿﺢ دﻫﯿﺪ‪:‬‬
‫• در درﺧﺖ ﺟﺴﺘﺠﻮی ‪ minimax‬ﺑﺎ اﺳﺘﻔﺎده از ﻫﺮس ‪ ،Alpha-Beta‬ﭼﻮن ﺑﻌﻀ از ﮔﺮهﻫﺎ را ﺑﺮرﺳ ﻧﻤ ﮐﻨﯿﻢ‪ ،‬ﻣﻘﺪاری‬
‫ﮐﻪ ﺑﺮای رﯾﺸﻪ ﺑﻪ دﺳﺖ ﻣ آورﯾﻢ ﻣ ﺗﻮاﻧﺪ ﮐﻤﺘﺮ ﯾﺎ ﺑﯿﺸﺘﺮ از ﺣﺎﻟﺘ ﺑﺎﺷﺪ ﮐﻪ از اﯾﻦ ﻫﺮس اﺳﺘﻔﺎده ﻧﻤ ﮐﻨﯿﻢ‪.‬‬
‫• در درﺧﺖ ﺟﺴﺘﺠﻮی ‪ minimax‬ﺑﺎ اﺳﺘﻔﺎده از ﻫﺮس ‪ ،Alpha-Beta‬ﭼﻮن ﺳﺮﻋﺖ ﺟﺴﺘﺠﻮ ﺑﯿﺸﺘﺮ ﻣ ﺷﻮد‪ ،‬ﻣﻘﺪاری ﮐﻪ‬
‫ﺑﺮای رﯾﺸﻪ ﺑﺪﺳﺖ ﻣ آورﯾﻢ ﻧﺰدﯾ ﺗﺮ ﺑﻪ ﻣﻘﺪار واﻗﻌ رﯾﺸﻪ اﺳﺖ‪.‬‬
‫ﺳﻮال ‪:٢‬‬
‫ﻓﺮض ﮐﻨﯿﺪ در ﺑﺎزی اﺗﻠﻮ ﺣﺮﯾﻒ ﺷﻤﺎ‪ RandomAI ،‬ﺑﺎﺷﺪ‪ .‬ﯾﻌﻨ از ﺑﯿﻦ ﻫﻤﻪی اﻧﺘﺨﺎبﻫﺎی ﻣﻤ ﻦ ﯾ را ﺑﺎ اﺣﺘﻤﺎل ﻣﺴﺎوی‬
‫اﻧﺘﺨﺎب ﮐﻨﺪ‪ .‬در اﯾﻦ ﺣﺎﻟﺖ‪ ،‬ﺑﺮای ﻣﺤﺎﺳﺒﻪی ارزش وﺿﻌﯿﺖ ﺑﺎزی ﺑﺎﯾﺪ از اﻟ ﻮرﯾﺘﻢ ‪ expectimax‬ﺑﻪ ﺟﺎی ‪ minimax‬اﺳﺘﻔﺎده‬
‫ﮐﻨﯿﻢ‪ .‬آﯾﺎ ارزش وﺿﻌﯿﺖ ﺑﺎزی در اﯾﻦ ﺣﺎﻟﺖ )ﺣﺎﻟﺘ ﮐﻪ ﺣﺮﯾﻒ ﺗﺼﺎدﻓ ﺑﺎزی ﻣ ﮐﻨﺪ(‪ ،‬ﻣ ﺗﻮاﻧﺪ اﮐﯿﺪا ﮐﻤﺘﺮ از ﺣﺎﻟﺘ ﺑﺎﺷﺪ‬
‫ﮐﻪ ﺣﺮﯾﻒ ﮐﺎﻣﻼ ﺑﻬﯿﻨﻪ ﺑﺎزی ﻣ ﮐﻨﺪ )و ﺷﻤﺎ درﺧﺖ ‪ minimax‬را ﺣﺴﺎب ﻣ ﮐﻨﯿﺪ(؟‬
‫ﺳﻮال ‪:٣‬‬
‫ﻓﺮض ﮐﻨﯿﺪ ﯾ ﺑﺎزی ﺳﻪ ﻧﻔﺮه دارﯾﻢ‪ .‬ﻫﻤﭽﻨﯿﻦ ﯾ ﺗﺎﺑﻊ ارزﯾﺎﺑ دارﯾﻢ ﮐﻪ ﺑﻪ ازای ﻫﺮ وﺿﻌﯿﺖ ﺳﻪ ﻋﺪد ﺑﺮﻣ ﮔﺮداﻧﺪ ﮐﻪ ﻧﺸﺎﻧ ﺮ‬
‫ﻣﯿﺰان ارزش آن وﺿﻌﯿﺖ ﺑﺮای ﻫﺮﯾ از ﺑﺎزﮐﻨﺎن اﺳﺖ‪ .‬ﺑﺎ ﻓﺮض اﯾﻨ ﻪ ﻫﺮ ﺳﻪ ﺑﺎزﯾ ﻦ ﺑﻬﯿﻨﻪ ﺑﺎزی ﻣ ﮐﻨﻨﺪ‪ ،‬اﻟ ﻮرﯾﺘﻤ ﻣﺸﺎﺑﻪ‬
‫اﻟ ﻮرﯾﺘﻢ ‪ minimax‬اراﺋﻪ ﮐﻨﯿﺪ ﮐﻪ در ﯾ وﺿﻌﯿﺖ ﻣﺸﺨﺺ‪ ،‬ﺑﻬﺘﺮﯾﻦ ﺣﺮﮐﺖ را ﺑﺮای ﺑﺎزﯾ ﻦ اول ﻣﺸﺨﺺ ﮐﻨﺪ‪.‬‬
‫ﺳﻮال ‪:۴‬‬
‫در ﺳﻮال ﻗﺒﻞ‪ ،‬اﮔﺮ ﺑﺪاﻧﯿﻢ ﺑﺎزﯾ ﻦ اول ﺑﻬﯿﻨﻪ ﺑﺎزی ﻣ ﮐﻨﺪ‪ ،‬وﻟ ﺑﺎزﯾ ﻨﺎن دوم و ﺳﻮم ﻏﯿﺮ ﺑﻬﯿﻨﻪ ﺑﺎزی ﻣ ﮐﻨﺘﺪ‪ ،‬آﯾﺎ اﻟ ﻮرﯾﺘﻢ داده‬
‫ﺷﺪه ﻣ ﺗﻮاﻧﺪ ﺗﻀﻤﯿﻦ ﮐﻨﺪ ﮐﻪ ﻧﺘﯿﺠﻪی ﺑﺎزی ﺑﺪﺗﺮ از ﺣﺎﻟﺘ ﮐﻪ ﺑﺪاﻧﯿﻢ ﻫﻤﻪ ﺑﻬﯿﻨﻪ ﺑﺎزی ﻣ ﮐﻨﻨﺪ ﻧﻤ ﺷﻮد؟ ﯾﻌﻨ ﺑﺎزﯾ ﻦ اول‬
‫ﺣﺪاﻗﻞ ﺑﻪ ﻣﯿﺰاﻧ ﮐﻪ در ﺣﺎﻟﺖ ﻗﺒﻞ ﺳﻮد ﻣ ﮐﺮد‪ ،‬در اﯾﻦ ﺣﺎﻟﺖ ﺳﻮد ﻣ ﮐﻨﺪ؟‬
‫‪۴‬‬
‫ﺳﻮال ‪:۵‬‬
‫ﺷ ﻞ زﯾﺮ ﯾ درﺧﺖ ‪ minimax‬را ﻧﺸﺎن ﻣ دﻫﺪ ﮐﻪ ﻣﻘﺪار ﯾ از ﺑﺮگﻫﺎی آن ﻧﺎﻣﻌﻠﻮم )‪ (x‬اﺳﺖ‪ .‬ﺑﺎ ﻓﺮض اﯾﻨ ﻪ ﺑﺎزﯾ ﻦ‬
‫اول‪ ،‬ﺑﺎزﯾ ﻦ ﺑﯿﺸﯿﻨﻪ ﺑﺎﺷﺪ و ﺑﺎزﯾ ﻦ دوم‪ ،‬ﺑﺎزﯾ ﻦ ﮐﻤﯿﻨﻪ‪ ،‬ﺑﻪ ازای ﭼﻪ ﻣﻘﺎدﯾﺮی از ‪ ،x‬ﺑﺎزﯾ ﻦ اول ‪ Action1‬را اﻧﺠﺎم ﻣ دﻫﺪ؟‬
‫ﺷ ﻞ ‪ :٢‬درﺧﺖ ‪ minimax‬ﯾ‬
‫ﻣﻮﻓﻖ و ﭘﺎﯾﺪار ﺑﺎﺷﯿﺪ‪.‬‬
‫‪۵‬‬
‫ﺑﺎزی‬