阶段一报告
目 录
1 选题... 2
2 系统需求分析... 3
2.1 系统可行性分析... 3
2.2 系统需求分析... 3
2.3 进度安排... 5
3 系统设计... 6
3.1 系统设计... 6
3.2 数据库设计... 6
4 系统实现... 7
4.1 代码实现... 7
4.2 运行界面实现... 15
5 结论和心得... 19
1 选题
|
选题一 |
算数运算测试 |
|
题目要求 |
|
|
功能基本要求:实现100以内加减法数学题,能根据题目计算出答案,与输入答案对比,判断是否正确,如错误将显示正确答案,同时判断是否继续玩,每题10分,最后计算分数。说明:要求数随机,运算符也随机,可以多次游戏,做对一题加10分,直到用户不想玩。 能力要求:1.沟通表达能力;2:资料搜集能力;3. 自主学习能力;4.时间规划能力 5.独立完成项目能力;6.文档撰写能力;7.面向对象编程思维和软件工程思想。 |
|
|
使用Java知识 |
|
|
Java基本输入输出、运算符、随机数、while循环、for循环、continue、break、数据类型转换、选择分支、异常、函数调用、GUI图形界面。 |
|
|
选题二 |
猜数游戏 |
|
题目要求 |
|
|
功能基本要求:计算机产生随机数(1-100之间),猜中即胜,猜不中,提示是大了还是小了,继续猜,直至猜到;给出所用的时间和评语,保留用户最好的成绩存进数据库,输出排行榜。说明:猜到了也可以继续玩,直到用户不想玩(最好成绩指的是所用时间最短)。 能力要求:1.沟通表达能力;2:资料搜集能力;3. 自主学习能力;4.时间规划能力 5.独立完成项目能力;6.文档撰写能力;7.面向对象编程思维和软件工程思想。 |
|
|
使用Java知识 |
|
|
Java基本输入输出、随机数、while循环、break、选择分支、随机数、类型转换、函数调用、数据库等
|
|
2 系统需求分析
2.1 系统可行性分析
一、算数运算测试
1.技术可行性
该程序使用Eclipse编译器,采用的Java语言,Java面向对象,GUI图形界面,技术上是可行的。
2经济可行性
该程序使用Eclipse编译器是免费的,该软件能满足设计的基本的需求,不需要额外的开销,经济上是可行的。
3.操作可行性
该程序只需用户安装Eclipse编译器并配置好环境变量就可以使用,GUI也在Eclipse编译器上安装了WindowBuilder插件,操作简单便捷。符合大部用户的使用习惯。操作上是可行的。
二 、猜数游戏
1技术可行性
该程序使用Eclipse编译器,采用的Java语言,Java面向对象,GUI图形界面与JDBC数据库,技术上是可行的。
2.经济可行性
该程序使用Eclipse编译器是免费的,该软件能满足设计的基本的需求,不需要额外的开销,经济上是可行的。
3.操作可行性
该程序只需用户安装Eclipse编译器并配置好环境变量就可以使用,JDBC数据库也安装了开源软件,操作简单便捷。符合大部用户的使用习惯。操作上是可行的。
2.2 系统需求分析
一、算数运算测试
1.需求分析
实现100以内加减法数学题,能根据题目计算出答案,与输入答案对比,判断是否正确,如错误将显示正确答案,同时判断是否继续玩,每题10分,最后计算分数。说明:要求数随机,运算符也随机,可以多次游戏,做对一题加10分,直到用户不想玩。
2.功能模块图
图2-1 算数运算测试功能模块图
二、猜数游戏
1.需求分析
计算机产生随机数(1-100之间),猜中即胜,猜不中,提示是大了还是小了,继续猜,直至猜到;给出所用的时间和评语,保留用户最好的成绩存进数据库,输出排行榜。说明:猜到了也可以继续玩,直到用户不想玩(最好成绩指的是所用时间最短)。
2.功能模块图
图2-2 猜数游戏功能模块图
2.3 进度安排
阶段一进度安排如表2-1所示。
表2-1 进度安排表
|
阶段 |
持续时间 |
阶段描述 |
输出 |
|
构思阶段 |
3小时 |
需求分析 |
需求说明,功能模块图 |
|
设计阶段 |
3小时 |
系统设计 |
设计说明-可以画流程图;数据库设计 |
|
实现阶段 |
1天 |
编写代码 |
项目工程源代码 |
|
1天 |
系统测试 |
进行黑盒测试(功能测试)-测试说明 |
|
|
运行阶段 |
1天 |
部署、运行 |
系统使用说明、运维报告、录制视频 |
3 系统设计
3.1 系统设计
一、算术测试运算
根据系统的实际功能需求分析,对系统功能部分进行了设计。
GUI图形界面:首先需有一下需要设计的地方:
随机题目生成模块:随机生成了0~3的运算符、随机生成两个0~100之间的数,通过Switch来决定生成什么运算符的算式。
监听提交按钮:点击“提交”按钮,获取到输入的值,强转为Integer类型与正确答案比较,如正确加10分,如错误,显示正确答案。
监听y->继续游戏:点击“y”按钮,需清空上一题目及相关信息,重新调用随机题目生成模块。
监听n->退出游戏:点击“n”按钮,需清空所有信息,并提示退出游戏与分数的信息。
二、猜数游戏
随机数生成模块:使用Random方法产生随机数,同时键盘输入猜数并比较大小,提示语句大了还是小了。
时间记录模块:设置初始计时时间与程序结束时间做差求出程序运行时间。
成绩记录模块:应用JDBC数据库将程序写入。
评语记录模块:根据所用时间给出评语。
成绩排行榜模块:通过升序输出数据库中的内容,并进行重复数据的删除,保留最好成绩。
退出功能模块:设置用户判断模块,用户根据自身是否要继续游戏而决定。
3.2 数据库设计
一、猜数游戏
图3-1数据库截图
4 系统实现
4.1 代码实现
一、算数运算测试
/*算数运算测试,根据题目写出答案,然后和答案比对判断是否正确,最后计算分数
(要求数随机,运算符也随机,可以多次游戏,直到用户不想玩)*/
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JLabel;
import javax.swing.JTextField;
import javax.swing.JButton;
import java.awt.Font;
public class CountTest extends JFrame implements ActionListener{
private static final long serialVersionUID = 1L;
private JPanel contentPane;//定义窗体
private JTextField textField;//定义文本输入框
JLabel label=new JLabel("题目:");//输出题目
JLabel label_题目显示=new JLabel();//输出算式
JButton button=new JButton("提交");//"提交"按钮
JButton btnNewButton = new JButton("y");//y继续按钮
JButton btnNewButton_1 = new JButton("n");//n退出按钮
JLabel lblNewLabel = new JLabel();//输出正确或者错误
JLabel lblNewLabel_1 = new JLabel();//输出是否继续提示语句
JLabel lblNewLabel_2 = new JLabel();//输出得分
int sum;//正确结果
int op; //运算符
int num1;//数1
int num2;//数2
int score;//分数
/**
* Launch the application.
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
CountTest frame = new CountTest();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
/**
* Create the frame.
*/
public CountTest() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 450, 300);
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 50, 50));
setContentPane(contentPane);
contentPane.setLayout(null);
label.setFont(new Font("宋体", Font.PLAIN, 19));
label.setBounds(72, 61, 53, 40);
contentPane.add(label);
label_题目显示.setFont(new Font("宋8", Font.PLAIN, 12));
label_题目显示.setBounds(134, 61, 150, 40);
contentPane.add(label_题目显示);
textField = new JTextField();
textField.setBounds(342, 71, 66, 21);
contentPane.add(textField);
textField.setColumns(10);
btnNewButton.setFont(new Font("宋体", Font.PLAIN, 14));
btnNewButton.addActionListener(this);//监听y
button.setFont(new Font("宋体", Font.PLAIN, 14));
button.addActionListener(this);//监听提交
button.setBounds(179, 218, 93, 23);
contentPane.add(button);
btnNewButton.setBounds(72, 218, 97, 23);
contentPane.add(btnNewButton);
btnNewButton_1.setFont(new Font("宋体", Font.PLAIN, 14));
btnNewButton_1.addActionListener(this);//监听n
btnNewButton_1.setBounds(282, 219, 97, 23);
contentPane.add(btnNewButton_1);
lblNewLabel.setFont(new Font("宋体", Font.PLAIN, 12));
lblNewLabel.setBounds(72, 111, 361, 15);
contentPane.add(lblNewLabel);
lblNewLabel_1.setFont(new Font("宋体", Font.PLAIN, 12));
lblNewLabel_1.setBounds(72, 153, 371, 15);
contentPane.add(lblNewLabel_1);
lblNewLabel_2.setFont(new Font("宋体", Font.PLAIN, 12));
lblNewLabel_2.setBounds(72, 193, 384, 15);
contentPane.add(lblNewLabel_2);
random();//初始化后就有题目
}
@Override
public void actionPerformed(ActionEvent arg0) {
if(arg0.getSource()==button) {
int a = Integer.parseInt(textField.getText());
if(Integer.valueOf(a).equals(sum)) {
score=score+10;
lblNewLabel.setText("回答正确!");
}else {
lblNewLabel.setText("回答错误!正确答案是:"+sum);
}
lblNewLabel_1.setText("您是否需要继续计算: 是:Y 否: N");
}
if(arg0.getSource()==btnNewButton) {
textField.setText(null);
label_题目显示.setText(null);
lblNewLabel.setText(null);
lblNewLabel_1.setText(null);
lblNewLabel_2.setText(null);
random();
}
if(arg0.getSource()==btnNewButton_1) {
textField.setText(null);
label_题目显示.setText(null);
lblNewLabel.setText(null);
lblNewLabel_1.setText("退出游戏!");
lblNewLabel_2.setText("您的分数为:"+score+"分!");
}
}
public void random() {
op = new Random().nextInt(3); //随机生成运算符
num1 = new Random().nextInt(100);//随机生成数1
num2 = new Random().nextInt(100);//随机生成数2
switch(op) { //通过随机数选择运算符
case 0:label_题目显示.setText(num1+"+"+num2+"=?");
sum=num1+num2;
break;
case 1:label_题目显示.setText(num1+"-"+num2+"=?");
sum=num1-num2;
break;
case 2:label_题目显示.setText(num1 + "*" + num2 + "=?");
sum=num1*num2;
break;
case 3:label_题目显示.setText(num1 + "/" + num2 + "=?");
sum=num1/num2;
break;
}
}
}
二、猜数游戏
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.*;
/*猜数游戏,计算机产生随机数,猜中即胜,猜不中提示是大了还是小了,直到猜到,然后给出所用的时间和评语
保留用户测试的成绩,做出成绩排行榜。猜到了也可以继续玩,直到不想玩,保留最好成绩(时间最短)*/
public class GussingGame{
public static void main(String[] args) {
loop:
while(true) {
Scanner in=new Scanner(System.in);
System.out.println("请输入用户名:");
String user=in.next();
//调用一次猜数
Gussing gus=new Gussing();
long time=gus.start()/1000;//单位是毫秒
if(time<=20){ //输出时间和评语
System.out.println("用时:"+time+"s"+" "+"you are so clever!");
}
if(time>20&&time<50){
System.out.println("用时:"+time+"s"+" "+"you are good!");
}
if(time>=50){
System.out.println("用时:"+time+"s"+" "+"you need practice!");
}
//保留用户测试的成绩
Connection con=null;
Statement statement = null;
try { //设置参数
String driverClass = "com.mysql.jdbc.Driver";
String url = "jdbc:mysql://localhost:3306/user";
String username = "root";
String password = "root";
Class.forName(driverClass);
//获取Conection对象
con = DriverManager.getConnection(url, username, password);
//获取Statement对象
statement = con.createStatement();
String sql = "insert into userinfo (userName, score) values ('"+ user +"',"+ time +")";
statement.execute(sql);
//通过分组统计出数据库中不重复的最小数据score,然后通过 not in 去删除其他重复多余的数据。
String sql1=" DELETE FROM userinfo WHERE score NOT IN (SELECT score FROM (SELECT MIN(score) AS score FROM userinfo GROUP BY userName) t)";
statement.execute(sql1);
//从数据库中升序输出
String sql2="SELECT @rowNum:=@rowNum + 1 AS 'rank',a.* FROM userinfo a,(SELECT @rowNum:=0) b ORDER BY a.score";
ResultSet rs =statement.executeQuery(sql2);
System.out.println("**********成绩排行榜如下*********");
System.out.println("排名" + "\t\t" + "姓名" + "\t\t" + "成绩");
while(rs.next()) {
String name1 = rs.getString("userName");
int grade1 = rs.getInt("score");
int rank = rs.getInt("rank");
System.out.println(rank + "\t\t" + name1+"\t\t" + grade1+"s");
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (statement != null) {
statement.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
try {
if (con != null) {
con.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
System.out.println("成绩保存成功");
System.out.println("你要继续玩游戏吗?y/n");
String answer=in.next();
while(true) {
if(answer.equals("y")) {
break;
}
else if(answer.equals("n")) {
System.out.println("********游戏结束,感谢您参与!************");
break loop;//结束最上面while()循环
}else {
System.out.println("输入有误!请重新输入!");
answer=in.next();
}
}
}
}
}
class Gussing{
public long start(){
//产生随机数
int innerNum=(int)(Math.random()*100);
//输入数据和给出提示
Scanner inn=new Scanner(System.in);
System.out.println("请输入1~100之间的数:");
long startime=System.currentTimeMillis(); //设定初始计时时间
int inputNum=inn.nextInt();
while(!(inputNum==innerNum)){
if(inputNum>innerNum)
System.out.println("输入的数偏大!");
else
System.out.println("输入的数偏小!");
inputNum=inn.nextInt();
}
//计算所用时间
long endtime=System.currentTimeMillis();
long usedtime=endtime-startime;
return usedtime;
}
}
4.2 运行界面实现
一、算数运算测试
图4-2-1 算数测试页面
图4-2-2 计算正确
图4-2-3 退出页面显示分数
二、猜数游戏
图4-2-4 猜数录入第一人成绩
图4-2-5 猜数录入第二人成绩
图4-2-6 猜数保留最新成绩
5 结论和心得
在学习JAVA的过程中,我有很深的体会,首先培养面向对象的思想是非常重要的,而且要有编程思想,而不是普通的解决问题,将具体问题模块化,找到解决方法,如果遇到不会做的程序,要学会网络检索学习他人的优秀代码,深刻理解后化为己用。
多看多练习,将陌生的东西看熟练久而久之就会写了。更重要的是时间管理和合理的需求分析,考虑时间可行性真的很重要。我也会更加努力完善自己的代码,养成良好的编程习惯。
浙公网安备 33010602011771号