課程設(shè)計(jì)(論文)任務(wù)書(shū)_第1頁(yè)
課程設(shè)計(jì)(論文)任務(wù)書(shū)_第2頁(yè)
課程設(shè)計(jì)(論文)任務(wù)書(shū)_第3頁(yè)
課程設(shè)計(jì)(論文)任務(wù)書(shū)_第4頁(yè)
課程設(shè)計(jì)(論文)任務(wù)書(shū)_第5頁(yè)
已閱讀5頁(yè),還剩22頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、 課程設(shè)計(jì)(論文)任務(wù)書(shū) 信息工程 學(xué)院學(xué)院物聯(lián)網(wǎng)工程 專(zhuān)專(zhuān)業(yè)業(yè) 2016-2班班一、課程設(shè)計(jì)一、課程設(shè)計(jì)( (論文論文) )題目:題目: 人機(jī)對(duì)弈五子棋游戲 二、課程設(shè)計(jì)二、課程設(shè)計(jì)( (論文論文) )工作:工作:自 20182018 年 1212 月 2424 日起至 20182018 年 1212 月 2828 日止三、課程設(shè)計(jì)三、課程設(shè)計(jì)( (論文論文) ) 地點(diǎn)地點(diǎn): : 5-202 四、課程設(shè)計(jì)四、課程設(shè)計(jì)( (論文論文) )內(nèi)容要求:內(nèi)容要求:1 1本課程設(shè)計(jì)的目的本課程設(shè)計(jì)的目的(1)使學(xué)生掌握軟件開(kāi)發(fā)的基本工作流程; (2)鞏固 JAVA 程序設(shè)計(jì)課程所學(xué)的內(nèi)容; (3)培養(yǎng)

2、學(xué)生的計(jì)算機(jī)思維能力以及合作的精神;(4)培養(yǎng)學(xué)生分析、解決問(wèn)題的能力;(5)提高學(xué)生的科技論文寫(xiě)作能力。 2 2課程設(shè)計(jì)的任務(wù)及要求課程設(shè)計(jì)的任務(wù)及要求1 1)基本要求:)基本要求:(1)研究課程設(shè)計(jì)任務(wù),并進(jìn)行系統(tǒng)需求分析;(2)對(duì)系統(tǒng)進(jìn)行總體設(shè)計(jì),分解系統(tǒng)功能模塊,進(jìn)行任務(wù)分配,以實(shí)現(xiàn)分工合作;(3)實(shí)現(xiàn)各功能模塊代碼; (4)系統(tǒng)組裝,測(cè)試、完善系統(tǒng)。2 2)創(chuàng)新要求:)創(chuàng)新要求: 在基本要求達(dá)到后,可進(jìn)行創(chuàng)新設(shè)計(jì),如改進(jìn)界面、增加功能或進(jìn)行代碼優(yōu)化。 3 3)課程設(shè)計(jì)論文編寫(xiě)要求)課程設(shè)計(jì)論文編寫(xiě)要求(1)要按照書(shū)稿的規(guī)格打印謄寫(xiě)課程設(shè)計(jì)論文(2)論文包括封面、設(shè)計(jì)任務(wù)書(shū)(含評(píng)語(yǔ))、

3、摘要、目錄、設(shè)計(jì)內(nèi)容、設(shè)計(jì)小結(jié)(3)論文裝訂按學(xué)校的統(tǒng)一要求完成4 4)參考文獻(xiàn):)參考文獻(xiàn):(1)丁振凡,JAVA 語(yǔ)言程序設(shè)計(jì)(第 2 版),清華大學(xué)出版社(2)丁振凡,JAVA 語(yǔ)言程序設(shè)計(jì)實(shí)驗(yàn)指導(dǎo)與習(xí)題解答,清華大學(xué)出版社(3)http:/ 5)課程設(shè)計(jì)進(jìn)度安排)課程設(shè)計(jì)進(jìn)度安排內(nèi)容內(nèi)容 天數(shù)天數(shù) 地點(diǎn)地點(diǎn)系統(tǒng)總體設(shè)計(jì) 1 實(shí)驗(yàn)室軟件設(shè)計(jì)及調(diào)試 1 實(shí)驗(yàn)室答辯及撰寫(xiě)報(bào)告 1 實(shí)驗(yàn)室、圖書(shū)館 學(xué)生簽名:學(xué)生簽名: 2015 年 6 月 25 日課程設(shè)計(jì)課程設(shè)計(jì)( (論文論文) )評(píng)審意見(jiàn)評(píng)審意見(jiàn)(1) 課程設(shè)計(jì)過(guò)程(20 分):優(yōu)()、良()、中()、一般()、差( );(2) 是否完成

