1100以内的猜数游戏.docx
《1100以内的猜数游戏.docx》由会员分享,可在线阅读,更多相关《1100以内的猜数游戏.docx(28页珍藏版)》请在冰点文库上搜索。
1100以内的猜数游戏
*******************
实践教学
*******************
软件学院
2014年春季学期
Java课程设计说明书
题目:
1-100以内的猜数游戏
专业班级:
姓名:
学号:
指导教师:
成绩:
摘要
本设计将一个1-100以内的猜数字游戏作为研究对象。
设计出一个有系统随机选出一个1-100的数字不显示出来,由玩家猜这个数字,直到猜中为止,并显示出玩家猜中数字所用时间和次数对玩家做出评判,并对所涉及的相关技术进行初步的探讨。
程序运行就进入游戏玩家就可以进行数字猜猜看了。
关键字:
数字游戏java代码图形化界面(GUI)编程
序言
这次课程设计内容是猜数游戏,利用java平台进行设计编程。
这次课程设计让我们更深入的了解了java编程,并且能更熟练的编写java程序能力,还提升了我们分析和解决问题的能力,这次程序设计使我们对于java语言的认识更加透彻。
对于这次的猜数游戏课程设计十分有意思,过程也遇到了各种问题,通过查找资料和各种调试,并且能在5天内完成这次课设体现了团队的合作能力。
本猜数游戏的程序是将一个1-100以内的猜数字游戏作为研究对象。
设计出一个有系统随机选出一个1-100的数字不显示出来,由玩家猜这个数字,直到猜中为止,并显示出玩家猜中数字所用时间和次数对玩家做出评判。
操作简单易懂,对于玩家的评判的语言风趣幽默。
虽然按时完成了这次的猜数游戏程序设计,但我们还有许多不足之处,需要进行更多的机会来编写java程序。
1、需求分析
1.1课程设计目的
(1)使学生巩固和提高Java编程技术;
(2)培养学生掌握程序设计的基本思路和方法;
(3)加强学生研发、调试程序的能力;
(4)培养学生分析、解决问题的能力;
(5)提高学生的科技论文写作能力。
1.2课程设计的任务及要求
任务:
图形化界面(GUI)编程,开发一个猜数游戏程序
(1)计算机产生随机数(1-100),不显示
(2)由玩家来测数字猜中即胜
(3)猜不中,提示是大了还是小了,继续猜,直至猜准
(4)给出所用时间和评语
2.设计思路
2.1系统总体设计
猜数字游戏—游戏随机给出一个1—100(包括1和100)之间的数字,然后让你猜是什么数字。
你可以随便猜一个数字,游戏会提示太大还是太小,从而缩小结果范围。
经过几次猜测与提示后,最终推出答案。
图一
游戏界面:
采用图形界面显示。
页面有如下功能:
开始,结束,重来。
游戏开始后,由计算机产生一个1-100的随机数,不显示在图形界面,但显示在字符界面。
用户只需输入所猜想的数字,打印在输入框内,按“确定”按钮表示确定,游戏返回提示语句,按照提示语句操作,直至游戏结束。
同时,计算机开始对游戏进行计时和计数功能。
游戏过程中,如果不想继续玩了,可以直接退出,想重新开局,按“重新开始”按钮即可。
想控制界面大小只需拖拽图形界面边框即可。
游戏结束后,可以选择“关闭”游戏,或者是“重新开始”。
2.2功能模块设计
图二
2.2.1功能模块详细设计
1、随机数的获取
功能描述:
玩家输入一个数字,数字的范围在1-100之间,系统获取随机数。
2、输入输出模块
功能描述:
对玩家输入的数字进行判断和提示。
如果玩家输入的不是系统要求的数字,系统将提示您,您输入的不是数字请重新输入.。
如果玩家输入的数字与随机生成数相比较,比随机生成数小.系统提示您,数字太小请您重新输入。
如果玩家输入的数字与随机生成数相比较,比随机生成数大.系统提示您,数字太大请您重新输入。
图三
3、判断模块
功能描述:
算出所用时间在玩家猜中时给出其所用时间,系统给出对其水平的判断和是否继续的提示;对玩家要求判断执行。
4、自动计数模块
功能描述:
系统根据您猜数字的次数,自动计数.
5、结果输出模块
功能描述:
直到用户猜到数字为止,提示信息是否重新猜数字,如果重新开始将进入下一次游戏,如果关闭将退出游戏系统。
3、详细设计
3.1程序流程图
3.2源程序和关键算法
3.2.1源程序
/* 程序运行时自动产生1-100的随机数
* 接受用户键盘输入数据并给出指示信息
* 直至猜对,游戏者猜对后,显示猜对次数
* 并且供计时功能
*/
importjava.awt.event.ActionEvent;
importjava.awt.event.ActionListener;
importjava.awt.event.KeyAdapter;
importjava.awt.event.KeyEvent;
importjava.util.Random;
importjavax.swing.*;
publicclassGuessNumextendsjavax.swing.JFrame{
{
//SetLook&Feel
try{//设置窗口外观为windows外观
javax.swing.UIManager.setLookAndFeel
("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
}catch(ClassNotFoundException|InstantiationException|IllegalAccessException|UnsupportedLookAndFeelExceptione){
}
}
privateJLabeljLabel1;
privateJTextFieldjTextField1;
privateJButtonjButton1;
privateJButtonjButton2;
privateintnumber=0;
privateintcounter=0;
longstartTime=System.currentTimeMillis();
longendTime;
/**
*Auto-generatedmainmethodtodisplaythisJFrame
*/
publicstaticvoidmain(String[]args){
GuessNuminst=newGuessNum();
inst.setVisible(true);//显示窗口
}
/**
*新建一个随机数产生器,然后生成一个1到100之间的整数
*/
publicGuessNum(){
super();
initGUI();
Randomrandom=newRandom();
number=random.nextInt(100);//产生一个1-100间的随机数
}
/**
*初始化窗口组件
*/
privatevoidinitGUI(){
try{
setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);//窗口关闭时销毁窗口
getContentPane().setLayout(null);//设置窗口布局为绝对布局
{
jLabel1=newJLabel();
getContentPane().add(jLabel1);
jLabel1.setText("欢迎进入有趣的猜数字游戏;
"+
"1到100之间的整数,你猜是什么?
快来猜猜看(^.^)
"+
"请输入你想猜的数:
");
jLabel1.setBounds(45,0,420,150);//设置标签位置
}
{
jTextField1=newJTextField();
getContentPane().add(jTextField1);
jTextField1.setBounds(42,168,112,28);//输入窗口大小
jTextField1.addKeyListener(newKeyAdapter(){//文本框添加键盘按键监听-监听回车键
publicvoidkeyPressed(KeyEventevt){
jTextField1KeyPressed(evt);
}
});
}
{
jButton1=newJButton();
getContentPane().add(jButton1);
jButton1.setText("确定");
jButton1.setBounds(182,168,77,28);//确定按钮
jButton1.addActionListener(newActionListener(){//按钮添加监听
@Override
publicvoidactionPerformed(ActionEventevt){
jButton1ActionPerformed(evt);//按钮被点击时执行该方法
}
});
}
{
jButton2=newJButton();
getContentPane().add(jButton2);
jButton2.setText("重新开始");
jButton2.setBounds(280,168,91,28);//设置重新开始按钮
jButton2.addActionListener(newActionListener(){
@Override
publicvoidactionPerformed(ActionEventevt){
jButton2ActionPerformed(evt);
}
});
}
pack();
this.setSize(450,280);//设置窗口大小
setLocationRelativeTo(null);//设置窗口在显示器居中显示
}catch(Exceptione){
e.printStackTrace();
}
}
/**
*“确定”按钮事件监听
*@paramevt
*/
privatevoidjButton1ActionPerformed(ActionEventevt){
intguess=0;//记录玩家所猜测的数字
counter++;//计数器增加一
//try,catch的异常管理。
try{
//获取玩家的输入
guess=Integer.parseInt(jTextField1.getText());
}catch(Exceptione){
//如果玩家不是输入一个合法的整数,则让他重新输入。
JOptionPane.showMessageDialog(null,"数字不合法,请输入一个1-100之间的整数!
");
jTextField1.setText("");//清空文本框内容
jTextField1.requestFocus();//文本框获取输入焦点
return;
}
//对玩家的输入进行判断。
if(guess>number){
JOptionPane.showMessageDialog(null,"猜的有点大了⊙﹏⊙!
,再小一点吧!
");
jTextField1.setText("");
jTextField1.requestFocus();
return;
}
if(guessJOptionPane.showMessageDialog(null,"猜的一有点小了⊙﹏⊙!
,再大一点吧!
");
jTextField1.setText("");
jTextField1.requestFocus();
return;
}
if(guess==number){
endTime=System.currentTimeMillis();
//判断成绩。
switch(counter){
case1:
JOptionPane.showMessageDialog(null,"好厉害,真棒!
!
?
(′▽`)");
break;
case2:
case3:
case4:
case5:
case6:
case7:
JOptionPane.showMessageDialog(null,"这么快就猜对了,好厉害哦!
↖(^ω^)↗");
break;
default:
JOptionPane.showMessageDialog(null,"猜了半天才猜出来,小同志,尚须努力啊!
╮(╯_╰)╭");
break;
}
JOptionPane.showMessageDialog(null,"您总共猜了"+counter+"次共花了"+(endTime-
startTime)/1000+"秒的时间答对正确答案!
");
}
jTextField1.setText("");
jTextField1.requestFocus();
}
privatevoidjButton2ActionPerformed(ActionEventevt){//重新开始
Randomrandom=newRandom();//重新生成随机数
number=random.nextInt(100);//产生一个1-100间的随机数
counter=0;//记录玩家猜测的次数
jTextField1.setText("");
startTime=System.currentTimeMillis();
}
privatevoidjTextField1KeyPressed(KeyEventevt){
//监听文本框回车
if(evt.getKeyCode()==KeyEvent.VK_ENTER){
jButton1.doClick();//文本框按回车键执行“确定”按钮的事件
}
}
privatevoidsetText(Stringstring){
thrownewUnsupportedOperationException("Notyetimplemented");
}
}
3.2.2关键算法
(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(guessJOptionPane.showMessageDialog(null,"猜的一有点小了⊙﹏⊙!
,再大一点吧!
");
jTextField1.setText("");
jTextField1.requestFocus();
return;
}
if(guess==number){
endTime=System.currentTimeMillis();
(3)判定成绩模块
//判断成绩。
switch(counter){
case1:
JOptionPane.showMessageDialog(null,"好厉害,真棒!
!
(′▽`)");
break;
case2:
case3:
case4:
case5:
case6:
case7:
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时,便执行case1里面的语句,即打印“好厉害,真棒!
!
”的字样,随后的break语句表示整个switch语句执行到这里结束了。
当counter的值为2时,便执行case2里面的语句。
可以发现case2到case6都没有break语句,这表示依次执行下面的语句,从而counter的值为2至7时,都打印“这么快就猜对了,好厉害哦!
”字样。
当counter的值不是1至7时,便执行default语句,打印“猜了半天才猜出来,小同志,尚须努力啊!
”的字样。
(4)计时模块
计时模块的代码分别写在游戏的开始和游戏的结束,取得时间差,以毫秒为单位。
longstartTime=System.currentTimeMillis();
longendTime=System.currentTimeMillis();
(5)异常处理
Java语言提供了异常(Exception)处理机制帮助程序员发现并处理异常。
所谓异常,就是在程序执行过程中能干扰程序正常流程的事件。
导致异常的原因很多,比如文件找不到、数组越界、除以零等。
当异常出现时,一个异常对象将被自动生成并传递给Java“运行时环境”(runtimesystem),说得专业一点,就是抛出一个异常。
异常对象包含了异常类型、程序运行状态等信息。
“运行时环境”得到异常对象后便打断程序的正常流程,自动寻找一个专门处理该异常的代码块来解决问题。
这样的代码块称作异常句柄(ExceptionHandler)。
你可以在异常句柄中尝试修复错误、重试或者报错,或者实在无法进行下去的时候来个自我了断。
如果“运行时环境”找不到异常句柄,Java程序便会自行中断。
一个典型的异常处理如下:
try{
statement(s);
}catch(exceptiontype1name){
statement(s);
}catch(exceptiontype2name){
statement(s);
}finally{
statement(s);
}
其中:
try语句括起来的语句可能抛出异常。
try语句至少要搭配一个catch语句或finally语句,不能单独使用。
catch语句必须和一个try语句配套使用,根据异常类型(exceptiontype)分别处理不同的异常。
也就是说,Java有许多预先定义的异常,你可以通过多个catch语句对它们分门别类地处理。
你还可以自己定义异常类型。
如果try语句块中没有抛出异常,这里自然不会被执行。
finally语句也必须和一个try语句配套使用,与catch语句不同,无论try语句块中是否抛出异常,finally所包括的语句块都会被执行
我设计的猜数字游戏需要从控制台获取玩家输入的数字,有多个异常处理
可以编写如下代码:
{
//SetLook&Feel
try{
javax.swing.UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
}catch(Exceptione){
e.printStackTrace();
}
}
//try,catch的异常管理。
try{
guess=Integer.parseInt(jTextField1.getText());
}catch(Exceptione){
使用异常机制的诸多好处:
使得程序更健壮,界面更友善。
把程序的业务逻辑与错误处理分开,代码更合理,更美观。
异常可以分层次处理,使得代码更简洁。
同类的异常可以归到一类一起处理,处理更方便。
4、运行调试与分析讨论
4.1测试方案
点击运行程序后,显示出图形界面。
系统自动获取到一个随机数。
玩家输入一个数,点击“确定”按钮。
如果玩家输入的数比系统给出的随机数小,系统会提示“您猜的太小了,请继续猜!
”。
如果玩家输入的数比系统给出的随机数大,系统提示“您猜的太大了,请继续猜!
”。
如果玩家猜对了数,但是所用时间大于七次,系统会提示“猜了半天才猜出来,小同志,尚须努力啊!
”,并且会计算出玩家所用的时间和所猜的次数。
如果玩家猜对了数,而且所用时间小于七次,系统会提示“这么快就猜对了,好厉害哦!
”,并且会计算出玩家所用的时间和所猜的次数。
如果玩家想重新再玩一次,点击“重新开始”按钮即可继续玩下一轮游戏。
4.2运行结果分析
开始运行程序时图形界面的显示