版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
PAGE20五子棋JAVA實驗報告一、實驗?zāi)康暮鸵?、能夠用編程語言實現(xiàn)一個簡單的五子棋程序2、在實際系統(tǒng)中使用、實現(xiàn)人工智能的相關(guān)算法3、進(jìn)一步加深對人工智能算法的理解二、五子棋的基本常識與原理1、五子棋的起源五子棋,是一種兩人對弈的純策略型棋類游戲,亦稱“串珠”、“連五子”;是中國民間非常熟知的一個古老棋種。相傳,它起源于四千多年前的堯帝時期,比圍棋的歷史還要悠久。亦有傳說,五子棋最初流行于少數(shù)民族地區(qū),以后漸漸演變成圍棋并在炎黃子孫后代中遍及開來。五子棋發(fā)展于日本,流行于歐美。容易上手,老少皆宜,而且趣味橫生,引人入勝;不僅能增強(qiáng)思維能力,提高智力,而且富含哲理,有助于修身養(yǎng)性。傳統(tǒng)五子棋的棋具與圍棋相同,棋子分為黑白兩色,棋盤為19X19,棋子放置于棋盤線交叉點(diǎn)上。兩人對局,各執(zhí)一色,輪流下一子,先將橫、豎或斜線的5個或5個以上同色棋子連成不間斷的一排者為勝。因為傳統(tǒng)五子棋在落子后不能移動或拿掉,所以也可以用紙和筆來進(jìn)行游戲。2、五子棋的基本常識與任何一種競技棋一樣,五子棋的每一局棋也分為三個階段:開局,中局和殘局。五子棋的開始階段稱為開局,或稱布局。其開局階段是十分短暫的,大約在七著與十幾著之間。在這一階段的爭奪中,雙方的布局,應(yīng)對將對以后的勝負(fù)起著極為關(guān)鍵的作用。在開局階段取得的形勢好壞,主動與被動,先手與后手的優(yōu)劣程度,往往直接影響中局的戰(zhàn)斗。因此積極處理好開局和開局向中局的過渡十分重要。五子棋是從一至五,逐漸布子,發(fā)展連系,同時運(yùn)用限制和反限制的智慧,在連子的過程中為自己的棋子爭得相對的主動權(quán)和優(yōu)勢,逐步擴(kuò)展優(yōu)勢,或者從劣勢轉(zhuǎn)化為優(yōu)勢,擊潰對方的防線,最后連五取勝或抓禁手取勝或迫使對方投子認(rèn)負(fù)。3、五子棋比賽的相關(guān)規(guī)定(1)職業(yè)連珠規(guī)則a.黑方先下子,白后下,從天元開始相互順序落子。b.最先在棋盤橫向、豎向、斜向形成連續(xù)的相同色五個棋子的一方為勝。c.黑棋禁手判負(fù),白棋無禁手。黑棋禁手包括“三三”(包括“四三三”)、“四四”(包括“四四三”)、“長連”。即黑棋只能以“四三”取勝。有關(guān)術(shù)語解釋請見圖示說明。d.如分不出勝負(fù),則定為平局。對局中拔子、中途退場均判為負(fù)。e.五連與禁手同時形成,判勝。(2)比賽中的規(guī)定和特例a.對局開始前,雙方猜子,大數(shù)減小數(shù),單數(shù)交換,偶數(shù)不換。b.白棋第一手(即盤面第二著棋)應(yīng)在天元為界自己一側(cè)布子,主要以示尊重對方,之后雙方可任意行子。c.對局中雙方應(yīng)遵守“職業(yè)連珠五子棋規(guī)則”,如出現(xiàn)爭議,應(yīng)由裁判判定。d.對局中掉子(棋子掉落在棋盤上)的一方判負(fù)。如遇推子或蹭子,以盤面第一落點(diǎn)為準(zhǔn)。用手將棋子扶正不算違規(guī)。e.對局中應(yīng)禮貌行棋,防止不正常聲音、動作影響對方思考。f..比賽結(jié)束后,雙方應(yīng)將各自棋子放回原處。g.對局中如黑方出現(xiàn)禁手,白方應(yīng)立即指出禁手點(diǎn),黑方即負(fù)。如白方在黑方出現(xiàn)禁手后,又下一步白子,黑棋禁手則不成立了。h.比賽對局時間,雙方分別為15分鐘、1小時、2小時、5小時四個等級標(biāo)準(zhǔn),超時判負(fù)。(3)特殊規(guī)定職業(yè)五子棋雖然對黑棋采取了種種限制,但黑子先行的優(yōu)勢依然很大。因此,在高段位的職業(yè)比賽中,又出現(xiàn)了三種特殊的規(guī)定。a.指定打法:是指比賽雙方按照約定好的開局進(jìn)行對弈,由白棋先行。b.三手可交換:是指黑棋下盤面第3手棋后,白方在下第四手之前,如感覺黑方棋形不利于己方,可提出交換,即執(zhí)白棋一方變?yōu)閳?zhí)黑棋一方,而黑方不可以不換。c.五手兩打法:是指黑棋在下盤面上關(guān)鍵的第5手棋時,必須下兩步棋,讓白棋在這兩步棋中拿掉一粒棋子,然后再繼續(xù)對弈。一般說來,白棋肯定拿掉對白方不利的一點(diǎn),而保留對黑方較為不利的那點(diǎn)讓黑方行棋。三、五子棋的系統(tǒng)設(shè)計1、系統(tǒng)用例模型設(shè)計五子棋系統(tǒng)應(yīng)該具有選擇玩家先落子還是電腦先落子的功能,應(yīng)該具有開始游戲和重新開始的功能,當(dāng)然了,必須具有在玩家指定位置落子的功能。以上描述,用用例圖在圖1中做進(jìn)一步描述。這部分功能,主要通過界面與系統(tǒng)的交互來實現(xiàn)。圖1五子棋系統(tǒng)的玩家用例圖各個用例,簡單描述如下:選擇電腦先落子:選擇后,在游戲過程中,由電腦執(zhí)黑子,先落子;玩家執(zhí)白子,于電腦后落子;選擇玩家先落子:選擇后,在游戲過程中,由玩家執(zhí)黑子,先落子;電腦執(zhí)白子,于玩家后落子;落子:原則上說,只要不違反禁手規(guī)則,在玩家鼠標(biāo)點(diǎn)擊最近的落子點(diǎn)落子,但是在本系統(tǒng)中,簡單起見,沒有考慮禁手規(guī)則;開始游戲:選擇后,根據(jù)設(shè)定的電腦還是玩家先落子,開始游戲;重新開始:在游戲途中,可以選擇重新開始,中斷游戲并重新開始游戲。同時,五子棋系統(tǒng)本身應(yīng)該具有棋盤繪制、棋勢掃描、棋勢排序、棋勢評估、擇位落子,以及勝負(fù)判定的功能,尤其是對于棋勢排序、棋勢評估和擇位落子,這里是體現(xiàn)五子棋系統(tǒng)人工智能(AI)的關(guān)鍵之處。以上描述,用用例圖在圖2中進(jìn)一步描述。圖2五子棋系統(tǒng)的系統(tǒng)用例圖各個用例,簡單描述如下:棋盤繪制:繪制19*19的棋盤及相關(guān)按鈕和選項,并負(fù)責(zé)電腦、玩家落子后棋子的具體繪制;棋勢掃描:掃描目前棋盤上的所有八個方向上的落子情況,獲取整個對弈雙方的棋勢;棋勢排序:對獲取的八個方向的棋勢(實際上下合一,左右合一,左下右上合一,坐上右下合一,為四個方向),進(jìn)行排序,便于進(jìn)行棋勢評估;棋勢評估:分別對電腦和玩家的棋勢進(jìn)行評估,量化棋勢;擇位落子:比較電腦和玩家的棋勢,若有利于玩家,則采取“守、堵”的策略,若有利于電腦,則采取“攻、走”的策略;勝負(fù)判定:每次電腦或是玩家落子后,判斷勝負(fù)情況,若出現(xiàn)“五子連珠”,則“連珠”一方取勝,另一方失敗,游戲結(jié)束。2、系統(tǒng)界面設(shè)計為了實現(xiàn)玩家的用例所需要的功能,同時又便于使用,五子棋系統(tǒng)的界面設(shè)計得比較簡單,如圖3所示。整體界面為一個19*19的棋盤,在f-06、f-14、j-10、n-06、n-14這五個位置畫了一個小方塊,以提醒玩家棋盤的中央位置,便于把握有利位置落子。在棋盤的右側(cè)是一些控制和提醒選項、按鈕和對弈狀態(tài)標(biāo)簽。其中,選項有“我是老大我先來”和“讓讓電腦也無妨”兩個。選擇前者,則玩家先落子;選擇后者,則電腦先落子。按鈕有“人機(jī)對戰(zhàn),快沖啊”和“不行了?那重來吧”兩個。單擊前者,則游戲開始;單擊后者,則中斷游戲,重新開始。標(biāo)簽有“就不告訴你是誰贏了”和“就不告訴你這是第幾步”兩個。前者是在游戲分出勝負(fù)后,顯示是黑方取勝還是白方取勝;后者是在游戲過程中,不論是電腦落子還是玩家落子,都提示現(xiàn)在是第幾步落子。圖3五子棋系統(tǒng)界面3、系統(tǒng)模塊設(shè)計為了實現(xiàn)五子棋系統(tǒng)本身具有的功能,將系統(tǒng)分為這幾個模塊:五子棋主模塊、棋勢掃描模塊、棋勢排序模塊、棋勢評估模塊以及隨機(jī)落子模塊。其中,五子棋主模塊實現(xiàn)棋盤繪制、勝負(fù)判定的功能,以及對弈過程中對比雙方棋勢的擇位落子模塊。棋勢掃描模塊、棋勢排序模塊、棋勢評估模塊分別實現(xiàn)棋勢掃描、棋勢排序、棋勢評估的功能;而隨機(jī)落子模塊則實現(xiàn)在前兩步棋勢尚未形成時,電腦緊鄰?fù)婕衣渥游恢秒S機(jī)擇位落子的功能,是用例圖中擇位落子功能的一部分。對應(yīng)的,系統(tǒng)一共有五個類,分別對應(yīng)五個模塊;分別為:五子棋主模塊Gobang類、棋勢掃描StatusScan類、棋勢排序StatusSort類、棋勢評估StatusEvaluation類,以及隨機(jī)落子RandomPlay類。類圖如圖4所示。其中Gobang類中的屬性和方法并沒有完全列出,只列出了主要的屬性和方法;其余類基本列出了所有的屬性和方法。具體細(xì)節(jié)將在第四部分“五子棋的實現(xiàn)與測試”一節(jié)討論,這里不再贅述。圖4五子棋系統(tǒng)的類圖四、五子棋的實現(xiàn)與測試1、Gobang類的實現(xiàn)Gobang類是五子棋的核心類,棋盤繪制、棋子落子,響應(yīng)事件的處理,游戲的控制和模式設(shè)置,勝負(fù)判定,以及對棋勢掃描、排序、評估等的調(diào)用都在這里實現(xiàn)。Gobang類的類圖如圖5所示。圖5Gobang類類圖其中棋盤的繪制,有paint()和init()來實現(xiàn),棋子落子由setQizi()來實現(xiàn),響應(yīng)事件的處理也在這個類中添加監(jiān)視器并處理,而游戲的控制和設(shè)置在Game_start()和Game_rastart()中實現(xiàn),游戲勝負(fù)的判定由Judge()方法和四個判定不同方向上是否五子連珠的Game_win_*()函數(shù)來實現(xiàn)。而最為重要的棋勢掃描、排序和評估,則由其屬性scanp、scanc、sort、evaluatep、evaluatec分別調(diào)用它們的方法來實現(xiàn)。隨機(jī)落子由屬性randomPlay調(diào)用其方法實現(xiàn)。2、StatusScan類的實現(xiàn)StatusScan類通過掃描目前棋盤上的所有八個方向上的落子情況,獲取整個對弈雙方的棋勢。StatusScan類的類圖如圖6所示。圖6StatusScan類類圖其中三維數(shù)組shape為一個20*20*5的數(shù)組,用來存儲所獲取的整個對弈雙方的棋勢。當(dāng)然了,在實際實現(xiàn)中,實例化了兩個StatusScan類的對象scanp和scanc,這兩個對象分別用來存儲玩家的棋勢和電腦的棋勢。而statusScan()方法具體實現(xiàn)從棋盤上獲取整個棋勢的具體過程,參數(shù)chesspad存儲棋盤上的詳細(xì)落子情況,參數(shù)colour決定需要獲取的是黑方的棋勢還是白方的棋勢。具體掃描時,對于棋盤(i,j)處,有上下、左右、左下右上、坐上右下八個方向,但是統(tǒng)計時,將上下、左右、左下右上、左上右下分別合一,則一共有四個結(jié)果,分別存儲在shape[i][j][0]、shape[i][j][1]、shape[i][j][2]、shape[i][j][3]中。3、StatusSort類的實現(xiàn)StatusSort類對StatusScan類掃描得到的棋勢進(jìn)行排序,以便于做進(jìn)一步的棋勢評估。StatusSort類的類圖如圖7所示。圖7StatusSort類類圖其中,StatusSort類只有一個方法statusSort(),參數(shù)shape即為StatusScan類掃描獲取的棋勢數(shù)據(jù),該方法主要是對shape中的棋勢數(shù)據(jù)進(jìn)行排序,使得shape數(shù)組滿足以下條件:排序后的結(jié)果仍然存儲在shape數(shù)組中。4、StatusEvaluation類的實現(xiàn)StatusEvaluate類對StatusSort類排序過的棋勢進(jìn)行評估,為對弈時電腦擇位落子提供依據(jù)。StatusEvaluate類的類圖如圖8所示。圖8StatusEvaluate類類圖其中,StatusEvaluate類也只有一個方法statusEvaluate(),參數(shù)shape即為StatusSort類排序后的棋勢,該方法主要是根據(jù)棋盤上每一個位置(i,j)的棋勢數(shù)據(jù)shap[i][j][0]、shap[i][j][1]、shap[i][j][2]以及shap[i][j][3]的取值,計算該位置的棋勢評估值,并保存在shap[i][j][4]中。此外,還要比較每一個位置的棋勢評估值,將最大的評估值記錄在屬性max中,相應(yīng)的位置坐標(biāo)記錄在max_x和max_y中。5、RandomPlay類的實現(xiàn)RandomPlay類主要是在前兩步,棋勢尚未形成,在玩家落子后,電腦緊鄰?fù)婕衣渥游恢?,隨機(jī)落子。RandomPlay類的類圖如圖9所示。圖9RandomPlay類類圖其中,方法randomPlay()方法具體實現(xiàn)這一過程,屬性chesspad存儲目前棋盤上的落子情況,參數(shù)a、b即為玩家最近一次的落子位置。randomPlay()方法通過檢測隨機(jī)數(shù)的值,分別在緊鄰?fù)婕衣渥?a,b)處的正上、正下、正左、正右、左下、右上、左上以及右下八個位置中的一個位置落子,最終選取的電腦落子位置,存儲在屬性x、y之中。6、五子棋系統(tǒng)的測試運(yùn)行系統(tǒng)后,選擇“讓讓電腦也無妨”,單擊“人機(jī)對戰(zhàn),快沖啊”,開始游戲。游戲過程中,能夠正確顯示相關(guān)的游戲信息,如圖10所示。圖10系統(tǒng)運(yùn)行截圖從圖中,可以看到“就不告訴你是誰贏了”標(biāo)簽顯示的勝負(fù)信息“五子連珠白棋贏了”;而“就不告訴你這是第幾步”標(biāo)簽顯示進(jìn)度信息“這是第13步”。進(jìn)一步生成了可執(zhí)行文件五子棋.jar,如圖11所示,可執(zhí)行文件將與實驗報告、源代碼一并提交。圖11系統(tǒng)生成的可執(zhí)行五子棋文件五、分析與總結(jié)通過五子棋實驗,從分析、設(shè)計、編程、調(diào)試,到最后運(yùn)行成功,自己得到了很多的鍛煉。*************************************
實驗報告實驗名稱:實驗3訪問控制學(xué)員:閆慧寧學(xué)號:09060100培養(yǎng)類型:軍人碩士研究生年級:研一專業(yè):計算機(jī)科學(xué)與技術(shù)所屬學(xué)院:計算機(jī)學(xué)院指導(dǎo)教員:任江春職稱:講師實驗室:103-南201實驗日期:2010春國防科學(xué)技術(shù)大學(xué)訓(xùn)練部制
六、附錄附錄1在網(wǎng)上查閱資料時,看到這個帖子,作者將自己的五子棋心得以一種非常有趣的形式展現(xiàn)出來:前序、四個對聯(lián)、后記;樂一樂的同時,也有不小的收獲,一并附于此,作為五子棋實驗的一個意外收獲。前序區(qū)區(qū)字奴,小小網(wǎng)蟲,癡四書,迷五子,樂此不疲。于聯(lián)眾蒙諸友賜教,學(xué)得棋技少許,術(shù)語若干,不勝心癢,試以韻筆題之,略有小得。是以聯(lián)句做文,集成發(fā)貼,唯愿感者留其言,評者留其論,亦酬傷神,亦慰嘔心。之一黑子落,白子落,棋樂陶陶任蹉跎,勝,能如何?敗,能如何?方寸紋枰自淡泊,心平氣和。先手措,后手措,棋道漫漫細(xì)求索,得,有什么?失,有什么?過去未來共斟酌,知足常樂。橫批:以和為貴之二縱馳奔,橫馳奔,各施韜略斗奇陣,連,可生根?跳,可生根?優(yōu)劣一子變風(fēng)云,三思謹(jǐn)慎。陰線紋,陽線紋,各藏玄機(jī)備異軍,沖,可細(xì)尋?活,可細(xì)尋?勝負(fù)一瞬轉(zhuǎn)乾坤,五星怡神。橫批:心正棋明之三直指路,斜指路,世事如棋萬千途,求,是何苦?棄,是何苦?煩惱歲月忘沉浮,難得糊涂。攻式促,守式促,人生如棋無盡處,逞,幾時悟?餒,幾時悟?坎坷光陰等閑度,漫卷詩書。橫批:寧靜致遠(yuǎn)之四老棋迷,小棋迷,相歡一線牽萬里,聚,談何易?散,談何易?網(wǎng)絡(luò)現(xiàn)實兩依依,珍重友誼。新棋友,舊棋友,三五知音遍神州,逢,曾記否?別,曾記否?游戲人生兩悠悠,真情永久。橫批:樂在棋中后記未慮平仄,難對詞性,非詩非賦,亦聯(lián)亦詞,筆隨心動,疏漏百出。吾雖無才,但喜交雕文之友,亦拜一字之師,盼觀添花妙筆,求聞回春妙方,可暢胸懷,可足平生?!禞ava語言程序設(shè)計》課程設(shè)計報告學(xué)院:信息科學(xué)技術(shù)學(xué)院班級:軟件技術(shù)2班姓名:學(xué)號:指導(dǎo)教師:課設(shè)時間:20**-03-17至20**-03-26二OXX年三月二十六日
目錄一、設(shè)計要求…………2二、設(shè)計步驟…………22.1程序流程圖………….…………...22.2程序的功能分配……….………...3三、設(shè)計正文…………63.1創(chuàng)建棋盤類……….63.2判斷輸贏功能實現(xiàn)……………….93.3測試結(jié)果………9四、心得體會…………...12五、參考文獻(xiàn)…………...12附錄(源代碼)……….13一、課程設(shè)計要求設(shè)計一個15╳15圍棋棋盤,由兩玩家交替進(jìn)行對戰(zhàn),并可以實現(xiàn)以下功能:1.選擇落子的先后順序2.重置棋盤3.刷新重新開始4.退出提示并且規(guī)定退出者判為負(fù),但退出過程中要有提示。以防不小心點(diǎn)錯了。最后判斷某一方是否為五子連珠。實現(xiàn)一個簡單的多用戶五子棋的游戲程序,包括如下兩個界面(1)選擇對弈桌(執(zhí)黑、執(zhí)白)。(2)在游戲界面,有開始,退出(游戲未結(jié)束、點(diǎn)退出自動判負(fù));二、設(shè)計步驟2.1程序流程圖2.2程序的功能分配a.棋盤的繪制publicvoiddraw_qipan(GraphicsG)//畫棋盤15*15{ G.setColor(Color.lightGray); G.fill3DRect(10,10,300,300,true); G.setColor(Color.black); for(inti=1;i<16;i++){ G.drawLine(20,20*i,300,20*i); G.drawLine(20*i,20,20*i,300); }}b.添加按鈕Buttonb1=newButton("開始"); Buttonb2=newButton("重置游戲"); LabellblWin=newLabel(""); CheckboxckbHB[]=newCheckbox[3]; Buttonexist=newButton("退出"); publicvoidinit(){ ckbHB[0]=newCheckbox("執(zhí)白",ckgHB,false); ckbHB[1]=newCheckbox("執(zhí)黑",ckgHB,false); ckbHB[2]=newCheckbox("觀看",ckgHB,false); }c.鼠標(biāo)棋子的觸發(fā)事件publicvoidmouseClicked(MouseEvente){ Graphicsg=getGraphics(); intx1,y1; x1=e.getX(); y1=e.getY(); if(e.getX()<20||e.getX()>300||e.getY()<20||e.getY()>300){ return; } if(x1%20>10){ x1+=10; } if(y1%20>10){ y1+=10; } x1=x1/20*20; y1=y1/20*20; set_Qizi(x1,y1); m*=(-1);}d.按鈕的觸發(fā)事件publicvoidactionPerformed(ActionEvente){ Graphicsg=getGraphics(); if(e.getSource()==b1){ Game_start(); } else{ Game_re(); } if(e.getSource()==exist){ Game_re(); lblWin.setText(Get_qizi_color(color_Qizi)+"輸了!"); intGame_Start=0; }e.判斷落子的位置及畫出相應(yīng)的黑白棋子publicvoidset_Qizi(intx,inty)//落子{ if(intGame_Start==0)//判斷游戲未開始{ return; } if(intGame_Body[x/20][y/20]!=0){ return; } Graphicsg=getGraphics(); if(color_Qizi==1)//判斷黑子還是白子{ g.setColor(Color.black); color_Qizi=0; } else{ g.setColor(Color.white); color_Qizi=1; } g.fillOval(x-10,y-10,20,20); intGame_Body[x/20][y/20]=color_Qizi+1;}f.判斷勝負(fù)if(Game_win_1(x/20,y/20))//判斷輸贏1{ lblWin.setText(Get_qizi_color(color_Qizi)+"贏了!"); intGame_Start=0; } if(Game_win_2(x/20,y/20))//判斷輸贏2{ lblWin.setText(Get_qizi_color(color_Qizi)+"贏了!"); intGame_Start=0; } if(Game_win_3(x/20,y/20))//判斷輸贏3{ lblWin.setText(Get_qizi_color(color_Qizi)+"贏了!"); intGame_Start=0; } if(Game_win_4(x/20,y/20))//判斷輸贏4{ lblWin.setText(Get_qizi_color(color_Qizi)+"贏了!"); intGame_Start=0; }}三、設(shè)計正文3.1創(chuàng)建棋盤類PublicclassWcyChessextendsAppletimplementsActionListener,MouseListener,MouseMotionListener,ItemListener{ intcolor_Qizi=0;//旗子的顏色標(biāo)識0:白子1:黑子 intintGame_Start=0;//游戲開始標(biāo)志0未開始1游戲中 intintGame_Body[][]=newint[16][16];//設(shè)置棋盤棋子狀態(tài) intm=-1; Buttonb1=newButton("開始"); Buttonb2=newButton("重置游戲"); LabellblWin=newLabel(""); CheckboxckbHB[]=newCheckbox[3]; Buttonexist=newButton("退出"); CheckboxGroupckgHB=newCheckboxGroup(); NetchatClientchat=newNetchatClient(); publicvoidinit(){ setLayout(null); addMouseListener(this); add(b1); b1.setBounds(330,50,80,30); b1.addActionListener(this); add(b2); b2.setBounds(330,90,80,30); b2.addActionListener(this); ckbHB[0]=newCheckbox("執(zhí)白",ckgHB,false); ckbHB[0].setBounds(320,20,60,30); ckbHB[1]=newCheckbox("執(zhí)黑",ckgHB,false); ckbHB[1].setBounds(380,20,60,30); ckbHB[2]=newCheckbox("觀看",ckgHB,false); add(ckbHB[0]); add(ckbHB[1]); add(ckbHB[2]); ckbHB[0].addItemListener(this); ckbHB[1].addItemListener(this); add(lblWin); lblWin.setBounds(330,180,80,30); lblWin.setBackground(Color.red); lblWin.setText("勝利者!");//沒有顯示? ckbHB[2].setBounds(440,20,60,30); add(exist); exist.setBounds(330,130,80,30); exist.addActionListener(this);// add(chat);chat.setBounds(20,500,300,300); chat.frame(); chat.setVisible(true); Game_start_csh(); setSize(500,600); setVisible(true); } publicvoiditemStateChanged(ItemEvente){ if(ckbHB[0].getState())//選擇黑子還是白子{ color_Qizi=0; } else{ color_Qizi=1; } } publicvoidmousePressed(MouseEvente){} publicvoidmouseClicked(MouseEvente){ Graphicsg=getGraphics(); intx1,y1; x1=e.getX(); y1=e.getY(); if(e.getX()<20||e.getX()>300||e.getY()<20||e.getY()>300){ return; } if(x1%20>10){ x1+=10; } if(y1%20>10){ y1+=10; } x1=x1/20*20; y1=y1/20*20; set_Qizi(x1,y1); m*=(-1); } publicvoidactionPerformed(ActionEvente){ Graphicsg=getGraphics(); if(e.getSource()==b1){ Game_start(); } else { Game_re(); } if(e.getSource()==exist){ Game_re(); lblWin.setText(Get_qizi_color(color_Qizi)+"輸了!"); intGame_Start=0; } } publicvoidmouseEntered(MouseEvente){} publicvoidmouseExited(MouseEvente){} publicvoidmouseReleased(MouseEvente){} publicvoidmouseDragged(MouseEvente){} publicvoidmouseMoved(MouseEvente){} publicvoidpaint(Graphicsg){ draw_qipan(g);}3.2判斷輸贏功能實現(xiàn)if(Game_win_1(x/20,y/20)){//判斷輸贏1 lblWin.setText(Get_qizi_color(color_Qizi)+"贏了!"); intGame_Start=0;}if(Game_win_2(x/20,y/20)){//判斷輸贏2 lblWin.setText(Get_qizi_color(color_Qizi)+"贏了!"); intGame_Start=0;} if(Game_win_3(x/20,y/20))//判斷輸贏3{ lblWin.setText(Get_qizi_color(color_Qizi)+"贏了!"); intGame_Start=0;} if(Game_win_4(x/20,y/20))//判斷輸贏4{ lblWin.setText(Get_qizi_color(color_Qizi)+"贏了!"); intGame_Start=0;}3.3測試結(jié)果a.進(jìn)入游戲界面游戲開始的界面有三個選擇項,用戶可以選擇相應(yīng)的角色,選擇完畢后點(diǎn)擊開始進(jìn)入游戲。b.選擇角色,開始下棋首先達(dá)到五個棋子連在一塊的贏了,并在紅色區(qū)域顯示誰贏了!c.下完后,重新開始下完一盤后游戲停止,點(diǎn)擊重新開始,界面回到初始界面,選擇角色繼續(xù)游戲.d.游戲中點(diǎn)退出,自動判輸在下棋的過程當(dāng)中誰中途退出,即點(diǎn)擊退出,系統(tǒng)自動判斷誰輸
四、課程設(shè)計心得體會通過此次課程設(shè)計,將我本學(xué)期所學(xué)的JAVA知識得到鞏固和應(yīng)用,在設(shè)計的過程中我遇到了很到問題,不過在老師和同學(xué)們的幫助和自己的思考下還是很好的完成了。這此課程設(shè)計還讓我懂得了寫程序不能閉門造車,要努力拓寬知識面,開闊視野,拓展思維。它還讓我學(xué)會了在網(wǎng)上查閱那些無限的資料。由于自己的分析設(shè)計和程序經(jīng)驗不足,該系統(tǒng)設(shè)計和實現(xiàn)過程中,還有許多沒有完善的地方,比如用戶界面設(shè)計不夠美觀,異常出錯處理比較差等多方面問題,這些都有待進(jìn)一步完善和提高。對于文中出現(xiàn)的不足和系統(tǒng)中出現(xiàn)的問題敬請老師指導(dǎo)。五、參考文獻(xiàn)1.吳其慶編著.Java程序設(shè)計實例教程.北京:冶金工業(yè)出版社2.柳西玲.許斌編著.Java語言應(yīng)用開發(fā)基礎(chǔ).北京:清華大學(xué)出版社3.丁振凡Java語言實用教程:北京郵電大學(xué)出版社附錄(源代碼)import.*;importjava.io.*;importjava.applet.*;importjava.awt.*;importjava.awt.event.*;importjava.applet.Applet;importjava.awt.Color;PublicclasswuziqiextendsAppletimplementsActionListener,MouseListener,MouseMotionListener,ItemListener{intcolor_Qizi=0;//旗子的顏色標(biāo)識0:白子1:黑子intintGame_Start=0;//游戲開始標(biāo)志0未開始1游戲中intintGame_Body[][]=newint[16][16];//設(shè)置棋盤棋子狀態(tài)intm=-1;Buttonb1=newButton("開始");Buttonb2=newButton("重新開始");LabellblWin=newLabel(""); CheckboxckbHB[]=newCheckbox[3]; Buttonexist=newButton("退出"); CheckboxGroupckgHB=newCheckboxGroup(); publicvoidinit(){ setLayout(null); addMouseListener(this); add(b1); b1.setBounds(330,50,80,30); b1.addActionListener(this); add(b2); b2.setBounds(330,90,80,30); b2.addActionListener(this); ckbHB[0]=newCheckbox("執(zhí)白",ckgHB,false); ckbHB[0].setBounds(320,20,60,30); ckbHB[1]=newCheckbox("執(zhí)黑",ckgHB,false); ckbHB[1].setBounds(380,20,60,30); ckbHB[2]=newCheckbox("觀看",ckgHB,false); add(ckbHB[0]); add(ckbHB[1]); add(ckbHB[2]); ckbHB[0].addItemListener(this); ckbHB[1].addItemListener(this); add(lblWin); lblWin.setBounds(330,180,80,30); lblWin.setBackground(Color.red); lblWin.setText("勝利者!");//沒有顯示? ckbHB[2].setBounds(440,20,60,30); add(exist); exist.setBounds(330,130,80,30); exist.addActionListener(this); Game_start_csh(); setSize(500,600); setVisible(true); } publicvoiditemStateChanged(ItemEvente){ if(ckbHB[0].getState())//選擇黑子還是白子 { color_Qizi=0; } else { color_Qizi=1; } } publicvoidmousePressed(MouseEvente){} publicvoidmouseClicked(MouseEvente){ Graphicsg=getGraphics(); intx1,y1; x1=e.getX(); y1=e.getY(); if(e.getX()<20||e.getX()>300||e.getY()<20||e.getY()>300){ return; } if(x1%20>10){ x1+=10; } if(y1%20>10){ y1+=10; } x1=x1/20*20; y1=y1/20*20; set_Qizi(x1,y1); m*=(-1) } publicvoidactionPerformed(ActionEvente){ Graphicsg=getGraphics(); if(e.getSource()==b1){ Game_start(); } else{ Game_re(); } if(e.getSource()==exist){ Game_re();// color_Qizi=m; lblWin.setText(Get_qizi_color(color_Qizi)+"輸了!"); intGame_Start=0; } } publicvoidmouseEntered(MouseEvente){} publicvoidmouseExited(MouseEvente){} publicvoidmouseReleased(MouseEvente){} publicvoidmouseDragged(MouseEvente){} publicvoidmouseMoved(MouseEvente){} publicvoidpaint(Graphicsg){ draw_qipan(g); } publicvoidset_Qizi(intx,inty){//落子 if(intGame_Start==0){//判斷游戲未開始 return; } if(intGame_Body[x/20][y/20]!=0){ return; } Graphicsg=getGraphics(); if(color_Qizi==1){//判斷黑子還是白子 g.setColor(Color.black); color_Qizi=0; } else{ g.setColor(Color.white); color_Qizi=1; } g.fillOval(x-10,y-10,20,20); intGame_Body[x/20][y/20]=color_Qizi+1; if(Game_win_1(x/20,y/20)){//判斷輸贏1 lblWin.setText(Get_qizi_color(color_Qizi)+"贏了!"); intGame_Start=0; } if(Game_win_2(x/20,y/20)){//判斷輸贏2{ lblWin.setText(Get_qizi_color(color_Qizi)+"贏了!"); intGame_Start=0; } if(Game_win_3(x/20,y/20)){//判斷輸贏3 lblWin.setText(Get_qizi_color(color_Qizi)+"贏了!"); intGame_Start=0; } if(Game_win_4(x/20,y/20)){//判斷輸贏4 lblWin.setText(Get_qizi_color(color_Qizi)+"贏了!"); intGame_Start=0; } } publicStringGet_qizi_color(intx) { if(x==0) { return"黑子"; } else { return"白子"; } } publicvoiddraw_qipan(GraphicsG){//畫棋盤15*15 G.setColor(Color.lightGray); G.fill3DRect(10,10,300,300,true); G.setColor(Color.black); for(inti=1;i<16;i++){ G.drawLine(20,20*i,300,20*i); G.drawLine(20*i,20,20*i,300); } } publicvoidGame_start(){//游戲開始 intGame_Start=1; Game_btn_enable(false); b2.setEnabled(true); } publicvoidGame_start_csh(){//游戲開始初始化 intGame_Start=0; Game_btn_enable(true); b2.setEnabled(false); ckbHB[0].setState(true); for(inti=0;i<16;i++){ for(intj=0;j<16;j++){ intGame_Body[i][j]=0; } } lblWin.setText(""); } publicvoidGame_re(){//重新開始游戲 repaint(); Game_start_csh(); } publicvoidGame_btn_enable(booleane){//設(shè)置組件狀態(tài) b1.setEnabled(e); b2.setEnabled(e);
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年八年級語文上冊 第五單元 第17課《中國石拱橋》教案 新人教版
- 2024-2025學(xué)年高中物理 第一章 分子動理論 第1節(jié) 物體是由大量分子組成的教案1 粵教版選修3-3
- 04年文化演藝活動組織合同
- 2024年人工智能產(chǎn)品研發(fā)與許可合同
- 2024年工程分包合同詳細(xì)條款及注意事項
- 2024年城市公共交通運(yùn)營合同具體條款及運(yùn)營要求
- 2024年工程履約協(xié)議
- 2024年工程質(zhì)量保證合同模板
- 2024年熱銷用友產(chǎn)品購買協(xié)議
- 2024年企業(yè)品牌管理與市場推廣合同
- DD 2022-1.2 巖心數(shù)字化技術(shù)規(guī)程 第2部分:表面圖像數(shù)字化
- 全國優(yōu)質(zhì)課一等獎初中物理九年級《科學(xué)探究:歐姆定律》課件
- 中醫(yī)外科乳房疾病診療規(guī)范診療指南2023版
- 2023-2024年抖音直播行業(yè)現(xiàn)狀及發(fā)展趨勢研究報告
- 新課標(biāo)-人教版數(shù)學(xué)六年級上冊第五單元《圓》單元教材解讀
- 2022湖北漢江王甫洲水力發(fā)電有限責(zé)任公司招聘試題及答案解析
- 2019新人教必修1unit2Travelling-Around整單元完整教案
- 大學(xué)生辯論賽評分標(biāo)準(zhǔn)表
- 診所污水污物糞便處理方案及周邊環(huán)境
- 江蘇開放大學(xué)2023年秋《馬克思主義基本原理 060111》形成性考核作業(yè)2-實踐性環(huán)節(jié)(占過程性考核成績的30%)參考答案
- 《我是班級的主人翁》的主題班會
評論
0/150
提交評論