《JAVA程序設(shè)計(jì)》課程設(shè)計(jì)五子棋小游戲_第1頁(yè)
《JAVA程序設(shè)計(jì)》課程設(shè)計(jì)五子棋小游戲_第2頁(yè)
《JAVA程序設(shè)計(jì)》課程設(shè)計(jì)五子棋小游戲_第3頁(yè)
《JAVA程序設(shè)計(jì)》課程設(shè)計(jì)五子棋小游戲_第4頁(yè)
《JAVA程序設(shè)計(jì)》課程設(shè)計(jì)五子棋小游戲_第5頁(yè)
已閱讀5頁(yè),還剩14頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、java程序設(shè)計(jì)課程設(shè)計(jì)題 目: 五子棋小游戲 專 業(yè): 信息與計(jì)算科學(xué) 學(xué) 號(hào): 070930205等 姓 名: 指導(dǎo)教師: 成 績(jī): 二00九 年 十二 月 九 日1.課程設(shè)計(jì)研究背景及意義五子棋是一種兩人對(duì)弈的純策略型棋類游戲,是起源于中國(guó)古代的傳統(tǒng)黑白棋種之一。發(fā)展于日本,流行于歐美。容易上手,老少皆宜,而且趣味橫生,引人入勝;不僅能增強(qiáng)思維能力,提高智力,而且富含哲理,有助于修身養(yǎng)性。然則看似很簡(jiǎn)單的一個(gè)小游戲,卻對(duì)我們這組剛接觸java編程的成員來(lái)說(shuō)卻是一個(gè)不錯(cuò)的挑戰(zhàn),由于水平不限不能做成和電腦進(jìn)行對(duì)戰(zhàn),也對(duì)于和其它電腦聯(lián)機(jī)對(duì)戰(zhàn)的模式不太清楚,故做成一個(gè)自己和自己對(duì)戰(zhàn)的五子棋來(lái)考驗(yàn)

2、我們的java的技術(shù)。2.課程設(shè)計(jì)題目描述和要求題目:五子棋小游戲游戲主要界面如下:游戲規(guī)則:1,棋子分為黑白兩色,采用1919棋盤。2,自己和自己對(duì)戰(zhàn),白子和黑子交替下,直到白子或黑子一方有五粒子連在一起,最先完成五粒子連在一起的一方為勝利的一方(可以是橫、豎、斜、反斜)。3,允許悔棋,且允許一直悔到棋盤上沒(méi)有棋子了,悔棋后允許恢復(fù)。當(dāng)悔棋后下子了,則不允許再恢復(fù)了。4,有棋子的地方不允許再下棋子了5,落子后不能移動(dòng)或拿掉。7,勝利后,棋局重新開始。主要功能:1,鼠標(biāo)點(diǎn)棋盤上的任意一點(diǎn),棋子會(huì)落入離這點(diǎn)最近的一個(gè)交叉點(diǎn)處。2,白子和黑子交替下。3,當(dāng)下到一半時(shí),可以保存進(jìn)度。4,關(guān)閉再打開后

3、,可以重新讀取進(jìn)度再接著下。5,允許悔棋,且允許一直悔到棋盤上沒(méi)有棋子了。6,悔棋后允許恢復(fù)。當(dāng)悔棋后下子了,則不允許再恢復(fù)了。7,下棋的過(guò)程中,隨時(shí)可以重新開始。8,有棋子的地方不允許再下子了。9,當(dāng)悔到?jīng)]有棋子的時(shí)候會(huì)彈出消息。10,任意一方勝利后會(huì)彈出消息11,恢復(fù)的步數(shù)超過(guò)了悔棋的步數(shù)的時(shí)候會(huì)彈出消息12,當(dāng)任意一方勝利后,棋局重新開始。13,設(shè)有菜單欄,玩家可以點(diǎn)菜單來(lái)完成某種操作。14,當(dāng)最小化后,能重新還原棋子(棋子不會(huì)消失)。15,點(diǎn)菜單欄的“幫助”“關(guān)于”會(huì)顯示這個(gè)課程設(shè)計(jì)小組的成員。3.課程設(shè)計(jì)報(bào)告內(nèi)容3.1 題目求解的理論依據(jù)及算法1,利用java的swing組件可以實(shí)現(xiàn)

