Java五子棋课程设计.docx

上传人:b****3 文档编号:3841605 上传时间:2022-11-25 格式:DOCX 页数:32 大小:279.49KB
下载 相关 举报
Java五子棋课程设计.docx_第1页
第1页 / 共32页
Java五子棋课程设计.docx_第2页
第2页 / 共32页
Java五子棋课程设计.docx_第3页
第3页 / 共32页
Java五子棋课程设计.docx_第4页
第4页 / 共32页
Java五子棋课程设计.docx_第5页
第5页 / 共32页
点击查看更多>>
下载资源
资源描述

Java五子棋课程设计.docx

《Java五子棋课程设计.docx》由会员分享,可在线阅读,更多相关《Java五子棋课程设计.docx(32页珍藏版)》请在冰豆网上搜索。

Java五子棋课程设计.docx

Java五子棋课程设计

 

计算机与信息工程系

《JAVA程序设计》课程设计

五子棋游戏

 

 

摘要:

要求:

使用图形用户界面,实现两人游戏,能够判断输赢。

有“开始”按钮,当选择完棋盘大小后,按此按钮进入对战状态。

当有胜利者(垂直、水平、对角线连续5子),显示对话框,提示谁(黑还是白)胜利了。

若当棋盘满了还无胜利者,显示平局对话框。

界面上还要有“复盘”按钮,可对完成的棋局进行复盘,例如每3秒走一步。

1.课程设计介绍

目的:

通过课程设计较全面的掌握Java语法基础知识、面向对象程序设计方法,尤其是基于Java的应用程序设计的方法与技术,能够运用J2SE平台,结合相应的数据库系统开发应用程序,理论联系实际,把所学课程及相关知识加以融会贯通,全面掌握Java语言的编程思想及面向对象程序设计的方法,为今后从事实际工作打下坚实的基础,达到培养实践操作技能的目的。

要求:

使用图形用户界面,实现两人游戏,能够判断输赢。

有“开始”按钮,当选择完棋盘大小后,按此按钮进入对战状态。

当有胜利者(垂直、水平、对角线连续5子),显示对话框,提示谁(黑还是白)胜利了。

若当棋盘满了还无胜利者,显示平局对话框。

界面上还要有“复盘”按钮,可对完成的棋局进行复盘,例如每3秒走一步。

2.系统设计

2.1需求分析

一款小游戏的确立是建立在各种各样的需求上面的,这种需求往往来自于玩家的实际需求,其中玩家的实际需求最为重要.面对游戏拥有不同知识和理解层面的玩家,游戏制作人对玩家需求的理解程度,在很大程度上决定了此类游戏开发的成败.因此如何更好地的了解,分析,明确玩家需求,并且能够准确,清晰以文档的形式表达给游戏制作人,保证开发过程按照满足玩家需求为目的正确开发方向进行,是每游戏游戏制作人需要面对的问题。

2.2总体设计

(1)界面棋盘设计

在对棋盘界面设计方面要考虑简洁友好,符合游戏者需求。

棋子的设计方面系统中设置了两种棋子颜色,white或者black,游戏者可自行选择。

棋子怎样画出来,怎样使棋子按我们所想的方式来绘制出来是设计的主要难题。

运行时要求当每次点击鼠标的时候就在点击鼠标的地方画一个棋子,所以得定义一个棋子的类使点击鼠标时系统把棋子绘制出来。

这样主界面里的棋子就确定了,而且也确定了几个所需要的类。

可以先定义好这些类了。

有了以上的准备就可以把棋盘绘制出来了,下棋时每次在适当位置点击鼠标的时候就在所点击的位置上画出你这个角色的颜色,然后计算机会自动的下棋,计算机自动下棋要有一个控制变量来控制能不能下棋。

人可以随意的下子,可是计算机就要计算在哪个位置下子了。

这里由计算机下子的算法来确定,人人对战的话就不象单机游戏一样,要计算机来判断人下子之后计算机下那一个地方了,人人对战只要在双方下子的时候判断赢棋情况,当然还要同步的控制两个人下棋的顺序,这样的话就要用到线程了,各自都继承或实现线程类或接口,以便各自能随时单独控制接发消息。

(2)算法设计

