springboot 实现积分计算和猜数字游戏

springboot 实现积分计算和猜数字游戏

本内容代码已提交到git上
https://github.com/2325616550/springBoot_jibite.git
git地址

一、目的
掌握Servlet编程,包括Servlet处理请求与响应,会话Session机制,熟悉Eclipse/MyEclipse开发Java Web应用框架。

二、实验内容与设计思想
1.设计思路
1、求函数y=x*e-x在区间[a,b]上的定积分值,其中a,b由页面表单传入(即使用参数传递),并假定a小于b。要求使用数值方法求得定积分值的近似值(不能使用定积分公式来计算),常用的近似求法有:矩形法、梯形法、抛物线法,任意选择一种或多种实现均可,详见附件。
本题要求使用迭代法实现定积分值的近似计算。
2、使用Session实现“猜数字游戏”。猜数字是一个简单的游戏,标准游戏规则如下:
通常由两个人玩,一方出数字,一方猜。出数字的人要想好一个没有重复数字的4位数,不能让猜的人知道。猜的人就可以开始猜。每猜一个数字,出数者就要根据这个数字给出几A几B,其中A前面的数字表示位置正确的数的个数,而B前的数字表示数字正确而位置不对的数的个数。
如正确答案为 5234,而猜的人猜 5346,则是 1A2B,其中有一个5的位置对了,记为1A,而3和4这两个数字对了,而位置没对,因此记为 2B,合起来就是 1A2B。
接着猜的人再根据出题者的几A几B继续猜,直到猜中(即 4A0B)为止。
本题要求计算机模拟出数字的一方(4位数字不能重复),并提供Web页面让游戏者猜测,同时根据比对结果给出相应的提示。一旦用户猜中数字,则显示成功信息,并给出答案及游戏者猜测的次数。

2.主要数据结构

@Service
public class NumberGameServiceImpl implements NumberGameService {
    private int answer;

    public int getAnswer() {
        return answer;
    }

    public void setAnswer(int answer) {
        this.answer = answer;
    }

    public List<Integer> getResult(int input){
        List<Integer> result=new ArrayList<>(2); //0-A 1-B
        int numOfA=0,numOfB=0;
        result.add(numOfA);
        result.add(numOfB);
        int correctNumber,answerNumber;
        for (int i = 3; i >=0; i--) {
            correctNumber = (int) (answer/pow(10,i)%10);
            answerNumber = (int) (input/pow(10,i)%10);
//            System.out.println(i + "---->" + correctNumber + "---->" + answerNumber);
            if(correctNumber==answerNumber) {
                numOfA++;
                result.set(0,numOfA);
            } else{
                for (int j = 0; j <=3; j++) {
                    if(j==i)
                        continue;
                    else{
                        correctNumber = (int) (answer/pow(10,j)%10);
                        if(answerNumber==correctNumber){
                            numOfB++;
                            result.set(1,numOfB);
                            break;
                        }
                    }
                }
            }
        }
        return result;
    }
}

上图是猜数字游戏的
属性就一个int整数 是指要猜的正确答案
然后一个获得猜测结果的方法,接口传入玩家猜测的数字
3.主要代码结构
在这里插入图片描述

3个controller 用来处理1.积分2.猜数字的业务3.页面的跳转
1个service 用来写获得猜测结果的逻辑
4.主要代码段分析

 @RequestMapping("setNumber")
    public void setNumber(HttpServletRequest req){
        HttpSession session = req.getSession();
        StringBuilder num = new StringBuilder();
        int correctNum;
        int a;
        while (true) {
            a = (int)(10*Math.random());
            //第一位不能为0
            if(num.length()<1){
                while(true) {
                    if (a == 0) {
                        a = (int) (10 * Math.random());
                    } else {
                        break;
                    }
                }
            }
            //检查重复
            boolean isRepeat;
            while(true){
                isRepeat = false;
                for (int i=0; i<num.length();i++) {
                    if (num.charAt(i)==(a+'0')) {
                        a = (int) (10 * Math.random());
                        isRepeat=true;
                        break;
                    }
                }
                if(!isRepeat)
                    break;
            }
            num.append(a);
            if(num.length()>3)
                break;
        }
        correctNum=Integer.parseInt( num.toString());
        session.setAttribute("correctNumber",correctNum);
        System.out.println(session.getAttribute("correctNumber"));
    }