4、調(diào)試,系統(tǒng)運(yùn)行效果(30 分):優(yōu)()、良()、中()、 一般( )、差( );(3)回答問(wèn)題(20 分):優(yōu)()、良()、中()、一般()、差();(4)課程設(shè)計(jì)報(bào)告(30 分):優(yōu)()、良()、中()、一般()、差 ( );(5)格式規(guī)范性及考勤是否降等級(jí):是()、否() 評(píng)閱人評(píng)閱人: 職稱(chēng)職稱(chēng):教授 2018 年 12 月 29 日 目錄目錄1 1、課程設(shè)計(jì)的目的及目標(biāo)、課程設(shè)計(jì)的目的及目標(biāo) .1 11.1 課程設(shè)計(jì)的目的:課程設(shè)計(jì)的目的:.1 11.2 課程設(shè)計(jì)的目標(biāo):課程設(shè)計(jì)的目標(biāo):.1 12 2、概要設(shè)計(jì)、概要設(shè)計(jì) .1 12.1 開(kāi)發(fā)工具及環(huán)境開(kāi)發(fā)工具及環(huán)境.1 12.2 任務(wù)

5、及需求分析任務(wù)及需求分析 .1 12.3 工作原理工作原理 .2 23 3、 具體實(shí)現(xiàn)具體實(shí)現(xiàn) .3 33.1 類(lèi)設(shè)計(jì)類(lèi)設(shè)計(jì) .3 34 4、運(yùn)行調(diào)試與分析討論、運(yùn)行調(diào)試與分析討論 .5 55 5、設(shè)計(jì)體會(huì)與小結(jié)、設(shè)計(jì)體會(huì)與小結(jié) .8 86 6、參考文獻(xiàn)、參考文獻(xiàn) .9 9附錄:(源程序)附錄:(源程序) .9 911、課程設(shè)計(jì)的目的及目標(biāo)1.1 課程設(shè)計(jì)的目的:課程設(shè)計(jì)的目的:本次課程設(shè)計(jì)的目的是為了讓學(xué)生使用 java 語(yǔ)言編程的知識(shí),JAVA 是一門(mén)編程語(yǔ)言也是一個(gè)平臺(tái),它基于 JAV 虛擬機(jī)技術(shù),借助這個(gè)東西建立了跨平臺(tái)優(yōu)勢(shì)JAVA 編程語(yǔ)言與眾不同之處在于:JAV 程序既是編譯型的(

6、轉(zhuǎn)換為一種 JAVA字節(jié)碼的中間語(yǔ)言),又是解釋型(JVM 對(duì)字節(jié)碼進(jìn)行解析和運(yùn)行)。編譯只進(jìn)行一次,而解釋在每次運(yùn)行程序時(shí)都會(huì)進(jìn)行。編譯后的字節(jié)碼采用一種針對(duì) JVM 優(yōu)化過(guò)的機(jī)器碼形式;解釋器是 JVM 的實(shí)現(xiàn)。我們需要利用 JAVA 開(kāi)發(fā)平臺(tái),學(xué)習(xí)和鞏固 JAVA 知識(shí),了解類(lèi)與對(duì)象的關(guān)系,繪圖以及事件處理原則。 1.2 課程設(shè)計(jì)的目標(biāo):課程設(shè)計(jì)的目標(biāo):本次課程設(shè)計(jì)所要求的五子棋游戲應(yīng)達(dá)到以下幾方面的要求:(1)運(yùn)行程序后即刻出現(xiàn)棋盤(pán)并可以開(kāi)始下棋;(2)人機(jī)對(duì)弈時(shí),先手為黑棋,后手為白棋;人為先手,計(jì)算機(jī)為后手;(3)程序能響應(yīng)鼠標(biāo)點(diǎn)擊并在相應(yīng)位置畫(huà)出棋子;(4)計(jì)算機(jī)具有一定的智能,

