课程设计报告--数独小游戏的开发.doc_第1页
课程设计报告--数独小游戏的开发.doc_第2页
课程设计报告--数独小游戏的开发.doc_第3页
课程设计报告--数独小游戏的开发.doc_第4页
课程设计报告--数独小游戏的开发.doc_第5页
已阅读5页,还剩26页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

淮 海 工 学 院 计算机工程学院课程设计报告设计名称: 面向对象课程设计 选题名称: 数独小游戏的开发 姓 名: 学 号: 专业班级: 计算机科学与技术 系 (院): 计算机工程学院 设计时间: 2013.6.172013.6.30 设计地点: 计算机楼204机房 宿舍 教室 成绩:指导教师评语: 签名: 年 月 日面向对象课程设计报告 第 31 页,共 31 页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平台的设计与实现,使读者了解此类游戏的开发过程,掌握实用的开发技巧,学会此类游戏的开发。系统功能:数独游戏的规则很简单,只需在空格处填入19的数字,并保证每个数字在每个九宫格内只能出现一次,且每个数字在每一行、每一列也只能出现一次,而一般的游戏过成功是系统随机生成一个棋局,然后玩家需在空白处填上相应的数字使其满足游戏规则。开局/重新开始:设置提示数字位置等游戏风云榜:游戏玩家水平高低程度退出:退出游戏帮助:提供帮助菜单使用户更加熟悉软件功能版本信息:提供版本信息等。二 概要设计 数独游戏的设计有4大模块构成:分别是Miansd.Java、fyb.java、help.java、win.java。其中win.java由:pan1,pan2,timeer三个模块组成。Win是用户界面,是具有很强的交互性的特点,其中timmer.java:是对主窗口界面的设计。产生9*9的九宫格以及对数独游戏的核心算法。Help是用户帮助文档,帮助用户去熟练的使用本软件。Fyb是游戏风云榜。提供使用此软件用户的最佳成绩得主。Miansd是主调用函数。是本软件的main方法所在的类。三 详细设计图一:uml图/* 游戏初始化*/ 构造数独游戏主界面 public void gameInit() this.setSize(500, 400); this.setLayout(new GridLayout(3, 3); for (int i = 0; i 9; i+) pnlGamei = new JPanel(); pnlGamei.setBorder(BorderFactory.createLineBorder(Color.black); pnlGamei.setLayout(new GridLayout(3, 3); this.add(pnlGamei); for (int z = 0; z 9; z+) for (int x = 0; x 3; x+) for (int y = 0; y 3; y+) txtGamezxy = new JTextField(); txtGamezxy.setBorder(BorderFactory .createEtchedBorder(); txtGamezxy .setFont(new Font(Dialog, Font.ITALIC, 20);/ 设置字体大小 txtGamezxy.setHorizontalAlignment(JTextField.CENTER);/ 设置字体居中 pnlGamez.add(txtGamezxy); this.init();/ 九宫格数据初始化,生成完整正确的九宫格 int i; i=(int)(Math.random()*2); this.setGameLevel(i);/ 根据完整的九宫格生成不同难度的数独游戏 for (int z = 0; z 9; z+) / 9宫格的行 for (int x = 0; x 3; x+) / 9宫格的列 for (int y = 0; y 3; y+) if (gridszxy.getValue() != 10) txtGamezxy.setText(gridszxy.getValue() + ); txtGamezxy.setEditable(false); else txtGamezxy.getDocument().addDocumentListener(this); this.setVisible(true); /*生成完整的正确填完的九宫格*/ void init() int value = 0; int backlocation; int i = 0, j = 0; int tag_rollback = NO, tag_validValues_exist;/ 是否回滚到上一个单元格的标记,单元格的可取值是否已过滤过,可取值是否存在 back: for (int z = 0; z 9; z+) / 9宫格的行 for (int x = i; x 3; x+) / 9宫格的列 for (int y = j; y 3; y+) if (tag_rollback = 1) i = 0; j = 0; tag_rollback = NO;/ 回滚了一次之后,回归正常状态继续遍历 if (null = gridszxy) gridszxy = new Grid(z, x, y); tag_validValues_exist = NO;/ 表示单元格的值是刚初始化的,需要过滤 else tag_validValues_exist = YES;/ 表示单元格的值是过滤过的 value = getValidValue(gridszxy, tag_validValues_exist); if (value = NEED_ROLLBACK) backlocation = backlocation(z, x, y); reset(gridszxy);/ 将该单元格重置 z = backlocation0 - 1;/ 这里z-2是因为跳到back之后,z会直接自增一次,所以减去2个才能跳转成上一个单元格 i = backlocation1; j = backlocation2; tag_rollback = YES;/ 从i,j,k指定的位置开始再次遍历 continue back;/ 重新开始前一个单元格的遍历 else gridszxy.setValue(value); / 游戏难度分级 0-2 分别为:初级、中级、疯狂模式/使用随机数种子产0-2的随机数用以控制游戏难度 void setGameLevel(int level) int blank_max, blank_min;/ blank代表每个单元格最多和最少空几个让玩家填, switch (level) case 0: blank_max = 4; blank_min = 2; blankInit(blank_max, blank_min); break; case 1: blank_max = 6; blank_min = 4; blankInit(blank_max, blank_min); break; case 2: blank_max = 8; blank_min = 6; blankInit(blank_max, blank_min); break; /产生游戏界面空白单元格 void blankInit(int blank_max, int blank_min) Random rd = new Random(); List list = new ArrayList(); int count, index;/ count代表实际的空白数,index代表空白的单元格位置 for (int z = 0; z 9; z+) count = 0; while (count blank_min) / 每个小9宫格随机出现最大和最小空白之间的空白个数 count = rd.nextInt(blank_max + 1); for (int i = 1; i = count; i+) index = rd.nextInt(9); if (list.contains(index) / 如果空白选项里已经含有当前位置就重新取 i-; else / 如果空白选项里已经没有含有当前位置就添加 list.add(index); for (int j : list) gridszj / 3j % 3.setValue(10);/ 根据j让一个小9宫格里面的9个格子随机空白 / 10就代表这个格子空白 list.clear(); 以及一些其他的算法不在一一列举。4课程设计成果(1)核心代码timer.javaimport java.awt.*;import java.util.*;import javax.swing.*;import javax.swing.event.DocumentEvent;import javax.swing.event.DocumentListener;import javax.swing.text.BadLocationException;import javax.swing.text.Document;class timeer extends JPanel implements DocumentListener private static final long serialVersionUID = 1L; private JPanel pnlGame; private JTextField txtGame; private Map warnFiledMap = new HashMap(); private Document doc; private static final int YES = 1;/ 单元格可取值存在 ; 已回滚;已冲突 private static final int NO = 0;/ 单元格可取值不存在 ;未回滚;未冲突 private static final int NEED_ROLLBACK = 10;/ 需要回滚 private int is_num = YES; /输入的是不是数字标记 private int is_remove_by_insert = NO;/remove是不是在已有值的前提下insert一个新值导致的 private Grid grids = new Grid933; public timeer() pnlGame = new JPanel9; txtGame = new JTextField933; gameInit(); /* 游戏初始化*/ public void gameInit() this.setSize(500, 400); this.setLayout(new GridLayout(3, 3); for (int i = 0; i 9; i+) pnlGamei = new JPanel(); pnlGamei.setBorder(BorderFactory.createLineBorder(Color.black); pnlGamei.setLayout(new GridLayout(3, 3); this.add(pnlGamei); for (int z = 0; z 9; z+) for (int x = 0; x 3; x+) for (int y = 0; y 3; y+) txtGamezxy = new JTextField(); txtGamezxy.setBorder(BorderFactory .createEtchedBorder(); txtGamezxy .setFont(new Font(Dialog, Font.ITALIC, 20);/ 设置字体大小 txtGamezxy.setHorizontalAlignment(JTextField.CENTER);/ 设置字体居中 pnlGamez.add(txtGamezxy); this.init();/ 九宫格数据初始化,生成完整正确的九宫格 int i; i=(int)(Math.random()*2); this.setGameLevel(i);/ 根据完整的九宫格生成不同难度的数独游戏 for (int z = 0; z 9; z+) / 9宫格的行 for (int x = 0; x 3; x+) / 9宫格的列 for (int y = 0; y 3; y+) if (gridszxy.getValue() != 10) txtGamezxy.setText(gridszxy.getValue() + ); txtGamezxy.setEditable(false); else txtGamezxy.getDocument().addDocumentListener(this); this.setVisible(true); /* 生成完整的正确填完的九宫格*/ void init() int value = 0; int backlocation; int i = 0, j = 0; int tag_rollback = NO, tag_validValues_exist;/ 是否回滚到上一个单元格的标记,单元格的可取值是否已过滤过,可取值是否存在 back: for (int z = 0; z 9; z+) / 9宫格的行 for (int x = i; x 3; x+) / 9宫格的列 for (int y = j; y 3; y+) if (tag_rollback = 1) i = 0; j = 0; tag_rollback = NO;/ 回滚了一次之后,回归正常状态继续遍历 if (null = gridszxy) gridszxy = new Grid(z, x, y); tag_validValues_exist = NO;/ 表示单元格的值是刚初始化的,需要过滤 else tag_validValues_exist = YES;/ 表示单元格的值是过滤过的 value = getValidValue(gridszxy, tag_validValues_exist); if (value = NEED_ROLLBACK) backlocation = backlocation(z, x, y); reset(gridszxy);/ 将该单元格重置 z = backlocation0 - 1;/ 这里z-2是因为跳到back之后,z会直接自增一次,所以减去2个才能跳转成上一个单元格 i = backlocation1; j = backlocation2; tag_rollback = YES;/ 从i,j,k指定的位置开始再次遍历 continue back;/ 重新开始前一个单元格的遍历 else gridszxy.setValue(value); / 游戏难度分级 0-2 分别为:初级、中级、疯狂模式 void setGameLevel(int level) int blank_max, blank_min;/ blank代表每个单元格最多和最少空几个让玩家填, switch (level) case 0: blank_max = 4; blank_min = 2; blankInit(blank_max, blank_min); break; case 1: blank_max = 6; blank_min = 4; blankInit(blank_max, blank_min); break; case 2: blank_max = 8; blank_min = 6; blankInit(blank_max, blank_min); break; void blankInit(int blank_max, int blank_min) Random rd = new Random(); List list = new ArrayList(); int count, index;/ count代表实际的空白数,index代表空白的单元格位置 for (int z = 0; z 9; z+) count = 0; while (count blank_min) / 每个小9宫格随机出现最大和最小空白之间的空白个数 count = rd.nextInt(blank_max + 1); for (int i = 1; i = count; i+) index = rd.nextInt(9); if (list.contains(index) / 如果空白选项里已经含有当前位置就重新取 i-; else / 如果空白选项里已经没有含有当前位置就添加 list.add(index); for (int j : list) gridszj / 3j % 3.setValue(10);/ 根据j让一个小9宫格里面的9个格子随机空白 / 10就代表这个格子空白 list.clear(); /*每个单元格的类 坐标 取值 可取值队 */ class Grid private int x;/ 对应每个小单元格的横坐标 private int y;/ 对应每个小单元格的纵坐标 private int z;/ 对应每个小9宫格 private int value;/ 最终取得值 private List validValues;/ 可以取的值 public Grid(int z, int x, int y) this.x = x; this.y = y; this.z = z; if (validValues = null) validValues = new ArrayList(); for (int i = 1; i 10; i+) validValues.add(i); public int getX() return x; public void setX(int x) this.x = x; public int getY() return y; public void setY(int y) this.y = y; public int getZ() return z; public void setZ(int z) this.z = z; public List getValidValues() return validValues; public void setValidValues(List validValues) this.validValues = validValues; public int getValue() return value; public void setValue(int value) this.value = value; / 当某单元格没有可取值时,回到上一个单元格 int backlocation(int z, int x, int y) int location = new int3;/ 存贮上一个单元格的位置信息 z x y switch (x + y) / 根据当前单元格的坐标和找到上一个元素的坐标 case 0: location0 = z - 1; location1 = 2; location2 = 2; break; case 1: if (x y) location0 = z; location1 = 0; location2 = 0; break; else location0 = z; location1 = 0; location2 = 2; break; case 2: if (x y) location0 = z; location1 = 1; location2 = 2; break; else location0 = z; location1 = 1; location2 = 0; break; case 3: if (x = 6) zy_index = grid.getZ() - 6; / 对应6 7 8 y轴方向起点为0 1 2 else if (grid.getZ() = 3) zy_index = grid.getZ() - 3; / 对应3 4 5 y轴方向起点为0 1 2 else zy_index = grid.getZ(); / 对应0 1 2 y轴方向起点为0 1 2 for (; zx_index grid.getZ(); zx_index+) / 去除同一行已存在的数据 for (int y = 0; y 3; y+) existValue = gridszx_indexgrid.getX()y.getValue();/ 获取该单元格之前同一行的不同列的值 grid_validValues_isExist = removeExistValue(grid, existValue); if (grid_validValues_isExist = NO) return NEED_ROLLBACK; / 去除同一列已存在的数据 for (; zy_index grid.getZ(); zy_index += 3) for (int x = 0; x 3; x+) existValue = gridszy_indexxgrid.getY().getValue();/ 获取该单元格之前同一列的不同列

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论