QuickHit项目——Java实现

简介: QuickHit项目——Java实现

文章目录


项目分析


QuickHit 游戏考验你键盘输入的速度和准确性。


根据输入速度和正确率将玩家分为不同级别,级别越高,一次显示的字符数就越多,玩家

正确输入一次的得分也越高。如果玩家在规定时间内完成规定次数的输入,正确率达到

规定要求,则玩家升级(为了简单起见,规定用户错误输入一次,游戏结束)。


玩家最高级别为六级,初始级别一律为一级


QuickHit游戏的设计主要是面向对象的程序设计,用到了抽象,封装,继承和多态。


在做这道题的时候,首先你得理清楚它的思路,比如说它涉及到了对象,对象的属性,实现的方法等等。


代码实现


玩家类

package cn.kgc.kb03.quickhit;
/**
 * @作者:BeiisBei
 * @时间:2019/9/3
 * @目的:
 */
import java.util.Scanner;
    //玩家类
    public class Player {
        private int levelNo;  //玩家当前级别
        private int currScore;  //玩家当前积分
        private long startTime;  //玩家当前开始时间
        private int elapsedTime;  //当前级别已用时间
        public int getLevelNo() {
            return levelNo;
        }
        public void setLevelNo(int levelNo) {
            this.levelNo = levelNo;
        }
        public int getCurrScore() {
            return currScore;
        }
        public void setCurrScore(int currScore) {
            this.currScore = currScore;
        }
        public long getStartTime() {
            return startTime;
        }
        public void setStartTime(long startTime) {
            this.startTime = startTime;
        }
        public int getElapsedTime() {
            return elapsedTime;
        }
        public void setElapsedTime(int elapsedTime) {
            this.elapsedTime = elapsedTime;
        }
    /**
     * 玩家类的方法play()
     * 玩家玩游戏
     */
    public void play() {
        Scanner input=new Scanner(System.in);
        Game game=new Game(this); //this--->指当前对象的引用,传入的值是当前Player类(现在没创建对象)以后创建对象的引用。
        //外层循环一次,等级加1
        for(int i = 0; i<LevelParam.levels.length; i++) {
            //等级加1
            this.levelNo+=1;
            //积分清0
            this.currScore=0;
            //计时清0
            this.startTime=System.currentTimeMillis();
            //获得每个级别对应的字符串输入字数
            int strLength=LevelParam.levels[levelNo-1].getStrTime();
            //内层循环一次,判断玩家输入的字符串
            for(int k=0;k<strLength;k++) {
                //游戏输出字符串
                String out=game.printStr();
                //玩家输入
                String in=input.next();
                //判断玩家输入的字符串,并输出相应结果
                game.printResult(out, in);
            }
        }
    }
}


游戏类

package cn.kgc.kb03.quickhit;
/**
 * @作者:
 * @时间:2019/9/3
 * @目的:
 */
import java.util.*;
//游戏类
public class Game {
    public Player play; //玩家
    /***
     * 构造方法 
     */  
    public Game(Player play) {
        this.play = play;
    }
    /***
     * 生成字符串,输出字符串,返回字符串用于和玩家的输入进行比较
     * @return
     */
    public String printStr() {
        StringBuffer sbu=new StringBuffer();  //StringBuffer类,字符串缓冲区,添加字符串
        Random rand=new Random();  //产生随机数类
        //根据相应的等级,来获得相应的输入次数
        int strLength=LevelParam.levels[play.getLevelNo()-1].getStrLength();
        for(int i=0;i<strLength;i++) {
            int randNum=rand.nextInt(strLength);  //产生随机数
            switch(randNum) {
                case 0:
                    sbu.append(">");       //append方法的作用是在一个StringBuffer对象后面追加字符串
                    break;
                case 1:
                    sbu.append("<");
                    break;
                case 2:
                    sbu.append("!");
                    break;
                case 3:
                    sbu.append("#");
                    break;
                case 4:
                    sbu.append("@");
                    break;
                case 5:
                    sbu.append("%");
                    break;
                case 6:
                    sbu.append("&");
                    break;
                case 7:
                    sbu.append("*");
                    break;
                case 8:
                    sbu.append("~");
                    break;
                case 9:
                    sbu.append("?");
                    break;
            }
        }
        System.out.println(sbu);    //输出字符串
        return sbu.toString();  //返回字符串
    }
    /**
     * 比较游戏输出out,和玩家输入in,根据比较结果输出相应信息
     *
     */
    public void printResult(String out, String in) {
        //输入正确
        if(out.equals(in)) {
            //system.currentTimeMillis()的作用是返回当前的计算机时间,时间的表达格式为当前计算机时间和GMT时间(格林威治时间)1970年1月1号0时0分0秒所差的毫秒数。
            long currentTime=System.currentTimeMillis();
            //如果超时
            if((currentTime-play.getStartTime())/1000>LevelParam.levels[play.getLevelNo()-1].getTimeLimit()) {
                System.out.println("你输入的太慢了,已经超时,退出!");
                System.exit(1);
            }
            //如果没有超时
            //计算玩家当前的积分
            play.setCurrScore(play.getCurrScore()+LevelParam.levels[play.getLevelNo()-1].getPerScore());
            //计算已用时间
            play.setElapsedTime((int)(currentTime-play.getStartTime())/1000);
            //输出玩家当前级别,当前积分,已用时间
            System.out.println("输入正确,你的级别是:"+play.getLevelNo()+",你的积分是:"+play.getCurrScore()+",已用时间:"+play.getElapsedTime()+"秒!");
            //判断用户是否已经闯过最后一关:等级为6,玩家获得的积分==通过所需要的分数(次数*每次的分数)
            if(play.getLevelNo()==6) {
                //获得通关所需要的分数
                int score=LevelParam.levels[play.getLevelNo()-1].getPerScore()*LevelParam.levels[play.getLevelNo()-1].getStrTime();
                if(score==play.getCurrScore()) {
                    System.out.println("恭喜你,通关了~");
                    System.exit(0);
                }
            }
        }else {
            //输入错误
            System.out.println("输入错误,退出!");
            System.exit(1);
        }
    }
}


级别类

package cn.kgc.kb03.quickhit;
/**
 * @作者:
 * @时间:2019/9/3
 * @目的:
 */
//级别类
public class Level {
    private int levleNo;  //各级别编号
    private int strLength;  //各级别一次输出字符串长度
    private int strTime;  //各级别输出字符串的次数
    private int timeLimit;  //各级别闯关时间限制
    private int perScore;  //各级别输入正确一次的得分
    public int getLevleNo() {
        return levleNo;
    }
    public void setLevleNo(int levleNo) {
        this.levleNo = levleNo;
    }
    public int getStrLength() {
        return strLength;
    }
    public void setStrLength(int strLength) {
        this.strLength = strLength;
    }
    public int getStrTime() {
        return strTime;
    }
    public void setStrTime(int strTime) {
        this.strTime = strTime;
    }
    public int getTimeLimit() {
        return timeLimit;
    }
    public void setTimeLimit(int timeLimit) {
        this.timeLimit = timeLimit;
    }
    public int getPerScore() {
        return perScore;
    }
    public void setPerScore(int perScore) {
        this.perScore = perScore;
    }
    public Level(int levleNo, int strLength, int strTime, int timeLimit, int perScore) {
        super();
        this.levleNo = levleNo;
        this.strLength = strLength;
        this.strTime = strTime;
        this.timeLimit = timeLimit;
        this.perScore = perScore;
    }
}


玩家级别参数类

package cn.kgc.kb03.quickhit;
/**
 * @作者:
 * @时间:2019/9/3
 * @目的:
 */
//玩家级别参数类
public class LevelParam {
    //对应玩游戏的6个级别
    public final static  Level levels[]=new Level[6];   //static属性属于该类所有,既由该类创建的所有对象共用同一个static属性。
    //static代码块的用法:当类被载入时,静态代码块被执行,且只被执行一次,静态块常用来执行类属性的初始化。
    static {
        levels[0]=new Level(1,2,6,56,1);
        levels[1]=new Level(2,3,5,56,2);
        levels[2]=new Level(3,4,4,46,5);
        levels[3]=new Level(4,5,3,36,8);
        levels[4]=new Level(5,6,2,26,10);
        levels[5]=new Level(6,7,1,16,15);
    }
}


测试类

package cn.kgc.kb03.quickhit;
/**
 * @作者:
 * @时间:2019/9/3
 * @目的:
 */
//测试类
public class Test {
    public static void main(String[] args) {
        Player p = new Player();
        p.play();
    }
}


项目总结


1.类继承的注意点:类的构造方法是不可以被继承的;虽然不能继承构造方法,但是我们可以 在子类的构造方法中 通过关键字 super 来调用到 父类的构造方法


2.构造方法一旦程序员自己给定了,那么jvm不再提供默认的 无参构造方法;


3.abstract关键字的注意点:


(1)不可以和final关键字一起使用,因为abstract关键字 是要求子类一定要重写父类的方法,但是final是不允许重写的;


(2)不可以和private关键字一起使用,因为private是私有的,不能被继承的内容,代表根本不存在方法重写,因此不能一起使用;


(3)不可以和static一起使用,因为static是静态修饰符,代表不需要实例化对象,直接用类名就可以调用方法, 那么如果是抽象方法,没有方法实现调用方法会出错,所以编译 器禁止 abstract和static一起使用


4.多态的三要素:


(1)一定要有继承


(2)一定要重写


(3)父类的指针,指向子类的对象。


目录
相关文章
|
2月前
|
IDE 安全 Java
Lombok 在企业级 Java 项目中的隐性成本:便利背后的取舍之道
Lombok虽能简化Java代码,但其“魔法”特性易破坏封装、影响可维护性,隐藏调试难题,且与JPA等框架存在兼容风险。企业级项目应优先考虑IDE生成、Java Records或MapStruct等更透明、稳健的替代方案,平衡开发效率与系统长期稳定性。
174 1
|
2月前
|
存储 小程序 Java
热门小程序源码合集:微信抖音小程序源码支持PHP/Java/uni-app完整项目实践指南
小程序已成为企业获客与开发者创业的重要载体。本文详解PHP、Java、uni-app三大技术栈在电商、工具、服务类小程序中的源码应用,提供从开发到部署的全流程指南,并分享选型避坑与商业化落地策略,助力开发者高效构建稳定可扩展项目。
|
2月前
|
安全 Java API
Java Web 在线商城项目最新技术实操指南帮助开发者高效完成商城项目开发
本项目基于Spring Boot 3.2与Vue 3构建现代化在线商城,涵盖技术选型、核心功能实现、安全控制与容器化部署,助开发者掌握最新Java Web全栈开发实践。
361 1
|
3月前
|
前端开发 Java API
2025 年 Java 全栈从环境搭建到项目上线实操全流程指南:Java 全栈最新实操指南(2025 版)
本指南涵盖2025年Java全栈开发核心技术,从JDK 21环境搭建、Spring Boot 3.3实战、React前端集成到Docker容器化部署,结合最新特性与实操流程,助力构建高效企业级应用。
1166 1
|
3月前
|
JavaScript Java 微服务
现代化 Java Web 在线商城项目技术方案与实战开发流程及核心功能实现详解
本项目基于Spring Boot 3与Vue 3构建现代化在线商城系统,采用微服务架构,整合Spring Cloud、Redis、MySQL等技术,涵盖用户认证、商品管理、购物车功能,并支持Docker容器化部署与Kubernetes编排。提供完整CI/CD流程,助力高效开发与扩展。
483 64
|
4月前
|
安全 JavaScript Java
java Web 项目完整案例实操指南包含从搭建到部署的详细步骤及热门长尾关键词解析的实操指南
本项目为一个完整的JavaWeb应用案例,采用Spring Boot 3、Vue 3、MySQL、Redis等最新技术栈,涵盖前后端分离架构设计、RESTful API开发、JWT安全认证、Docker容器化部署等内容,适合掌握企业级Web项目全流程开发与部署。
321 0
|
4月前
|
人工智能 安全 Java
掌握Java反射:在项目中高效应用反射机制
Java反射是一种强大功能,允许程序在运行时动态获取类信息、创建对象、调用方法和访问字段,提升程序灵活性。它在框架开发、动态代理、注解处理等场景中广泛应用,如Spring和Hibernate。但反射也存在性能开销、安全风险和代码复杂性,应谨慎使用。
125 0
|
4月前
|
安全 Java 测试技术
Java 大学期末实操项目在线图书管理系统开发实例及关键技术解析实操项目
本项目基于Spring Boot 3.0与Java 17,实现在线图书管理系统,涵盖CRUD操作、RESTful API、安全认证及单元测试,助力学生掌握现代Java开发核心技能。
217 0
|
4月前
|
缓存 Java 数据库
Java 项目分层架构实操指南及长尾关键词优化方案
本指南详解基于Spring Boot与Spring Cloud的Java微服务分层架构,以用户管理系统为例,涵盖技术选型、核心代码实现、服务治理及部署实践,助力掌握现代化Java企业级开发方案。
219 2
下一篇
oss云网关配置