7、能夠與人進(jìn)行五子棋對(duì)弈;(5)程序可以正確判斷出局面的勝負(fù)情況并及時(shí)報(bào)出結(jié)果,終止棋局;(6)盡可能實(shí)現(xiàn)人人對(duì)戰(zhàn)功能;(7)重新開(kāi)始:在游戲途中,可以選擇重新開(kāi)始,中斷游戲并重新開(kāi)始。2、概要設(shè)計(jì)2.1 開(kāi)開(kāi)發(fā)發(fā)工具及環(huán)境工具及環(huán)境裝有 eclipse 的計(jì)算機(jī)一臺(tái)。2.2 任務(wù)及需求分析任務(wù)及需求分析設(shè)計(jì)人機(jī)對(duì)弈五子棋程序,實(shí)現(xiàn)人與計(jì)算機(jī)進(jìn)行五子棋對(duì)弈,具體任務(wù)如下:(1)棋盤(pán)布局設(shè)計(jì);(2)能進(jìn)行基本的五子棋操作,有圖形界面,能夠用鼠標(biāo)進(jìn)行操作;(3)編程實(shí)現(xiàn)棋子的繪制;(4)增加具體的功能如重開(kāi)一局等功能; 2(5)勝負(fù)判斷的功能,程序能對(duì)下棋的結(jié)果進(jìn)行判斷,分出勝負(fù),并顯示獲勝方;(6

8、)運(yùn)行測(cè)試程序,調(diào)試糾正運(yùn)行錯(cuò)誤。(7)游戲內(nèi)容:采用無(wú)“禁手”的規(guī)則,相同顏色的棋子,五子一線為勝。2.3 工作原理工作原理(1)工作過(guò)程運(yùn)行程序后,首先出現(xiàn)五子棋游戲窗體,用戶(hù)點(diǎn)擊游戲菜單項(xiàng),出現(xiàn)相關(guān)子菜單,選擇模式子菜單中的人機(jī)對(duì)弈便可進(jìn)入人機(jī)對(duì)弈模式。然后移動(dòng)鼠標(biāo),在窗體的棋盤(pán)上點(diǎn)擊鼠標(biāo)下子,即可在棋盤(pán)中相應(yīng)位置顯示下的對(duì)應(yīng)棋子。接下來(lái)計(jì)算機(jī)會(huì)根據(jù)用戶(hù)下的棋,采取窮舉法選擇八個(gè)方向上贏面最大的位置下子,用戶(hù)與計(jì)算機(jī)誰(shuí)先達(dá)到五子連成一線,誰(shuí)便是獲勝方。若選擇模式子菜單中的人人對(duì)戰(zhàn)便可進(jìn)入人人對(duì)戰(zhàn)模式。兩個(gè)用戶(hù)可同時(shí)玩游戲,同樣誰(shuí)先達(dá)到五子連成一線,誰(shuí)便是獲勝方。若雙方勢(shì)均力敵,可選擇游戲

9、菜單項(xiàng)中的棋盤(pán)子菜單,點(diǎn)擊大號(hào)棋盤(pán)或超大號(hào)棋盤(pán),以便避免棋盤(pán)空間不足造成無(wú)法分出勝負(fù)的情況。若覺(jué)得窗體外觀不太美觀,可選擇外觀菜單中的三個(gè)選項(xiàng)進(jìn)行選擇。為了顯示程序的相關(guān)制作信息,程序提供了版本菜單進(jìn)行顯示。具體功能實(shí)現(xiàn)見(jiàn)第四章節(jié)運(yùn)行調(diào)試及分析討論。(2)工作原理利用圖形界面編程實(shí)現(xiàn),利用到的知識(shí)點(diǎn)包括:窗體的創(chuàng)建和應(yīng)用界面布局;事件處理,包括按鈕的動(dòng)作事件處理,鼠標(biāo)事件,窗體事件;接口知識(shí):事件處理中通過(guò)接口約束事件監(jiān)聽(tīng)者必須實(shí)現(xiàn)相應(yīng)接口中定義的方法;流程控制語(yǔ)句:通過(guò)條件判斷區(qū)分不同事件源,作不同操作處理。棋子狀態(tài)控制:通過(guò) arrMapShow 數(shù)組來(lái)判斷是下什么顏色的棋子,如果是計(jì)算機(jī)

10、下棋,則計(jì)算棋盤(pán)上某一放個(gè)八個(gè)方向上棋子的最大值,通過(guò)調(diào)用 readyplay()方法判斷某位置是否可下棋。3、 具體實(shí)現(xiàn)總共涉及五類(lèi),分別為:ChessFrame、ChessModel、ChessWindowEvent、FiveChessAppletDemo、MainPanel 3。引入的 java 包為:import java.awt.*;import java.awt.event.*; import java.applet.*; import javax.swing.*; import java.io.PrintStream; import javax.swing.JComponent;

11、 import javax.swing.JPanel;3.1 類(lèi)設(shè)計(jì)類(lèi)設(shè)計(jì)(1) 類(lèi)名:FiveChessAppletDemo作用:顯示五子棋游戲窗體。類(lèi)中含有的方法介紹: main()方法:程序運(yùn)行的入口,創(chuàng)建了 ChessFrame 類(lèi)的一個(gè)實(shí)例對(duì)象(cf),并啟動(dòng)屏幕顯示顯示該實(shí)例對(duì)象。(2) 類(lèi)名:ChessFrame作用:創(chuàng)建五子棋游戲主窗體和菜單。該類(lèi)繼承 JFrame 類(lèi),實(shí)現(xiàn) ActionListener 接口。類(lèi)中含有的方法介紹: ChessFrame()構(gòu)造方法:構(gòu)造五子棋游戲的主窗體; makeMenu()方法:構(gòu)造五子棋游戲的主菜單; makeMenuItem()方法:

