Assignment3.pdf

‫‪ ‬‬
‫‪ ‬‬
‫ﺗﻤﺮﻳﻦ ﺳﺮي ﺳﻮم‬
‫درس ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﻲ ﺷﻲءﮔﺮا‬
‫ﻣﻮﻋﺪ ارﺳﺎل‪ :‬ﺷﻨﺒﻪ ‪ 19‬اردﻳﺒﻬﺸﺖ ‪1388‬‬
‫ﻣﺤﻤﺪ دﺷﺘﻲ ‪ -‬اﻣﻴﺮ ﺷﻴﺨﻬﺎ‬
‫‪ ‬‬
‫‪ ‬ﺗﻤﺮﻳﻦ ﺳﺮي ﺳﻮم ﺑﺮﻧﺎﻣﻪ ﺳﺎزي ﺷﻲءﮔﺮا‬
‫‪ ‬ﻣﻬﻠﺖ ﺗﺤﻮﻳﻞ‪ :‬ﺷﻨﺒﻪ ‪ 19‬اردﻳﺒﻬﺸﺖ ‪1388‬‬
‫ﻧﻜﺎت ﻛﻠﻲ‬
‫‪ ‬در اﻳﻦ ﺗﻤﺮﻳﻦ ﺷﻤﺎ ﺑﺮﻧﺎﻣﻪي ﻗﺎﺑﻞ اﺟﺮاﻳﻲ ﻧﻤﻲﻧﻮﻳﺴﻴﺪ و ﻓﻘﻂ ﭼﻨﺪ ﻛﻼس را ﭘﻴﺎدهﺳﺎزي ﻣﻲﻛﻨﻴﺪ‪ .‬‬
‫‪ ‬ﻫﺪف از اﻳﻦ ﺗﻤﺮﻳﻦ‪ ،‬آﺷﻨﺎﻳﻲ ﺑﻴﺸﺘﺮ ﺑﺎ ﻣﻔﺎﻫﻴﻢ ‪ interface ،exception ،package‬و ﻛﺎر ﺑﻴﺸﺘﺮ ﺑﺎ ﻣﺤﻴﻂ‬
‫ﮔﺮاﻓﻴﻜﻲ اﺳﺖ‪ .‬‬
‫‪ ‬ﺑﺮاي ارﺳﺎل‪ ،‬ﻫﻤﻪي ﻓﺎﻳﻞﻫﺎي ﺧﻮد را در ﻳﻚ ﻓﺎﻳﻞ ﺑﻪ ﻧﺎم ‪ STDID.zip‬ﻗﺮار دﻫﻴﺪ‪) .‬ﻛﻪ ‪ STDID‬ﺷﻤﺎره‬
‫داﻧﺸﺠﻮﻳﻴﺘﺎن ﻣﻲﺑﺎﺷﺪ‪ (.‬دﻗﺖ ﻛﻨﻴﺪ ﻛﻪ ﻓﺎﻳﻞﻫﺎي ﺧﻮد را ﺑﺪون ﻗﺮار دادن در ﻫﻴﭻ ﭘﻮﺷﻪاي در ﻓﺎﻳﻞ ‪ zip‬ﻗﺮار‬
‫دﻫﻴﺪ‪ .‬در واﻗﻊ ﺑﺎﻳﺪ داﺧﻞ ﻓﺎﻳﻞ ‪ zip‬ﺷﻤﺎ ﻓﻘﻂ ﭘﻮﺷﻪي ‪ ir‬و ﻣﺤﺘﻮﻳﺎت آن ﻗﺮار داﺷﺘﻪ ﺑﺎﺷﺪ‪ .‬‬
‫‪ ‬ﺑﺮاي ارﺳﺎل ﺗﻤﺮﻳﻦ ﺑﻪ آدرس زﻳﺮ ﻣﺮاﺟﻌﻪ ﻛﻨﻴﺪ‪ :‬‬
‫‪http://ce.sharif.edu/~m_jahangir/java882 ‬‬
‫‪ ‬ﻣﻮﻋﺪ ارﺳﺎل‪ ،‬ﺳﺎﻋﺖ ‪) 11:59‬ﻇﻬﺮ( روز ﺷﻨﺒﻪ ‪ 19‬اردﻳﺒﻬﺸﺖ ‪ 1388‬ﺑﻮده و ﺑﻪ ﻫﻴﭻ ﻋﻨﻮان ﺗﻤﺪﻳﺪ ﻧﺨﻮاﻫﺪ ﺷﺪ‪.‬‬
‫‪ ‬ﺗﺄﺧﻴﺮ ﺗﺎ ‪ 1‬ﺳﺎﻋﺖ‪ ،‬ﺑﻪ ازاي ﻫﺮ ‪ 3‬دﻗﻴﻘﻪ ﻣﻮﺟﺐ ﻛﺴﺮ ﺷﺪن ‪ %1‬ﻧﻤﺮه‪ ،‬از ‪ 1‬ﺳﺎﻋﺖ ﺗﺎ ‪ 24‬ﺳﺎﻋﺖ ﻣﻮﺟﺐ ﻛﺴﺮ ﺷﺪن‬
‫‪ %20‬ﻧﻤﺮه‪ ،‬از ‪ 24‬ﺳﺎﻋﺖ ﺗﺎ ‪ 25‬ﺳﺎﻋﺖ‪ ،‬ﺑﻪ ازاي ﻫﺮ ‪ 2‬دﻗﻴﻘﻪ ﻣﻮﺟﺐ ﻛﺴﺮ ﺷﺪن ‪ %1‬ﻧﻤﺮهي دﻳﮕﺮ و ﺑﻴﻦ ‪ 25‬ﺳﺎﻋﺖ‬
‫ﺗﺎ ‪ 48‬ﺳﺎﻋﺖ ﺑﺎﻋﺚ ﻛﺴﺮ ﺷﺪن ‪ %50‬ﻧﻤﺮه ﻣﻲﺷﻮد‪ .‬ﺗﺄﺧﻴﺮ ﺑﻴﺸﺘﺮ از ‪ 48‬ﺳﺎﻋﺖ ﻗﺎﺑﻞ ﻗﺒﻮل ﻧﻴﺴﺖ‪ .‬‬
‫‪ ‬ﻗﻄﻊ ﺑﻮدن اﻳﻨﺘﺮﻧﺖ ﺧﻮاﺑﮕﺎه‪ ،‬ﻛﻨﺪي ﭘﺎﻳﮕﺎه اﻳﻨﺘﺮﻧﺘﻲ داﻧﺸﻜﺪه‪ ،‬ﺗﻤﺎم ﺷﺪن ﻛﺎرت اﻳﻨﺘﺮﻧﺖ و … ﻫﻴﭻﻛﺪام دﻟﻴﻞ‬
‫ﻣﻮﺟﻬﻲ ﺑﺮاي ﺗﺄﺧﻴﺮ ﻧﻴﺴﺘﻨﺪ‪ .‬ﺑﻨﺎﺑﺮاﻳﻦ ﭘﻴﺸﻨﻬﺎد ﻣﻲﺷﻮد ﺟﻮابﻫﺎي ﺧﻮد را در داﻧﺸﻜﺪه ارﺳﺎل ﻛﻨﻴﺪ‪ .‬‬
‫‪ ‬ﻫﺮﮔﻮﻧﻪ روﻧﻮﺷﺖ‪ ،1‬ﺑﺮاي ﻣﻨﺒﻊ روﻧﻮﺷﺖ و ﻫﻤﭽﻨﻴﻦ ﻧﺴﺨﻪﻫﺎي روﻧﻮﻳﺴﻲ ﺷﺪه ‪ -2‬ﻧﻤﺮه در ﭘﻲ ﺧﻮاﻫﺪ داﺷﺖ‪ .‬‬
‫‪ ‬ﺗﻼش ﺑﺮاي اﺳﺘﻔﺎده از ﻣﻨﺎﺑﻊ ﺳﻴﺴﺘﻢ ﻣﺎﻧﻨﺪ ﻛﺎرت ﺻﺪا و ﭘﺮﻳﻨﺘﺮ و ﻧﻮﺷﺘﻦ ﺑﻪ ﻓﺎﻳﻞ و ‪ ...‬ﻣﻨﺠﺮ ﺑﻪ درﻳﺎﻓﺖ ﻧﻤﺮهي‬
‫‪ ‬ﻛﻼسﻫﺎ و ﻣﺘﺪﻫﺎي ﮔﻔﺘﻪ ﺷﺪه در آنﻫﺎ ﺣﺪاﻗﻞﻫﺎي ﻻزم ﻫﺴﺘﻨﺪ‪ .‬ﻳﻌﻨﻲ ﺷﻤﺎ ﻣﻲﺗﻮاﻧﻴﺪ ﺑﺮاي راﺣﺖﺗﺮ ﺷﺪن ﭘﻴﺎده‪-‬‬
‫ﺳﺎزﻳﺘﺎن ﻳﺎ ﺷﻲﮔﺮاﺗﺮ ﺷﺪن ﻛﺪﺗﺎن ﺑﻪ اﻳﻦ ﻛﻼسﻫﺎ ﻣﺘﺪﻫﺎي دﻳﮕﺮي اﺿﺎﻓﻪ ﻛﻨﻴﺪ ﻳﺎ ﺑﻪ ﻛﻞ ﺗﻤﺮﻳﻦ ﻛﻼسﻫﺎي‬
‫دﻳﮕﺮي اﺿﺎﻓﻪ ﻛﻨﻴﺪ‪ .‬وﻟﻲ دﻗﺖ داﺷﺘﻪ ﺑﺎﺷﻴﺪ ﻛﻪ ﻛﻼسﻫﺎي ﮔﻔﺘﻪ ﺷﺪه و ﻣﺘﺪﻫﺎي آﻧﻬﺎ ﺑﺎﻳﺪ ﺑﻪ ﻫﻤﻴﻦ ﺷﻜﻞ‪ ،‬ﻣﻮﺟﻮد‬
‫ﺑﺎﺷﻨﺪ‪ .‬‬
‫‪ ‬ﻗﺴﻤﺘﻲ از ﻧﻤﺮه ﺑﻪ ﺷﻲﮔﺮا ﺑﻮدن ﺑﺮﻧﺎﻣﻪ ﻧﻮﺷﺘﻪ ﺷﺪه ﺑﺴﺘﮕﻲ دارد‪ .‬ﺑﻨﺎﺑﺮاﻳﻦ ﺑﻪ ﺷﻲﮔﺮا ﻧﻮﺷﺘﻦ ﺑﺮﻧﺎﻣﻪﺗﺎن دﻗﺖ ﻛﻨﻴﺪ‪ .‬‬
‫‪ ‬‬
‫‪ 1‬ﻛﭙﻲ ﻳﺎ ﻫﻤﺎن ﻛُﭗ‬
‫‪ ‬‬
‫‪ ‬‬
‫‪ ‬ﺗﻤﺮﻳﻦ ﺳﺮي ﺳﻮم ﺑﺮﻧﺎﻣﻪ ﺳﺎزي ﺷﻲءﮔﺮا‬
‫ﺻﻔﺮ در اﻳﻦ ﺗﻤﺮﻳﻦ ﻣﻲﺷﻮد‪ .‬‬
‫‪ 1‬‬
‫‪ ‬‬
‫‪ ‬از آﻧﺠﺎﻳﻲ ﻛﻪ ﺑﺨﺸﻲ از ﻧﻤﺮه ﻣﺮﺑﻮط ﺑﻪ ﺗﺼﺤﻴﺢ ﺧﻮدﻛﺎر اﺳﺖ‪ ،‬ﻋﺪم رﻋﺎﻳﺖ ﻧﻜﺎت ﻇﺮﻳﻒ ﻣﺎﻧﻨﺪ ﻧﺎم ﻣﺘﺪﻫﺎ‪ ،‬ﻧﺎم‬
‫ﻛﻼﺳﻬﺎ‪ ،‬ﺻﻮرت ﺻﺤﻴﺢ رﺷﺘﻪﻫﺎ)اﻋﻢ از ﺑﺰرﮔﻲ و ﻛﻮﭼﻜﻲ ﻛﺎراﻛﺘﺮﻫﺎ( و ‪ ...‬ﻣﻮﺟﺐ اﺧﺘﻼل در روﻧﺪ ﺗﺼﺤﻴﺢ )و ﻧﻤﺮه(‬
‫ﺧﻮاﻫﺪ ﺷﺪ‪) .‬دﻗﺖ ﻛﻨﻴﺪ ﻛﻪ اﻳﻦ ﺗﻤﺮﻳﻦ ﺗﺼﺤﻴﺢ ﺑﺮﺧﻂ ﻧﺪارد وﻟﻲ ﺑﻌﺪ از ﭘﺎﻳﺎن ﻣﻬﻠﺖ ارﺳﺎل ﺑﻪ ﺻﻮرت ﺧﻮدﻛﺎر‬
‫ﺗﺼﺤﻴﺢ ﻣﻲﺷﻮد‪ (.‬‬
‫‪ ‬ﻧﺤﻮهي ﻧﻤﺮهدﻫﻲ ﺑﻪ ﺻﻮرت زﻳﺮ ﻣﻲﺑﺎﺷﺪ‪ :‬‬
‫‪ o‬ﺗﺼﺤﻴﺢ ﺧﻮدﻛﺎر ‪ %50 ‬ﻧﻤﺮه ‪ ‬‬
‫‪ o‬رﻋﺎﻳﺖ اﺻﻮل ﺷﻲﮔﺮاﻳﻲ و آداب ﺑﺮﻧﺎﻣﻪﻧﻮﻳﺴﻲ ﺟﺎوا ‪ %25 ‬ﻧﻤﺮه ‪ ‬‬
‫‪ o‬دادن ﭘﻴﻐﺎم ﻣﻨﺎﺳﺐ ﺑﻪ ﻫﻨﮕﺎم ﺑﺮوز ﺧﻄﺎ ‪ %10 ‬ﻧﻤﺮه ‪ ‬‬
‫‪ o‬واﺳﻂ ﻛﺎرﺑﺮي‪ %15  2‬ﻧﻤﺮه ‪ ‬‬
‫‪ ‬ﺳﻮاﻻت ﺧﻮد را ﺑﺎ ﻓﺮﺳﺘﺎدن اﻳﻤﻴﻞ ﺑﻪ آدرس ‪ [email protected]‬ﻣﻄﺮح ﻛﻨﻴﺪ‪ .‬‬
‫‪ ‬ﺗﻤﺮﻳﻦ ﺳﺮي ﺳﻮم ﺑﺮﻧﺎﻣﻪ ﺳﺎزي ﺷﻲءﮔﺮا‬
‫‪ 2‬‬
‫‪ ‬‬
‫‪ 2‬زﻳﺒﺎﻳﻲ واﺳﻂ ﻛﺎرﺑﺮي ﻧﻤﺮه ﻧﺪارد‪ ،‬و ﻓﻘﻂ ﻛﺎرآﻳﻲ واﺳﻂ ﻛﺎرﺑﺮي ﻫﻤﺎنﻃﻮر ﻛﻪ در اداﻣﻪ ﮔﻔﺘﻪ ﺧﻮاﻫﺪ ﺷﺪ‪ ،‬ﻣﺪﻧﻈﺮ اﺳﺖ‪ .‬‬
‫‪ ‬‬
‫‪ ‬‬
‫ﻣﻘﺪﻣﻪ‬
‫در اﻳﻦ ﺗﻤﺮﻳﻦ‪ ،‬ﺷﻤﺎ ﺑﺎﻳﺪ ﺑﺎزي ﺷﻄﺮﻧﺞ را ﭘﻴﺎده ﺳﺎزي ﻛﻨﻴﺪ‪ .‬ﺑﺮاي اﻃﻼﻋﺎت ﺑﻴﺸﺘﺮ در زﻣﻴﻨﻪي اﻳﻦ ﺑﺎزي ﻣﻲﺗﻮاﻧﻴﺪ ﺑﻪ آدرس‬
‫‪ http://en.wikipedia.org/wiki/Chess‬ﻣﺮاﺟﻌﻪ ﻓﺮﻣﺎﺋﻴﺪ‪ .‬ﻛﻠﻴﻪي ﻛﻼﺳﻬﺎ و ﭘﻜﻴﺠﻬﺎي اﻳﻦ ﺑﺮﻧﺎﻣﻪ ﺑﺎﻳﺪ‬
‫داﺧﻞ ﭘﻜﻴﺞ ‪ ir.sharif.ce.javaclass.chess‬ﺑﺎﺷﻨﺪ‪ .‬‬
‫ﺑﺮﻧﺎﻣﻪاي ﻛﻪ ﻣﻲﻧﻮﻳﺴﻴﺪ ﺑﺎﻳﺪ ﻗﺎﺑﻠﻴﺖ اﻧﺠﺎم دادن ﺑﺎزي ﺑﺼﻮرت اﻧﺴﺎن ﺑﺎ اﻧﺴﺎن و ﻫﻮش ﻣﺼﻨﻮﻋﻲ ﺑﺎ ﻫﻮش ﻣﺼﻨﻮﻋﻲ را داﺷﺘﻪ‬
‫ﺑﺎﺷﺪ‪.‬‬
‫واﺳﻂ ﻛﺎرﺑﺮي‬
‫ﻛﻠﻴﻪي ﻛﻼسﻫﺎﻳﻲ ﻛﻪ ﻣﺮﺑﻮط ﺑﻪ واﺳﻂ ﻛﺎرﺑﺮي ﻣﻲﺑﺎﺷﻨﺪ ﺑﺎﻳﺪ داﺧﻞ ﭘﻜﻴﺞ ‪ir.sharif.ce.javaclass.chess.ui‬‬
‫ﺑﺎﺷﻨﺪ‪) .‬و ﻫﻤﭽﻨﻴﻦ ﻛﻼسﻫﺎﻳﻲ ﻛﻪ ﻣﺮﺑﻮط ﺑﻪ واﺳﻂ ﻛﺎرﺑﺮي ﻧﻴﺴﺘﻨﺪ ﻧﺒﺎﻳﺪ در اﻳﻦ ﭘﻜﻴﺞ ﺑﺎﺷﻨﺪ!( دﻗﺖ ﻛﻨﻴﺪ ﻛﻪ واﺳﻂ‬
‫ﻛﺎرﺑﺮي ﺗﻨﻬﺎ ﺑﺮاي ﺣﺎﻟﺖ ﺑﺎزي اﻧﺴﺎن ﺑﺎ اﻧﺴﺎن اﺳﺖ و ﺑﺮاي ﺣﺎﻟﺖ ﺑﺎزي ﻫﻮش ﻣﺼﻨﻮﻋﻲ ﺑﺎ ﻫﻮش ﻣﺼﻨﻮﻋﻲ ﻧﻴﺎز ﺑﻪ واﺳﻂ‬
‫ﻛﺎرﺑﺮي ﻧﻴﺴﺖ‪.‬‬
‫ﺷﻤﺎ ﺑﺎﻳﺪ ﻳﻚ راﺑﻂ ﻛﺎرﺑﺮ در ﻧﻈﺮ ﺑﮕﻴﺮﻳﺪ ﻛﻪ ﻛﺎﺑﺮ ﺑﺘﻮاﻧﺪ ﺑﺎ آن ﻛﺎر ﻛﻨﺪ‪ .‬ﺑﺮاي اﻳﻦ ﻛﺎر ﭘﻴﺸﻨﻬﺎد ﻣﻲﺷﻮد از ‪ JFrame‬اﺳﺘﻔﺎده‬
‫ﻛﻨﻴﺪ‪).‬در ﺻﻮرﺗﻴﻜﻪ ﺧﻮاﺳﺘﻴﺪ‪ ،‬ﻣﺎﻧﻌﻲ ﻧﺪارد ﻛﻪ از ‪ Applet‬ﻧﻴﺰ اﺳﺘﻔﺎده ﻧﻤﺎﺋﻴﺪ‪ (.‬ﺑﺮاي ﺣﺮﻛﺖ دادن ﻳﻚ ﻣﻬﺮه‪ ،‬ﻛﺎرﺑﺮ ﺑﺎﻳﺪ‬
‫روي ﺧﺎﻧﻪي آن ﻣﻬﺮه ﻛﻠﻴﻚ ﻛﻨﺪ و ﺳﭙﺲ روي ﻣﻘﺼﺪ ﻛﻠﻴﻚ ﻛﻨﺪ‪ .‬در ﺻﻮرﺗﻴﻜﻪ ﻣﺠﺪدا روي ﻫﻤﺎن ﺧﺎﻧﻪ ﻛﻠﻴﻚ ﻛﺮد ﺑﺎﻳﺪ آن‬
‫ﻣﻬﺮه از ﺣﺎﻟﺖ اﻧﺘﺨﺎب ﺑﻴﺮون ﺑﻴﺎﻳﺪ‪ .‬ﻫﻤﭽﻨﻴﻦ در ﺻﻮرﺗﻴﻜﻪ ﺧﺎرج از ﺻﻔﺤﻪي ﺷﻄﺮﻧﺞ ﻛﻠﻴﻚ ﻛﺮد‪ ،‬ﺑﺎﻳﺪ آن ﻣﻬﺮه از ﺣﺎﻟﺖ‬
‫اﻧﺘﺨﺎب ﺑﻴﺮون ﺑﻴﺎﻳﺪ‪.‬‬
‫دﻗﺖ ﻛﻨﻴﺪ ﻛﻪ وﺿﻌﻴﺖ ﻓﻌﻠﻲ ﺑﺎزي )اﻋﻢ از ﻧﻮﺑﺖ و اﻳﻨﻜﻪ ﺑﺎزﻳﻜﻦ در ﺣﺎﻟﺖ ﻛﻴﺶ ﻫﺴﺖ ﻳﺎ ﻧﻪ( ﺑﺎﻳﺪ ﺑﻪ ﻛﺎرﺑﺮ ﻧﺸﺎن داده ﺷﻮد‪.‬‬
‫اﻳﻦ ﻗﺴﻤﺖ در ﺗﺤﻮﻳﻞ ﺣﻀﻮري ﺑﺮرﺳﻲ ﻣﻲﺷﻮد‪.‬‬
‫ﻫﻮش ﻣﺼﻨﻮﻋﻲ ﻛﻪ ﺑﻪ ﺑﺎزي ﺷﻤﺎ داده ﻣﻲﺷﻮد )ﻧﺤﻮهي داده ﺷﺪن ﻫﻮش ﻣﺼﻨﻮﻋﻲ ﺑﻪ ﺑﺎزي ﺑﻌﺪا ﺗﻮﺿﻴﺢ داده ﻣﻲﺷﻮد(‪ ،‬ﺷﻲ‪-‬‬
‫اي اﺳﺖ ﻛﻪ ‪ interface‬زﻳﺮ را ﭘﻴﺎدهﺳﺎزي )‪ (implement‬ﻣﻲﻛﻨﺪ‪.‬‬
‫{ ‪public interface IPlayer‬‬
‫;)‪public String move(Chess chess‬‬
‫}‬
‫‪ ‬‬
‫‪ ‬‬
‫‪ ‬ﺗﻤﺮﻳﻦ ﺳﺮي ﺳﻮم ﺑﺮﻧﺎﻣﻪ ﺳﺎزي ﺷﻲءﮔﺮا‬
‫ﻫﻮش ﻣﺼﻨﻮﻋﻲ‬
‫‪ 3‬‬
‫‪ ‬‬
‫در ﻫﻨﮕﺎﻣﻲ ﻛﻪ ﻧﻮﺑﺖ ﺑﻪ ﻫﻮش ﻣﺼﻨﻮﻋﻲ ﺑﺮﺳﺪ‪ ،‬ﺷﻤﺎ ﺑﺎ ﻓﺮاﺧﻮاﻧﻲ ﻣﺘﺪ ‪ move‬ﻫﻮش ﻣﺼﻨﻮﻋﻲ‪ ،‬ﺣﺮﻛﺖ ﻣﻮرد ﻧﻈﺮش را‬
‫درﻳﺎﻓﺖ ﻣﻲﻛﻨﻴﺪ‪ .‬ﺧﺮوﺟﻲ اﻳﻦ ﻣﺘﺪ ﻳﻚ رﺷﺘﻪ اﺳﺖ ﻛﻪ ﻣﺸﺨﺺ ﻣﻲﻛﻨﺪ ﻣﻬﺮهي درون ﭼﻪ ﺧﺎﻧﻪاي‪ ،‬ﺑﻪ ﭼﻪ ﺧﺎﻧﻪاي ﺑﺮود‪.‬‬
‫ﺑﺮاي ﻣﺜﺎل اﮔﺮ ﺧﺮوﺟﻲ اﻳﻦ ﻣﺘﺪ‪ ،‬رﺷﺘﻪي ”‪ “A2‐>A4‬ﺑﺎﺷﺪ‪ ،‬ﺑﺎﻳﺪ ﻣﻬﺮهي درون ﺧﺎﻧﻪي ‪ A2‬ﺑﻪ ﺧﺎﻧﻪي ‪ A4‬ﺑﺮود‪ .‬ورودي‬
‫اﻳﻦ ﺗﺎﺑﻊ ﻳﻚ ﺷﻲ از ﺟﻨﺲ ‪ Chess‬اﺳﺖ ﻛﻪ ﻫﻤﺎن ﺑﺎزي در ﺣﺎل اﺟﺮاﺳﺖ ﻛﻪ ﺑﻌﺪا ﺗﻮﺿﻴﺢ داده ﺧﻮاﻫﺪ ﺷﺪ‪) .‬دﻟﻴﻞ اﻳﻨﻜﻪ‬
‫اﻳﻦ ﮔﻮﻧﻪ ورودي ﺑﺎﻳﺪ ﺑﻪ ﻣﺘﺪ ‪ move‬داد اﻳﻦ اﺳﺖ ﻛﻪ ﻣﺘﺪ ‪ ،move‬در ﻫﻨﮕﺎم اﺟﺮاي ﻳﻚ ﺣﺮﻛﺖ‪ ،‬ﺑﺎﻳﺪ ﻣﻮﻗﻌﻴﺖ ﺗﻤﺎﻣﻲ‬
‫ﻣﻬﺮهﻫﺎ را ﺑﺪاﻧﺪ‪(.‬‬
‫ﻣﻬﺮهﻫﺎ‬
‫ﺑﺮاي ﻣﻬﺮهﻫﺎ ﺑﺎﻳﺪ ﻳﻚ ﭘﻜﻴﺞ ﺗﺤﺖ ﻧﺎم ‪ ir.sharif.ce.javaclass.chess.pieces‬در ﻧﻈﺮ ﺑﮕﻴﺮﻳﺪ ﻛﻪ ﺑﺎﻳﺪ در آن ﻳﻚ‬
‫ﻛﻼس ‪ abstract‬ﺗﺤﺖ ﻧﺎم ‪ Piece‬وﺟﻮد داﺷﺘﻪ ﺑﺎﺷﺪ ﻛﻪ ‪ 2‬ﻣﺘﺪ ‪ abstract‬دارد‪ .‬اﻳﻦ ﻣﺘﺪﻫﺎ ﻋﺒﺎرﺗﻨﺪ از‪) :‬ﭘﺎراﻣﺘﺮﻫﺎي‬
‫اﻳﻦ ﻣﺘﺪﻫﺎ ﺑﺮ ﻋﻬﺪهي ﺧﻮدﺗﺎن اﺳﺖ‪(.‬‬
‫‪ :draw ‬اﻳﻦ ﺗﺎﺑﻊ وﻇﻴﻔﻪي رﺳﻢ ﻣﻬﺮه را ﺑﺮ ﻋﻬﺪه دارد‪ .‬‬
‫‪ :canMoveTo ‬اﻳﻦ ﺗﺎﺑﻊ آدرس ﻳﻚ ﺧﺎﻧﻪ را ﻣﻲﮔﻴﺮد و ﭼﻚ ﻣﻲﻛﻨﺪ ﻛﻪ آﻳﺎ اﻳﻦ ﻣﻬﺮه ﻣﻲﺗﻮاﻧﺪ ﺑﻪ آن ﺧﺎﻧﻪ ﺑﺮود‬
‫ﻳﺎ ﻧﻪ‪) .‬ﻧﻴﺎز ﺑﻪ ﭘﻴﺎده ﺳﺎزي ﺣﺮﻛﺖ ﺷﺎه‪-‬ﻗﻠﻌﻪ‪ 3‬و ارﺗﻘﺎء ﺳﺮﺑﺎز‪ 4‬ﻧﻴﺴﺖ( ‪ ‬‬
‫ﺳﭙﺲ ﺑﻪ ازاي ﻫﺮ ﻧﻮع ﻣﻬﺮه از ﺷﻄﺮﻧﺞ‪ ،‬ﺑﺎﻳﺪ ﻳﻚ ﻛﻼس ﺑﮕﻴﺮﻳﺪ ﻛﻪ ﺑﭽﻪ اﻳﻦ ﻛﻼس ‪ Piece‬ﺑﺎﺷﺪ‪ .‬ﺑﺮاي ﻫﺮ ﻧﻮع ﻣﻬﺮه‪ ،‬ﺑﺎﻳﺪ‬
‫ﻣﺘﺪ ‪ toString‬را ‪ override‬ﻛﻨﻴﺪ ﻛﻪ ﺧﺮوﺟﻲ آن ﺑﺼﻮرت ”‪ “XY‬ﻣﻲﺑﺎﺷﺪ‪ Y .‬ﻧﺸﺎندﻫﻨﺪهي رﻧﮓ ﻣﻬﺮه ﻣﻲﺑﺎﺷﺪ )در‬
‫ﺻﻮرﺗﻴﻜﻪ ﺳﻔﻴﺪ ﺑﻮد‪ W ،‬و در ﺻﻮرﺗﻴﻜﻪ ﺳﻴﺎه ﺑﻮد‪ B ،‬ﺧﻮاﻫﺪ ﺑﻮد( و ‪ ،X‬ﻧﻮع ﻣﻬﺮه ﻣﻲﺑﺎﺷﺪ ﻛﻪ ﻣﻄﺎﺑﻖ ﺑﺎ ﺟﺪول زﻳﺮ ﻣﺸﺨﺺ‬
‫ﻣﻲﮔﺮدد‪) :‬ﺑﺮاي ﻣﺜﺎل ﺳﺮﺑﺎز ﺳﻴﺎه ﺑﺼﻮرت ”‪ “PB‬و اﺳﺐ ﺳﻔﻴﺪ ﺑﺼﻮرت ”‪ “NW‬ﻣﺸﺨﺺ ﻣﻲﺷﻮﻧﺪ‪(.‬‬
‫‪ ‬ﺗﻤﺮﻳﻦ ﺳﺮي ﺳﻮم ﺑﺮﻧﺎﻣﻪ ﺳﺎزي ﺷﻲءﮔﺮا‬
‫‪ 4‬‬
‫اﺳﺐ ‪ ‬‬
‫ﻓﻴﻞ‬
‫وزﻳﺮ‬
‫ﺷﺎه‬
‫ﺳﺮﺑﺎز‬
‫ﻗﻠﻌﻪ )رخ(‬
‫‪ N‬‬
‫‪ B‬‬
‫‪ Q‬‬
‫‪K‬‬
‫‪P‬‬
‫‪R‬‬
‫ﺧﻄﺎ‪5‬ﻫﺎ ‪ ‬‬
‫ﻛﻠﻴﻪي ﻛﻼﺳﻬﺎي ﻣﺮﺑﻮط ﺑﻪ ﺧﻄﺎﻫﺎ ﺑﺎﻳﺪ داﺧﻞ ﭘﻜﻴﺞ ‪ ir.sharif.ce.javaclass.chess.exceptions‬ﺑﺎﺷﻨﺪ‪.‬‬
‫اوﻟﻴﻦ ﻛﻼﺳﻲ ﻛﻪ ﺑﺎﻳﺪ در اﻳﻦ ﭘﻜﻴﺞ در ﻧﻈﺮ ﺑﮕﻴﺮﻳﺪ‪ ،‬ﻛﻼس ‪ ChessException‬اﺳﺖ ﻛﻪ ﺑﭽﻪي ‪ Exception‬ﻣﻲﺑﺎﺷﺪ‪.‬‬
‫‪ ‬‬
‫‪ Castling 3‬‬
‫‪ :Promotion 4‬وﻗﺘﻲ ﻛﻪ ﺳﺮﺑﺎز ﻳﻚ ﺑﺎزﻳﻜﻦ ﺑﻪ ﺧﺎﻧﻪي آﺧﺮ رﺳﻴﺪ‪ ،‬ﺣﻖ دارد ﺑﺠﺎي آن ﻳﻚ ﻣﻬﺮهي ﻣﻄﻠﻮب ﺑﻴﺎورد‪ .‬‬
‫‪ Exception 5‬‬
‫‪ ‬‬
‫‪ ‬‬
‫ﺑﺮﻧﺎﻣﻪي ﺷﻤﺎ ﺑﺎﻳﺪ ﺧﻄﺎﻫﺎي ﻻزم را ﺑﻪ ﻛﺎرﺑﺮ ﺑﺪﻫﺪ‪) .‬دﻗﺖ ﻛﻨﻴﺪ ﻛﻪ اﻳﻦ ﺧﻄﺎﻫﺎ در ﺣﺎﻟﺘﻲ ﻛﻪ ‪ 2‬اﻧﺴﺎن ﺑﺎ ﻫﻢ ﺑﺎزي ﻣﻲ ﻛﻨﻨﺪ‪،‬‬
‫ﺑﺎﻳﺪ ﺑﻪ ﺻﻮرت ﮔﺮاﻓﻴﻜﻲ ﺑﻪ ﻛﺎرﺑﺮ ﻧﺸﺎن داده ﺷﻮﻧﺪ‪ 6‬و در ﺣﺎﻟﺘﻲ ﻛﻪ ‪ 2‬ﻫﻮش ﻣﺼﻨﻮﻋﻲ ﺑﺎ ﻫﻢ ﺑﺎزي ﻣﻲﻛﻨﻨﺪ ﻧﺒﺎﻳﺪ ﺑﻪ ﺻﻮرت‬
‫ﮔﺮاﻓﻴﻜﻲ ﻧﺸﺎن داده ﺷﻮﻧﺪ( ﺧﻄﺎﻫﺎﻳﻲ ﻛﻪ ﭘﻴﺎده ﺳﺎزي آﻧﻬﺎ ﺿﺮوري اﺳﺖ ﻋﺒﺎرﺗﻨﺪ از‪:‬‬
‫‪ ‬ﺣﺮﻛﺖ اﺷﺘﺒﺎه ﻣﻬﺮهﻫﺎ ‪ ‬‬
‫‪ ‬ﻛﻴﺶ ﺑﻮدن)ﻣﻮﻗﻌﻲ ﻛﻪ در ﺣﺎﻟﺖ ﻛﻴﺶ ﺑﻮدن‪ ،‬ﺣﺮﻛﺘﻲ اﻧﺠﺎم دﻫﺪ ﻛﻪ ﻫﻨﻮز ﻛﻴﺶ ﺑﻤﺎﻧﺪ ﻳﺎ در وﺿﻌﻴﺖ ﻋﺎدي‪،‬‬
‫ﺣﺮﻛﺘﻲ ﻛﻨﺪ ﻛﻪ ﺑﻪ ﺣﺎﻟﺖ ﻛﻴﺶ ﺑﺮود‪ (.‬‬
‫‪ ‬ﭘﺮش از روي ﻣﻬﺮهﻫﺎ )ﺑﺮاي ﻣﻬﺮهﻫﺎي ﻏﻴﺮ اﺳﺐ!( ‪ ‬‬
‫‪ ‬ﻋﺪم رﻋﺎﻳﺖ ﻧﻮﺑﺖ ‪ ‬‬
‫‪ ‬ﺧﺎﻟﻲ ﺑﻮدن ﺧﺎﻧﻪ ‪ ‬‬
‫‪ ‬زدن ﻣﻬﺮهي ﺧﻮدي)!(‬
‫دﻗﺖ ﻛﻨﻴﺪ ﻛﻪ ﺑﺮاي ﻫﺮ ﺧﻄﺎ ﺑﺎﻳﺪ ﻳﻚ ﻛﻼس ﺟﺪاﮔﺎﻧﻪ ﺑﮕﻴﺮﻳﺪ ﻛﻪ ﺑﭽﻪي ‪ ChessException‬ﺑﺎﺷﺪ‪.‬‬
‫ﻛﻼس ‪ Chess‬‬
‫در واﻗﻊ وﻇﻴﻔﻪي ﺷﻤﺎ‪ ،‬ﭘﻴﺎدهﺳﺎزي ﻛﻼﺳﻲ ﻫﻤﺎﻧﻨﺪ ﻛﻼس زﻳﺮ اﺳﺖ‪:‬‬
‫{‪Public class Chess‬‬
‫‪public Chess(); // human vs. human game‬‬
‫‪public Chess(IPlayer ai1, IPlayer ai2); // AI vs. AI game‬‬
‫;‪public void nextMove() throws ChessException‬‬
‫;)(‪public char getTurn‬‬
‫;)‪public String getPieceIn(String place‬‬
‫‪ Constructor‬اول‪ ،‬ﺑﺮاي ﺣﺎﻟﺘﻲ اﺳﺖ ﻛﻪ اﻧﺴﺎن ﺑﺎ اﻧﺴﺎن ﺑﺎزي ﻣﻲﻛﻨﺪ‪ ،‬ﺑﺎ ﺻﺪا زده ﺷﺪن اﻳﻦ ‪ ،constructor‬واﺳﻂ‬
‫ﻛﺎرﺑﺮي ﻧﻤﺎﻳﺶ داده ﻣﻲﺷﻮد و آﻣﺎدهي ﮔﺮﻓﺘﻦ ﺣﺮﻛﺖ ﻛﺎرﺑﺮ ﻣﻲﺷﻮد‪.‬‬
‫‪ Constructor‬دوم‪ ،‬ﺑﺮاي ﺣﺎﻟﺘﻲ اﺳﺖ ﻛﻪ ﻫﻮش ﻣﺼﻨﻮﻋﻲ ﺑﺎ ﻫﻮش ﻣﺼﻨﻮﻋﻲ ﺑﺎزي ﻣﻲﻛﻨﺪ و ﺑﻮﺳﻴﻠﻪي دو ﭘﺎراﻣﺘﺮ ‪ ai1‬و‬
‫‪ ai2‬آن دو ﻫﻮش ﻣﺼﻨﻮﻋﻲ را ﺑﻪ ﺑﺎزي ﻣﻲدﻫﻴﻢ‪.‬‬
‫‪ ‬‬
‫‪ 6‬ﺑﺮاي راﺣﺘﻲ ﻣﻲﺗﻮاﻧﻴﺪ از ﺗﻮاﺑﻊ اﻳﺴﺘﺎي ﻛﻼس ‪ JOptionPane‬اﺳﺘﻔﺎده ﻛﻨﻴﺪ‪.‬‬
‫‪ ‬‬
‫‪ ‬‬
‫‪ ‬ﺗﻤﺮﻳﻦ ﺳﺮي ﺳﻮم ﺑﺮﻧﺎﻣﻪ ﺳﺎزي ﺷﻲءﮔﺮا‬
‫}‬
‫‪ 5‬‬
‫‪ ‬‬
‫ﻣﺘﺪﻫﺎي ﺑﻌﺪي ﺑﺮاي ﺗﺴﺖ ﺧﻮدﻛﺎر ﺑﺮﻧﺎﻣﻪ در ﺣﺎﻟﺖ ﺑﺎزي ﻫﻮش ﻣﺼﻨﻮﻋﻲ ﺑﺎ ﻫﻮش ﻣﺼﻨﻮﻋﻲ ﻣﻲﺑﺎﺷﻨﺪ‪ ،‬و ﺑﺮاي ﺣﺎﻟﺘﻲ ﻛﻪ‬
‫اﻧﺴﺎن ﺑﺎ اﻧﺴﺎن در ﺣﺎل ﺑﺎزي ﻛﺮدن اﺳﺖ‪ ،‬ﻛﺎﺑﺮدي ﻧﺪارﻧﺪ‪.‬‬
‫ﻣﺘﺪ ‪ ،nextMove‬ﻣﺘﺪ ‪ move‬را ﺑﺮاي ﺑﺎزﻳﻜﻨﻲ ﻛﻪ اﻛﻨﻮن ﻧﻮﺑﺖ اوﺳﺖ‪ ،‬ﻓﺮاﺧﻮاﻧﻲ ﻣﻲﻛﻨﺪ‪ .‬در ﺻﻮرﺗﻴﻜﻪ ﻫﺮ ﻛﺪام از‬
‫ﺣﺎﻟﺖﻫﺎي اﺳﺘﺜﻨﺎ رخ دﻫﺪ‪ ،‬ﻣﺴﺘﻘﻞ از ﻧﻮع ﺧﻄﺎ‪ ،‬ﺑﺎﻳﺪ ﻳﻚ ‪ ChessException‬ﺣﺎوي ﭘﻴﻐﺎم ”‪“Exception for X‬‬
‫ﺑﻴﻨﺪازد ﻛﻪ در آن ‪ X‬ﻣﺸﺨﺺ ﻛﻨﻨﺪهي رﻧﮓ ﻣﻬﺮهي ﺑﺎزﻳﻜﻨﻲ اﺳﺖ ﻛﻪ ﺧﻄﺎ ﺑﺮاي آن رخ داده اﺳﺖ‪ .‬ﺑﺮاي ﻣﺜﺎل اﮔﺮ اﻳﻦ ﺧﻄﺎ‬
‫ﺑﺮاي ﺑﺎزﻳﻜﻦ ﺑﺎ رﻧﮓ ﺳﻔﻴﺪ رخ دﻫﺪ‪ ،‬ﺑﺎﻳﺪ ﺣﺎوي ﭘﻴﻐﺎم ”‪ “Exception for W‬ﺑﺎﺷﺪ و اﮔﺮ ﺑﺮاي ﺑﺎزﻳﻜﻦ ﺑﺎ رﻧﮓ ﺳﻴﺎه رخ‬
‫دﻫﺪ‪ ،‬ﺑﺎﻳﺪ ﺣﺎوي ﭘﻴﻐﺎم ”‪ “Exception for B‬ﺑﺎﺷﺪ‪.‬‬
‫ﻣﺘﺪ ‪ ،getTurn‬ﻣﺸﺨﺺ ﻣﻲﻛﻨﺪ ﻛﻪ ﻧﻮﺑﺖ ﻛﺪام ﺑﺎزﻳﻜﻦ اﺳﺖ‪ .‬در ﺻﻮرﺗﻴﻜﻪ ﻧﻮﺑﺖ ﺑﺎزﻳﻜﻦ ﺳﻴﺎه ﺑﺎﺷﺪ‪ ،‬ﻛﺎراﻛﺘﺮ ’‪ ‘B‬و در‬
‫ﺻﻮرﺗﻴﻜﻪ ﻧﻮﺑﺖ ﺑﺎزﻳﻜﻦ ﺳﻔﻴﺪ ﺑﺎﺷﺪ‪ ،‬ﻛﺎراﻛﺘﺮ ’‪ ‘W‬را ﺑﺮﻣﻲﮔﺮداﻧﺪ‪.‬‬
‫ﻣﺘﺪ ‪ ،getPieceIn‬اﻳﻦ ﻣﺘﺪ ﻣﺸﺨﺺ ﻣﻲﻛﻨﺪ ﻛﻪ در ﺧﺎﻧﻪي ‪ place‬ﭼﻪ ﻣﻬﺮهاي ﻗﺮار دارد‪ .‬در ﺻﻮرﺗﻴﻜﻪ ﻣﻬﺮهاي در اﻳﻦ‬
‫ﺧﺎﻧﻪ ﻗﺮار داﺷﺖ‪ ،‬ﻣﻘﺪار ﺧﺮوﺟﻲ اﻳﻦ ﻣﺘﺪ‪ ،‬ﻫﻤﺎن ﻣﻘﺪار ﺧﺮوﺟﻲ ﻣﺘﺪ ‪ toString‬ﺑﺮاي آن ﻣﻬﺮه ﺧﻮاﻫﺪ ﺑﻮد و در ﺻﻮرﺗﻴﻜﻪ‬
‫ﻣﻬﺮهاي در اﻳﻦ ﺧﺎﻧﻪ ﻗﺮار ﻧﺪاﺷﺖ‪ ،‬ﻣﻘﺪار ﺧﺮوﺟﻲ ﺑﺮاي اﻳﻦ ﻣﺘﺪ‪ “E” ،‬ﺧﻮاﻫﺪ ﺑﻮد‪ .‬دﻗﺖ ﻛﻨﻴﺪ ﻛﻪ رﺷﺘﻪي ‪ ،place‬رﺷﺘﻪاي‬
‫اﺳﺖ ﻛﻪ ﻛﺎراﻛﺘﺮ اول آن ﺳﺘﻮن را ﻣﺸﺨﺺ ﻣﻲﻛﻨﺪ و ﻛﺎراﻛﺘﺮ دوم آن‪ ،‬ﺳﻄﺮ را ﻣﺸﺨﺺ ﻣﻲﻛﻨﺪ‪ .‬ﺑﺮاي ﻣﺜﺎل اﮔﺮ رﺷﺘﻪي‬
‫‪ ،palce‬ﺑﺼﻮرت ”‪ “F5‬ﺑﻮد‪ ،‬ﻳﻌﻨﻲ ﺧﺎﻧﻪي ﺑﺎ ردﻳﻒ ‪ 5‬و ﺳﺘﻮن ‪ .F‬دﻗﺖ ﻛﻨﻴﺪ در اﻳﻦ ﻣﺘﺪ در ﺻﻮرﺗﻴﻜﻪ رﺷﺘﻪي ﻣﺮﺑﻮط ﺑﻪ‬
‫ﺧﺎﻧﻪي ورودي‪ ،‬ﻣﺠﺎز ﻧﺒﻮد‪ ،‬ﻣﻲﺗﻮاﻧﻴﺪ از ‪ IllegalArgumentException‬اﺳﺘﻔﺎده ﻛﻨﻴﺪ‪.‬‬
‫ﺟﻤﻊ ﺑﻨﺪي‬
‫در ﻧﻬﺎﻳﺖ داﺷﺘﻦ ﻛﻼﺳﻬﺎي زﻳﺮ ﺑﺮاي اﻳﻦ ﺗﻤﺮﻳﻦ اﺟﺒﺎري اﺳﺖ‪:‬‬
‫‪ ‬ﺗﻤﺮﻳﻦ ﺳﺮي ﺳﻮم ﺑﺮﻧﺎﻣﻪ ﺳﺎزي ﺷﻲءﮔﺮا‬
‫‪ 6‬‬
‫‪Class / Interface‬‬
‫‪Package‬‬
‫‪Chess‬‬
‫‪ir.sharif.ce.javaclass.chess‬‬
‫‪IPlayer‬‬
‫…‬
‫…‬
‫‪ir.sharif.ce.javaclass.chess.ui‬‬
‫‪Piece‬‬
‫‪ir.sharif.ce.javaclass.chess.pieces‬‬
‫‪… 6 more‬‬
‫‪ChessException‬‬
‫‪… 6 more‬‬
‫‪ ‬‬
‫‪ir.sharif.ce.javaclass.chess.exceptions‬‬
‫‪ ‬‬
‫دﻗﺖ ﻛﻨﻴﺪ ﻛﻪ در ﻧﻬﺎﻳﺖ در ﺻﻮرﺗﻲ ﻛﻪ ﺑﺎزي در ﺣﺎﻟﺖ ‪ 2‬ﻫﻮش ﻣﺼﻨﻮﻋﻲ اﺟﺮا ﺷﻮد‪ ،‬ﻧﺒﺎﻳﺪ ﻫﻴﭻ ﮔﻮﻧﻪ ﻋﻤﻠﻴﺎت ﮔﺮاﻓﻴﻜﻲ‬
‫اﻧﺠﺎم دﻫﺪ‪ .‬ﻫﻤﭽﻨﻴﻦ ﻧﻴﺎز ﺑﻪ ﭘﻴﺎدهﺳﺎزي ﻣﺎت ﻧﻴﺴﺖ‪.‬‬
‫‪ ‬ﺗﻤﺮﻳﻦ ﺳﺮي ﺳﻮم ﺑﺮﻧﺎﻣﻪ ﺳﺎزي ﺷﻲءﮔﺮا‬
‫‪ ‬‬
‫‪ ‬‬
‫‪ 7‬‬