对于五子棋游戏,无论人机对战,还是双人对战,都需要判断棋盘上是否存在五子连珠情况,这既是游戏名字的由来,也是游戏结束的标志。

判断五子连珠的原理是从横,竖,左斜线,右斜线4条线上判断是否存在5个相连的同类棋子。

对战一方落子后,在该处向8个方向检测连续的同类棋子,如果检测到直线方向上存在5个连续的同类棋子(包含本位置棋子),则判断为“连五”并结束检测循环。

基于检测结果,可以判断游戏是否结束,并根据获胜方的落子代码判断获胜方是谁。

由于不考虑禁手问题,在实现“连五”过程中,我们可以考虑完成“双四”,“四三”,“双三”,“冲四”,“活三”,“活四”来实现目的。

活四:

有两个点能形成“连五”的四就是活四;冲四:

只有一个点能形成“连五”的四叫做“冲四”,或者叫做“单四”;活三:

己方在落一子就能形成“活四”的三叫做“活三”。

“活三”分为“连活三”和“跳活三”。

连活三:

在棋盘某一条阳线或阴线上有同色三子相连,且在此三子两端延长线上有一端至少有一个,另一端至少有两个无子的交叉点与此三子紧密相连。

跳活三:

中间仅间隔一个无子交叉点的连三,但两端延长线均至少有一个无子的交叉点与此三子相连。

双三:

由于黑方走一着在无子交叉点上同时形成二个或二个以上黑方"活"的局面。

双四:

由于黑方走一着在无子交叉点上同时形成二个或二个以上黑方"四"的局面。

四三:

指某一方同时具备两个先手,其中一个是"四",一个是"活三"。

在实现上面这些高级算法的时候,我们需要一个基础,就是对制定位置周围情况进行检测。

在棋盘上面,棋子存在8个移动方向,检测时需要对每个方向进行检测。

为了简单直观,这里将每步棋子的移动生成一个新的棋子。

 

2.3功能设计

 

3.系统各功能模块设计

3.1ChessFrame主要功能

