程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> JAVA綜合教程 >> 好玩的快速擊鍵項目,好玩擊鍵項目

好玩的快速擊鍵項目,好玩擊鍵項目

編輯:JAVA綜合教程

好玩的快速擊鍵項目,好玩擊鍵項目


      今天做了一個很有意思的項目,叫快速擊鍵,這個項目他主要考察的就是:面向對象設計的思想, 類的封裝, 構造方法的使用, this、static關鍵字的使用

 一.項目需求:

   根據輸入的速率和正確率將玩家分為不同級別,級別越高,一次顯示的字符數越多,玩家正確輸入一次的得分也越高。如果玩家在規定的時間內完成規定次數的輸入,正確率達到規定標准,則玩家升級(在這裡規定只要錯誤輸入一次,則游戲結束)。玩家最高級為6級,初始級別一律為一級。

運行效果圖:

二.分析需求:

01.發現類:

    玩家類(Player),游戲類(Game),級別類(Level),LevelParam(保存每一個級別的參數信息)

02.發現類中的屬性:

   玩家類(Player)的屬性:

levelNo:玩家當前級別號,currScore:玩家當前級別積分,startTime:玩家當前級別開始時間,elapsedTime 當前級別已用時間

   級別類(Level)的屬性:

 levelNo:各級別編號,strLength各級別一次輸入字符串的長度,strTime各級別輸出字符串的次數,timeLimit各級別闖關的時間限制,perScore各級別正確輸入一次的得分。

 游戲類(Game):既然是玩游戲,肯定有玩家,所以在游戲類中要添加一個玩家的屬性player;

03.發現類的方法

   玩家類(Player)的方法:play();

  游戲類(Game)的方法:

String printStr(),輸出字符串,返回字符串用於和玩家的輸入進行比較。

void printResult(String out,String in)比較輸出out和玩家輸入in

三.實現功能:

第一步我們要形成這個項目的一個整體框架。

Level類:

package cn.hyj.quickhit;

/**
 * 級別類
 * 
 * @author HYJ
 * 
 */
public class Level {
    private int levelNo;// 各級別編號
    private int strLength;// 各級別一次輸出字符串的長度
    private int strTimes;// 各級別輸出字符串的次數
    private int timeLimit;// 各級別闖關的時間限制
    private int perScore;// 各級別正確輸入一次的得分

    public Level() {
        super();
        // TODO Auto-generated constructor stub
    }

    public Level(int levelNo, int strLength, int strTimes, int timeLimit,
            int perScore) {
        super();
        this.levelNo = levelNo;
        this.strLength = strLength;
        this.strTimes = strTimes;
        this.timeLimit = timeLimit;
        this.perScore = perScore;
    }

    public int getLevelNo() {
        return levelNo;
    }

    public void setLevelNo(int levelNo) {
        this.levelNo = levelNo;
    }

    public int getStrLength() {
        return strLength;
    }

    public void setStrLength(int strLength) {
        this.strLength = strLength;
    }

    public int getStrTimes() {
        return strTimes;
    }

    public void setStrTimes(int strTimes) {
        this.strTimes = strTimes;
    }

    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;
    }

}

LevelParam類:

package cn.hyj.quickhit;

//存放級別的屬性
public class LevelParam {
    // 定義級別類型數組保存級別信息
    public static final Level[] levels = new Level[6];
    // 靜態代碼塊給數組賦初值
    static {
        levels[0] = new Level(1, 2, 5, 60, 1);
        levels[1] = new Level(2, 3, 6, 60, 2);
        levels[2] = new Level(3, 4, 7, 60, 5);
        levels[3] = new Level(4, 5, 8, 60, 8);
        levels[4] = new Level(5, 6, 9, 60, 10);
        levels[5] = new Level(6, 7, 10, 60, 15);
    }

}

 

Game類:

package cn.hyj.quickhit;

import java.util.Random;

/**
 * 游戲類
 * 
 * @author HYJ
 * 
 */
public class Game {
    Player play;// 代表玩家
    /**
     * 無參構造
     */
    public Game() {
    }