12、構(gòu)造五子棋游戲的菜單項(xiàng); makeRadioButtonMenuItem()方法:構(gòu)造五子棋游戲的單選按鈕式菜單項(xiàng); mapsize()方法:獲取棋盤(pán)大??; restart()方法:重新開(kāi)局; actionperformed()方法:異常的捕獲及不同模式、不同棋盤(pán)大小以及下拉菜單功能的實(shí)現(xiàn)。(3) 類(lèi)名:ChessModel作用:實(shí)現(xiàn)了整個(gè)五子棋程序算法的核心。采用窮舉法判斷八個(gè)方向上存在棋子 4的最大值進(jìn)行對(duì)弈。類(lèi)中含有的主要方法介紹: ChessModel()構(gòu)造方法:根據(jù)不同的棋盤(pán)模式(modeChess)來(lái)構(gòu)建對(duì)應(yīng)大小的棋盤(pán); PanelInit()方法:按照棋盤(pán)模式構(gòu)建棋盤(pán)大??; b

13、adxy()方法:判斷下子的橫向、縱向坐標(biāo)是否越界; chessExist()方法:計(jì)算棋盤(pán)上某一方格上八個(gè)方向棋子的最大值,(這八個(gè)方向分別是:左、右、上、下、左上、左下、右上、右下); readyplay()方法:判斷該坐標(biāo)位置是否可下棋子; play()方法:在該坐標(biāo)位置下棋子; computerDo()方法:用窮舉法判斷每一個(gè)坐標(biāo)點(diǎn)的八個(gè)方向的的最大棋子數(shù),最后得出棋子數(shù)最大值的坐標(biāo),下子; checkMax()方法:計(jì)算棋盤(pán)上某一方格上八個(gè)方向棋子的最大值; judgeSuccess()方法:判斷勝負(fù); showSuccess()方法:贏棋后的提示; showDefeat()方法:輸

14、棋后的提示。(4) 類(lèi)名:MainPanel作用:構(gòu)建一個(gè)面板,在該面板上畫(huà)上棋盤(pán);處理在該棋盤(pán)上的鼠標(biāo)事件(如鼠標(biāo)左鍵點(diǎn)擊、鼠標(biāo)右鍵點(diǎn)擊、鼠標(biāo)拖動(dòng)等);該類(lèi)繼承 JPanel 類(lèi),實(shí)現(xiàn) MouseListener、MouseMotionListener 接口。類(lèi)中含有的主要方法介紹: ChessModel()方法:根據(jù)棋盤(pán)模式設(shè)定面板的大??; setModel()方法:根據(jù)棋盤(pán)模式設(shè)定棋盤(pán)的寬度和高度; paintComponent()方法:根據(jù)坐標(biāo)計(jì)算出棋盤(pán)方格棋子的信息(如白子還是黑子),然后調(diào)用 draw 方法在棋盤(pán)上畫(huà)出相應(yīng)的棋子; draw()方法:根據(jù)提供的棋子信息(顏色、坐標(biāo))

15、畫(huà)棋子; mousePressed ()方法:響應(yīng)鼠標(biāo)的點(diǎn)擊事件,根據(jù)鼠標(biāo)的點(diǎn)擊來(lái)下棋,根據(jù)下棋判斷勝負(fù)、判斷是否人機(jī)對(duì)弈等; mouseMoved()方法:響應(yīng)鼠標(biāo)的拖動(dòng)事件。 (5) 類(lèi)名: ChessWindowEvent 5作用:響應(yīng)退出窗口。該類(lèi)繼承WindowAdapter。類(lèi)中含有的方法介紹: windowClosing()方法:處理窗口關(guān)閉; ChessWindowEvent ()構(gòu)造方法:提供無(wú)參構(gòu)造方法。3.2 對(duì)弈策略對(duì)弈策略采用 readyplay()方法判斷該位置是否可以下棋,然后用窮舉法判斷每一個(gè)坐標(biāo)點(diǎn)的八個(gè)方向,即左、右、上、下、左上、左下、右上、右下,棋子的最大

16、值,最后得出最大值的坐標(biāo),下子。最后采用 judgeCuccess()方法,判斷八個(gè)方向上是否滿(mǎn)五個(gè)同色棋子,若有,則成功,反之則失敗。4、運(yùn)行調(diào)試與分析討論 圖圖 4-14-1 程序運(yùn)行初始界面程序運(yùn)行初始界面 圖圖 4-24-2 人機(jī)人機(jī)/ /人人對(duì)弈模式選擇界面人人對(duì)弈模式選擇界面 6 圖圖 4-34-3 人機(jī)對(duì)弈界面人機(jī)對(duì)弈界面 圖圖 4-44-4 兩種結(jié)果信息顯示界面兩種結(jié)果信息顯示界面 圖圖 4-54-5 棋盤(pán)選擇界面棋盤(pán)選擇界面 7 圖圖 4-64-6 視圖類(lèi)型選擇界面視圖類(lèi)型選擇界面 圖圖 4-74-7 程序版本信息選擇界面程序版本信息選擇界面 8 圖圖 4-84-8 程序版本

