Tianjin TianShi College |
Java课程设计
(阶段一文档)
院 别: 信息科学与工程学院 专 业: 计算机科学与技术 班 级: 2019级计科二班 学生姓名: 马瑞欣 指导老师: 董保莲 |
二〇二一年七月
目录
1 选题
选题一 | 算术运算测试 |
题目要求 | |
实现10道1-100之间数的运算,运算数和运算符均由计算机随机产生,从开始答题起进行计时,答对一题计10分,将每个用户的答题时间和正确次数记录下来,存放在对应的数组里,答题时间较少的、正确次数较少的排名较高,将所有的数据在排行榜里输出,并将输出的信息存放在文件中。 | |
使用Java知识 | |
Java基本输入输出、循环分支、Java数组、文件类的使用 | |
选题二 | 猜数游戏 |
题目要求 | |
计算机随机产生1-100之间的数字,让用户猜测,对用户输入的数字和计算机随机产生的数字进行对比,输出猜大了或猜小了,直至用户所输数据和计算机产生的数据相等为止,记录用户猜测的次数,将次数的大小进行比较,猜测次数较少的排名较高,将所有的数据在排行榜中输出,并将输出的信息存放在文件中。 | |
使用Java知识 | |
Java基本输入输出、循环分支、switch选择分支、Java数组、文件类的使用 |
2 系统需求分析
2.1 系统可行性分析
一、算术运算测试
运用Java基础知识和文件,实现10道算数运算功能,能够计算10道1-100之间随机数的加减法运算,在控制台进行输入和输出操作。能够将用户输入的结果和正确答案进行对比,并将用户运算的正确次数进行输出,写入文件中,最终结果显示在文件和排行榜中。
二、猜数游戏
运用Java基础知识和文件,实现猜数游戏,计算机随机产生数字,与用户所猜数字进行比较,在控制台输入输出。将所得结果写入文件中,并在文件和帮行榜中同时显示。
2.2 系统需求分析
一、算术运算测试
计算机随机产生1-100之间的数和+、-两种运算符,用户在控制台输入自己的计算结果,将用户的结果和正确答案进行对比,将答对题的数目记录在数组中,答对一题记10分,最后在排行榜和文件中对用户的答题情况进行显示。
图2-1:算术运算测试模块图
二、猜数游戏
计算机随机产生数,与用户输入的数进行比较,输出猜大或猜小,直至两者相等退出程序,并根据所猜次数的大小进行评分,将所猜次数写入文件中,并在文件和排行榜中显示。
图2-2:猜数游戏模块图
2.3 进度安排
阶段一进度安排如表2-1所示。
表2-1 进度安排表
阶段 | 持续时间 | 阶段描述 | 输出 |
构思阶段 | 3小时 | 需求分析 | 需求说明,功能模块图 |
设计阶段 | 2小时 | 系统设计 | 设计说明-画流程图 |
实现阶段 | 1天 | 编写代码 | 项目工程源代码 |
5小时 | 系统测试 | 进行黑盒测试(功能测试)-测试说明 | |
运行阶段 | 半天 | 部署、运行 | 系统使用说明、运维报告、录制视频 |
3 系统设计
3.1 系统设计
一、算术运算测试
用户进入控制界面后,计算机开始随机产生运算,用户需要输入本人的计算结果,用Scanner来实现,然后计算机会再次生成下一个运算,直至用户输入10个答案为之。对用户输入的每一个答案和正确的答案进行对比,将用户答对的次数记录下来,将答对次数*10后得到的分数的结果存放在score数组中,对score数组进行冒泡排序,如果遇到分数一样的情况,则对不同用户所用时间的大小进行比较。把分数较高,用时较短的记录在文件中,并在排行榜中显示。
二、猜数游戏
进入控制界面后,提示用户参加游戏的人数,计算机随机产生0-100之间数字,提示用户输入自己所猜的0-100之间的数字,如果用户所猜数字不在0-100之间,则提示用户重新输入数字,直至输入正确范围内的数字为止。对用户输入的数字和产生的随机数及进行比较,直至两者正确为之。根据用户所猜次数的多少进行评分,将用户猜数过程中所用的时间记录下来,并输出。将用户所用的时间和猜数的过程记录在文件中,并在排行榜中显示。
3.2 文件设计
将算术运算和猜数游戏的信息分别存入到d:\\学生成绩排行榜.txt和d://猜数.txt文件中,将运行过程中每一个玩家的信息分别放在文件之中,包括所得的分数和所用的时间。所有的信息都写入文件中,在文件中显示出来。
4 系统实现
4.1代码实现
一、算术运算测试
package ts.pr;
import java.io.*;
import java.util.*;
public class sum {
public static void main(String args[]) {
int i,j;
int[] score=new int[2];//存分数
long[] times=new long[2];//存所用时间
Random ran=new Random();//计算机随机产生运算数
Scanner input=new Scanner(System.in);
//外层循环控制答题人数,内层循环控制题的数量
for(i=1;i<=score.length;i++)
{
int count=0;//count记录答对题的数目,开始答对次数为0
long starttime=System.currentTimeMillis();//开始时间
for(j=1;j<=10;j++) {
int number1=(int)(Math.random()*100);//计算机随机产生第一个运算数
int number2=(int)(Math.random()*100);//计算机随机产生第二个运算数
int operation=ran.nextInt(2);//计算机随机产生运算符,operation=0进行加法运算,operation=1进行减法运算
if(operation==0) {
System.out.println(number1+"+"+number2+"=?");
//用户在控制台输入自己的答案
int answer=input.nextInt();
if(number1+number2==answer) {
count++;//对用户的答案和正确的答案进行比较,如果相等,count的值+1
}else {
continue;
}
}else if(operation==1) {
System.out.println(number1+"-"+number2+"=?");
int answer=input.nextInt();
if(number1-number2==answer) {
count++;
}else {
continue;
}
}
}
long endtime=System.currentTimeMillis();//结束时间
long time=(endtime-starttime)/1000;
score[i-1]=10*count;//分数等于答对题的数目*10
times[i-1]=time;
System.out.println("第"+i+"位同学答题情况:");
System.out.println("共答对"+count+"道题,得分为:"+(10*count)+",用时"+time+"秒");
}
//实现成绩排行榜
for(int x=0;x<score.length;x++) {
for(int y=0;y<score.length-1-x;y++) {
if(score[y]<score[y+1]) {
int temp=score[y];
score[y]=score[y+1];
score[y+1]=temp;
long t=times[y];
times[y]=times[y+1];
times[y+1]=t;
}
}
}
for(int x=0;x<score.length;x++) {
for(int y=x+1;y<score.length;y++) {
if(score[x]==score[y]) {
if(times[x]>times[y]) {
long temp=times[x];
times[x]=times[y];
times[y]=temp;
}
}
}
}
System.out.println();
System.out.println("*************成绩排行榜*************");
System.out.println("名次\t答对题数\t总分\t所用时间(s)");
for(int a=0;a<score.length;a++) {
System.out.println(""+(a+1)+"\t "+(score[a])+"\t "+score[a]+"\t "+times[a]);
}
//把排行榜存放到文件(d://学生成绩排行榜.txt)
Writer wr=null;
BufferedWriter b=null;
try {
wr=new FileWriter("d:\\学生成绩排行榜.txt");
b=new BufferedWriter(wr);
b.write("名次\t答对次数\t总分\t所用时间(s)");
b.newLine();
for(int x=0;x<score.length;x++) {
b.write(""+(x+1)+"\t "+(score[x])+"\t "+score[x]+"\t "+times[x]);
b.newLine();
}
System.out.println("成绩榜已保存!");
b.flush();
}catch(IOException e) {
e.printStackTrace();
}finally {
try {
b.close();
wr.close();
}catch(IOException e) {
e.printStackTrace();
}
}
}
}
二、猜数游戏
package ts.pr;
import java.io.*;
import java.lang.reflect.Array;//动态创建和访问数组元素的各种静态方法
import java.util.*;
public class CaiShu {
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println("*********************欢迎进入猜数字游戏*********************");
Scanner sc=new Scanner(System.in);
System.out.println("请输入参与猜数字游戏的人数:");//提示用户输入参与猜数字游戏的人数
int personnum=sc.nextInt();//输入参加游戏的人数
Writer wr=null;//输入流
int guess;//定义用户猜的数字
int[] score=new int[personnum];//定义数组存放成绩
int[] count1=new int[personnum];//定义数组存放猜测次数
for(int j=0;j<personnum;j++) {
int number=(int)(Math.random()*100);//定义number为系统产生的随机数,随机生成1-100之间的数
int count=0;//猜测次数
System.out.println("*******************************");
System.out.println("请输入0-100之间的数字");
long starttime=System.currentTimeMillis();//定义开始时间
//开始猜数
do {
guess=sc.nextInt();//用户输入自己所猜的数字
if(guess<0||guess>100){
System.out.println("输入的数错误,请输入0-100之间的数");
guess=sc.nextInt();
}
if(number<guess) {//计算机随机产生的数字小于用户所猜的数字,则提示用户所猜的数字过大
System.out.println("猜大了,继续猜");
count++;//猜测次数加1
count1[j]+=1;//将猜测次数存放在数组中,同时数组长度加1
}
else if(number>guess) {//计算机随机产生的数字大于用户所猜的数字,则提示用户所猜的数字过小
System.out.println("猜小了,请继续");
count++;
count1[j]+=1;
}
else {//计算机随机产生的数字和用户所猜的数字相等,则猜数游戏结束,退出程序
count++;
count1[j]+=1;
break;
}
}while(true);//所猜次数相等则退出程序
System.out.println("第"+(j+1)+"位玩家共猜了"+count+"次");
System.out.println("这个数字是:"+number);//输出所猜的数字
//对用户所猜次数给出相应的分数
int grade=count;
switch(grade){
case 1:System.out.println("本次游戏所得分数为100分"); break;
case 2:System.out.println("本次游戏所得分数为90分"); break;
case 3:System.out.println("本次游戏所得分数为80分"); break;
case 4:System.out.println("本次游戏所得分数为70分"); break;
case 5:System.out.println("本次游戏所得分数为60分"); break;
default:System.out.println("本次游戏所得分数为50分"); break;
}
long endtime=System.currentTimeMillis();//定义结束时间
System.out.println("一共用时"+(endtime-starttime)/1000+"秒");
//猜测次数评价
if(count==1)
{
System.out.println("恭喜你,一次就猜对了!");
}
else if(count>=2&&count<=10){
System.out.println("猜得不错,继续加油");
}else {
System.out.println("猜的有点慢,得继续加油");
}
//写入文件
try {
wr=new FileWriter("d://猜数.txt",true);
wr.write("\r\n");
wr.write("第"+(j+1)+"位玩家:");
wr.write("\r\n");
wr.write("猜数次数");
String guess1=Integer.toString(count);
wr.write(guess1);
wr.write("\r\n");
wr.write("\r\n");
System.out.println("已写入文件");
}catch(IOException e) {
e.printStackTrace();
}finally {
try {
wr.close();
}catch(IOException e) {
e.printStackTrace();
}
}
}
Arrays.sort(count1);//对分数排序
System.out.println("***********************************");
System.out.println("***********排行榜*****************");
System.out.println("本次得分排名如下:");
//使用冒泡排序对猜数的信息进行排序
for(int i=0;i<score.length;i++){
for(int j=0;j<score.length-1;j++){
if(count1[j]>count1[j+1]){
int temp=count1[j];
count1[j]=count1[j+1];
count1[j+1]=temp;
}
}
}
System.out.println();
System.out.println("名次\t所猜次数");
for(int x=0;x<score.length;x++){
System.out.println(""+(x+1)+"\t "+"所猜次数为:"+count1[x]);//输出排序后的信息
}
}
}
4.2 用户界面实现
一、算术运算测试
在程序中对参与运算的人数进行了定义,运行后计算机随机产生算术运算式,用户开始输入自己的答案,第一个玩家输入答案后,第二个玩家开始输入,每个玩家输入10道题的答案。计算机对用户输入的答案和正确答案进行对比,并将每个玩家所用的时间记录下来,最后输出排行榜,成绩越高的排行榜排名越高。成绩相等的所用时间越少排名越高。
图4-1算数运算测试运行界面
二、猜数游戏
在运行界面先输入参与猜数字游戏的人数,计算机随机产生随机数,进入猜数字游戏,提示用户输入自己所猜的数字,如果数字不是在0-100之间的话,提示用户重新输入正确的数字,将用户输入的数字和计算机随机产生的数字进行对比,提示用户猜大或猜小,直到两者相等为止,并输出当前用户所猜次数和所用的时间以及猜数的分数,并输出该用户的评价信息。然后第二个用户开始猜数,猜数过程和第一个用户一致。然后输出排行榜,猜测次数越少的排名就越高。
图4-2:猜数游戏运行界面
图4-3:猜数游戏运行界面
5 .系统测试
一、算术运算测试
在算数运算测试模块中主要对时间、次数、所得成绩进行测试,测试结果如表5-1所示
表5-1 算术运算测试模块
编号 | 测试功能 | 输入描述 | 预期结果 | 运行结果 |
1 | 时间 | 将用户算数运算过程中所使用的时间放在数组中 | 用户答题所用时间可以正常记录 | 正常,与预期结果一致 |
2 | 次数 | 将用户答题所用的正确次数保存 | 用户答题的正确次数可以正常记录 | 正常,与预期结果一致 |
3 | 所得成绩 | 用户答题正确次数*10 | 用户所得成绩可以根据正确次数进行准确计算 | 正常,与预期结果一致 |
算术运算测试模块主要是针对用户的操作,从测试结果中可以看出该模块的所有功能均能正常实现,且测试结果与预期结果一致。
二、猜数游戏模块
在猜数游戏模块中主要对时间、次数进行测试,测试结果如表5-2所示
表5-2 猜数游戏模块
编号 | 测试功能 | 输入描述 | 预期结果 | 运行结果 |
1 | 时间 | 将用户猜数过程中所使用的时间放在数组中 | 用户所猜数字所用时间可以正常记录 | 正常,与预期结果一致 |
2 | 次数 | 将用户猜数过程中所用的次数保存 | 用户猜数过程中所用的次数可以正常记录 | 正常,与预期结果一致 |
猜数游戏测试模块主要是针对用户的操作,从测试结果中可以看出该模块的所有功能均能正常实现,且测试结果与预期结果一致。
6 结论和心得
结论:项目一对算数运算和猜数游戏进行设计,实现了对随机运算的处理和对随机数的猜测,运行结果与预期一致,程序能够正常运行,并且能够达到预期效果。
心得:通过此次项目一,将以前在课本上学到的知识结合了起来,项目一时间紧迫,没有时间很好的掌握GUI或数据库知识,没有很好的将其运用在项目一中。但也对以前所学的知识点进行了复习,并且在这个过程中也掌握了一些以前学习过程中不是很了解的知识。以后会更加努力,尽早掌握GUI或数据库相关知识,扩宽视野。