4、游戲主界面的設(shè)置和菜單的添加。本次發(fā)開的小游戲界面比較簡(jiǎn)單,就一個(gè)面板外加一個(gè)菜單欄,在面板中繪圖。菜單條中有三項(xiàng)分別為:文件(保存進(jìn)度、讀取進(jìn)度、退出),編輯(悔棋、恢復(fù)、重來(lái)),幫助(關(guān)于)。2,利用java的輸入輸出類庫(kù)和文件操作來(lái)完成文件的讀寫來(lái)完成保存進(jìn)度和讀取進(jìn)度的功能。3,利用java的事件處理來(lái)完成鼠標(biāo),菜單的事件處理。4,利用java的類來(lái)生成棋子5,利用java的類的繼承和多態(tài),自定義mypanel來(lái)繼承jpanel,在mypanel 中重寫paintcomponent()方法來(lái)實(shí)現(xiàn)畫在面板中圖形的重繪。6,利用java的繪圖類graphics在面板中繪制棋盤,當(dāng)點(diǎn)鼠標(biāo)的時(shí)

5、候繪制棋子,以及完成重繪。7,利用java的動(dòng)態(tài)數(shù)組arraylist來(lái)存儲(chǔ)棋子的坐標(biāo)等等信息。8,建立一個(gè)19*19的矩陣來(lái)存儲(chǔ)棋盤上黑白棋子的信息,初始值全為0,例如:當(dāng)每12行7列下了一個(gè)黑子后,hflag127=1。如果是白子則bflag127=1下一個(gè)棋子便對(duì)勝負(fù)進(jìn)行一次判斷,當(dāng)hflag或bflag有五個(gè)1連在一起的時(shí)候則判hflag和bflag對(duì)應(yīng)的一方勝利。9,建立一個(gè)棋子的類,有屬性:x:棋子在棋盤上的橫坐標(biāo)、y: 棋子在棋盤上的縱坐標(biāo)num:這是玩家下的第幾個(gè)棋子xflag:矩陣的行、yflag:矩陣的列當(dāng)下一個(gè)棋子后產(chǎn)生一個(gè)棋子實(shí)例,將棋子在棋盤的位置和這是下的第幾個(gè)子以

6、及第幾行和第幾列分別賦值給x,y,num,xflag,yflag。10,當(dāng)num % 2=0的時(shí)候畫白子,當(dāng)num % 2=1的時(shí)候畫黑子。3.2 主要事件處理:1,鼠標(biāo)事件處理(mouselistener):public void mouseclicked(mouseevent e) int x = e.getx();/*棋子在棋盤上的橫坐標(biāo)*/int y = e.gety()/*棋子在棋盤上的縱坐標(biāo)*/;int it = 0, jt = 0; /*矩陣的行和列*/絕對(duì)定位棋子即當(dāng)點(diǎn)在交叉點(diǎn)附近,棋子會(huì)落在交叉點(diǎn)if (y 53) /下子不會(huì)落到菜單欄上,菜單和標(biāo)題共高53個(gè)像素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;/當(dāng)絕對(duì)定位交叉處沒(méi)有棋子時(shí)畫棋子if (bflagitjt = 0 & hflagitjt = 0) if (a % 2 = 0) pal.drawbai(x, y);bflagitjt = 1;/下了一子后這點(diǎn)便不能下子了if (a %

8、2 = 1) pal.drawhei(x, y);hflagitjt = 1; /下了一子后這點(diǎn)便不能下子了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);/ 把棋子實(shí)例保存到動(dòng)態(tài)數(shù)組中huiqinum = 0;/下子后,便不能悔棋了,悔棋步數(shù)重置為0a+;shengfu();/每下一子對(duì)勝負(fù)情況進(jìn)行判斷2、動(dòng)作事件處理(點(diǎn)菜單的時(shí)候)(actionlistener):public void a

