java猜价格(优化)

使用float类型让价格更加精确,价格要产生两位的小数

float在定义赋初值的时候,后面跟上一个f 

但是一般的float类型需要格式化,printf或者String.format

 System.out.printf("%.3f",d);

或者String.format(“%.3f”,d)

这里.3f表示小数位数是3位,这里的3可以换成0,换成0就没有小数,默认去掉后面的位数使用四舍五入的方法。

import java.util.Scanner;
public class cjg {
    public static void main(String[] args) {
        //定义全局变量,username玩家参与名字,plan_price系统产生的价格
        String username;
        //float类型赋初值尾部一定要加上f,不然小数会报错
        float plan_price=0.00f;
        //定义菜单
        System.out.println("----------------------------");
        System.out.println(" 游戏: 幸运价格猜猜猜");
        System.out.println("                 作者:XXXXX");
        System.out.println("                 版本:v1.1");
        System.out.println("----------------------------");
        //显示欢迎界面,当用户敲入回车,进入用户的用户名输入
        //这里的回车需要Scanner
        Scanner scanner = new Scanner(System.in);
        //先接收回车,在这步用户敲任何数据都不接收,这句没有接收,原因用户敲任何内容不需要保存
        scanner.nextLine();
        //敲入回车后,才开始进行游戏的进行,输入用户名
        System.out.println("请输入用户名字");
        //这里username全局变量是需要接收的
        username=scanner.next();
        //接收完之后
        System.out.println(username+",欢迎进入游戏空间,现在请选择的价格猜猜猜商品的类别");
        //输出类别
        System.out.println("***********************");
        System.out.println("1------家电(1000-2000)");
        System.out.println("2------文具(1-100)");
        System.out.println("***********************");
        //接收用户输入1或2,防止用户输入其它内容报错,这里不用nextInt,还使用next
        String user_choice=scanner.next();
        //用户的user_choice内容输入后,只有1和2进行响应,其它天马行空的价格
        //条件语句有确定值用switch
        switch(user_choice){
            case "1":
                //只能产生整数,不需要round,经过round计算后是double类型,当前plan_price也不是两位小数
                //需要用到格式化的方法,先把Math.random()*1000+1000变成字符串,字符串转化成%f,保留两位小数
                //这里先产生一个临时的字符串,可以调用String.format,使用%.2f
                String tmp_price=String.format("%.2f",Math.random()*1000+1000);
                //之后再把tmp_price转化成float类型,不同类型之间转换调用类型的大写.parse类型
                plan_price=Float.parseFloat(tmp_price);
//                System.out.println(plan_price);
                break;
            case "2":
                //先定义一个临时变量,格式化字符串两位小数
                tmp_price=String.format("%.2f",Math.random()*99+1);
                //再使用Float.parseFloat不同类型之间转化方法转化成float类型
                plan_price=Float.parseFloat(tmp_price);
//                System.out.println(plan_price);
                break;
            default:
                //先定义一个临时变量,格式化字符串两位小数
                tmp_price=String.format("%.2f",Math.random()*10000);
                //再使用Float.parseFloat不同类型之间转化方法转化成float类型
                plan_price=Float.parseFloat(tmp_price);
        }
        //做用户输入价格的提示
        System.out.println("请用户输入猜猜猜的价格:");
        //用户猜数字,输入价格和判断是重复的步骤,while猜对,还有一个变量用户输入价格
//        float user_price=scanner.nextFloat();
        //nextFloat可能造成程序异常退出,使用next接收不会报错
        //只要用户输错了价格,你就不停使用下面这一句,使用循环.(分辩有限次,还是无限次)无限次使用while
        //while条件是tmp_user_price能够匹配到价格格式
        String tmp_user_price=scanner.next();
        //注意while里面匹配小数的正则,不匹配取非(!)
        while(!tmp_user_price.matches("^[0-9]+(.[0-9]{1,2})?$")){
            System.out.println("你输入的价格有问题,请检查输入价格:");
            tmp_user_price=scanner.next();
        }
        //直到输入正常退出循环
        float user_price=Float.parseFloat(tmp_user_price);
//        //这个tmp_user_price中有a,b,c或者除了点的其它符号就会退出
//        //达到效果,需要使用正则表达式,matches匹配正则表达,搜索正则表达匹配小数
//        //这里的if条件当不停地做用户价格输入,这个条件判断就是循环的条件
//        if(){
//        }else{
//        }
        //设定一个最终输出不同信息的标志位
        boolean flag=false;
        //考虑一下,用户在while没有出来过,做一个规定,如果用户输入0或者负数,直接退出猜价格
        while(!(user_price==plan_price)){
            //进入到循环中,如果用户输入0或者负数,直接退出循环
            //这里的user_price是一个区间段,只能用if
            if(user_price<=0) {
                //没有完成,放弃了,flag=true
                flag=true;
                //退出循环程序使用break
                break;
            }
            //进入循环的条件没有等于,else中的意义:除了大于就是小于
            if(user_price>plan_price){
                System.out.println("猜大了");
            }else{
                System.out.println("猜小了");
            }
            //循环继续猜
//            user_price=scanner.nextFloat();
            //这里的nextFloat也报错,用前面的nextFloat逻辑来替换
            tmp_user_price=scanner.next();
            //注意while里面匹配小数的正则,不匹配取非(!)
            while(!tmp_user_price.matches("^[0-9]+(.[0-9]{1,2})?$")){
                System.out.println("你输入的价格有问题,请检查输入价格:");
                tmp_user_price=scanner.next();
            }
            //直到输入正常退出循环
            user_price=Float.parseFloat(tmp_user_price);
        }
        //最后输出用户到底是猜出来的还是没有猜出来的,猜出来的输出“你真聪明”,猜不出来“再接再励”。
        if(flag){
            System.out.println("再接再励");
        }else{
            System.out.println("你真聪明");
        }
        //程序最后往往会留下一些建议内容
        System.out.println("对本系统的使用有什么宝贵意见,可以联系作者或者email");
    }
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值