课程设计报告74971889.docx
- 文档编号:29479167
- 上传时间:2023-07-23
- 格式:DOCX
- 页数:38
- 大小:132.11KB
课程设计报告74971889.docx
《课程设计报告74971889.docx》由会员分享,可在线阅读,更多相关《课程设计报告74971889.docx(38页珍藏版)》请在冰豆网上搜索。
课程设计报告74971889
(此文档为word格式,下载后您可任意编辑修改!
)
淮海工学院计算机工程学院
课程设计报告
设计名称:
面向对象课程设计
选题名称:
数独小游戏的开发
姓名:
学号:
专业班级:
计算机科学与技术
系(院):
计算机工程学院
设计时间:
2013.6.17~2013.6.30
设计地点:
计算机楼204机房宿舍教室
指导教师评语:
签名:
年月日
1.课程设计目的
《面向对象程序设计》是一门实践性很强的计算机专业基础课程,课程设计是学习完该课程后进行的一次较全面的综合练习。
其目的在于通过实践加深学生对面向对象程序设计的理论、方法和基础知识的理解,掌握使用Java语言进行面向对象设计的基本方法,提高运用面向对象知识分析实际问题、解决实际问题的能力。
2.课程设计任务与要求:
【设计要求】
课程设计可选用NetBeans、Eclipse、JBuilder等作为开发平台以提高开发效率,尽可能熟练掌握其中一种集成开发环境。
建议采用UML建模技术进行系统的分析设计,在Visio中画出系统用例图和类图,并将UML图复制到设计报告中。
通过这次设计,要求掌握以下内容:
1)面向对象技术中的继承与多态(重载和覆盖)机制、各种修饰符的使用
2)类、包、接口的定义与使用
3)常用工具类与算法的实现(数组、向量、字符串、链表)
4)Java常用标准GUI组件及其事件处理
5)Java的异常处理机制
6)Java的数据库连接技术
7)Java的多线程技术与动画制作
8)Java的网络编程
3.课程设计说明书
一需求分析
数独小游戏开发:
益智类游戏是一种比较流行的游戏,其画面都比较简单,很少有复杂的游戏特效,但是通常用到人工智能的算法来控制游戏的难度。
而算法的优化是开发该类游戏的难点。
这类游戏游戏主要包括棋牌类游戏和智力测试类游戏,例如麻将,扫雷、五子棋、扑克牌等。
数独就是益智游戏的一种,玩法简单单数字的排列方式千变万化,很多人认为数独是练头脑的绝佳方式。
本章通过讲解数独游戏在java平台的设计与实现,使读者了解此类游戏的开发过程,掌握实用的开发技巧,学会此类游戏的开发。
系统功能:
数独游戏的规则很简单,只需在空格处填入1~9的数字,并保证每个数字在每个九宫格内只能出现一次,且每个数字在每一行、每一列也只能出现一次,而一般的游戏过成功是系统随机生成一个棋局,然后玩家需在空白处填上相应的数字使其满足游戏规则。
开局/重新开始:
设置提示数字位置等
游戏风云榜:
游戏玩家水平高低程度
退出:
退出游戏
帮助:
提供帮助菜单使用户更加熟悉软件功能
版本信息:
提供版本信息等。
二概要设计
数独游戏的设计有4大模块构成:
分别是Miansd.Java、fyb.java、help.java、win.java。
其中win.java由:
pan1,pan2,timeer三个模块组成。
Win是用户界面,是具有很强的交互性的特点,其中timmer.java:
是对主窗口界面的设计。
产生9*9的九宫格以及对数独游戏的核心算法。
Help是用户帮助文档,帮助用户去熟练的使用本软件。
Fyb是游戏风云榜。
提供使用此软件用户的最佳成绩得主。
Miansd是主调用函数。
是本软件的main方法所在的类。
三详细设计
图一:
uml图
/*游戏初始化*/构造数独游戏主界面
publicvoidgameInit(){
this.setSize(500,400);
this.setLayout(newGridLayout(3,3));
for(inti=0;i<9;i++){
pnlGame[i]=newJPanel();
pnlGame[i].setBorder(BorderFactory.createLineBorder(Color.black));
pnlGame[i].setLayout(newGridLayout(3,3));
this.add(pnlGame[i]);
}
for(intz=0;z<9;z++){
for(intx=0;x<3;x++){
for(inty=0;y<3;y++){
txtGame[z][x][y]=newJTextField();
txtGame[z][x][y].setBorder(BorderFactory
.createEtchedBorder());
txtGame[z][x][y]
.setFont(newFont("Dialog",Font.ITALIC,20));//设置字体大小
txtGame[z][x][y].setHorizontalAlignment(JTextField.CENTER);//设置字体居中
pnlGame[z].add(txtGame[z][x][y]);
}
}
}
this.init();//九宫格数据初始化,生成完整正确的九宫格
inti;
i=(int)(Math.random()*2);
this.setGameLevel(i);//根据完整的九宫格生成不同难度的数独游戏
for(intz=0;z<9;z++){//9宫格的行
for(intx=0;x<3;x++){//9宫格的列
for(inty=0;y<3;y++){
if(grids[z][x][y].getValue()!
=10){
txtGame[z][x][y].setText(grids[z][x][y].getValue()+"");
txtGame[z][x][y].setEditable(false);
}else{
txtGame[z][x][y].getDocument().addDocumentListener(this);
}
}
}
}
this.setVisible(true);
}
/*生成完整的正确填完的九宫格*/
voidinit(){
intvalue=0;
int[]backlocation;
inti=0,j=0;
inttag_rollback=NO,tag_validValues_exist;//是否回滚到上一个单元格的标记,单元格的可取值是否已过滤过,可取值是否存在
back:
for(intz=0;z<9;z++){//9宫格的行
for(intx=i;x<3;x++){//9宫格的列
for(inty=j;y<3;y++){
if(tag_rollback==1){
i=0;
j=0;
tag_rollback=NO;//回滚了一次之后,回归正常状态继续遍历
}
if(null==grids[z][x][y]){
grids[z][x][y]=newGrid(z,x,y);
tag_validValues_exist=NO;//表示单元格的值是刚初始化的,需要过滤
}else{
tag_validValues_exist=YES;//表示单元格的值是过滤过的
}
value=getValidValue(grids[z][x][y],tag_validValues_exist);
if(value==NEED_ROLLBACK){
backlocation=backlocation(z,x,y);
reset(grids[z][x][y]);//将该单元格重置
z=backlocation[0]-1;//这里z-2是因为跳到back之后,z会直接自增一次,所以减去2个才能跳转成上一个单元格
i=backlocation[1];
j=backlocation[2];
tag_rollback=YES;//从i,j,k指定的位置开始再次遍历
continueback;//重新开始前一个单元格的遍历
}else{
grids[z][x][y].setValue(value);
}
}
}
}
}
//游戏难度分级0-2分别为:
初级、中级、疯狂模式
//使用随机数种子产0-2的随机数用以控制游戏难度
voidsetGameLevel(intlevel){
intblank_max,blank_min;//blank代表每个单元格最多和最少空几个让玩家填,
switch(level){
case0:
blank_max=4;
blank_min=2;
blankInit(blank_max,blank_min);
break;
case1:
blank_max=6;
blank_min=4;
blankInit(blank_max,blank_min);
break;
case2:
blank_max=8;
blank_min=6;
blankInit(blank_max,blank_min);
break;
}
}
//产生游戏界面空白单元格
voidblankInit(intblank_max,intblank_min){
Randomrd=newRandom();
List
intcount,index;//count代表实际的空白数,index代表空白的单元格位置
for(intz=0;z<9;z++){
count=0;
while(count count=rd.nextInt(blank_max+1); } for(inti=1;i<=count;i++){ index=rd.nextInt(9); if(list.contains(index)){//如果空白选项里已经含有当前位置就重新取 i--; }else{//如果空白选项里已经没有含有当前位置就添加 list.add(index); } } for(intj: list){ grids[z][j/3][j%3].setValue(10);//根据j让一个小9宫格里面的9个格子随机空白//10就代表这个格子空白 } list.clear(); } } 以及一些其他的算法不在一一列举。 4.课程设计成果 (1)核心代码 timer.java importjava.awt.*; importjava.util.*; importjavax.swing.*; importjavax.swing.event.DocumentEvent; importjavax.swing.event.DocumentListener; importjavax.swing.text.BadLocationException; importjavax.swing.text.Document; classtimeerextendsJPanelimplementsDocumentListener{ privatestaticfinallongserialVersionUID=1L; privateJPanel[]pnlGame; privateJTextField[][][]txtGame; privateMap privateDocumentdoc; privatestaticfinalintYES=1;//单元格可取值存在;已回滚;已冲突 privatestaticfinalintNO=0;//单元格可取值不存在;未回滚;未冲突 privatestaticfinalintNEED_ROLLBACK=10;//需要回滚 privateintis_num=YES;//输入的是不是数字标记 privateintis_remove_by_insert=NO;//remove是不是在已有值的前提下insert一个新值导致的 privateGrid[][][]grids=newGrid[9][3][3]; publictimeer(){ pnlGame=newJPanel[9]; txtGame=newJTextField[9][3][3]; gameInit(); } /*游戏初始化*/ publicvoidgameInit(){ this.setSize(500,400); this.setLayout(newGridLayout(3,3)); for(inti=0;i<9;i++){ pnlGame[i]=newJPanel(); pnlGame[i].setBorder(BorderFactory.createLineBorder(Color.black)); pnlGame[i].setLayout(newGridLayout(3,3)); this.add(pnlGame[i]); } for(intz=0;z<9;z++){ for(intx=0;x<3;x++){ for(inty=0;y<3;y++){ txtGame[z][x][y]=newJTextField(); txtGame[z][x][y].setBorder(BorderFactory .createEtchedBorder()); txtGame[z][x][y] .setFont(newFont("Dialog",Font.ITALIC,20));//设置字体大小 txtGame[z][x][y].setHorizontalAlignment(JTextField.CENTER);//设置字体居中 pnlGame[z].add(txtGame[z][x][y]); } } } this.init();//九宫格数据初始化,生成完整正确的九宫格 inti; i=(int)(Math.random()*2); this.setGameLevel(i);//根据完整的九宫格生成不同难度的数独游戏 for(intz=0;z<9;z++){//9宫格的行 for(intx=0;x<3;x++){//9宫格的列 for(inty=0;y<3;y++){ if(grids[z][x][y].getValue()! =10){ txtGame[z][x][y].setText(grids[z][x][y].getValue()+""); txtGame[z][x][y].setEditable(false); }else{ txtGame[z][x][y].getDocument().addDocumentListener(this); } } } } this.setVisible(true); } /*生成完整的正确填完的九宫格*/ voidinit(){ intvalue=0; int[]backlocation; inti=0,j=0; inttag_rollback=NO,tag_validValues_exist;//是否回滚到上一个单元格的标记,单元格的可取值是否已过滤过,可取值是否存在 back: for(intz=0;z<9;z++){//9宫格的行 for(intx=i;x<3;x++){//9宫格的列 for(inty=j;y<3;y++){ if(tag_rollback==1){ i=0; j=0; tag_rollback=NO;//回滚了一次之后,回归正常状态继续遍历 } if(null==grids[z][x][y]){ grids[z][x][y]=newGrid(z,x,y); tag_validValues_exist=NO;//表示单元格的值是刚初始化的,需要过滤 }else{ tag_validValues_exist=YES;//表示单元格的值是过滤过的 } value=getValidValue(grids[z][x][y],tag_validValues_exist); if(value==NEED_ROLLBACK){ backlocation=backlocation(z,x,y); reset(grids[z][x][y]);//将该单元格重置 z=backlocation[0]-1;//这里z-2是因为跳到back之后,z会直接自增一次,所以减去2个才能跳转成上一个单元格 i=backlocation[1]; j=backlocation[2]; tag_rollback=YES;//从i,j,k指定的位置开始再次遍历 continueback;//重新开始前一个单元格的遍历 }else{ grids[z][x][y].setValue(value); } } } } } //游戏难度分级0-2分别为: 初级、中级、疯狂模式 voidsetGameLevel(intlevel){ intblank_max,blank_min;//blank代表每个单元格最多和最少空几个让玩家填, switch(level){ case0: blank_max=4; blank_min=2; blankInit(blank_max,blank_min); break; case1: blank_max=6; blank_min=4; blankInit(blank_max,blank_min); break; case2: blank_max=8; blank_min=6; blankInit(blank_max,blank_min); break; } } voidblankInit(intblank_max,intblank_min){ Randomrd=newRandom(); List intcount,index;//count代表实际的空白数,index代表空白的单元格位置 for(intz=0;z<9;z++){ count=0; while(count count=rd.nextInt(blank_max+1); } for(inti=1;i<=count;i++){ index=rd.nextInt(9); if(list.contains(index)){//如果空白选项里已经含有当前位置就重新取 i--; }else{//如果空白选项里已经没有含有当前位置就添加 list.add(index); } } for(intj: list){ grids[z][j/3][j%3].setValue(10);//根据j让一个小9宫格里面的9个格子随机空白//10就代表这个格子空白 } list.clear(); } } /*每个单元格的类坐标取值可取值队*/ classGrid{ privateintx;//对应每个小单元格的横坐标 privateinty;//对应每个小单元格的纵坐标 privateintz;//对应每个小9宫格 privateintvalue;//最终取得值 privateList publicGrid(intz,intx,inty){ this.x=x; this.y=y; this.z=z; if(validValues==null){ validValues=newArrayList for(inti=1;i<10;i++){ validValues.add(i); } } } publicintgetX(){ returnx; } publicvoidsetX(intx){ this.x=x; } publicintgetY(){ returny; } publicvoidsetY(inty){ this.y=y; } publicintgetZ(){ returnz; } publicvoidsetZ(intz){ this.z=z; } publicList returnvalidValues; } publicvoidsetValidValues(List this.validValues=validValues; } publicintgetValue(){ returnvalue; } publicvoidsetValue(intvalue){ this.value=value; } } //当某单元格没有可取值时,回到上一个单
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 课程设计 报告 74971889