最新版课程设计报告74971889.docx
《最新版课程设计报告74971889.docx》由会员分享,可在线阅读,更多相关《最新版课程设计报告74971889.docx(38页珍藏版)》请在冰豆网上搜索。
最新版课程设计报告74971889
淮海工学院计算机工程学院
课程设计报告
设计名称:
面向对象课程设计
选题名称:
数独小游戏的开发
姓名:
学号:
专业班级:
计算机科学与技术
系(院):
计算机工程学院
设计时间:
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();
Listlist=newArrayList();
intcount,index;//count代表实际的空白数,index代表空白的单元格位置
for(intz=0;z<9;z++){
count=0;
while(countcount=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;
privateMapwarnFiledMap=newHashMap();
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();
Listlist=newArrayList();
intcount,index;//count代表实际的空白数,index代表空白的单元格位置
for(intz=0;z<9;z++){
count=0;
while(countcount=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;//最终取得值
privateListvalidValues;//可以取的值
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;
}
publicListgetValidValues(){
returnvalidValues;
}
publicvoidsetValidValues(ListvalidValues){
this.validValues=validValues;
}
publicintgetValue(){
returnvalue;
}
publicvoidsetValue(intvalue){
this.value=value;
}
}
//当某单元格没有可取值时,回到上一个单元格
int[]backlocation(i