17、信息介紹界面程序版本信息介紹界面5、設(shè)計(jì)體會(huì)與小結(jié)本次實(shí)驗(yàn)我們做的是人機(jī)對(duì)弈五子棋,這是上課時(shí)曾經(jīng)了解過(guò)的相關(guān)內(nèi)容,但不可否認(rèn)的是,理解起來(lái)確實(shí)存在一定的困難。課程設(shè)計(jì)是將所有學(xué)過(guò)的甚至沒(méi)有學(xué)過(guò)的知識(shí)集合起來(lái),并且運(yùn)用到實(shí)際的運(yùn)用當(dāng)中,使得整個(gè)過(guò)程進(jìn)行的難度較大,最后敲定的代碼也很長(zhǎng),較為復(fù)雜,以致于在調(diào)試過(guò)程中,出現(xiàn)了很多問(wèn)題,代碼不斷出錯(cuò),運(yùn)行之后的界面功能不全,計(jì)算機(jī)下棋的算法太過(guò)簡(jiǎn)單,甚至一度出現(xiàn)無(wú)從下手,不知從何修改的困境但所有的一切都不能成為實(shí)現(xiàn)道路上的障礙,所以后來(lái)我們通過(guò)不停的討論、翻書(shū),上網(wǎng)參考別人的代碼,不斷優(yōu)化,最后問(wèn)題都被一一解決。由于此次時(shí)間倉(cāng)促,依舊存在很多不足,比

18、如很多功能并不能全部實(shí)現(xiàn),對(duì)弈的策略比較簡(jiǎn)單等。此次課程設(shè)計(jì),我們深刻的了解到對(duì)知識(shí)運(yùn)用熟練的重要性和團(tuán)隊(duì)團(tuán)結(jié)協(xié)作的重要性,它們是做好一個(gè)項(xiàng)目的基石。通過(guò)努力和團(tuán)結(jié)協(xié)作完成的完整代碼帶給我們的成就感是不可比擬的,希望下次我們能做的更好。小組成員:胡子凌、范整整、吳越男、吳嘉懿6、參考文獻(xiàn)1 丁振凡,JAVA 語(yǔ)言程序設(shè)計(jì),清華大學(xué)出版社.2 丁振凡,JAVA 語(yǔ)言程序設(shè)計(jì)實(shí)驗(yàn)指導(dǎo)與習(xí)題解答,清華大學(xué)出版社.3 Charles Petzold. Windows 程序設(shè)計(jì). 北京大學(xué)出版社,2002. 4 陳明,Java 語(yǔ)言程序設(shè)計(jì),清華大學(xué)出版社. 9附錄:(源程序)package keshe

19、;import java.awt.*;import java.awt.event.*; import java.applet.*; import javax.swing.*; import java.io.PrintStream; import javax.swing.JComponent; import javax.swing.JPanel;/* *main 方法創(chuàng)建了 ChessFrame 類(lèi)的一個(gè)實(shí)例對(duì)象(cf), *并啟動(dòng)屏幕顯示顯示該實(shí)例對(duì)象。 */ public class FiveChessAppletDemo public static void main(String arg

20、s) ChessFrame cf= new ChessFrame(); cf.show(); /* *類(lèi) ChessFrame 主要功能是創(chuàng)建五子棋游戲主窗體和菜單 */ class ChessFrame extends JFrame implements ActionListener private String strsize=20 x15,30 x20,40 x30; private String strmode=人機(jī)對(duì)弈,人人對(duì)弈; public static boolean iscomputer=true,checkcomputer=true; private int width,h