    public Game(Player plays) {
        play = plays;
    }
    /**
     * 生成字符串
     */
    public String getStr() {
        // 獲取級別對應的要輸出字符串的長度
        int strLength = LevelParam.levels[play.getLevelNo() - 1].getStrLength();
        StringBuffer str = new StringBuffer();
        // 實例化生成隨機數的對象
        Random rd = new Random();
        // 通過循環輸出要生成的字符串
        for (int i = 0; i < strLength; i++) {
            // 產生隨機數
            int random = rd.nextInt(strLength);
            switch (random) {
            case 0:
                str.append(">");
                break;
            case 1:
                str.append("<");
                break;
            case 2:
                str.append("*");
                break;
            case 3:
                str.append("&");
                break;
            case 4:
                str.append("#");
                break;
            case 5:
                str.append("@");
                break;
            }

        }
        // 輸出字符串
        System.out.println(str);
        // 返回該字符串的值,用於和用戶輸入字符串的值作比較
        return str.toString();
    }

    /**
     * 系統給的字符串和用戶輸入的字符串作對比
     * 
     * @param outstr
     *            系統輸出的字符串
     * @param instr
     *            用戶輸入的字符串
     */
    public void strThesame(String outstr, String instr) {
        Boolean flag = false;// 定義標記默認不同
        if (outstr.equals(instr)) {
            // 證明兩個字符串相同
            flag = true;// 改變標記
        } else {
            System.out.println("輸入錯誤,退出!");
            System.exit(0);
        }
        /**
         * 如果輸入正確則會出現兩種情況 01.如果超時,則直接輸出錯誤信息並退出程序 02.如果沒有超時: 計算玩家當前積分 計算玩家已用時間
         * 輸出玩家當前級別,當前積分和已用時間 判斷用戶是否已經闖過最後一關
         * */
        if (flag) {
            long currentTime = System.currentTimeMillis(); // 返回以毫秒為單位的當前時間
            // 如果超時的情況
            if (LevelParam.levels[play.getLevelNo() - 1].getTimeLimit() < (currentTime - play
                    .getStartTime()) / 1000) {
                System.out.println("你輸入太慢了,已經超時,退出!");
                System.exit(0);
            }
            // 如果沒有超時的情況
            else {
                // 計算玩家當前積分
                play.setCurrScore(play.getCurrScore()
                        + LevelParam.levels[play.getLevelNo() - 1]
                                .getPerScore());
                // 計算玩家已用時間
                play.setEndTime((int) (currentTime - play.getStartTime()) / 1000);
                // 輸出玩家當前級別,當前積分和已用時間
                System.out.println("輸入正確,您的級別" + play.getLevelNo() + ",您的積分"
                        + play.getCurrScore() + ",已用時間" + play.getEndTime()
                        + "秒。");

            }
        }
    }

}

Player類:

package cn.hyj.quickhit;

import java.util.Scanner;

/**
 * 玩家類
 * 
 * @author HYJ
 * 
 */
public class Player {
    private int levelNo;// 玩家當前級別號
    private int currScore;// 玩家當前積分
    private long startTime;// 當前玩家級別的開始時間
    private int endTime;// 當前玩家級別的已用時間

    /**
     * 玩家玩游戲的方法
     */
    public void play() {
        // 調用游戲類的帶參構造傳入玩家對象
        Game game = new Game(this);
        Scanner input = new Scanner(System.in);
        // 外層循環每循環一次讓等級加一
        for (int i = 0; i < LevelParam.levels.length; i++) {
            // 讓玩家級別加一
            this.levelNo += 1;
            // 升級後積分清零,計時清零
            this.setCurrScore(0);
            this.setStartTime(System.currentTimeMillis());
            if (this.levelNo == 6) {
                System.out.println("高手,恭喜已通關!");
                break;
            }
            // 內層循環控制用戶輸入的字符串和系統的字符串作比較
            for (int j = 0; j < LevelParam.levels[levelNo - 1].getStrTimes(); j++) {
                // 游戲輸出字符串
                String outstr = game.getStr();
                // 調用game類的方法比較兩個字符串是否相同
                // 接收用戶輸入的字符串
                String instr = input.next();
                game.strThesame(outstr, instr);

            }
        }

    }

    public Player() {
        super();
        // TODO Auto-generated constructor stub
    }

    public Player(int levelNo, int currScore, long startTime, int endTime) {
        super();
        this.levelNo = levelNo;
        this.currScore = currScore;
        this.startTime = startTime;
        this.endTime = endTime;
    }

    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 getEndTime() {
        return endTime;
    }

    public void setEndTime(int endTime) {
        this.endTime = endTime;
    }

}

測試:

package cn.hyj.quickhit;

public class Test {

    /**
     * @param args
     */
    public static void main(String[] args) {
//實例化玩家對象 Player player = new Player(); //調用玩家玩游戲的方法
player.play(); } }

 

 

 

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved