一、需求分析
1.玩家输入一个数字,数字的范围在1~100之间,系统自动随机获取。
2.对玩家输入的数字进行判断大小,如果不是正确答案,则系统给出或大或小提示,用户继续进行猜测。
3.玩家猜中时系统对于所猜次数给出不同的评语,并把猜测过程所用时间记录于一个文本中。
4.每次猜测系统自动统计猜测次数并显示。
5.猜中后可自动进行下一轮游戏。
二、课题及本人任务
课题:猜数游戏
本人任务:整个程序
三、总体设计
游戏随机给出一个1~100(包括100)之间的数字,然后用户猜测是什么数字。用户可以随便猜测一个数字,游戏会提示太大还是太小,从而缩小范围。经过几次猜测与提示后,最终推出答案。(系统设计如下图)
游戏界面:采用图形界面显示。
游戏开始后,由计算机产生一个1~100的随机数。用户只需输入所猜想的数字,打印在输入框内,按Enter键表示确定,游戏返回提示语句并清空输入框,直到游戏结束。同时计算机计算猜测次数并显示,计算游戏时间并存入一个文档。可以通过按窗体关闭符直接结束游戏。
四、主要功能展示与代码分析
功能展示:
初始界面:
输入一个数字后:系统给出提示并清空输入框
猜对后给出评语:
继续则进行下一轮游戏:
用于存储猜测时间的文件:
该文件存储游戏时间(毫秒):
代码分析:
package KESHE;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
import java.awt.BorderLayout;
import static java.awt.BorderLayout.*;
public class Finish extends JFrame {
int number,random,counter; //猜的数,答案,次数
long time;//时间
JLabel welcomeJLabel;//定义一个组件
JLabel hintJLabel; //提示显示框
JTextField guessField; //输入框
JPanel panel;//显示背景色
public Finish() { //布局
super("猜数字"); //窗体名
panel=new JPanel();
panel.setBackground(Color.PINK); //定义背景色
welcomeJLabel= new JLabel("已随机生成一个1到100的整数,来猜猜看吧");
add(welcomeJLabel,NORTH);
guessField=new JTextField(25); //容乃字符长度
panel.add(guessField);
add(panel); //默认添加到中间
hintJLabel= new JLabel(""); //初始换提示框
add(hintJLabel,SOUTH);
TextFieldHandler handler=new TextFieldHandler();
guessField.addActionListener(handler); //监听
random=(int)(1+100*Math.random()); //产生随机数
}
long begintime=System.currentTimeMillis();//开始计时
private class TextFieldHandler implements ActionListener {
public void actionPerformed (ActionEvent event) {
while(true){
number=Integer.parseInt(guessField.getText()); //获取猜测的数值
while(number!=random) {
number=Integer.parseInt(guessField.getText());
if(number>random) {
hintJLabel.setText("猜高了,再试试吧。已试错"+(++counter)+"次");
guessField.setText(""); //置空输入框
}
else{
hintJLabel.setText("猜低了,请继续!已试错"+(++counter)+"次");
guessField.setText("");
}
}
long endtime=System.currentTimeMillis();//结束计时
time=endtime-begintime;//总时间
//猜中后的用户提示
File f= new File("d:" + File.separator + "课设测试") ;//新建一个文件夹
Writer out = null ;
try {
String con=String.valueOf(time);//把time转换成字符串
con+="\r\n";//换行
out = new FileWriter(f,true);
out.write(con) ;// 将内容输出,保存文件
out.close() ;// 关闭文件
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if (counter<3)
JOptionPane.showMessageDialog(null, "恭喜您,猜中了,真厉害!");
else if (counter==6)
JOptionPane.showMessageDialog(null, "终于猜中了!");
else
JOptionPane.showMessageDialog(null, "您终于猜中了╮(╯▽╰)╭,您其实可以做得更好的!");
//开始下一轮猜数字游戏前的初始化工作
guessField.setText("");
random=(int)(1+100*Math.random());
counter=0;
}
}
}
public static void main(String[] args)
{
Finish f = new Finish(); // create ListFrame
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setSize(400,300);
f.setVisible(true);
}
}
五、测试与改进
把背景色改成了粉色
对于每次猜测给出提示和已经猜的次数,用户体验比较直观
一次游戏结束之后可以直接进行下一轮,无需再重新启动程序
生成jar文件,更方便使用。
六、附录
源代码:
package KESHE;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
import java.awt.BorderLayout;
import static java.awt.BorderLayout.*;
public class Finish extends JFrame {
int number,random,counter; //猜的数,答案,次数
long time;//时间
JLabel welcomeJLabel;//定义一个组件
JLabel hintJLabel; //提示显示框
JTextField guessField; //输入框
JPanel panel;//显示背景色
public Finish() { //布局
super("猜数字"); //窗体名
panel=new JPanel();
panel.setBackground(Color.PINK); //定义背景色
welcomeJLabel= new JLabel("已随机生成一个1到100的整数,来猜猜看吧");
add(welcomeJLabel,NORTH);
guessField=new JTextField(25); //容乃字符长度
panel.add(guessField);
add(panel); //默认添加到中间
hintJLabel= new JLabel(""); //初始换提示框
add(hintJLabel,SOUTH);
TextFieldHandler handler=new TextFieldHandler();
guessField.addActionListener(handler); //监听
random=(int)(1+100*Math.random()); //产生随机数
}
long begintime=System.currentTimeMillis();//开始计时
private class TextFieldHandler implements ActionListener {
public void actionPerformed (ActionEvent event) {
while(true){
number=Integer.parseInt(guessField.getText()); //获取猜测的数值
while(number!=random) {
number=Integer.parseInt(guessField.getText());
if(number>random) {
hintJLabel.setText("猜高了,再试试吧。已试错"+(++counter)+"次");
guessField.setText(""); //置空输入框
}
else{
hintJLabel.setText("猜低了,请继续!已试错"+(++counter)+"次");
guessField.setText("");
}
}
long endtime=System.currentTimeMillis();//结束计时
time=endtime-begintime;//总时间
//猜中后的用户提示
File f= new File("d:" + File.separator + "课设测试") ;//新建一个文件夹
Writer out = null ;
try {
String con=String.valueOf(time);//把time转换成字符串
con+="\r\n";//换行
out = new FileWriter(f,true);
out.write(con) ;// 将内容输出,保存文件
out.close() ;// 关闭文件
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if (counter<3)
JOptionPane.showMessageDialog(null, "恭喜您,猜中了,真厉害!");
else if (counter==6)
JOptionPane.showMessageDialog(null, "终于猜中了!");
else
JOptionPane.showMessageDialog(null, "您终于猜中了╮(╯▽╰)╭,您其实可以做得更好的!");
//开始下一轮猜数字游戏前的初始化工作
guessField.setText("");
random=(int)(1+100*Math.random());
counter=0;
}
}
}
public static void main(String[] args)
{
Finish f = new Finish(); // create ListFrame
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setSize(400,300);
f.setVisible(true);
}
}