21、eight; private ChessModel cm; private MainPanel mp;/構(gòu)造五子棋游戲的主窗體 public ChessFrame() this.setTitle(五子棋游戲); cm=new ChessModel(1); mp=new MainPanel(cm); Container con=this.getContentPane(); con.add(mp,Center); this.setResizable(false); this.addWindowListener(new ChessWindowEvent(); MapSize(20,15); JMen

22、uBar mbar=new JMenuBar(); this.setJMenuBar(mbar); JMenu gameMenu=new JMenu(游戲);mbar.add(makeMenu(gameMenu,new Object 開(kāi)局, 棋盤(pán),模式,null,退出 ,this); JMenu lookMenu=new JMenu(視圖); mbar.add(makeMenu(lookMenu,new Object Metal,Motif,Windows ,this); JMenu helpMenu=new JMenu(幫助); 10mbar.add(makeMenu(helpMenu,ne

23、w Object 關(guān)于 ,this);/構(gòu)造五子棋游戲的主菜單 public JMenu makeMenu(Object parent,Object items,Object target) JMenu m=null; if(parent instanceof JMenu) m=(JMenu)parent; else if(parent instanceof String) m=new JMenu(String)parent); else return null; for(int i= 0;iitems.length;i+) if(itemsi= null) m.addSeparator();

24、else if(itemsi = 棋盤(pán)) JMenu jm=new JMenu(棋盤(pán)); ButtonGroup group=new ButtonGroup(); JRadioButtonMenuItem rmenu; for(int j=0;jstrsize.length;j+) rmenu=makeRadioButtonMenuItem(strsizej,target); if(j=0) rmenu.setSelected(true); jm.add(rmenu); group.add(rmenu); m.add(jm); else if(itemsi= 模式) JMenu jm=new

25、JMenu(模式); ButtonGroup group=new ButtonGroup(); JRadioButtonMenuItem rmenu; for(int h=0;hstrmode.length;h+) rmenu=makeRadioButtonMenuItem(strmodeh,target); if(h=0)rmenu.setSelected(true); jm.add(rmenu); group.add(rmenu); m.add(jm); else m.add(makeMenuItem(itemsi,target);return m;/構(gòu)造五子棋游戲的菜單項(xiàng) public

26、JMenuItem makeMenuItem(Object item,Object target) JMenuItem r= null; if(item instanceof String) r=new JMenuItem(String)item); 11else if(item instanceof JMenuItem) r=(JMenuItem)item; else return null; if(target instanceof ActionListener) r.addActionListener(ActionListener)target);return r; /構(gòu)造五子棋游戲的單

27、選按鈕式菜單項(xiàng) public JRadioButtonMenuItem makeRadioButtonMenuItem( Object item,Object target) JRadioButtonMenuItem r= null; if(item instanceof String) r=new JRadioButtonMenuItem(String)item);else if(item instanceof JRadioButtonMenuItem) r=(JRadioButtonMenuItem)item; else return null; if(target instanceof

28、ActionListener) r.addActionListener(ActionListener)target); return r; public void MapSize(int w,int h) setSize(w*20+50,h*20+100); if(this.checkcomputer) this.iscomputer=true; elsethis.iscomputer=false; mp.setModel(cm); mp.repaint(); public boolean getiscomputer() return this.iscomputer; public void