这个方法处理的是设置正确答案的业务。
因为数字不能重复,就单独每一位随机再和之前已经获得的数字进行比较 如若相同就继续随机直至都不同。这里要注意下第一位数字不能为0.
2.

   @RequestMapping("integration")
        public double getIntegration(String parm){
                //x*e-x
                Map<String,String> map ;
                double x,a,b;
                double y=0.0;
                List<Object> json =JSON.parseArray(parm);
                String idea=json.get(0).toString();
                Gson gson = new Gson();
                map = gson.fromJson(idea, new TypeToken<HashMap<String,String>>(){}.getType());
                String valueOfA = map.get("value");
                a=Double.parseDouble(valueOfA);
                idea=json.get(1).toString();
                map = gson.fromJson(idea, new TypeToken<HashMap<String,String>>(){}.getType());
                String valueOfB = map.get("value");
                b=Double.parseDouble(valueOfB);
                double eps = 0.0001;
                int n = 512;   //初始分割
                double step = (b - a) / n;
                double s1,s2,diff;
                s1=0.0;
                for (int i = 0; i < n; i++)
                {
                        s1 += func(a + step * i)*step;   //计算初始面积
                }
                do
                {
                        n = 2 * n;    //分割加倍
                        s2=s1/2;
                        step = (b - a) / n;
                        for (int i = 1; i < n; i+=2) {
                                s2+=func(a + step * i)*step;
                        }
                        diff = (s1 - s2)>0?(s1-s2):(s2-s1);      //计算两次迭代的结果差值
                        s1 = s2; //更新迭代变量
                } while (diff >= eps);
                return s1;
        }

这个是处理积分功能的,通过前端将表单数据序列化传回后端,处理积分用的是迭代求法。
三、实验使用环境
IDEA开发和Spring Boot框架

四、实验步骤和调试过程
1.实验步骤
(1).先将前端页面写好,这里用的是ajax局部刷新来处理本次实验要求的功能。
前端页面展示:
在这里插入图片描述

(2).编写后台代码和脚本,启动运行
2.测试数据设计
(1).页面中两个按钮都绑定了单机事件,点击会触发ajax局部刷新页面。点击后的页面:
在这里插入图片描述

(2).处理积分的数据设计
可能会出现1.积分上下限大小不对,2.没填数据就点确定,3.有填入空格,4.数字中混了字母等可能意外的情况。这些都有写脚本用正则表达式去检验。
(3).猜数字的数据设计
可能会出现1.没填数据就点确认,2.有填入空格,3.没填满4位数字,4.多填数字等可能出现意外的情况。这些也都有考虑到并进行了校验。
3.测试结果分析。
(1).积分的数据处理结果
1.什么都不填或其中有没填

2.出现填入不能表示数据的字符

3.出现填写了空格

4.错误的上下限

5.正确的情况

(2).猜数字的数据结果
1.什么都不填或没填满4位数

2.出现了非数字的字符

3.由于在输入标签中加入了 ,则解决了输入可能超过4位数的情况
4,正常的情况
1).在设置正确数字的代码中添加一行将正确数字打印到控制台,我们可以发现我们本次要猜的数字。
2).第一次我们输入0A0B的情况
3).第二次我们输入1A1B的情况
4).第三次我们输入正确的情况

五、实验小结
1.实验中产生的错误及原因分析
实验中的猜数字游戏中的模态框出现过点击空白区就消失的情况,后来查询资料是要加一个 backdrop : ‘static’ 属性,其中 ,backdrop:’static’ 指的是点击背景空白处不被关闭。
2.实验体会和收获。
Servlet 是运行在服务器上的一个 java 小程序, 它可以接收客户端发送过来的请求, 并响应数据给客户端。

六、附录
可线上验证本次实验:http://39.100.64.245/springboot/smallFeature
部署的远程服务

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值