程序运行后将n个地雷随机的布置在r×c的二维数组中,产生如下的二维数组:
0
0
0
-1
0
0
-1
0
-1
0
0
-1
0
0
0
-1
-1
0
-1
0
0
-1
0
-1
-1
0
0
0
-1
0
0
-1
0
0
0
-1
如果雷是-1。
则continue,进行下一次循环,重新查找随机数
2,计算每个位置周围的地雷数
以上一模块产生的随机地雷分布的二维数组为数据来源,计算该二维数组中不是地雷的位置周围的8个位置总共有多少个地雷,将这一数字存储在该位置,产生如下二维数组:
1
2
2
-1
2
1
-1
2
-1
4
4
-1
2
3
3
-1
-1
3
-1
2
2
-1
5
-1
-1
3
2
2
-1
3
2
-1
1
1
2
-1
循环访问2为数组,依次拿到2为数组里的数,如果元素为-1,continue,如果元素不是-1,计算该位置周围的8个位置有多少个-1;
左上i-1,j-1
左中i-1.j
左右i-1;j+1
左二1:
i,j-1左二2:
ij左三:
i,j+1
3,输出布雷面板:
我们要编写程序完成布雷面板的控制台输出,为了区分布雷面板中哪些位置是已经被用户排开的,哪些位置是未被排开的,我们对以上二维数组的数据定义作如下约定:
若该位置保存的数字是n,则n满足如下条件:
1)若0<=n<=8,则表示该位置不是地雷,其周围位置的地雷数就是n,且该位置未被用户排开。
2)若10<=n<=18,则表示该位置不是地雷,其周围位置的地雷数就是n%10,且该位置已经被用户排开。
3)若n==-1,则表示该位置是地雷,并且未被用户标记。
4,用户排雷程序模块
完成以上两个模块后,用户可以完成排雷的操作,我们要编写一个程序来支持用户通过控制台来排除地雷,用户可以在控制台输入坐标位置,来表示排除该位置是地雷。
当用户输入坐标位置后,程序需要执行如下操作:
1)若该坐标位置是地雷(值为-1),则,程序结束,用户排雷失败。
2)若该坐标位置存储的数字是大于0小于等于8的整数(该位置不是地雷,该位置周围地雷数等于该数字,该位置未被用户排开),则将该位置排开(并将该位置的数字+10,表示该位置已经排开),然后重新输出一遍布雷面板。
3)若该坐标位置存储的数字是大于等于10小于等于18的整数(该位置不是地雷,该位置已经被排开),则输出错误信息,请用户重新输入。
4)若该坐标位置存储的数字等于0(该位置不是地雷,该位置周围的8个位置也没有地雷,该位置还未被用户排开),则找该位置的周围8个位置,将其排开,排开时递归的执行排雷程序模块的操作。
∙说明:
1,该案例可分为四个子案例单独讲解,或作为课堂练习或课后作业让学员完成。
2,其中前三个模块比较简单,要求大多数学员都能独立完成,最后一个模块比较复杂,需要设计方法的递归调用,有基础的学员可以在教师和项目经理的指导下完成。
3,该案例考察了以下知识点:
数组的操作,复杂流程的控制,方法的递归调用等。
4,该案例难度系数:
架构级
✧案例13:
五子棋游戏v1.0(控制台版本)
∙定义
编写程序实现两人互玩的五子棋游戏,游戏开始时要求在控制台输出以下棋盘,然后提示黑方和白方下子,玩家从命令行输入落子坐标,如:
af,表示在a,f坐标落子,其中黑方的子用@表示,白方的子用O表示,空白位置用*表示,每有一方落子,则要重新输出棋盘的状态,程序还要能判断某一方获胜,并终止游戏。
棋盘初始状态:
0123456789abcdef
0****************
1****************
2****************
3****************
4****************
5****************
6****************
7****************
8****************
9****************
a****************
b****************
c****************
d****************
e****************
f****************
1定义一个字符型的二维数组定义棋盘状态,[16][16],赋初始值,,每个位置*号
输出来
2读取用户输入,根据黑方坐标把数组中3行6列拿出来看一下,如果是黑色的就落下,如果该位置没有*号,就提示用户该位置有棋子
3判断每落下一个棋子,程序有没有获胜,如果没有获胜提示白方落子或黑子罗子
4如果5子排列就获胜
说明
1,该案例主要考察的知识点:
复杂循环的控制,数组的应用,流程控制解决复杂问题。
2,教师可以讲解如何判断某一方获胜的算法。
3,讲师可以将整个程序分模块,将每个模块的方法定义好,由学员来实现。
4,该案例难度系数:
架构级
✧案例14:
类的抽象—栈
∙定义
栈是一种常用的数据结构,其特点是存储数据时“先进后出”。
写一个类用来模拟栈这种数据结构,要求底层使用数组存储数据,并给出相应的进栈和出栈的方法。
还要求定义一个测试类,包含主方法,在主方法中测试栈的定义是否正确(生成栈对象,调用栈的方法)。
∙说明
1,该案例主要考察学员抽象数据类型的能力。
2,教师可以启发学生思考,抽象数据类型时如何抽象属性和方法,如何将属性和方法的定义细化。
3,该案例难度系数:
设计级
✧案例15:
类的抽象—人类
∙定义
写一个类Person,包含以下属性:
Stringname;intage;booleangender;Personpartner。
为Person类写一个marry(Personp)方法,代表当前对象和p结婚,如若可以结婚,则输出恭贺信息,否则输出不能结婚原因。
要求在本类中写一个主方法,来测试以上程序(生成两个Person对象,并调用它们的marry方法)。
下列情况不能结婚:
1,同性;2,未达到结婚年龄,男<22,女<20;3,某一方已婚
∙说明
1,该案例主要考察类的自关联的定义和使用。
2,该案例还可做如下扩展:
将intage的定义改为Calendarbirthday的定义,要求学员使用Calendar操作日期数据。
3,教师可以借助该案例讲解java.util.Calendar和java.util.GregorianCalendar的使用,让学员熟悉日期数据的处理方法。
4,该案例难度系数:
设计级
✧案例16:
酒店前台客房管理程序v2.0(面向对象实现)
∙定义
将以前写的酒店房间管理程序按照面向对象的方式重新设计,抽象出以下类:
酒店类:
属性:
酒店名称;酒店所有房间的数组。
方法:
查询房间状态booleanisEmpty(introomNumber);
入住booleancheckIn(intrid,StringgName),退房booleancheckOut(intrid);
开始运行voidstart();
∙说明:
1,该案例考察学员面向对象的抽象能力。
2,教师可以指导学员搭建好程序的代码框架,让学员完成方法。
3,该案例难度系数:
设计级
✧案例17:
继承关系的设计和实现
∙定义
考虑一个具有各种图形类的图形系统,这些图形包括长方形、正方形、三角形、圆形等。
例如,长方形可以有长、宽、中心点等数据,而正方形和圆形可能只有一个中心点和一个边长或半径。
在一个精心设计的图形系统中,这些类应派生于一个公共的类(即Figure类)。
现要求实现这样一个系统。
Figure类是父类。
定义从Figure类继承的Rectangle和Triangle类。
每个类都有erase和draw方法。
draw方法将该图形在控制台输出出来,而erase方法则擦除这些图形(只需清屏,通过输出空行,或者通过执行更复杂的动作)。
∙说明:
1,该案例主要考察的知识点:
继承关系的定义,方法的覆盖。
2,该案例难度系数:
程序级
✧案例18:
接口的应用—DAO模式
∙定义
我们要开发一套通用的网站用户管理程序,该程序主要包含用户注册和用户登录等基本功能。
用户的注册数据可能会存储在不同的介质中(文件或数据库)。
为了让业务程序访问数据时不需要去关注数据的存储介质,我们需要在程序中抽象一个对数据访问的接口,该接口中给出了业务程序可能对数据访问的所有方法的定义。
然后分别写出该接口的两个实现类,从文件和数据库中访问数据。
以我们现在所学的知识,我们暂时还无法去实现这两个类,但我们可以在相应的方法中输出语句来模拟一个实现。
即便这样,我们还是可以定义一个可以真正实现的类,该类从数据访问用户的注册数据。
定义DAO接口,定义2个类,查询和添加方法然后调用该接口中的类
∙说明:
1,该案例描述接口的意义,和使用接口降低耦合。
2,教师可以带领学员完成该案例,并讲解使用接口给整个程序结构带来的好处。
3,该案例难度系数:
架构级
✧案例19:
字符串的应用—字符串解析
∙定义
Unix机器中用9个字符来表示文件的访问权限,其中前三位表示文件拥有者对文件的权限,中间三位表示同组者对文件的权限,最后三位表示其他人对文件的权限,而每一类不同的角色对文件的权限又分为读(r),写(w)和执行(x)三种权限,如:
“rw-r--r--”则表示拥有者具有读和写的权限,同组者和其他人只有读的权限。
同时,我们也可以对权限种类进行编码,如:
读=4,写=2,执行=1,这样文件的权限也可以用三位八进制数字来表示,例如:
“644”就等价于“rw-r--r--”。
现在要求编写程序将给定的文件权限字符串转换为8进制的编码值,或者将8进制编码值转化为文件权限字符串。
∙说明:
1,该案例考察的知识点:
字符串的操作,进制的转换,Integer和String的转化等。
2,教师可以带领学员完成从字符串到8进制数字的转化程序,要求学员自己完成逆向的转化程序。
3,该案例难度系数:
设计级
✧案例20:
模拟ArrayList的实现—MyArrayList类
∙定义
自己写一个MyArrayList类,实现java.util.ArrayList类的核心功能,要求底层使用数组存储数据,能实现自动扩容,能使用Iterator遍历,实现List接口的常用方法。
∙说明
1,该案例主要考察学员对ArrayList实现原理的掌握,进一步加深面向对象的抽象思想,熟练掌握数组操作。
2,教师可以写出该类的代码框架,让学员实现其中的重要方法。
3,该案例的重点和难点在于add方法中实现数组自动扩容和iterator方法中实现并得到迭代器。
4,该案例难度系数:
程序级/设计级
✧案例21:
模拟LinkedList类的实现—MyLinkedList类
∙定义
自己写一个MyLinkedList类,实现java.util.LinkedList类的核心功能,要求底层使用链表存储数据,能实现自动扩容,能使用Iterator遍历,实现List接口的常用方法。
∙说明:
1,该案例主要考察学员对链表的实现原理的掌握,进一步加深面向对象的抽象思想,熟练掌握链表的定义和操作。
2,教师可以写出该类的代码框架,让学员实现其中的重要方法。
3,教师应该讲解Java实现链表的基本方法。
4,该案例难度系数:
程序级/设计级
✧案例22:
反射实现类的动态加载
∙定义
编写如下格式的配置文件,然后根据配置文件的参数加载类,生成实例,设置属性的值,并调用方法,在该案例中假定类一定有无参构造方法,假定属性类型是String,假定方法都是无参的。
CLASS_NAME=tts.cookbook.key22.Student
FIELD_NAME=name
FIELD_VALUE=zhangsan
METHOD_NAME=study
∙说明
1,该案例主要考察学员对反射的理解,使用反射进行类的动态加载。
2,教师应该讲解使用Properties装载配置文件的方法,并将该段代码发布给学员。
此时并不需要学员理解文件访问的方法。
3,教师可以引导学员思考一下如果没有题目所给的那些假设,如果要访问的属性和方法不止一个,那用Properties格式的配置文件就不能很好的描述了,这时需要一种有层次感能自我说明的数据描述格式—XML。
4,该案例难度系数:
架构级
✧案例23:
简易计算器的界面设计及实现
∙定义
使用AWT和Swing设计简单的计算器界面,并实现基本的运算功能,如下图所示:
∙说明:
1,该案例主要考察学员对基本图形组件和布局管理器的使用。
2,教师可以讲解多层布局设计的原理和基本方法。
3,教师可以讲解实现运算的基本算法。
4,该案例难度系数:
程序级
✧案例24:
简易记事本程序的界面设计
∙定义
使用AWT和Swing设计一个类似于windows记事本的程序界面,要求使用菜单。
∙说明:
1,该案例主要考察学员对基本图形组件,布局管理器和程序菜单的设计和使用。
2,教师可以讲解多层布局设计的原理和基本方法。
3,教师可以讲解JFileChooser和JColorChooser的使用。
4,