29、restart() int modeChess=cm.getModeChess(); if(modeChess= 1) cm=new ChessModel(modeChess); MapSize(cm.getWidth(),cm.getHeight(); else System.out.println(u81EAu5B9Au4E49); public void actionPerformed(ActionEvent e) String arg=e.getActionCommand(); try 12if(arg.equals(Windows) UIManager.setLookAndFeel(

30、 com.sun.java.swing.plaf.windows.WindowsLookAndFeel); else if(arg.equals(Motif) UIManager.setLookAndFeel( com.sun.java.swing.plaf.motif.MotifLookAndFeel); else UIManager.setLookAndFeel( javax.swing.plaf.metal.MetalLookAndFeel); SwingUtilities.updateComponentTreeUI(this); catch(Exception ee) if(arg.e

31、quals(20 x15) this.width=20; this.height=15; cm=new ChessModel(1); MapSize(this.width,this.height); SwingUtilities.updateComponentTreeUI(this); if(arg.equals(30 x20) this.width=30; this.height=20; cm=new ChessModel(2);MapSize(this.width,this.height); SwingUtilities.updateComponentTreeUI(this); if(ar

32、g.equals(40 x30) this.width=40; this.height=30; cm=new ChessModel(3); MapSize(this.width,this.height); SwingUtilities.updateComponentTreeUI(this); if(arg.equals(人機(jī)對(duì)弈) this.checkcomputer=true;this.iscomputer=true; cm=new ChessModel(cm.getModeChess(); MapSize(cm.getWidth(),cm.getHeight(); SwingUtiliti

33、es.updateComponentTreeUI(this); if(arg.equals(人人對(duì)弈) this.checkcomputer=false; this.iscomputer=false; cm=new ChessModel(cm.getModeChess(); MapSize(cm.getWidth(),cm.getHeight(); SwingUtilities.updateComponentTreeUI(this); if(arg.equals(開(kāi)局) restart(); 13if(arg.equals(關(guān)于) JOptionPane.showMessageDialog(t

34、his, 制作者:天天都不知道吃什么小組, 關(guān)于,0); if(arg.equals(退出) System.exit(0); /* *類(lèi) ChessModel 實(shí)現(xiàn)了整個(gè)五子棋程序算法的核心 */ class ChessModel /棋盤(pán)的寬度、高度、棋盤(pán)的模式(如 2015) private int width,height,modeChess; /棋盤(pán)方格的橫向、縱向坐標(biāo) private int x=0,y=0; /棋盤(pán)方格的橫向、縱向坐標(biāo)所對(duì)應(yīng)的棋子顏色,/數(shù)組 arrMapShow 只有 4 個(gè)值:1,2,3,-5,/其中 1 代表該棋盤(pán)方格上下的棋子為黑子, /2 代表該棋盤(pán)方格上下

35、的棋子為白子, /3 代表為該棋盤(pán)方格上沒(méi)有棋子, /-5 代表該棋盤(pán)方格不能夠下棋子private intarrMapShow; /交換棋手的標(biāo)識(shí),棋盤(pán)方格上是否有棋子的標(biāo)識(shí)符 private boolean isOdd,isExist;public ChessModel() /該構(gòu)造方法根據(jù)不同的棋盤(pán)模式(modeChess)來(lái)構(gòu)建對(duì)應(yīng)大小的棋盤(pán) public ChessModel(int modeChess) this.isOdd=true; if(modeChess= 1) PanelInit(20,15,modeChess); if(modeChess= 2) PanelInit(3

36、0,20,modeChess); if(modeChess= 3) PanelInit(40,30,modeChess); /按照棋盤(pán)模式構(gòu)建棋盤(pán)大小 private void PanelInit(int width, int height,int modeChess) this.width= width; this.height =height; this.modeChess=modeChess; arrMapShow=new intwidth+1height+1; for(int i= 0;i=width; i+) for(int j=0;j = width+20| x= height+2

37、0| y0; /計(jì)算棋盤(pán)上某一方格上八個(gè)方向棋子的最大值, /這八個(gè)方向分別是:左、右、上、下、左上、左下、右上、右下 public boolean chessExist(int i,int j) if(this.arrMapShowij=1| this.arrMapShowij=2) return true; return false;/判斷該坐標(biāo)位置是否可下棋子 public void readyplay(int x,int y) if(badxy(x,y) return; if(chessExist(x,y) return; this.arrMapShowxy=3; /在該坐標(biāo)位置下棋子

38、 public void play(int x,int y) if(badxy(x,y) return; if(chessExist(x,y) this.isExist=true; return; else 15this.isExist=false; if(getisOdd() setisOdd(false); this.arrMapShowxy=1; else setisOdd(true); this.arrMapShowxy=2; /計(jì)算機(jī)走棋 /* *說(shuō)明:用窮舉法判斷每一個(gè)坐標(biāo)點(diǎn)的四個(gè)方向的的最大棋子數(shù), 最后得出棋子數(shù)最大值的坐標(biāo),下子 */ public void computer

39、Do(int width,int height) int max_black,max_white,max_temp,max=0; setisOdd(true); System.out.println(計(jì)算機(jī)走棋 .); for(int i= 0;i=width; i+) for(int j=0;j max) max=max_temp; this.x=i; this.y=j; setX(this.x); setY(this.y); this.arrMapShowthis.xthis.y=2;/記錄電腦下子后的橫向坐標(biāo)public void setX(int x) this.x=x; /記錄電腦下

40、子后的縱向坐標(biāo) public void setY(int y) this.y=y; /獲取電腦下子的橫向坐標(biāo)public int getX() return this.x; /獲取電腦下子的縱向坐標(biāo)public int getY() return this.y; /計(jì)算棋盤(pán)上某一方格上八個(gè)方向棋子的最大值, /這八個(gè)方向分別是:左、右、上、下、左上、左下、右上、右下public int checkMax(int x, int y,int black_or_white) int num=0,max_num,max_temp=0; int x_temp=x,y_temp=y; int x_temp

41、1=x_temp,y_temp1=y_temp; /judge right 16for(int i=1;ithis.width) break;if(this.arrMapShowx_temp1y_temp1=black_or_white) num+; else break; /judge left x_temp1=x_temp; for(int i=1;i5;i+) x_temp1-=1; if(x_temp10) break; if(this.arrMapShowx_temp1y_temp1=black_or_white) num+; else break; if(num5) max_tem

42、p=num;/judge up x_temp1=x_temp; y_temp1=y_temp; num=0; for(int i=1;i5;i+) y_temp1-=1; if(y_temp10) break; if(this.arrMapShowx_temp1y_temp1=black_or_white) num+; else break; /judge down y_temp1=y_temp; for(int i=1;ithis.height) break; if(this.arrMapShowx_temp1y_temp1=black_or_white) num+; else break;

43、 17if(nummax_temp&num5)max_temp=num;/judge left_up x_temp1=x_temp; y_temp1=y_temp; num=0; for(int i=1;i5;i+) x_temp1-=1; y_temp1-=1; if(y_temp10|x_temp10) break; if(this.arrMapShowx_temp1y_temp1=black_or_white) num+; else break; /judge right_down x_temp1=x_temp; y_temp1=y_temp; for(int i=1;ithis

44、.height | x_temp1this.width) break; if(this.arrMapShowx_temp1y_temp1=black_or_white) num+; else break; if(nummax_temp&num5) max_temp=num;/judge right_up x_temp1=x_temp; y_temp1=y_temp; num=0; for(int i=1;i5;i+)x_temp1+=1; y_temp1-=1; if(y_temp1this.width) break; if(this.arrMapShowx_temp1y_temp1=

45、black_or_white) num+; elsebreak; /judge left_down x_temp1=x_temp; y_temp1=y_temp; 18for(int i=1;ithis.height | x_temp1max_temp&num5) max_temp=num; max_num=max_temp; return max_num;/判斷勝負(fù) public boolean judgeSuccess(int x,int y,boolean isodd) int num=1; int arrvalue; int x_temp=x,y_temp=y; if(isod

46、d) arrvalue=2; else arrvalue=1; int x_temp1=x_temp,y_temp1=y_temp; /判斷右邊 for(int i=1;ithis.width) break; if(this.arrMapShowx_temp1y_temp1=arrvalue) num+; else break; /判斷左邊 x_temp1=x_temp; for(int i=1;i6;i+)x_temp1-=1; if(x_temp10) break; if(this.arrMapShowx_temp1y_temp1=arrvalue) num+; else break; i

47、f(num=5) return true; 19/判斷上方x_temp1=x_temp; y_temp1=y_temp; num=1; for(int i=1;i6;i+) y_temp1-=1; if(y_temp10) break; if(this.arrMapShowx_temp1y_temp1=arrvalue) num+; else break; /判斷下方 y_temp1=y_temp; for(int i=1;ithis.height) break; if(this.arrMapShowx_temp1y_temp1=arrvalue) num+; else break; if(n

48、um=5) return true;/判斷左上 x_temp1=x_temp; y_temp1=y_temp; num=1; for(int i=1;i6;i+) x_temp1-=1;y_temp1-=1; if(y_temp10|x_temp10) break; if(this.arrMapShowx_temp1y_temp1=arrvalue) num+; else break; /判斷右下 x_temp1=x_temp; y_temp1=y_temp; for(int i=1;ithis.height | x_temp1this.width) break; if(this.arrMap

49、Showx_temp1y_temp1=arrvalue) num+; else break; if(num=5) return true;/判斷右上 x_temp1=x_temp; y_temp1=y_temp; num=1; for(int i=1;i6;i+) x_temp1+=1; y_temp1-=1; if(y_temp1this.width) break; if(this.arrMapShowx_temp1y_temp1=arrvalue) num+; else break; /判斷左下x_temp1=x_temp; y_temp1=y_temp; for(int i=1;ithi

50、s.height | x_temp10) break; if(this.arrMapShowx_temp1y_temp1=arrvalue) num+; else break; if(num=5) return true; return false;/贏棋后的提示 public void showSuccess(JPanel jp) JOptionPane.showMessageDialog(jp,你贏了,好厲害!,win, JOptionPane.INFORMATION_MESSAGE); /輸棋后的提示 public void showDefeat(JPanel jp) JOptionPa

51、ne.showMessageDialog(jp,你輸了,請(qǐng)重新開(kāi)始!,lost, 21JOptionPane.INFORMATION_MESSAGE); /* *類(lèi) MainPanel 主要完成如下功能: * 1、構(gòu)建一個(gè)面板,在該面板上畫(huà)上棋盤(pán); * 2、處理在該棋盤(pán)上的鼠標(biāo)事件(如鼠標(biāo)左鍵點(diǎn)擊、鼠標(biāo)右鍵點(diǎn)擊、鼠標(biāo)拖動(dòng)等) */ class MainPanel extends JPanel implements MouseListener,MouseMotionListener private int width,height;/棋盤(pán)的寬度和高度 private ChessModel cm;/根據(jù)棋盤(pán)模式設(shè)定面板的大小 MainPanel(ChessModel mm) cm=mm; width=cm.getWidth(); height=cm.getHeight(); addMouseListener(this); /根據(jù)棋盤(pán)模式設(shè)定棋盤(pán)的寬度和高度public void setModel(ChessModel mm) cm=mm; width=cm.getWidth(); height =cm.getHeight(); /根據(jù)坐標(biāo)計(jì)算出棋盤(pán)方格棋子的信息(如白子還

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論