JAVA实现华容道智力游戏有源码.docx
- 文档编号:3327324
- 上传时间:2022-11-21
- 格式:DOCX
- 页数:19
- 大小:22.65KB
JAVA实现华容道智力游戏有源码.docx
《JAVA实现华容道智力游戏有源码.docx》由会员分享,可在线阅读,更多相关《JAVA实现华容道智力游戏有源码.docx(19页珍藏版)》请在冰豆网上搜索。
JAVA实现华容道智力游戏有源码
课程设计(论文)任务书
软件学院学 院 软件+电子商务专 业2 班
一、课程设计(论文)题目 华容道——一个传统的智力游戏
二、课程设计(论文)工作自2010年12月20日起至2010年12月24日止。
三、课程设计(论文)地点:
软件学院实训中心
四、课程设计(论文)内容要求:
1.本课程设计的目的
(1)掌握Java语言的程序设计方法;
(2)理论联系实际,进一步提高学生的软件开发技术;
(3)培养学生分析、解决问题的能力;
(4)提高学生实践论文撰写能力。
2.课程设计的任务及要求
1)课程设计任务:
用java语言编写一个华容道小游戏
2)创新要求:
在基本要求达到后,可进行创新设计
3)课程设计论文编写要求
(1)课程设计任务及要求
(2)设计思路--工作原理、功能规划
(3)详细设计---数据分析、算法思路、类设计、功能实现(含程序流程图、主要代
码及注释)、界面等。
(4)运行调试与分析讨论---给出运行屏幕截图,分析运行结果,有何改进想法等。
(5)设计体会与小结---设计遇到的问题及解决办法,通过设计学到了哪些新知识,
巩固了哪些知识,有哪些提高。
(6)参考文献(必须按标准格式列出,可参考教材后面的参考文献格式)
(7)报告按规定排版打印,要求装订平整,否则要求返工;
(8)课设报告的装订顺序如下:
封面---任务书---中文摘要---目录----正文---附录
(代码及相关图片)
(9)严禁抄袭,如有发现,按不及格处理。
4)课程设计评分标准:
(1)学习态度:
10分;
(2)系统设计:
20分;
(3)编程调试:
20分;
(4)回答问题:
20分;
(5)论文撰写:
30分。
5)参考文献:
(1)丁振凡.Java语言实用教程(第2版)[M].北京邮电大学出版社.2008.1
(2)丁振凡.Java语言实用教程实验指导(第2版)[M].北京邮电大学出版社.2008.1
(3)杨树林等.Java语言最新实用案例教程(第2版)[M].清华大学出版社.2010.7
6)课程设计进度安排
1.准备阶段(4学时):
选择设计题目、了解设计目的要求、查阅相关资料
2.程序模块设计分析阶段(4学时):
程序总体设计、详细设计
3.代码编写调试阶段(8学时):
程序模块代码编写、调试、测试
4.撰写论文阶段(4学时):
总结课程设计任务和设计内容,撰写课程设计论文
学生签名:
2010年12月20日
课程设计(论文)评审意见
(1)学习态度(10分):
优( )、良( )、中( )、一般( )、差( );
(2)系统设计(20分):
优()、良( )、中( )、一般( )、差( );
(3)编程调试(20分):
优( )、良( )、中( )、一般( )、差( );
(4)回答问题(20分):
优( )、良( )、中( )、一般( )、差( );
(5)论文撰写(30分):
优( )、良( )、中( )、一般( )、差( );
评阅人:
职称:
讲师
2010年12月25日
中文摘要
华容道,古老的中国游戏,以其变化多端、百玩不厌的特点与魔方、独立钻石棋一起被国外智力专家并称为“智力游戏界的三个不可思议”。
游戏就是依照“曹瞒兵败走华容,正与关公狭路逢,只为当初恩义重,放开金锁走蛟龙”这一故事情节设计,受到很多玩家的喜爱。
该程序用Java语言编写,棋盘上有10个不一样大小的按钮,分别代表曹操、张飞、赵云、马超、黄忠和关羽,还有四个兵。
棋盘最下方有两个空着的小方格,代表曹操逃出的位置,可以实现通过鼠标或者键盘移动界面上的按钮,最终使曹操移动到棋盘最下方,代表曹操逃出华容道。
目 录
一、课程设计任务及要求
1、本程序主要练习使用布局管理器设计一个华容道游戏界面,并练习使用事件监听器(鼠标事件、键盘事件和焦点事件)实现按钮的移动。
2、编写一个按钮的子类,使用该子类创建的对象代表华容道中的人物。
通过焦点事件控制人物颜色,当人物获得焦点时颜色为红色,当失去焦点时颜色为黄色。
3、通过键盘事件和鼠标事件来实现曹操、关羽等人物的移动。
当人物上发生鼠标事件或键盘事件时,如果鼠标指针的位置是在人物的下方(也就是组件的下半部分)或按下键盘的“↓“键,该人物向下移动。
向左、向右和向上的移动原理类似。
4、点击“重新开始”可以使各个按钮复位,重新开始游戏。
二、需求分析
要满足的容道游戏的基本操作:
1.各人物按钮按相应的顺序和大小排列,按钮上标注人物名字,界面美观。
2.通过焦点事件控制人物按钮的颜色,得到焦点呈红色,失去焦点为淡黄色。
3.可以通过键盘控制各个按钮的移动:
按“↓”键,人物按钮向下移动其它方向类似。
4.可以通过鼠标点击来控制各个人物按钮的移动:
如果点击的位置在按钮的上半部分则向上移动,如果点击按钮的下半部分则向下,左右原理类似。
5.有“重新开始按钮”点击重新开始按钮各个人物按钮复位,能重新开始游戏。
6.小程序能够自由的缩小,放大,关闭。
三、设计思路
1.首先是界面设计,该界面主要包括十个人物按钮(马、曹操、关羽等)以及旁边的四个边框按钮和重新开始按钮。
对于人物按钮,创建Button按钮的子类,在该类中定义按钮的一些新的属性和焦点事件监听器,如:
按钮的标签名、按钮的颜色、按钮的排号(如这里有十个人物按钮,从1排到十,在程序中可以依靠这个属性区分人物按钮)、按钮颜色、按钮获得或失去焦点事件。
同时在设计该界面时要考虑到各个按钮的位置、大小等情况。
2.对界面上的各人物按钮添加相应的相应事件
焦点事件:
通过焦点事件各个按钮的是焦点。
鼠标事件、键盘事件:
通过这两种事件去完成界面上各人物按钮的移动。
对重新开始按钮定义动作事件(ActionEvent)完成界面初始化功能也就是各人物按钮重新归位。
四、详细设计
1.类的设计
本程序总共有3个类
(1)MoveExample类
publicclassMoveExample
{
publicstaticvoidmain(Stringargs[])//定义主方法
{
newHua_Rong_Road();//创建一个Hua_Rong_Road对象
}
}
(2)Person类
增加焦点事件监视器:
addFocusListener(事件监听器)
当组件具有焦点监视器后,如果组件从无输入焦点变成有输入焦点或从有输入焦点到无输入焦点都会触发FocusEvent事件。
创建监视器的类必须要实现FocusListener接口,该接口有两个方法:
publicvoidfocusGained(finalFocusEvente)//获得焦点触发
publicvoidfocusLost(finalFocusEvente)//失去焦点触发
当组件从无输入焦点变成有输入焦点并触发FocusEvent事件时,监视器调用类实现的接口方法focusGained(FocusEvente);当组件从有输入焦点变成无输入焦点并触发FocusEvent事件时,监视器调用类实现方法focusLost(FocusEvente)。
classPersonextendsButtonimplementsFocusListener
{
intnumber;
Colorc=newColor(255,245,170);//设置颜色
//preson方法
publicPerson(finalintnumber,finalStrings){
super(s);
setBackground(c);//背景色
this.number=number;
c=getBackground();
addFocusListener(this);//事件焦点监听
}
publicvoidfocusGained(finalFocusEvente)//获得焦点触发
{
setBackground(Color.red);//获得焦点的颜色
}
publicvoidfocusLost(finalFocusEvente)//失去焦点触发
{
setBackground(c);
}
}
(3)Hua_Rong_Road类
游戏界面主要包括十个人物按钮马、曹操、关羽等。
对于人物按钮,在该类中定义按钮的一些新的属性和焦点事件监听器,如:
按钮的标签名、按钮的颜色、按钮的排号(如这里有十个人物按钮,从1排到十,在程序中可以依靠这个属性区分人物按钮)、按钮颜色、按钮获得或失去焦点事件。
同时在设计该界面时要考虑到各个按钮的位置、大小等情况。
classHua_Rong_RoadextendsFrameimplementsMouseListener,KeyListener,ActionListener
{
Personperson[]=newPerson[10];
Buttonleft,right,above,below;
Buttonrestart=newButton("重新开始");//添加重新开始按钮
Hua_Rong_Road()方法设置容器
publicHua_Rong_Road()
{
init();//设置按钮
setBounds(100,100,320,360);//组件在容器上的起点和长宽
setVisible(true);//像控件中添加元素
validate();//刷新
addWindowListener(newWindowAdapter()//注册窗口事件监听
{publicvoidwindowClosing(WindowEvente)//关闭
{
System.exit(0);
}});
}
init()方法设置10个按钮
publicvoidinit()
{
setLayout(null);//设置布局默认
add(restart);//添加重新开始
restart.setBounds(100,320,120,25);//按钮大小
restart.addActionListener(this);//注册监听
Stringname[]={"曹操","关羽","张飞","刘备","赵云","黄忠","兵","兵","兵","兵"};
for(intk=0;k { person[k]=newPerson(k,name[k]);//为每个按钮加上名字 person[k].addMouseListener(this);//每个按钮都注册鼠标事件监听 /*鼠标事件的类型是MouseEvent,即组件触发鼠标时,MouseEvent类自动创建一个事件对象。 Java分别使用MouseListener接口来处理鼠标事件。 MouseListener接口可以处理5种鼠标事件: 单击、按下、释放、进入和退出。 */ person[k].addKeyListener(this);//注册键盘事件监听 /*当按下、释放或敲击键盘上一个键时就发生了键盘事件,如: 当一个组件处于激活状态时(获得焦点),敲击键盘上一个键就导致了这个组件发生了键盘事件。 事件源使用addKeyListener方法获得监视器。 */ /*KeyEvent类的publicintgetKeycode()方法和publicchargetKeychar()判断哪个键被按下、敲击或释放。 */ add(person[k]);//加上人物按钮 } //为每一个人物按钮设置位置和大小 person[0].setBounds(104,54,100,100); person[1].setBounds(104,154,100,50); person[2].setBounds(54,154,50,100); person[3].setBounds(204,154,50,100); person[4].setBounds(54,54,50,100); person[5].setBounds(204,54,50,100); person[6].setBounds(54,254,50,50); person[7].setBounds(204,254,50,50); person[8].setBounds(104,204,50,50); person[9].setBounds(154,204,50,50); person[9].requestFocus();//把焦点先设置在这个按钮上 /* 其次来画出游戏界面的边框,用定义的left,right,above,below,来控制大小*/ left=newButton(); right=newButton(); above=newButton(); below=newButton(); add(left); add(right); add(above); add(below); left.setBounds(49,49,5,260); right.setBounds(254,49,5,260); above.setBounds(49,49,210,5); below.setBounds(49,304,210,5); validate();//刷新 } 经过以上操作就完成了界面的布局得到的界面如图一所示: 图一: 界面布局 接下来就要为各个按钮注册事件监听: 鼠标事件和键盘事件 键盘事件: KeyEvent为键盘事件的类型,KeyListener是事件监视器实现的接口,其中有三种相应事件: 按键、释放键、按下和释放的组合事件。 PublicvoidKeyPressed(KeyEvente) PublicvoidKeyTyped(KeyEvente) PublicvoidKeyReleased(KeyEvente) 如下: publicvoidkeyTyped(KeyEvente){} publicvoidKeyReleased(KeyEvente){} 因为要实现人机交互的效果,所以要响应键盘事件,这一操作是在函数publicvoidkeyPressed(KeyEvente)中完成的: 首先通过语句Personman=(Person)e.getSource()获取事件源,然后通过语句if(e.getKeyCode()==KeyEvent.VK_DOWN)响应用户按向下光标的操作,通过语句if(e.getKeyCode()==KeyEvent.VK_LEFT)响应用户按向左光标的操作,通过语句if(e.getKeyCode()==KeyEvent.VK_RIGHT)响应用户按向右光标的操作,通过语句if(e.getKeyCode()==KeyEvent.VK_UP)响应用户按向上光标的操作。 */ publicvoidKeyPressed(KeyEvente) { Personman=(Person)e.getSource();//返回事件源 /*用KeyEvent类的getKeycode()方法和getKeychar()判断哪个键被按下、敲击或释放。 */ if(e.getKeyCode()==KeyEvent.VK_DOWN) { go(man,below); } if(e.getKeyCode()==KeyEvent.VK_UP) { go(man,above); } if(e.getKeyCode()==KeyEvent.VK_LEFT) { go(man,left); } if(e.getKeyCode()==KeyEvent.VK_RIGHT) { go(man,right); } } 鼠标事件: publicvoidmouseReleased(MouseEvente){} publicvoidmouseEntered(MouseEvente){} publicvoidmouseExited(MouseEvente){} publicvoidmouseClicked(MouseEvente){} //响应鼠标事件,通过鼠标点击的位置判断是像那个方向移动 publicvoidmousePressed(MouseEvente) { Personman=(Person)e.getSource(); intx=-1,y=-1; x=e.getX(); y=e.getY(); intw=man.getBounds().width; inth=man.getBounds().height; if(y>h/2) { go(man,below); } if(y { go(man,above); } if(x { go(man,left); } if(x>w/2) { go(man,right); } } 用go方法控制人物按钮上下左右移动: 当前人物向右与其他人物不重叠,则向右前进五十单元。 publicvoidgo(Personman,Buttondirection) { booleanmove=true; RectanglemanRect=man.getBounds(); intx=man.getBounds().x; inty=man.getBounds().y; if(direction==below)//向各个方向上的移动 y=y+50; elseif(direction==above) y=y-50; elseif(direction==left) x=x-50; elseif(direction==right) x=x+50; manRect.setLocation(x,y); RectangledirectionRect=direction.getBounds(); for(intk=0;k<10;k++) { RectanglepersonRect=person[k].getBounds(); if((manRect.intersects(personRect))&&(man.number! =k)) //如果覆盖就不移动 { move=false; } } if(manRect.intersects(directionRect)) { move=false; } if(move==true) //移动到新的位置 { man.setLocation(x,y); } } 发生操作时调用: publicvoidactionPerformed(ActionEvente){ dispose(); newHua_Rong_Road(); } 2.流程图如图二: 图二: 流程图 五、运行调试与分析讨论 运行结果 1.运行小程序如图3所示: 图三 2.点击按钮使按钮获得焦点如图四所示: 图四 3.用鼠标或者键盘移动人物按钮如图五: 图五 4.点击重新开始按钮后如图六所示: 图六 6、设计体会与小结 通过本程序,我练习使用布局管理器设计了一个华容道游戏界面,并且练习使用事件监听器监听焦点的得失,首先增加焦点事件监视器: addFocusListener(事件监听器),当组件具有焦点监视器后,如果组件从无输入焦点变成有输入焦点或从有输入焦点到无输入焦点都会触发FocusEvent事件。 创建监视器的类必须要实现FocusListener接口,该接口有两个方法: publicvoidfocusGained(FocusEvente)//获得焦点触发 publicvoidfocusLost(FocusEvente)//失去焦点触发 练习了通过鼠标事件实现按钮的移动,鼠标事件的类型是MouseEvent,即组件触发鼠标时,MouseEvent类自动创建一个事件对象。 Java分别使用MouseListener接口与MouseMotionListener接口来处理鼠标事件。 MouseListener接口可以处理5种鼠标事件: 单击、按下、释放、进入和退出。 MouseMotionListener接口可以处理2种鼠标事件: 拖动、移动。 练习了通过键盘事件实现按钮的移动,当按下、释放或敲击键盘上一个键时就发生了键盘事件,当一个组件处于激活状态时(获得焦点),敲击键盘上一个键就导致了这个组件发生了键盘事件。 事件源使用addKeyListener方法获得监视器。 KeyEvent为键盘事件的类型,KeyListener是事件监视器实现的接口,其中有三种相应事件: 按键、释放键、按下和释放的组合事件。 PublicvoidKeyPressed(KeyEvente) PublicvoidKeyTyped(KeyEvente) PublicvoidKeyReleased(KeyEvente) 用KeyEvent类的publicintgetKeycode()方法和publicchargetKeychar()判断哪个键被按下、敲击或释放。 七、参考文献 [1]作者: 丁振凡.参考书籍名称[M]: 《java语言实用教程》.出版地: 北京邮电大学出版社.出版年限: 2007. [2]作者: 耿祥义.参考书籍名称[M]: 《Java基础教程》.出版地: 清华大学出版社.出版年限: 2009. 附录(源码清单) importjava.awt.*; import; publicclassMoveExample { publicstaticvoidmain(Stringargs[]) { newHua_Rong_Road(); } } classPersonextendsButtonimplementsFocusListener { intnumber; Colorc=newColor(255,245,170); Person(intnumber,Strings) { super(s); setBackground(c); this.number=number; c=getBackground(); addFocusListener(this); } publicvoidfocusGained(FocusEvente) { setBackground(Color.red); } publicvoidfocusLost(FocusEvente) { setBackground(c); } } classHua_Rong_Roadextends
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- JAVA 实现 华容道 智力 游戏 源码
![提示](https://static.bdocx.com/images/bang_tan.gif)