Tianjin TianShi College |
Java课程设计
(阶段一文档)
院 别: 信息科学与工程学院 专 业: 计算机科学与技术 班 级: 2019级计科2班 学生姓名: 高子腾 指导老师: 董保莲 |
二〇二一年七月
目 录
1 选题
选题一 | 算数运算测试 |
题目要求 | |
实现十道100以内加减法数学题,能根据题目计算出答案,与输入答案对比,判断做题是否正确,最后计算分数。(添加排行榜功能存放到文件或数据库中)算错不扣分,算对加2分,算错不可重新计算。根据名次、所用时间、所得分数等做出成绩排行榜。 | |
使用Java知识 | |
Java基本输入输出、运算符、循环、选择分支 | |
选题二 | 猜数游戏 |
题目要求 | |
计算机产生随机数,猜中即胜,猜不中,提示是大了还是小了,继续猜,直至猜到,给出所用时间和评语。保留用户测试成绩,做出成绩排行榜。排行榜存放到文件或数据库中 | |
使用Java知识 | |
循环、分支、变量、常用类等 |
2 系统需求分析
2.1 系统可行性分析
一、算术运算测试
运用Java基础知识和文件,实现十道算数加减法运算功能,能够计算十道0-100之间随机数的加减法运算,在控制台进行输入和输出。能够将用户输入的结果和正确答案进行比对,并将用户运算的正确次数进行和运算,算出所得分数,写入文件中,最终结果显示在文件和排行榜中。
二、猜数游戏
运用Java基础知识和文件,实现猜数游戏,计算机随机产生数字,与用户所猜数字进行比较,在控制台输入输出。将所得结果写入文件中,并在文件和排行榜中同时显示。
2.2 系统需求分析
调研对象:用户玩家
算术运算测试:计算机随机产生0-100之间的数和“+”、“-”两种数学运算符,用户在控制台输入计算结果,将用户的结果和正确答案进行比对,答对一题记2分,将分数存放在数组中,最后在排行榜和文件中对用户的答题情况进行显示。
图2-1:算数运算测试模块图
猜数游戏:计算机随机产生一个数,与用户输入的数进行比较,判断猜大或猜小,直至两者相等退出程序,并根据所猜次数的多少进行评分并输出评语,将所猜次数写入文件中,并在文件和排行榜中显示。
图2-2:猜数游戏模块图
2.3 进度安排
阶段一进度安排如表3-1所示。
表2-1 进度安排表
阶段 | 持续时间 | 阶段描述 | 输出 |
构思阶段 | 3小时 | 需求分析 | 需求说明,功能模块图 |
设计阶段 | 0.5小时 | 系统设计 | 设计说明-可以画流程图;数据库设计 |
实现阶段 | 1天 | 编写代码 | 项目工程源代码 |
1小时 | 系统测试 | 进行黑盒测试(功能测试)-测试说明 | |
运行阶段 | 0.5天 | 部署、运行 | 系统使用说明、运维报告、录制视频 |
3 系统设计
3.1 系统设计
算术运算:用户进入控制界面后,计算机开始随机产生运算,用户需要输入本人的计算结果,用Scanner来实现,然后计算机会再次生成下一个运算,直至用户输完10个答案为止。对用户输入的每一个答案和正确的答案进行比对,将用户答对的次数直接以加2分的方式记录下来,将得到的分数存放在score数组中,对score数组进行排序,用Arrays.sort()方法实现,并在排行榜中显示。
猜数游戏:进入控制界面后,提示用户参加游戏的人数,计算机随机产生0-100之间的数字,提示用户输入自己所猜的数字,如果用户所猜数字不在0-100之间,则提示用户重新输入数字,直至输入在正确范围内的数字为止。对用户输入的数字和产生的随机数及进行比较,直至两数相同为止。根据用户所猜次数的多少进行评分,将用户猜数过程中所用的时间记录下来,并输出。将用户所用的时间和猜数的过程记录在文件中,并在排行榜中显示。
3.2 文件设计
在程序中运用文件写入将程序运行过程中的生成的信息写入本台电脑d:\\Math.txt和d:\\MathRank.txt以及d://guess.txt中并保存。 将算数运算过程中产生的加减法运算和结果以及猜数游戏中所猜的数字存在文件当中。
4 系统实现
4.1 代码实现
算术运算测试package zt.com;
import java.io.*;
import java.util.*;
import java.util.Arrays;
import static java.lang.Math.*;
public class MathNew {
public static void main(String[] args) {
Writer wr=null;//输入流
Writer ph=null;//输入流
Random ran=new Random();//随机生成数
Random r=new Random();//随机生成数
System.out.println("请输入参与算题人数:");
Scanner sc=new Scanner(System.in);
int people=sc.nextInt();
int[] score=new int[people];//定义每个人的分数数组
String[] stuName=new String[people];//定义每个人姓名的数组
int[] time=new int[people];//所用时间数组
int[] answer=new int[10];//用户输入答案的数组
int[] count=new int[people];//定义用户做对次数的数组
//按个人做循环输入10个答案
for(int k=0;k<people;k++)
{
System.out.println("请输入您的姓名:");
Scanner n=new Scanner(System.in);
stuName[k]=n.next();
System.out.println("第"+(k+1)+"位同学计算中");
System.out.println("请输入下面计算题的答案:");
long starttime=System.currentTimeMillis();//开始时间节点
//十道题结果的判定
for(int i=0;i<10;i++)
{
int add1=r.nextInt(100);//产生随机数
int add2=r.nextInt(100);//产生随机数
int operation=ran.nextInt(2);//计算机随机产生运算符,operation=0进行加法运算,operation=1进行减法运算
if(operation==0)
{
System.out.println(add1+"+"+add2+"=?");//数学表达式
int rightAnswer1=add1+add2;
System.out.println("您的答案:");
Scanner s=new Scanner(System.in);
answer[i]=s.nextInt();
//对加法运算结果的判定
if(answer[i]==rightAnswer1){
System.out.println("恭喜你!答对了!加两分");
score[k]+=2;
count[k]++;
}else if(answer[i]!=rightAnswer1){
System.out.println("答案错误!不加分!");
}
}else if(operation==1)
{
System.out.println(add1+"-"+add2+"=?");//数学表达式
int rightAnswer2=add1-add2;
System.out.println("您的答案:");
Scanner kz=new Scanner(System.in);
answer[i]=kz.nextInt();
//对减法运算结果的判定
if(answer[i]==rightAnswer2)
{
System.out.println("恭喜你!答对了!加两分!");
score[k]+=2;
count[k]++;
}else if(answer[i]!=rightAnswer2)
{
System.out.println("答案错误!不加分!");
}
}
}
long endtime=System.currentTimeMillis();//结束时间节点
time[k]=(int)(endtime-starttime)/1000;//时间由计算机内部的ms转化为
}
//信息输入
try {
wr=new FileWriter("d://Math.txt",true);
//循环输入数据信息
for(int k=0;k<people;k++)
{
wr.write("第"+(k+1)+"位同学:");
wr.write("\r\n");
wr.write("所得分数:");
String rank= Integer.toString(score[k]);
wr.write(rank);
wr.write("做对次数:");
String count1= Integer.toString(count[k]);
wr.write(count1);
wr.write("次\t");
wr.write("花费时间:");
String time1=Double.toString(time[k]);
wr.write(time1);
wr.write(" 秒 \r\n\n");
}
System.out.println("玩家信息已读入");
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
wr.close();
} catch (IOException e) {
e.printStackTrace();
}
}
Arrays.sort(score);//由大到小进行排序
int temp;
for(int i=0;i<people;i++)//冒泡排序 对进行相同分数下时间的比较
{
for(int j=1;j<people;j++)
{
if(score[i]==score[j])
{
if(time[i]<time[j])
{
temp=time[i];
time[i]=time[j];
time[j]=temp;
}
}
}
}
System.out.println("*********排行榜*********");//排行榜运行界面的输出
for(int k=0;k<people;k++){
System.out.println("第"+(k+1)+"名"+"\t"+"得分:"+score[people-k-1]+"分\t\t"+time[people-k-1]+"秒");
System.out.println("——————————————————————");
}
//信息输入
try {
ph=new FileWriter("d://MathRank.txt",true);
ph.write("\n\n");
//循环显示排行榜信息
for(int k=0;k<people;k++)
{
ph.write("第"+(k+1)+"名"+"\t");
ph.write("得分:");
String score1=Double.toString(score[k]);
ph.write(score1);
ph.write(" 分 \r\t");
String time1=Double.toString(time[k]);
ph.write(time1);
ph.write(" 秒\r\n\n");
}
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
ph.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
猜数游戏
package zt.com;
import java.io.*;
import java.util.*;
public class guessNumber {
public static void main(String[] args) throws IOException{
Writer wr=null;//输入流
Writer ph=null;//输入流
Random r=new Random();
//玩家人数
Scanner p=new Scanner(System.in);
System.out.println("请输入玩家人数:");
int people=p.nextInt();
int[] person=new int[people];//定义玩家数组
String[] name=new String[person.length];//定义玩家代号的数组
long[] time=new long[person.length];//定义猜数时长的数组
int[] count=new int[person.length];//定义猜对所用次数的数组
//玩家数组猜数循环
for(int i=0;i<person.length;i++)
{
System.out.println("请输入您的代号:");
name[i] = p.next();
Scanner input=new Scanner(System.in);
int number=r.nextInt(100);//产生随机数
int guess;//用户猜的数字
System.out.println("请输入您猜的0-100间的数字");
long starttime=System.currentTimeMillis();//开始时间节点
//用户猜测随机数与计算机所给的随机数进行比对
do{
guess=input.nextInt();
if(guess<0||guess>100)
{
System.out.println("输入有误,请重新输入");
System.out.println("请输入您猜的0-100间的数字");
continue;
}
if(number<guess){
System.out.println("猜大了");
count[i]++;
}else if(number>guess){
System.out.println("猜小了");
count[i]++;
}else{
count[i]++;
break;
}
}while(true);
long endtime=System.currentTimeMillis();//结束时间节点
System.out.println("这个数字是:"+number);//将正确答案输出
System.out.println("您猜的次数:"+count[i]);//输出所用次数
System.out.println("您猜的时间:"+((endtime-starttime)/1000)+"秒");//输出所用时间
time[i]=(int)(endtime-starttime)/1000;//时间由计算机内部的ms转换为s
//对用户所用时间进行分级给出评语
if(time[i]<=5) {
System.out.println("你一定是开挂了!Amazing!!!");
}else if(time[i]>5&&time[i]<=10) {
System.out.println("哎呦~不错呦~");
}else if(time[i]>10&&time[i]<=20) {
System.out.println("再加把劲儿啊大兄弟!");
}else if(time[i]>20) {
System.out.println("一定是电脑出问题了!");
}
}
//信息录入
try {
wr=new FileWriter("d://guess.txt",true);//建立文本文档存放输入数据
for(int i=0;i<person.length;i++)//循环显示
{
wr.write("代号:");
wr.write(name[i]);
wr.write("\r\n");
wr.write("猜数所用次数:");
String count1= Integer.toString(count[i]);
wr.write(count1);
wr.write(" 次 \r\n");
wr.write("花费时间:");
String time1=Double.toString(time[i]);
wr.write(time1);
wr.write(" 秒 \r\n\n");
}
System.out.println("玩家信息已读入");
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
wr.close();
} catch (IOException e) {
e.printStackTrace();
}
}
try {
ph=new FileWriter("d://rank.txt",true);//建立文本文档存放排行榜信息
ph.write("\n\n");
for(int i=0;i<person.length;i++)//循环显示
{
ph.write("第"+(i+1)+"名"+"\t");
ph.write("花费时间:");
String time1=Double.toString(time[i]);
ph.write(time1);
ph.write(" 秒 \r\n\n");
}
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
ph.close();
} catch (IOException e) {
e.printStackTrace();
}
}
Arrays.sort(time);//进行由小到大的排序
System.out.println("*********排行榜*********");
//循环输出排序结果
for(int i=0;i<person.length;i++){
System.out.println("第"+(i+1)+"名"+"\t"+"用时:"+time[i]+"秒");
System.out.println("——————————————————————");
}
4.2 运行界面实现
算术运算测试:首先运行程序,开始输入选择做题的人数,再输入做题人的姓名信息,开始做题,十道题做完之后由下一个人开始,输入姓名信息,继续做题,直到最开始输入的人数都做完为止,结束循环,输出简易得分排行榜
图4-1算术运算测试运行界面1
图4-2算术运算测试运行界面2
猜数游戏:首先运行程序,输入进行游戏的人数,先输入第一个人的代号信息,进入猜数循环,直到猜中为止,再由下一个人开始,输入代号信息,进入猜数循环,循环往复,直到猜数人达到一开始输入的游戏人数为之,结束循环,输出简易得分排行榜
图4-3:猜数游戏运行界面
5 系统测试
表5-1算术运算模块测试表
编号 | 测试功能 | 输入描述 | 预期结果 | 运行结果 |
1 | 时间 | 将用户算数运算过程中所使用的时间放在数组中 | 用户答题所用时间可以正常记录 | 正常,与预期结果一致 |
2 | 次数 | 将用户答题正确的次数保存在数组中 | 用户答题的正确次数可以正常记录 | 正常,与预期结果一致 |
3 | 所得成绩 | 将用户答题正确的次数直接加2分得出成绩,保存在数组中 | 用户所得成绩可以根据所得分数进行准确计算 | 正常,与预期结果一致 |
算术运算测试模块主要是针对用户的操作,从测试结果中可以看出该模块的所有功能均能正常实现,且测试结果与预期结果一致。
表5-2 猜数游戏测试表
编号 | 测试功能 | 输入描述 | 预期结果 | 运行结果 |
1 | 时间 | 将用户猜数过程中所使用的时间放在数组中 | 用户所猜数字所用时间可以正常记录 | 正常,与预期结果一致 |
2 | 次数 | 将用户猜数过程中猜测的次数保存 | 用户猜数过程中所用的次数可以正常记录 | 正常,与预期结果一致 |
猜数游戏测试模块主要是针对用户的操作,从测试结果中可以看出该模块的所有功能均能正常实现,且测试结果与预期结果一致。
6 结论和心得
结论:本次项目通过运用java相关知识,实现了十道加减法算术题的计算以及猜数游戏,并计算出每个人所得分数,写入文件中生成简单的排行榜,再将排行榜进行输出。实现结果与预想结果一致。
心得:通过这次的试验阶段,自己完成了两个个人项目,通过在网上查找资料、请教同学,又知道了一些平时没有注意到的知识点,通过反复的查漏补缺的过程,对项目进行了进一步的完善,但还是会有一些不足,希望通过日后的努力,对代码和编程思想的积累,可以更好地完善之前做过的项目。这次项目也应该包括GUI和数据库知识,但是我目前还没有将这两个模块的学习视频看完,没有办法将其应用到这次的个人项目里,日后我会继续努力、完善。