个人项目
https://github.com/xuweizheng/test
一、实践目的
1、掌握基本输入输出。
2、掌握方法定义与调用,理解参数传递方式。
3、掌握数组的声明、定义与初始化,数组的处理。
4、掌握数组作为方法参数和返回值。
5. 掌握Java的语言规范,面向对象的核心概念和特性;
6. 掌握Java的编程技术,包括异常处理,图形界面设计;
7. 掌握Java应用软件的开发环境和开发过程;
8. 掌握面向对象的思想和程序设计方法
二、实践要求
利用方法、数组、基本输入输出等Java基础知识,给出所选项目的基本设计与实现。
三、项目需求
猜数字游戏
本设计将一个1-100以内的猜数字游戏作为研究对象。设计出一个有系统随机选出一个1-100的数字不显示出来,由玩家猜这个数字,直到猜中为止,并显示出玩家猜中数字所用时间和次数对玩家做出评判,并对所涉及的相关技术进行初步的探讨。
程序运行就进入游戏玩家就可以进行数字猜猜看了。
四、项目设计方案
4.1课程设计的要求
设计一个猜数字游戏程序,该游戏可以由程序随机产生整数,玩游戏者通过由用户输入数字来匹配上面所产生的数字。用户随机输入数字,当与计算机产生的随机数相符合时,计算机将提醒用户,游戏成功的信息,当有偏差时,将会提醒偏差,如偏大或者是偏小。
4.2 系统总体设计
猜数字游戏—游戏随机给出一个1—100 (包括1和100) 之间的数字,然后让你猜是什么数字。你可以随便猜一个数字,游戏会提示太大还是太小,从而缩小结果范围。经过几次猜测与提示后,最终推出答案。(如图1)
图1系统设计结构图
游戏界面:采用图形界面显示。页面有如下功能:开始,结束,重来。
游戏开始后,由计算机产生一个1-100的随机数,不显示在图形界面,但显示在字符界面。用户只需输入所猜想的数字,打印在输入框内,按“确定”按钮表示确定,游戏返回提示语句,按照提示语句操作,直至游戏结束。
同时,计算机开始对游戏进行计时和计数功能。
游戏过程中,如果不想继续玩了,可以直接退出,想重新开局,按“重新开始”按钮即可。想控制界面大小只需拖拽图形界面边框即可。
游戏结束后,可以选择“关闭”游戏,或者是“重新开始”。
4.3功能模块设计
4.4功能模块详细设计
1、随机数的获取
功能描述:玩家输入一个数字,数字的范围在1-100之间,系统获取随机数。
2 、输入输出模块
功能描述:对玩家输入的数字进行判断和提示。如果玩家输入的不是系统要求的数字,系统将提示您,您输入的不是数字请重新输入.。如果玩家输入的数字与随机生成数相比较,比随机生成数小.系统提示您,数字太小请您重新输入。如果玩家输入的数字与随机生成数相比较,比随机生成数大.系统提示您,数字太大请您重新输入。(如图3)
3 、判断模块
功能描述:算出所用时间在玩家猜中时给出其所用时间,系统给出对其水平的判断和是否继续的提示;对玩家要求判断执行。(如图4)
4、 自动计数模块
功能描述:系统根据您猜数字的次数,自动计数. (如图5)
5、 结果输出模块
功能描述:直到用户猜到数字为止,提示信息是否重新猜数字,如果重新开始将进入下一次游戏,如果关闭将退出游戏系统。
五、详细设计
5.1 程序流程图(如图6)
5.2uml图
六、核心算法详细设计
6.1关键算法
(1)记录猜测次数模块
记录玩家猜测的次数
counter = 0;
计数器增加一
counter++;
首先定义了一个counter变量来记录玩家猜测的次数,并直接初始化为0。在打印一行游戏提示以后,便开始一个do-while语句。
在do-while语句中,首先用异常处理语句获取玩家的输入,如果玩家输入不合法,提示以后用continue语句从头重新执行循环语句,等待玩家的输入。从而,guess变量一定包含一个合法的整数。之后要对玩家的输入进行判断。
如果玩家的猜测太大或者太小,都做出提示。接着把计数器增加1,表示玩家做过一次猜测。
最后便是do-while语句的判断:当玩家猜测的数字和随机产生的答案不同,则再次进入循环,否则便结束循环,执行下面的代码。 (用Eclipse的Alt+/快捷键帮助编写do-while语句。)
(2)输入输出模块
// 获取玩家的输入
guess=Integer.parseInt(jTextField1.getText());
// 如果玩家不是输入一个合法的整数,则让他重新输入
JOptionPane.showMessageDialog(null, "数字不合法,请输入一个1-100之间的整数!");
jTextField1.setText("");
jTextField1.requestFocus();
return ;
}
// 对玩家的输入进行判断。
if (guess > number){
JOptionPane.showMessageDialog(null, "猜的有点大了⊙﹏⊙!,再小一点吧!");
jTextField1.setText("");
jTextField1.requestFocus();
return ;
}
if (guess < number){
JOptionPane.showMessageDialog(null, "猜的一有点小了⊙﹏⊙!,再大一点吧!");
jTextField1.setText("");
jTextField1.requestFocus();
return ;
}
if (guess == number) {
endTime=System.currentTimeMillis();
(3)判定成绩模块
// 判断成绩。
switch (counter) {
case 1: JOptionPane.showMessageDialog(null,"好厉害,真棒!! (′▽`)");
break;
case 2:
case 3:
case 4:
case 5:
case 6:
case 7: JOptionPane.showMessageDialog(null,"这么快就猜对了,好厉害哦! ↖(^ω^)↗");
break;
default:JOptionPane.showMessageDialog(null,"猜了半天才猜出来,小同志,尚须努力啊! ╮(╯_╰)╭");
break;
}
JOptionPane.showMessageDialog(null,"您总共猜了"+counter+"次 共花了"+(endTime-
startTime)/1000+"秒的时间答对正确答案!");
}
jTextField1.setText("");
jTextField1.requestFocus();
}
switch语句是基于整型表达式的条件判断语句,猜数字用它来进行成绩判断。可以看出,switch语句是和若干case语句和一个default语句搭配使用的。代码中的switch语句用counter变量的值进行判断。
当counter的值为1时,便执行case 1里面的语句,即打印“好厉害,真棒!!”的字样,随后的break语句表示整个switch语句执行到这里结束了。
当counter的值为2时,便执行case 2里面的语句。可以发现case 2到case 6都没有break语句,这表示依次执行下面的语句,从而counter的值为2至7时,都打印“这么快就猜对了,好厉害哦!”字样。
当counter的值不是1至7时,便执行default语句,打印“猜了半天才猜出来,小同志,尚须努力啊!”的字样。
(4)计时模块
计时模块的代码分别写在游戏的开始和游戏的结束,取得时间差,以毫秒为单位。
long startTime = System.currentTimeMillis();
long endTime = System.currentTimeMillis();
(5)异常处理
Java语言提供了异常(Exception)处理机制帮助程序员发现并处理异常。所谓异常,就是在程序执行过程中能干扰程序正常流程的事件。导致异常的原因很多,比如文件找不到、数组越界、除以零等。当异常出现时,一个异常对象将被自动生成并传递给Java“运行时环境”(runtime system),说得专业一点,就是抛出一个异常。异常对象包含了异常类型、程序运行状态等信息。“运行时环境”得到异常对象后便打断程序的正常流程,自动寻找一个专门处理该异常的代码块来解决问题。这样的代码块称作异常句柄(Exception Handler)。你可以在异常句柄中尝试修复错误、重试或者报错,或者实在无法进行下去的时候来个自我了断。如果“运行时环境”找不到异常句柄,Java程序便会自行中断。
一个典型的异常处理如下:
try {
statement(s);
} catch (exceptiontype1 name) {
statement(s);
} catch (exceptiontype2 name) {
statement(s);
} finally {
statement(s);
}
其中:
try语句括起来的语句可能抛出异常。try语句至少要搭配一个catch语句或finally语句,不能单独使用。
catch语句必须和一个try语句配套使用,根据异常类型(exception type)分别处理不同的异常。也就是说,Java有许多预先定义的异常,你可以通过多个catch语句对它们分门别类地处理。你还可以自己定义异常类型。如果try语句块中没有抛出异常,这里自然不会被执行。
finally语句也必须和一个try语句配套使用,与catch语句不同,无论try语句块中是否抛出异常,finally所包括的语句块都会被执行
我设计的猜数字游戏需要从控制台获取玩家输入的数字,有多个异常处理
可以编写如下代码:
{
//Set Look & Feel
try {
javax.swing.UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
} catch(Exception e) {
e.printStackTrace();
}
}
// try,catch的异常管理。
try {
guess=Integer.parseInt(jTextField1.getText());
} catch (Exception e) {
使用异常机制的诸多好处:
使得程序更健壮,界面更友善。
把程序的业务逻辑与错误处理分开,代码更合理,更美观。
异常可以分层次处理,使得代码更简洁。
同类的异常可以归到一类一起处理,处理更方便。
6.2类与数据结构实现
首先搭建Java程序框架。打开Eclipse,新建名为GuessNumGame的项目,然后新建名为GuessNum的Java类。GuessNum加上合适的javadoc。
(1)随机数的产生
我们可以借助Java API提供的Random类来产生一个随机数。
首先在main函数中加入以下三行代码:
// 新建一个随机数产生器,然后生成一个1到100之间的整数。
Random random = new Random();
int num = random.nextInt(100);
第一句定义了一个类型是Random类的变量random(Java语言区分大小写,所以Random和random是不同意思),并且用new操作符生成一个Random类的实例赋给random变量。random变量实际上是一个参照,指向内存中用new操作符新建的Random类的实大多数情况下可以把random直接看做是一个Random类的实例,可以通过“random”加上“.操作符”来调用Random类的方法,用random.nextInt(100)来获取一个1至100之间的随机数。
第二句语句定义一个整型变量number来保存随机产生的整数,并且用直接初始化的方法把random产生的随机数赋给number变量。
(2)输入输出界面
标准输入输出(Standard I/O)是指可以被应用程序使用的信息流。比如,应用程序可以从标准输入(Standard input)读取数据,向标准输出(Standard output)写数据,把出错信息发送到标准错误(Standard error)。猜数字游戏主要用到标准输入,即控制台输入。用System.out.println进行控制台输出,用System.in进行控制台输入。它是一个纯粹的输入流,而猜数字游戏主要是通过控制台获取玩家的字符输入,则需要把它包装成一个BufferedReader实例来使用
BufferedReader input = new BufferedReader(
new InputStreamReader(System.in));
这时,input就是一个能处理来自控制台输入的、支持Unicode的、可以整行读取的一个BufferedReader实例,比如能通过input.readLine()方法获取玩家在控制台整整一行的输入。
七、使用说明与运行结果截图
(1)开始运行程序时图形界面的显示(如图8)
玩家输入一个数“58”后,点击“确定”,系统提示“猜的有点小了,再大一点!”。(如图9)
玩家再次输入一个数“70”后,点击“确定”,系统提示您“猜的有点大了,再小一点!”。(如图10)
玩家再次输入一个数“32”,点击“确定”,系统提示“猜了半天才猜出来,小同志,尚须努力”,单击确定显示“您总共猜了8次,您猜数字总共花了33秒”。(如图11 12)
玩家再重新玩一次,获取随机数后,玩家输入一个随机数“90”,点击“确定”,系统提示“正确”!您总共猜了2次,您猜数字总共花了14秒”。(如图13)
如果玩家输入数字不再1到100以内数字系统提示错误!(如图14)
八、实验总结
经过这次实验,我发现在操作的过程中我都遇到了很多的困难,同时我也得到了很多的收获的。
在选题初期时,不知道选什么题比较好,后来衡量了一下自己,最终选择是猜数字游戏。
在本次试验中,给我印象最为深刻的是程序的编译过程中,从中我学到了许多以前学有学会和没有学到的函数。比如do-while语句的判断,控制台输入的概念和方法。除此之个还不其它一些函数也得到了巩固。以前总是模模糊糊的,现在心里十分清楚了。,对一些类及方法的运用显得只能,这次的学习让我从纸上谈兵逐渐的过渡到实践出真知。通过这次课程设计,我进一步加深对基础理论的理解,扩大专业知识面,对收集资料、查阅文献、方案制定等实践方面得到了很好的锻练,促进对所学知识应用能力的提高。同时我渐渐的复习了Java使用方法和编程语法,之后的编程过程也相对得心应手,基本完成了预期计划的要求。