9、ctionperformed(actionevent e) if (e.getactioncommand().equals(保存進(jìn)度) handlesave();if (e.getactioncommand().equals(讀取進(jìn)度) 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(重來(lái)) restart();if (e.getactioncommand().equals(關(guān)于.) handleabout();3、窗口事件處理(windowadapter):public void windowclosing(windowevent e) system.exit(0);3.3 簡(jiǎn)要的操作流程(要求畫流程圖)界面大體構(gòu)造restarthandlehuifuhandlehuiqihandlereadhandlesavehandaboutexit(0)退出讀取進(jìn)度保存進(jìn)度悔棋恢復(fù)關(guān)于重來(lái)幫助文件編輯窗口事件處理(關(guān)閉)窗口菜單鼠標(biāo)事件處理(下子)簡(jiǎn)要

11、的設(shè)計(jì)流程:創(chuàng)建窗口初始化菜單、面板對(duì)各個(gè)菜單項(xiàng)添加事件監(jiān)聽以及鼠標(biāo)事件監(jiān)聽窗口事件處理動(dòng)作事件處理鼠標(biāo)事件處理完成java源代碼編寫調(diào)試修改程序,完善功能3.4事件處理的幾個(gè)重要方法:1、保存進(jìn)度(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、讀取進(jìn)度(handleread)public void handleread() int temp = filec.showopendialog(this);if (temp = jfilechooser.approve_option) restart();/讀取進(jìn)程前必須清

14、空所有變量string path = filec.getselectedfile().getabsolutepath();file = new file(path);try fileinputstream fout = new fileinputstream(file);datainputstream din = new datainputstream(fout);/ readint以4個(gè)字節(jié)表示一個(gè)int,故要除4,一個(gè)循環(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)沒(méi)棋子了!, 警告,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, 對(duì)不起,系統(tǒng)不充許恢復(fù)!, 警告,joptionpane.information_message);5、重來(lái)(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、判斷勝負(fù)(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 詳細(xì)操作步驟(含部分源程序代碼)1,產(chǎn)生棋子的類的主要屬性(文件qizi.java)public class qizi private int x; /棋子在棋盤上的橫坐標(biāo)private int y; /棋子在棋盤上的縱坐標(biāo)private int num;/ 這是玩家下的第幾個(gè)棋子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;/*動(dòng)態(tài)數(shù)組,保存棋子實(shí)例*/arraylist list = new arraylist();/*動(dòng)態(tài)數(shù)組,暫存悔棋時(shí)從list移出的棋子實(shí)例*/arraylist beiyong = new arraylist();/*保存棋盤交叉點(diǎn)的橫坐標(biāo)*/double hen = new double1919;/*保存棋盤交叉點(diǎn)的縱坐標(biāo)*/double shu = new double1919;/重寫這個(gè)方法用來(lái)完成圖形的重繪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);/初始化棋盤交叉點(diǎn)坐標(biāo)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è)計(jì)小組n本組成員:n組長(zhǎng):沈村敬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;/*判斷坐標(biāo)上有沒(méi)有白子*/int bflag = new int1919;/* 判斷坐標(biāo)上有沒(méi)有黑子*/int hflag = new int1919;/*連續(xù)悔了幾步棋*/int huiqinum = 0;/*標(biāo)題欄的圖標(biāo)*/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) / 處理鼠標(biāo)點(diǎn)擊事件略,重復(fù)public void shengfu() / 判斷勝負(fù)略

27、,重復(fù);public wuziqi() / 構(gòu)造方法/*設(shè)置框架大小*/this.setsize(506, 556);/*設(shè)置標(biāo)題*/this.settitle(五子棋);/*設(shè)置標(biāo)題圖標(biāo)*/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);/*增加鼠標(biāo)事件偵聽*/this.addmouselistener(this);/*初始化棋盤的坐標(biāo)*/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)試出錯(cuò)信息及解決方法制作過(guò)程中遇到的最主要的錯(cuò)誤如下:(這兩個(gè)錯(cuò)誤都困擾了我們相當(dāng)長(zhǎng)一段時(shí)間,很有代表性)1,當(dāng)在框架里繪圖的時(shí)候,會(huì)重寫paint()方法,但加了菜單后,菜單彈出再收縮后,界面不能及時(shí)刷新,會(huì)留下白色的一片。解決方法:寫一個(gè)類繼承jpanel類,重寫paintcomponent()方法,用這個(gè)方法代替paint()方法,可解決這個(gè)問(wèn)題。2,下面是文件讀取的方法中一段代碼:try fileinputstream fout = new fileinputstream(file);datainputstream din =

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 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ì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論