ﺗﻤﺮﯾﻦ ﺳﺮي ﭼﻬﺎرم درس ﻫﻮش ﻣﺼﻨﻮﻋﯽ
ﻣﺪرس :دﮐﺘﺮ ﺳﻠﯿﻤﺎﻧﯽ
ﺗﺮم دوم ﺳﺎل ﺗﺤﺼﯿﻠﯽ 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
© Copyright 2026 Paperzz