AI-HW4.pdf

‫ﺗﻤﺮﯾﻦ ﺳﺮي ﭼﻬﺎرم درس ﻫﻮش ﻣﺼﻨﻮﻋﯽ‬
‫ﻣﺪرس‪ :‬دﮐﺘﺮ ﺳﻠﯿﻤﺎﻧﯽ‬
‫ﺗﺮم دوم ﺳﺎل ﺗﺤﺼﯿﻠﯽ ‪1394-95‬‬
‫داﻧﺸﮑﺪه ﻣﻬﻨﺪﺳﯽ ﮐﺎﻣﭙﯿﻮﺗﺮ‬
‫داﻧﺸﮕﺎه ﺻﻨﻌﺘﯽ ﺷﺮﯾﻒ‬
‫‬
‫‬
‫‬
‫ﺳﻮال ﻋﻤﻠﯽ‬
‫ـــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــ ‬
‫در اﯾﻦ ﺗﻤﺮﯾﻦ‪ ،‬ﺷﻤﺎ ﺑﺎﯾﺪ ﯾﮏ ﻋﺎﻣﻞ ﻫﻮﺷﻤﻨﺪ ﺑﺮاي ﺑﺎزي ﻫﮕﺰ‪ 1‬ﻃﺮاﺣﯽ ﮐﻨﯿﺪ‪ .‬ﺑﺮاي ﻃﺮاﺣﯽ اﯾﻦ ﻋﺎﻣﻞ‪ ،‬ﺷﻤﺎ ﺑﺎﯾﺪ از درﺧﺖ ‪Minimax‬‬
‫اﺳﺘﻔﺎده ﮐﻨﯿﺪ و ﺑﺮاي ﺑﻬﺒﻮد آن از ﻫﺮس ‪ Alpha-Beta‬ﮐﻤﮏ ﺑﮕﯿﺮﯾﺪ‪.‬‬
‫ﺑﺮاي ﭘﯿﺎدهﺳﺎزي ﺗﺎﺑﻊ ‪ Minimax‬ﻻزم اﺳﺖ ﮐﻪ ﺑﺮاي ﻫﺮ ﺣﺎﻟﺖ ﺑﺎزي ﯾﮏ ﺗﺎﺑﻊ ارزﯾﺎﺑﯽ )‪ (evaluation function‬داﺷﺘﻪ ﺑﺎﺷﯿﺪ‪ .‬ﺑﺎ‬
‫ﺗﻮﺟﻪ ﺑﻪ اﯾﻨﮑﻪ ﺑﺨﺸﯽ از ﻧﻤﺮه ﺷﻤﺎ ﺑﻪ اﯾﻦ ﻗﺴﻤﺖ اﺧﺘﺼﺎص دارد و ﻣﯿﺰان ﻫﻮﺷﻤﻨﺪي ﺑﺮﻧﺎﻣﻪ ﺷﻤﺎ را اﯾﻦ ﻗﺴﻤﺖ ﻣﺸﺨﺺ ﻣﯽﮐﻨﺪ‪،‬‬
‫ﺳﻌﯽ ﮐﻨﯿﺪ ﮐﻪ در ﻃﺮاﺣﯽ آن دﻗﺖ ﮐﻨﯿﺪ‪ .‬ﻻزم ﺑﻪ ذﮐﺮ اﺳﺖ ﮐﻪ ﺑﺮﻧﺎﻣﻪي ﺷﻤﺎ ﺑﺮاي ﻫﺮ ﺣﺮﮐﺖ ﻓﻘﻂ ‪ 10‬ﺛﺎﻧﯿﻪ زﻣﺎن دارد‪ .‬در ﻧﺘﯿﺠﻪ‪،‬‬
‫اﮔﺮ اﻧﺘﺨﺎب ﺣﺮﮐﺖ ﺑﯿﺸﺘﺮ ﻃﻮل ﺑﮑﺸﺪ‪ ،‬ﺷﻤﺎ ﺑﺎزﻧﺪهي ﺑﺎزي ﺧﻮاﻫﯿﺪ ﺷﺪ‪.‬‬
‫ﻣﻌﺮﻓﯽ ﺑﺎزي‬
‫اﯾﻦ ﺑﺎزي دوﻧﻔﺮه اﺳﺖ و روي ﯾﮏ ﺟﺪول ‪ 7 × 7‬ﺑﻪ ﺷﮑﻞ زﯾﺮ اﻧﺠﺎم ﻣﯽﺷﻮد‪.‬‬
‫‬
‫ﺑﺎزﯾﮑﻦﻫﺎ ﺑﻪ ﻧﻮﺑﺖ )اﺑﺘﺪا ﺑﺎزﯾﮑﻦ ﻗﺮﻣﺰ و ﺳﭙﺲ ﺑﺎزﯾﮑﻦ آﺑﯽ( ﯾﮏ ﻣﻬﺮه ﺑﺮ روي ﺧﺎﻧﻪﻫﺎي ﺧﺎﻟﯽ ﺟﺪول ﻣﯽﮔﺬارﻧﺪ‪ .‬ﻫﺮ ﺑﺎزﯾﮑﻦ ﮐﻪ ﺑﺘﻮاﻧﺪ‬
‫زودﺗﺮ ﻣﺴﯿﺮي ﺑﯿﻦ ﺿﻠﻊﻫﺎﯾﯽ از ﺟﺪول ﮐﻪ ﻫﻢرﻧﮓ ﺧﻮدش اﺳﺖ ﺑﺮﻗﺮار ﺳﺎزد‪ ،‬ﺑﺮﻧﺪهي ﺑﺎزي اﺳﺖ‪ .‬ﺑﻪ ﻃﻮر ﻣﺜﺎل در ﺟﺪول زﯾﺮ ﺑﺎزﯾﮑﻦ‬
‫ﻗﺮﻣﺰ ﺑﺮﻧﺪه ﺑﺎزي اﺳﺖ‪ ،‬زﯾﺮا ﺗﻮاﻧﺴﺘﻪ ﻣﺴﯿﺮي از ﺑﺎﻻ ﺑﻪ ﭘﺎﯾﯿﻦ ﺟﺪول ﺑﺮﻗﺮار ﺳﺎزد‪.‬‬
‫‬
‫‪Hex‬‬
‫‪1‬‬
‫ﻣﯽﺗﻮان ﺑﻪ آﺳﺎﻧﯽ ﻧﺸﺎن داد ﮐﻪ اﯾﻦ ﺑﺎزي ﻫﻤﯿﺸﻪ ﺑﺮﻧﺪه ﺧﻮاﻫﺪ داﺷﺖ‪.‬‬
‫از ﻃﺮﻓﯽ ﭼﻮن ﻧﻔﺮ اول در اﯾﻦ ﺑﺎزي ﺑﻪ ﻃﻮر ﻧﺴﺒﯽ ﻗﺪرت ﺑﯿﺸﺘﺮي دارد‪ ،‬از ﻗﺎﻋﺪهي ﺗﻌﻮﯾﺾ‪ 2‬ﺑﺮاي ﺗﻌﺪﯾﻞ ﻗﺪرت ﺑﺎزﯾﮑﻦﻫﺎ اﺳﺘﻔﺎده‬
‫ﻣﯽﺷﻮد‪ ،‬ﺑﻪ اﯾﻦ ﺻﻮرت ﮐﻪ ﺑﺎزﯾﮑﻦ دوم‪ ،‬در اوﻟﯿﻦ ﺣﺮﮐﺖ ﺧﻮد دو اﻧﺘﺨﺎب دارد‪ ،‬ﯾﺎ ﻣﯽﺗﻮاﻧﺪ ﺑﻪ ﻋﻨﻮان ﺑﺎزﯾﮑﻦ دوم ﺑﻪ ﺑﺎزي اداﻣﻪ دﻫﺪ‬
‫)ﺣﺎﻟﺖ ﻋﺎدي( و ﯾﺎ اﯾﻦ ﮐﻪ ﺟﺎﯾﺶ را ﺑﺎ ﻧﻔﺮ اول ﻋﻮض ﮐﻨﺪ‪ ،‬ﺑﻪ اﯾﻦ ﺗﺮﺗﯿﺐ ﺣﺮﮐﺖ ﺑﺎزﯾﮑﻦ اول‪ ،‬ﻣﺘﻌﻠﻖ ﺑﻪ او ﻣﯽﺷﻮد و ﺑﺎزﯾﮑﻦ اول از‬
‫اﯾﻦ ﺑﻪ ﺑﻌﺪ ﺑﻪ ﻋﻨﻮان ﺑﺎزﯾﮑﻦ دوم اداﻣﻪ ﻣﯽدﻫﺪ و ﺣﺮﮐﺖ ﺑﻌﺪي را اﻧﺠﺎم ﻣﯽدﻫﺪ‪ ،‬در واﻗﻊ ﺑﺎزﯾﮑﻦ دوم ﻗﺪرت اﯾﻦ را دارد ﮐﻪ ﺣﺮﮐﺖ‬
‫ﺑﺎزﯾﮑﻦ اول را در ﺻﻮرﺗﯽ ﮐﻪ ﺗﻤﺎﯾﻞ داﺷﺖ ﺑﺮاي ﺧﻮد ﮐﻨﺪ و ﺳﭙﺲ ﺑﺎزﯾﮑﻦ اول ﺑﻪ ﺟﺎي او ﺑﻪ ﻋﻨﻮان ﺑﺎزﯾﮑﻦ دوم ﺑﻪ ﺑﺎزي اداﻣﻪ دﻫﺪ‪.‬‬
‫ﺑﻪ ﻃﻮر ﻣﺜﺎل اﮔﺮ ﺟﺪول ﻣﺎﻧﻨﺪ ﺷﮑﻞ ﺳﻤﺖ ﭼﭗ ﺑﺎﺷﺪ و ﺑﺎزﯾﮑﻦ دوم ﺗﺼﻤﯿﻢ ﺑﻪ ﺗﻌﻮﯾﺾ ﺟﺎﯾﺶ ﺑﮕﯿﺮد‪ ،‬ﺟﺪول ﺑﻪ ﺻﻮرت ﺷﮑﻞ ﺳﻤﺖ‬
‫راﺳﺖ ﻣﯽﺷﻮد‪) .‬ﺣﺮﮐﺖ ﺑﺎزﯾﮑﻦ ﻗﺮﻣﺰ ﺑﻪ ﺣﺮﮐﺖ ﻣﻌﺎدل ﺑﺮاي ﺑﺎزﯾﮑﻦ آﺑﯽ ﺗﺒﺪﯾﻞ ﺷﺪه و در ﺣﺮﮐﺖ ﺑﻌﺪي ﺑﺎزﯾﮑﻦ ﻗﺮﻣﺰ ﺑﺎﯾﺪ ﺑﺎزي را‬
‫اداﻣﻪ دﻫﺪ(‬
‫‬
‫‬
‫‪Swap Rule‬‬
‫‪2‬‬
‫ﺗﻮﺿﯿﺤﺎت ﮐﺪ‬
‫‪Class AbstractPlayer‬‬
‫•‬
‫‪public abstract class AbstractPlayer‬‬
‫{‬
‫;)‪abstract public Move getMove(Board board‬‬
‫}‪public int getColor() {...‬‬
‫}‬
‫ﺑﺮاي ﻧﻮﺷﺘﻦ ﮐﺪ ﺧﻮد ﺑﺎﯾﺪ ﮐﻼس ‪ AbstractPlayer‬را ‪ extend‬ﮐﻨﯿﺪ‪ .‬دﻗﺖ ﮐﻨﯿﺪ ﮐﻪ ﮐﻼﺳﯽ ﮐﻪ ﻣﯽﻧﻮﯾﺴﯿﺪ ﺑﻪ ﻧﺎم‬
‫]‪ Player[std_id‬ﺑﺎﺷﺪ‪ .‬ﯾﻌﻨﯽ اﮔﺮ ﺷﻤﺎره داﻧﺸﺠﻮﯾﯽ ﺷﻤﺎ ‪ 123456‬اﺳﺖ‪ ،‬اﯾﻦ ﮐﻼس ﺑﺎﯾﺪ ﺑﻪ ﻧﺎم ‪Player123456‬‬
‫ﺑﺎﺷﺪ‪.‬‬
‫در اﯾﻦ ﮐﻼس‪ ،‬ﺷﻤﺎ ﺑﺎﯾﺪ ﺗﺎﺑﻊ ‪ getMove‬را ﭘﯿﺎدهﺳﺎزي ﮐﻨﯿﺪ ﮐﻪ ﺑﺎ ﮔﺮﻓﺘﻦ ﯾﮏ ‪ ،Board‬ﺣﺮﮐﺖ ﻣﻮرد ﻧﻈﺮ را ﺑﺮﻣﯽﮔﺮداﻧﺪ‪.‬‬
‫ﻫﻤﭽﻨﯿﻦ ﺑﻪ ﮐﻤﮏ ﺗﺎﺑﻊ ‪ getcolor‬ﻣﯽﺗﻮاﻧﯿﺪ ﺑﻔﻬﻤﯿﺪ ﮐﻪ ﮐﺪ ﺷﻤﺎ ﺑﺮاي ﮐﺪام ﯾﮏ از رﻧﮓﻫﺎ در ﺣﺎل ﺑﺎزي اﺳﺖ‪ 1) .‬ﻧﻤﺎد ﺑﺎزﯾﮑﻦ‬
‫ﻗﺮﻣﺰ و ‪ 2‬ﻧﻤﺎد ﺑﺎزﯾﮑﻦ آﺑﯽ اﺳﺖ(‬
‫‪Class Cell‬‬
‫•‬
‫اﯾﻦ ﮐﻼس ﻧﺸﺎنﮔﺮ ﯾﮏ ﺧﺎﻧﻪ از ﺟﺪول اﺳﺖ ﮐﻪ ﺑﻪ وﺳﯿﻠﻪ ﻣﺸﺨﺼﻪﻫﺎي ‪) r‬ﺷﻤﺎره ﺳﻄﺮ( و ‪) c‬ﺷﻤﺎره ﺳﺘﻮن( ﻣﻌﻠﻮم ﻣﯽﺷﻮد‪.‬‬
‫‪Class Move‬‬
‫•‬
‫ﺑﯿﺎنﮔﺮ ﯾﮏ ﺣﺮﮐﺖ در ﺑﺎزي اﺳﺖ ﺑﻪ اﯾﻦ ﺻﻮرت ﮐﻪ در ‪ constructor‬ﺧﻮد ﯾﮏ ‪ Cell‬ﮐﻪ ﺧﺎﻧﻪ ﺟﺪﯾﺪي اﺳﺖ ﮐﻪ ﻗﺮار‬
‫اﺳﺖ در آن ﻣﻬﺮه ﮔﺬاﺷﺘﻪ ﺷﻮد‪ ،‬را ﻣﯽﮔﯿﺮد‪ .‬ﻫﻤﭽﻨﯿﻦ ﮐﻼس ‪ Swap‬ﻓﺮزﻧﺪ اﯾﻦ ﮐﻼس اﺳﺖ ﮐﻪ ﻧﺸﺎنﮔﺮ ﺣﺮﮐﺖ ﺗﻌﻮﯾﺾ ﻧﻮﺑﺖ اﺳﺖ‪.‬‬
‫‪Class Board‬‬
‫•‬
‫اﯾﻦ ﮐﻼس‪ ،‬ﻫﻤﺎن ﺟﺪول ﺑﺎزي اﺳﺖ‪ 7 .‬ﺗﺎﺑﻊ وﺟﻮد دارد ﮐﻪ ﻣﯽﺗﻮاﻧﯿﺪ در اﯾﻦ ﮐﻼس از آنﻫﺎ اﺳﺘﻔﺎده ﮐﻨﯿﺪ‪:‬‬
‫)(‪public int getSize‬‬
‫اﯾﻦ ﺗﺎﺑﻊ اﻧﺪازه ﺟﺪول ﺑﺎزي را ﺑﺮﻣﯽﮔﺮداﻧﺪ‪ ) .‬ﮐﻪ در اﯾﻦﺟﺎ ﻫﻤﺎن ‪ 7‬اﺳﺖ (‬
‫)(‪public int getNumberOfMoves‬‬
‫اﯾﻦ ﺗﺎﺑﻊ ﺗﻌﺪاد ﺣﺮﮐﺎﺗﯽ ﮐﻪ ﺗﺎﮐﻨﻮن اﻧﺠﺎم ﺷﺪه اﺳﺖ را ﺑﺮﻣﯽﮔﺮداﻧﺪ‪.‬‬
‫)‪public int get(Cell cell‬‬
‫اﯾﻦ ﺗﺎﺑﻊ ﺑﺎ ﮔﺮﻓﺘﻦ ﯾﮏ ﺧﺎﻧﻪ از ﺟﺪول ﻣﺤﺘﻮﯾﺎت آن را ﺑﺮﻣﯽﮔﺮداﻧﺪ ﮐﻪ ‪ 0‬ﻧﻤﺎد ﺧﺎﻧﻪي ﺧﺎﻟﯽ‪ 1 ،‬ﺑﺮاي ﺧﺎﻧﻪي ﻗﺮﻣﺰ و ‪ 2‬ﺑﺮاي ﺧﺎﻧﻪي آﺑﯽ‬
‫اﺳﺖ‪.‬‬
‫)‪public void move(Move move,int player‬‬
‫ﺑﺎ ﮔﺮﻓﺘﻦ ﯾﮏ ﺣﺮﮐﺖ و ﺷﻤﺎره ﺑﺎزﯾﮑﻨﯽ ﮐﻪ اﮐﻨﻮن ﻧﻮﺑﺘﺶ اﺳﺖ‪ ،‬ﺣﺮﮐﺖ را اﻧﺠﺎم داده و ﺟﺪول را ﺑﻪ روز ﻣﯽﮐﻨﺪ‪.‬‬
‫)(‪public boolean isSwapAvailable‬‬
‫ﻧﺸﺎن ﻣﯽدﻫﺪ ﮐﻪ در اﯾﻦ ﺣﺮﮐﺖ ﻣﯽﺗﻮان ﻗﺎﻋﺪه ﺗﻌﻮﯾﺾ را اﺟﺮا ﮐﺮد ﯾﺎ ﻧﻪ‬
‫)‪public ArrayList<Cell> getAdjacents(Cell cell‬‬
‫ﺑﺎ ﮔﺮﻓﺘﻦ ﯾﮏ ﺧﺎﻧﻪ‪ ،‬ﻟﯿﺴﺘﯽ از ﺧﺎﻧﻪﻫﺎي ﻣﺠﺎورش را ﺑﺮﻣﯽﮔﺮداﻧﺪ‪.‬‬
‫)(‪public int win‬‬
‫ﻧﺸﺎن ﻣﯽدﻫﺪ ﮐﻪ ﺟﺪول ﺑﺮﻧﺪهاي دارد ﯾﺎ ﻧﻪ‪ 0 ،‬ﻧﺸﺎنﮔﺮ اﯾﻦ اﺳﺖ ﮐﻪ ﺑﺎزي ﺗﺎﮐﻨﻮن ﺑﺮﻧﺪهاي ﻧﺪاﺷﺘﻪ‪ 1 ،‬ﺑﺮاي ﺑﺮد ﻧﻔﺮ ﻗﺮﻣﺰ و ‪ 2‬ﺑﺮاي ﺑﺮد‬
‫ﻧﻔﺮ آﺑﯽ اﺳﺖ‪.‬‬
‫ﺗﻮﺿﯿﺤﺎت ﺗﮑﻤﯿﻠﯽ‬
‫•‬
‫ﺑﺮاي اﻃﻼع ﮐﺎﻣﻞ از ﻧﺤﻮهي اﺟﺮاي ﺑﺎزي‪ ،‬ﮐﺪﻫﺎي ﻣﻮﺟﻮد را ﻣﻄﺎﻟﻌﻪ ﮐﻨﯿﺪ‪ .‬ﺑﺮاي درك ﺑﻬﺘﺮ ﮐﺪ‪ ،‬ﯾﮏ ﺑﺎزﯾﮑﻦ ﺑﻪ ﻧﺎم‬
‫‪ RandomPlayer‬ﻗﺮار ﮔﺮﻓﺘﻪ اﺳﺖ‪.‬‬
‫•‬
‫ﺗﻨﻬﺎ ﭼﯿﺰي ﮐﻪ ﺷﻤﺎ ﺑﺎﯾﺪ ﺗﺤﻮﯾﻞ دﻫﯿﺪ‪ ،‬ﮐﻼس ]‪ Player[std_id‬اﺳﺖ‪ .‬ﺑﻨﺎﺑﺮاﯾﻦ ﻣﺠﺎز ﺑﻪ ﺗﻐﯿﯿﺮ در ﺳﺎﯾﺮ ﮐﺪﻫﺎ ﻧﯿﺴﺘﯿﺪ‪.‬‬
‫•‬
‫ﻣﺴﺘﻨﺪي درﺑﺎرهي ﻧﺤﻮهي ﭘﯿﺎدهﺳﺎزي ﮐﺪ و ﭼﺮاﯾﯽ اﺳﺘﻔﺎده از ‪ evaluation function‬ﺗﻬﯿﻪ و در ﻗﺎﻟﺐ ‪ PDF‬آن را‬
‫ارﺳﺎل ﮐﻨﯿﺪ‪.‬‬
‫•‬
‫ﻧﯿﻤﯽ از ﻧﻤﺮهي ﺷﻤﺎ را ﻋﻤﻠﮑﺮد ﮐﺪﺗﺎن در ﻣﻘﺎﺑﻞ ﺳﺎﯾﺮ ﺑﺎزﯾﮑﻨﺎن ﺗﺸﮑﯿﻞ ﻣﯽدﻫﺪ‪ .‬ﮐﺪﻫﺎي ﺷﻤﺎ دو ﺑﻪ دو در ﻣﻘﺎﺑﻞ ﯾﮑﺪﯾﮕﺮ‬
‫ﺑﺎزي ﺧﻮاﻫﻨﺪ ﮐﺮد )ﯾﮏﺑﺎر ﺑﻪ ﻋﻨﻮان ﺑﺎزﯾﮑﻦ اول و ﯾﮏﺑﺎر ﺑﻪ ﻋﻨﻮان ﺑﺎزﯾﮑﻦ دوم(‬
‫•‬
‫ﻫﺮ ﮔﻮﻧﻪ ﺳﻮال در ﻣﻮرد ﺗﻤﺮﯾﻦ را در ﮐﻮﺋﺮا ﻣﻄﺮح ﮐﻨﯿﺪ‪.‬‬
‫ﻣﻮﻓﻖ ﺑﺎﺷﯿﺪ ‪J‬‬