classChessFrameextendsJFrameimplementsActionListener{

privateString[]strsize={"20x15","30x20","40x30"};

privateString[]strmode={"人机对弈","人人对弈"};

publicstaticbooleaniscomputer=true,checkcomputer=true;

privateintwidth,height;

privateChessModelcm;

privateMainPanelmp;

3.2游戏主窗体

publicChessFrame(){

this.setTitle("五子棋游戏");

cm=newChessModel

(1);

mp=newMainPanel(cm);

Containercon=this.getContentPane();

con.add(mp,"Center");

this.setResizable(false);

this.addWindowListener(newChessWindowEvent());

MapSize(20,15);

JMenuBarmbar=newJMenuBar();

this.setJMenuBar(mbar);

JMenugameMenu=newJMenu("游戏");

mbar.add(makeMenu(gameMenu,newObject[]{

"开局","棋盘","模式",null,"退出"

},this));

JMenulookMenu=newJMenu("视图");

mbar.add(makeMenu(lookMenu,newObject[]{

"Metal","Motif","Windows"

},this));

JMenuhelpMenu=newJMenu("帮助");

mbar.add(makeMenu(helpMenu,newObject[]{

"关于"

},this));

}

3.3主菜单

publicJMenumakeMenu(Objectparent,Objectitems[],Objecttarget){

JMenum=null;

if(parentinstanceofJMenu)

m=(JMenu)parent;

elseif(parentinstanceofString)

m=newJMenu((String)parent);

else

returnnull;

for(inti=0;i

if(items[i]==null)

m.addSeparator();

elseif(items[i]=="棋盘"){

JMenujm=newJMenu("棋盘");

ButtonGroupgroup=newButtonGroup();

JRadioButtonMenuItemrmenu;

for(intj=0;j

rmenu=makeRadioButtonMenuItem(strsize[j],target);

if(j==0)

rmenu.setSelected(true);

jm.add(rmenu);

group.add(rmenu);}m.add(jm);

}elseif(items[i]=="模式"){

JMenujm=newJMenu("模式");

ButtonGroupgroup=newButtonGroup();

JRadioButtonMenuItemrmenu;

for(inth=0;h

rmenu=makeRadioButtonMenuItem(strmode[h],target);

if(h==0)

rmenu.setSelected(true);

jm.add(rmenu);

group.add(rmenu);}m.add(jm);

}else

m.add(makeMenuItem(items[i],target));returnm;}

4.设计结果与分析

(1)五子棋游戏的主界面。

(2)五子棋游戏的结束界面。

(3)游戏栏中的各个选项。

 

(4)视图设置栏中的各个选项。

 

(5)Help帮助栏中的选项。

5.课程设计总结和体会

通过这次课程设计,我进一步加深对基础理论的理解,扩大专业知识面,对收集资料、查阅文献、方案制定等实践方面得到了很好的锻练,促进对所学知识应用能力的提高。

同时我渐渐的复习了Java使用方法和编程语法,之后的编程过程也相对得心应手,基本完成了预期计划的要求。

在此感谢指导老师刘老师,他在课题的研究上不遗余力的给予指导。

他严谨的治学态度深深的影响了我,使我受益匪浅!

6.参考文献

[1]耿祥义.JAVA大学实用教程.北京:

电子工业出版社。

[2]朱战立,沈伟.Java程序设计实用指南.北京:

电子工业出版社。

[3]唐大仕.Java程序设计[M].北京:

北方交通大学出版社。

[4]叶核亚.JAVA2程序设计实用教程[M].北京:

电子工业出版社。

[5]邢素萍.JAVA办公自动化项目方案精解[M].北京:

航空工业出版社。

 

成绩评定

出勤情况(10分)

界面设计(15分)

功能实现(30分)

创新点(15分)

答辩情况(10分)

设计报告(20分)

设计评语

指导教师

 

附录:

//Java编程:

五子棋游戏源代码

importjava.awt.*;

importjava.awt.event.*;

importjava.applet.*;

importjavax.swing.*;

importjava.io.PrintStream;

importjavax.swing.JComponent;

importjavax.swing.JPanel;

/*

*main方法创建了ChessFrame类的一个实例对象(cf),

*并启动屏幕显示显示该实例对象。

**/

publicclassFiveChessAppletDemo{

publicstaticvoidmain(Stringargs[]){

ChessFramecf=newChessFrame();

cf.show();

}

}

/*

*类ChessFrame主要功能是创建五子棋游戏主窗体和菜单

**/

classChessFrameextendsJFrameimplementsActionListener{

privateString[]strsize={"20x15","30x20","40x30"};

privateString[]strmode={"人机对弈","人人对弈"};

publicstaticbooleaniscomputer=true,checkcomputer=true;

privateintwidth,height;

privateChessModelcm;

privateMainPanelmp;

//构造五子棋游戏的主窗体

publicChessFrame(){

this.setTitle("五子棋游戏");

cm=newChessModel

(1);

mp=newMainPanel(cm);

Containercon=this.getContentPane();

con.add(mp,"Center");

this.setResizable(false);

this.addWindowListener(newChessWindowEvent());

MapSize(20,15);

JMenuBarmbar=newJMenuBar();

this.setJMenuBar(mbar);

JMenugameMenu=newJMenu("游戏");

mbar.add(makeMenu(gameMenu,newObject[]{

"开局","棋盘","模式",null,"退出"

},this));

JMenulookMenu=newJMenu("视图");

mbar.add(makeMenu(lookMenu,newObject[]{

"Metal","Motif","Windows"

},this));

JMenuhelpMenu=newJMenu("帮助");

mbar.add(makeMenu(helpMenu,newObject[]{

"关于"

},this));

}

//构造五子棋游戏的主菜单

publicJMenumakeMenu(Objectparent,Objectitems[],Objecttarget){

JMenum=null;

if(parentinstanceofJMenu)

m=(JMenu)parent;

elseif(parentinstanceofString)

m=newJMenu((String)parent);

else

returnnull;

for(inti=0;i

if(items[i]==null)

m.addSeparator();

elseif(items[i]=="棋盘"){

JMenujm=newJMenu("棋盘");

ButtonGroupgroup=newButtonGroup();

JRadioButtonMenuItemrmenu;

for(intj=0;j

rmenu=makeRadioButtonMenuItem(strsize[j],target);

if(j==0)

rmenu.setSelected(true);

jm.add(rmenu);

group.add(rmenu);

}

m.add(jm);

}elseif(items[i]=="模式"){

JMenujm=newJMenu("模式");

ButtonGroupgroup=newButtonGroup();

JRadioButtonMenuItemrmenu;

for(inth=0;h

rmenu=makeRadioButtonMenuItem(strmode[h],target);

if(h==0)

rmenu.setSelected(true);

jm.add(rmenu);

group.add(rmenu);

}

m.add(jm);

}else

m.add(makeMenuItem(items[i],target));

returnm;

}

//构造五子棋游戏的菜单项

publicJMenuItemmakeMenuItem(Objectitem,Objecttarget){

JMenuItemr=null;

if(iteminstanceofString)

r=newJMenuItem((String)item);

elseif(iteminstanceofJMenuItem)

r=(JMenuItem)item;

else

returnnull;

if(targetinstanceofActionListener)

r.addActionListener((ActionListener)target);

returnr;

}

//构造五子棋游戏的单选按钮式菜单项

publicJRadioButtonMenuItemmakeRadioButtonMenuItem(

Objectitem,Objecttarget){

JRadioButtonMenuItemr=null;

if(iteminstanceofString)

r=newJRadioButtonMenuItem((String)item);

elseif(iteminstanceofJRadioButtonMenuItem)

r=(JRadioButtonMenuItem)item;

else

returnnull;

if(targetinstanceofActionListener)

r.addActionListener((ActionListener)target);

returnr;

}

publicvoidMapSize(intw,inth){

setSize(w*20+50,h*20+100);

if(this.checkcomputer)

this.iscomputer=true;

else

this.iscomputer=false;

mp.setModel(cm);

mp.repaint();

}

publicbooleangetiscomputer(){

returnthis.iscomputer;

}

publicvoidrestart(){

intmodeChess=cm.getModeChess();

if(modeChess<=3&&modeChess>=1){

cm=newChessModel(modeChess);

MapSize(cm.getWidth(),cm.getHeight());

}else{

System.out.println("\u81EA\u5B9A\u4E49");

}

}

publicvoidactionPerformed(ActionEvente){

Stringarg=e.getActionCommand();

try{

if(arg.equals("Windows"))

UIManager.setLookAndFeel(

"com.sun.java.swing.plaf.windows.WindowsLookAndFeel");

elseif(arg.equals("Motif"))

UIManager.setLookAndFeel(

"com.sun.java.swing.plaf.motif.MotifLookAndFeel");

else

UIManager.setLookAndFeel(

"javax.swing.plaf.metal.MetalLookAndFeel");

SwingUtilities.updateComponentTreeUI(this);

}catch(Exceptionee){}

if(arg.equals("20x15")){

this.width=20;

this.height=15;

cm=newChessModel

(1);

MapSize(this.width,this.height);

SwingUtilities.updateComponentTreeUI(this);

}

if(arg.equals("30x20")){

this.width=30;

this.height=20;

cm=newChessModel

(2);

MapSize(this.width,this.height);

SwingUtilities.updateComponentTreeUI(this);

}

if(arg.equals("40x30")){

this.width=40;

this.height=30;

cm=newChessModel(3);

MapSize(this.width,this.height);

SwingUtilities.updateComponentTreeUI(this);

}

if(arg.equals("人机对弈")){

this.checkcomputer=true;

this.iscomputer=true;

cm=newChessModel(cm.getModeChess());

MapSize(cm.getWidth(),cm.getHeight());

SwingUtilities.updateComponentTreeUI(this);

}

if(arg.equals("人人对弈")){

this.checkcomputer=false;

this.iscomputer=false;

cm=newChessModel(cm.getModeChess());

MapSize(cm.getWidth(),cm.getHeight());

SwingUtilities.updateComponentTreeUI(this);

}

if(arg.equals("开局")){

restart();

}

if(arg.equals("关于"))

JOptionPane.showMessageDialog(this,"五子棋游戏测试版本","关于",0);

if(arg.equals("退出"))

System.exit(0);

}

}

/*

*类ChessModel实现了整个五子棋程序算法的核心

*/

classChessModel{

//棋盘的宽度、高度、棋盘的模式(如20×15)

privateintwidth,height,modeChess;

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工程科技 > 能源化工

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1