版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、java程序設(shè)計課程設(shè)計題 目: 五子棋小游戲 專 業(yè): 信息與計算科學(xué) 學(xué) 號: 070930205等 姓 名: 指導(dǎo)教師: 成 績: 二00九 年 十二 月 九 日1.課程設(shè)計研究背景及意義五子棋是一種兩人對弈的純策略型棋類游戲,是起源于中國古代的傳統(tǒng)黑白棋種之一。發(fā)展于日本,流行于歐美。容易上手,老少皆宜,而且趣味橫生,引人入勝;不僅能增強思維能力,提高智力,而且富含哲理,有助于修身養(yǎng)性。然則看似很簡單的一個小游戲,卻對我們這組剛接觸java編程的成員來說卻是一個不錯的挑戰(zhàn),由于水平不限不能做成和電腦進行對戰(zhàn),也對于和其它電腦聯(lián)機對戰(zhàn)的模式不太清楚,故做成一個自己和自己對戰(zhàn)的五子棋來考驗
2、我們的java的技術(shù)。2.課程設(shè)計題目描述和要求題目:五子棋小游戲游戲主要界面如下:游戲規(guī)則:1,棋子分為黑白兩色,采用1919棋盤。2,自己和自己對戰(zhàn),白子和黑子交替下,直到白子或黑子一方有五粒子連在一起,最先完成五粒子連在一起的一方為勝利的一方(可以是橫、豎、斜、反斜)。3,允許悔棋,且允許一直悔到棋盤上沒有棋子了,悔棋后允許恢復(fù)。當悔棋后下子了,則不允許再恢復(fù)了。4,有棋子的地方不允許再下棋子了5,落子后不能移動或拿掉。7,勝利后,棋局重新開始。主要功能:1,鼠標點棋盤上的任意一點,棋子會落入離這點最近的一個交叉點處。2,白子和黑子交替下。3,當下到一半時,可以保存進度。4,關(guān)閉再打開后
3、,可以重新讀取進度再接著下。5,允許悔棋,且允許一直悔到棋盤上沒有棋子了。6,悔棋后允許恢復(fù)。當悔棋后下子了,則不允許再恢復(fù)了。7,下棋的過程中,隨時可以重新開始。8,有棋子的地方不允許再下子了。9,當悔到?jīng)]有棋子的時候會彈出消息。10,任意一方勝利后會彈出消息11,恢復(fù)的步數(shù)超過了悔棋的步數(shù)的時候會彈出消息12,當任意一方勝利后,棋局重新開始。13,設(shè)有菜單欄,玩家可以點菜單來完成某種操作。14,當最小化后,能重新還原棋子(棋子不會消失)。15,點菜單欄的“幫助”“關(guān)于”會顯示這個課程設(shè)計小組的成員。3.課程設(shè)計報告內(nèi)容3.1 題目求解的理論依據(jù)及算法1,利用java的swing組件可以實現(xiàn)
4、游戲主界面的設(shè)置和菜單的添加。本次發(fā)開的小游戲界面比較簡單,就一個面板外加一個菜單欄,在面板中繪圖。菜單條中有三項分別為:文件(保存進度、讀取進度、退出),編輯(悔棋、恢復(fù)、重來),幫助(關(guān)于)。2,利用java的輸入輸出類庫和文件操作來完成文件的讀寫來完成保存進度和讀取進度的功能。3,利用java的事件處理來完成鼠標,菜單的事件處理。4,利用java的類來生成棋子5,利用java的類的繼承和多態(tài),自定義mypanel來繼承jpanel,在mypanel 中重寫paintcomponent()方法來實現(xiàn)畫在面板中圖形的重繪。6,利用java的繪圖類graphics在面板中繪制棋盤,當點鼠標的時
5、候繪制棋子,以及完成重繪。7,利用java的動態(tài)數(shù)組arraylist來存儲棋子的坐標等等信息。8,建立一個19*19的矩陣來存儲棋盤上黑白棋子的信息,初始值全為0,例如:當每12行7列下了一個黑子后,hflag127=1。如果是白子則bflag127=1下一個棋子便對勝負進行一次判斷,當hflag或bflag有五個1連在一起的時候則判hflag和bflag對應(yīng)的一方勝利。9,建立一個棋子的類,有屬性:x:棋子在棋盤上的橫坐標、y: 棋子在棋盤上的縱坐標num:這是玩家下的第幾個棋子xflag:矩陣的行、yflag:矩陣的列當下一個棋子后產(chǎn)生一個棋子實例,將棋子在棋盤的位置和這是下的第幾個子以
6、及第幾行和第幾列分別賦值給x,y,num,xflag,yflag。10,當num % 2=0的時候畫白子,當num % 2=1的時候畫黑子。3.2 主要事件處理:1,鼠標事件處理(mouselistener):public void mouseclicked(mouseevent e) int x = e.getx();/*棋子在棋盤上的橫坐標*/int y = e.gety()/*棋子在棋盤上的縱坐標*/;int it = 0, jt = 0; /*矩陣的行和列*/絕對定位棋子即當點在交叉點附近,棋子會落在交叉點if (y 53) /下子不會落到菜單欄上,菜單和標題共高53個像素for (i
7、nt i = 0; i 19; i+) for (int j = 0; j 19; j+) if (pal.henij - 13 = x& (y - 53 = pal.shuij - 13) & (y - 53 = pal.shuij + 13) x = (int) pal.henij;y = (int) pal.shuij;it = i; jt = j;/當絕對定位交叉處沒有棋子時畫棋子if (bflagitjt = 0 & hflagitjt = 0) if (a % 2 = 0) pal.drawbai(x, y);bflagitjt = 1;/下了一子后這點便不能下子了if (a %
8、2 = 1) pal.drawhei(x, y);hflagitjt = 1; /下了一子后這點便不能下子了qizi qi = new qizi(x, y); /將信息保存在棋子屬性中qi.setflagx(it); qi.setflagy(jt);qi.setx(x); qi.sety(y); qi.setnum(a);pal.list.add(qi);/ 把棋子實例保存到動態(tài)數(shù)組中huiqinum = 0;/下子后,便不能悔棋了,悔棋步數(shù)重置為0a+;shengfu();/每下一子對勝負情況進行判斷2、動作事件處理(點菜單的時候)(actionlistener):public void a
9、ctionperformed(actionevent e) if (e.getactioncommand().equals(保存進度) handlesave();if (e.getactioncommand().equals(讀取進度) handleread();if (e.getactioncommand().equals(退出) system.exit(0);if (e.getactioncommand().equals(悔棋) handlehuiqi();if (e.getactioncommand().equals(恢復(fù)) handlehuifu();if (e.getactionco
10、mmand().equals(重來) restart();if (e.getactioncommand().equals(關(guān)于.) handleabout();3、窗口事件處理(windowadapter):public void windowclosing(windowevent e) system.exit(0);3.3 簡要的操作流程(要求畫流程圖)界面大體構(gòu)造restarthandlehuifuhandlehuiqihandlereadhandlesavehandaboutexit(0)退出讀取進度保存進度悔棋恢復(fù)關(guān)于重來幫助文件編輯窗口事件處理(關(guān)閉)窗口菜單鼠標事件處理(下子)簡要
11、的設(shè)計流程:創(chuàng)建窗口初始化菜單、面板對各個菜單項添加事件監(jiān)聽以及鼠標事件監(jiān)聽窗口事件處理動作事件處理鼠標事件處理完成java源代碼編寫調(diào)試修改程序,完善功能3.4事件處理的幾個重要方法:1、保存進度(handlesave)public void handlesave() int temp = filec.showsavedialog(this);if (temp = jfilechooser.approve_option) string path=filec.getselectedfile().getabsolutepath();file = new file(path);try file.c
12、reatenewfile();fileoutputstream fout = new fileoutputstream(file);dataoutputstream dout = new dataoutputstream(fout);for (int i = 0; i pal.list.size(); i+) dout.writeint(pal.list.get(i).getflagx();dout.writeint(pal.list.get(i).getflagy();dout.writeint(pal.list.get(i).getnum();dout.writeint(pal.list.
13、get(i).getx();dout.writeint(pal.list.get(i).gety();fout.close(); catch (filenotfoundexception e) e.printstacktrace(); catch (ioexception e) e.printstacktrace();2、讀取進度(handleread)public void handleread() int temp = filec.showopendialog(this);if (temp = jfilechooser.approve_option) restart();/讀取進程前必須清
14、空所有變量string path = filec.getselectedfile().getabsolutepath();file = new file(path);try fileinputstream fout = new fileinputstream(file);datainputstream din = new datainputstream(fout);/ readint以4個字節(jié)表示一個int,故要除4,一個循環(huán)讀了5次,故要除20for (int i = 0; i 0) qizi temp = pal.list.get(pal.list.size() - 1);pal.beiy
15、ong.add(temp);int tempx = temp.getflagx();int tempy = temp.getflagy();if (a % 2 = 1) bflagtempxtempy = 0;if (a % 2 = 0) hflagtempxtempy = 0;pal.list.remove(pal.list.size() - 1);a-;huiqinum+;repaint(); else joptionpane.showmessagedialog(this, 已經(jīng)沒棋子了!, 警告,joptionpane.information_message);4、處理恢復(fù)(handle
16、huifu)public void handlehuifu() if (huiqinum 0) qizi temp = pal.beiyong.get(pal.beiyong.size() - 1);pal.list.add(temp);int tempx = temp.getflagx();int tempy = temp.getflagy();if (a % 2 = 1) bflagtempxtempy = 1;if (a % 2 = 0) hflagtempxtempy = 1;pal.beiyong.remove(pal.beiyong.size() - 1);a+;huiqinum-
17、;repaint(); else joptionpane.showmessagedialog(this, 對不起,系統(tǒng)不充許恢復(fù)!, 警告,joptionpane.information_message);5、重來(restart)public void restart() pal.list.clear();for (int i = 0; i 19; i+) for (int j = 0; j 19; j+) bflagij = 0;hflagij = 0;repaint();6、處理關(guān)于(handleabout)public void handleabout() joptionpane.sh
18、owmessagedialog(this, about, about,joptionpane.information_message);7、判斷勝負(shengfu)public void shengfu() /*是否白棋有五粒連在一起*/int ba = 0;/*是否黑棋有五粒連在一起*/int he = 0;/ 橫線上有五粒for (int i = 0; i 19; i+) for (int j = 0; j 15; j+) if (bflagij = 1 & bflagij + 1 = 1& bflagij + 2 = 1 & bflagij + 3 = 1& bflagij + 4 =
19、 1) ba = 1;if (hflagij = 1 & hflagij + 1 = 1& hflagij + 2 = 1 & hflagij + 3 = 1& hflagij + 4 = 1) he = 1;/ 豎線上有五粒斜、線上有五粒、反斜線上有五粒略,和第一種情況相似if (ba = 1) joptionpane.showmessagedialog(this, 白棋勝利, 結(jié)果,joptionpane.information_message);restart();if (he = 1) joptionpane.showmessagedialog(this, 黑棋勝利, 結(jié)果,jopti
20、onpane.information_message);restart();3.5 詳細操作步驟(含部分源程序代碼)1,產(chǎn)生棋子的類的主要屬性(文件qizi.java)public class qizi private int x; /棋子在棋盤上的橫坐標private int y; /棋子在棋盤上的縱坐標private int num;/ 這是玩家下的第幾個棋子private int flagx; / 矩陣的行private int flagy; / 矩陣的列2,產(chǎn)生面板文件mypanel.java的大概內(nèi)容:public class mypanel extends jpanel /*白子的
21、圖片*/image bai;/*黑子的圖片*/image hei;/*19*19的棋盤圖片*/image qipan;/*動態(tài)數(shù)組,保存棋子實例*/arraylist list = new arraylist();/*動態(tài)數(shù)組,暫存悔棋時從list移出的棋子實例*/arraylist beiyong = new arraylist();/*保存棋盤交叉點的橫坐標*/double hen = new double1919;/*保存棋盤交叉點的縱坐標*/double shu = new double1919;/重寫這個方法用來完成圖形的重繪protected void paintcomponent
22、(graphics g) g.drawimage(qipan, 0, 0, this);if (list.size() != 0) for (int i = 0; i list.size(); i+) qizi qizi = (qizi) list.get(i);if (i % 2 = 0) g.drawimage(bai, qizi.getx() - 12, qizi.gety() - 12, this); else g.drawimage(hei, qizi.getx() - 12, qizi.gety() - 12, this);/方法畫白棋子public void drawbai(in
23、t x, int y) this.getgraphics().drawimage(bai, x - 12, y - 12, this);/方法畫白棋子public void drawhei(int x, int y) this.getgraphics().drawimage(hei, x - 12, y - 12, this);/初始化棋盤交叉點坐標public void startxy() for (int i = 0; i 19; i+) for (int j = 0; j 19; j+) henij = 18.0+j * 25.8;shuij = 18.0+i * 25.8;3、五子棋的
24、主要文件wuziqi.java的大概內(nèi)容:public class wuziqi extends jframe implements mouselistener final string about = 0709302班java課程設(shè)計小組n本組成員:n組長:沈村敬n組員:劉新琳、雷艷飛、李云、黃生涯;jmenubar mb;mypanel pal;jmenu wenjian, bianji, help;jmenuitem read, save, exit, huiqi, huifu, restart, about;process pro = new process();jfilechoose
25、r filec = new jfilechooser();file file;/* 控制白棋和黑棋的交替*/int a;/*判斷坐標上有沒有白子*/int bflag = new int1919;/* 判斷坐標上有沒有黑子*/int hflag = new int1919;/*連續(xù)悔了幾步棋*/int huiqinum = 0;/*標題欄的圖標*/image top;class process implements actionlistener / 處理菜單事件public void actionperformed(actionevent e) 略,重復(fù)public void handlesa
26、ve() / 保存文件略,重復(fù)public void handleread() / 讀取文件略,重復(fù)public void handlehuiqi() / 處理悔棋略,重復(fù)public void handlehuifu() / 恢復(fù)悔棋略,重復(fù)public void handleabout() /彈出消息,小組名稱略public void restart() / 重新開始略,重復(fù)public void init() / 初始化菜單略public void mouseclicked(mouseevent e) / 處理鼠標點擊事件略,重復(fù)public void shengfu() / 判斷勝負略
27、,重復(fù);public wuziqi() / 構(gòu)造方法/*設(shè)置框架大小*/this.setsize(506, 556);/*設(shè)置標題*/this.settitle(五子棋);/*設(shè)置標題圖標*/this.seticonimage(top);init();/*獲取容器*/container co = getcontentpane();co.add(pal);/*使框架居中*/dimension c = toolkit.getdefaulttoolkit().getscreensize();dimension self = this.getsize();double x = c.getwidth()
28、 / 2 - self.getwidth() / 2;double y = c.getheight() / 2 - self.getheight() / 2;this.setlocation(int) x, (int) y);/*設(shè)置不能改變大小*/this.setresizable(false);/*增加鼠標事件偵聽*/this.addmouselistener(this);/*初始化棋盤的坐標*/pal.startxy();/*關(guān)閉窗口*/this.addwindowlistener(new windowadapter() public void windowclosing(windowe
29、vent e) system.exit(0););/*增加菜單*/this.setjmenubar(mb);/*顯示所有*/this.setvisible(true);/ main()public static void main(string args) new wuziqi();3.6 程序調(diào)試出錯信息及解決方法制作過程中遇到的最主要的錯誤如下:(這兩個錯誤都困擾了我們相當長一段時間,很有代表性)1,當在框架里繪圖的時候,會重寫paint()方法,但加了菜單后,菜單彈出再收縮后,界面不能及時刷新,會留下白色的一片。解決方法:寫一個類繼承jpanel類,重寫paintcomponent()方法,用這個方法代替paint()方法,可解決這個問題。2,下面是文件讀取的方法中一段代碼:try fileinputstream fout = new fileinputstream(file);datainputstream din =
溫馨提示
- 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度寵物用品連鎖店承包經(jīng)營服務(wù)協(xié)議4篇
- 二零二五版明星代言合同合作方責任與義務(wù)協(xié)議4篇
- 建設(shè)工程設(shè)計合同(2篇)
- 聚氨酯管殼施工方案
- 二零二五版數(shù)碼產(chǎn)品典當借款服務(wù)協(xié)議4篇
- 2025年度個人貸款還款計劃合同模板8篇
- 中央處理器GPU:性能躍遷與行業(yè)應(yīng)用的深度剖析 頭豹詞條報告系列
- 班會安全教育模板
- 二零二五年度民間擔保機構(gòu)與企業(yè)合作協(xié)議4篇
- 鯨的自述200字5篇
- 2023-2024學(xué)年度人教版一年級語文上冊寒假作業(yè)
- 軟件運維考核指標
- 空氣動力學(xué)仿真技術(shù):格子玻爾茲曼方法(LBM)簡介
- 對表達方式進行選擇與運用
- GB/T 18488-2024電動汽車用驅(qū)動電機系統(tǒng)
- 投資固定分紅協(xié)議
- 高二物理題庫及答案
- 職業(yè)發(fā)展展示園林
- 2024版醫(yī)療安全不良事件培訓(xùn)講稿
- 中學(xué)英語教學(xué)設(shè)計PPT完整全套教學(xué)課件
- 移動商務(wù)內(nèi)容運營(吳洪貴)項目五 運營效果監(jiān)測
評論
0/150
提交評論