课程设计报告74971889.docx

上传人:b****5 文档编号:29479167 上传时间:2023-07-23 格式:DOCX 页数:38 大小:132.11KB
下载 相关 举报
课程设计报告74971889.docx_第1页
第1页 / 共38页
课程设计报告74971889.docx_第2页
第2页 / 共38页
课程设计报告74971889.docx_第3页
第3页 / 共38页
课程设计报告74971889.docx_第4页
第4页 / 共38页
课程设计报告74971889.docx_第5页
第5页 / 共38页
点击查看更多>>
下载资源
资源描述

课程设计报告74971889.docx

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

课程设计报告74971889.docx

课程设计报告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();

Listlist=newArrayList();

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;

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(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;//最终取得值

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;

}

}

//当某单元格没有可取值时,回到上一个单

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

当前位置:首页 > 成人教育 > 电大

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

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