2021-06-30

 

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:\\学生成绩排行榜.txtd://猜数.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或数据库相关知识,扩宽视野。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值