JavaSE面向對象--QuickHit

面向對象的三大特性已經學習完了,自我感覺不是很好,許多地方的知識點運用的不夠熟練,甚至有一些知識點很是模棱兩可,不知道如何正確的運用,對於這次QuickHit項目,自我感覺最難的是時間戳和字符串,因爲之前就對字符串不夠熟悉,導致現在的這種情況,還有對於主方法中對象的不同使用,r容易混淆。

現在總結一下這個項目的感受和自我感覺的難點:
對於這個題的分析和和解題思路,因爲PDF文檔已經解釋的很清晰明瞭,所以不再進行一個分析,這裏最主要的是總結裏面的代碼。

1.定義的一個玩家類:這個類主要儲存了玩家的級別,時間,和玩家玩兒遊戲升級的方法

package com.QuickHit;
import java.util.*;
public class Player {
//當前級別
private int  levelNo;
//級別積分
private int score;
//開始時間
private long startTime;
//已用時間
private long elapseTime;
義方法
    //setter
    public void setLeveNo(int leveNo){
        this.levelNo = leveNo;
    }
    public void setScore(int score){
        this.score = score;
    }   
    public void setStartTime(long time){
        this.startTime = startTime;
    }
    public void setElapseTime(){
        this.elapseTime = elapseTime;
    }
    //getter
    public int getLeveNo(){
        return levelNo;
    }
    public int getScore(){
        return score;
    }
    public long getStartTime(){
        return startTime;
    }
    public long getElapseTime(){
        return elapseTime;
    }

    //玩家玩遊戲的方法
    public void play(){
        //首先開始的一局遊戲,
        Game game = new Game(this);
        //創建一個輸入的對象
        Scanner input = new Scanner(System.in);
        //創建循環玩遊戲的方法,外層循環一次代表升級一次,一共六級,當創建Stringbuffer 對象時,就已經在堆區創建了一個空間,這個時候空間的值是空的,當傳入值是纔會有相對應的內容。
        for (int i = 0; i < LevelInitial.levelsArr.length; i++) {
            //玩家升級一次
            levelNo += 1;  
            //獲取遊戲開始時間,就是獲取到當前時間
            startTime = System.currentTimeMillis();
            //內循環,循環一次代表完成了一個等級的遊戲
            for (int j = 0; j < LevelInitial.levelsArr[levelNo - 1].getStrTime(); j++) {
                //生成的字符串
                String out = game.printStr();
                //玩家輸入相應字符串
                String in = input.next();
                //生成的字符串個輸入的字符串比較結果
                game.result(out,in);
            }
        }
    }

}

這一段代碼前半部分是很簡單的,就是對一個類的封裝和提供的一個接口訪問,後面的玩家玩遊戲的方法可能會難一點,因爲涉及到字符串,我對字符串的運用一直都是不很明白,所以對於我來說這裏比較的難以理解,所以我對代碼的的解釋就會詳細一點。

Scanner input = new Scanner(System.in);
        //創建循環玩遊戲的方法,外層循環一次代表升級一次,一共六級,當創建Stringbuffer 對象時,就已經在堆區創建了一個空間,這個時候空間的值是空的,當傳入值是纔會有相對應的內容。當用到增刪改查的時候,可以用StringBuffer。

2.創建一個等級類:
這個類主要儲存了等級數,和得分的初始化信息等

package com.QuickHit;

public class Level {
    //級別號
    private int levelNo;
    //字符串長度
    private int strlength;
    //輸出字符串次數
    private int timeLimit;
    //闖關時間限制
    private int strTime;
    //輸入正確的得分
    private int perscore;

public Level(int levelNo, int Strlength,int timeLimit,int strTime,int perscore){
        this.levelNo = levelNo;
        this.strlength = strlength;
        this.timeLimit = timeLimit;
        this.strTime = strTime;
        this.perscore = perscore;
        }
        //GETTER 因爲遊戲中數值已經確定了,不需要在另外設置了
        public int getLevelNo(){
            return levelNo;
        }
        public int getTimeLimit(){
            return timeLimit;
        }
        public int getStrTime(){    
            return strTime;
        }
        public int getStrlength(){
            return strlength;
        }
        public int getPerscore(){
            return perscore;
        }
}

這個類主要是爲了獲取分數,長度,時間,等級數做準備,這裏是比較簡單的

package com.QuickHit;
import java.util.*;
public class Game {
    private Player player;
    public Game(Player player){
        this.player = player;
    }
    //方法
    public String printStr(){
        //得到玩家等級
        int levelNo = player.getLevelNo() - 1;
        //得到玩家等級的字符串的長度
        int strlen = LevelInitial.levelsArr[levelNo].getStrlength();
        //創建隨機數對象
        Random random = new Random();
        //創建一個stringBuffer,儲存產生的隨機字符
        StringBuffer buffer = new StringBuffer();
        for (int i = 0; i < strlen; i++) {
            //每循環一次產生一個隨機數
            int rand = random.nextInt(strlen);
            //將這個隨機數字對應的字符 拼接
            switch(rand){
            case 0:
                buffer.append("<");
                break;
            case 1:
                buffer.append(">");
                break;
            case 2:
                buffer.append("&");
                break;
            case 3:
                buffer.append("*");
                break;
            case 4:
                buffer.append("%");
                break;
            case 5:
                buffer.append("#");
                break;
            case 6:
                buffer.append("@");
                break;
            }
        }
        //輸出字符串
        System.out.println(buffer);
        //返回用戶輸入好的字符串
        return buffer.toString();
    }
    public void result(String out,String in){
        //判斷輸出和輸入結果是否一致
        if (out.equals(in)) {
            //獲取當前時間
            long currentTime = System.currentTimeMillis();
            //獲取開始遊戲的時間戳。判斷是否超時
            if (currentTime - player.getStartTime()/1000<=LevelInitial.levelsArr[player.getLeveNo()-1].getTimeLimit()) {
                //如果沒有超時,繼續運行
                int newScore = player.getScore() + LevelInitial.levelsArr[player.getLeveNo() - 1].getPerscore();
                player.setScore(newScore);
                long time = (currentTime - player.getStartTime())/1000;
                player.setElapseTime(time);

System.out.println("輸入正確,您的等級是:" + player.getLevelNo() + ", 您的積分是:" + player.getScore() + ", 您的用時爲:" + player.getElapseTime() + "秒");
                //判斷是否已經全部通關
                if (player.getLeveNo() == 6) {
                    //定義初始化的和爲0
                    int sum = 0;
                    //計算總分
                    for (int j = 0; j < LevelInitial.levelsArr.length; j++) {
                        int currentScore = LevelInitial.levelsArr[j].getPerscore() * LevelInitial.levelsArr[j].getStrTime();
                        sum += currentScore;
                    }
                    if (player.getScore() == sum) {
                        System.out.println("恭喜您全部通關!!真棒!!");
                        System.exit(0);
                    }
                }
            }else {
                //輸入正確但是超時
                System.out.println("輸入正確,但是時間超時,遊戲結束!!遊戲退出!!");
                System.exit(1);
            }
            }else {
            //輸入錯誤
            System.out.println("輸入錯誤,遊戲結束!!遊戲退出!!");
            System.exit(1);
        }
    }
}

這裏定義的是一個玩家類,在定義的時候,我遇到了字符串的使用這方面的問題,字符串適應不夠熟練,甚至有些地方根本不知道怎麼去使用,這也是導致我在做這題的時候沒有做出來的原因之一,他們的之間的邏輯在腦海中也不夠清晰,所以感覺這是一個難點,比如說哦判斷超時啊,算積分啊,感覺都不如人意。

package hit;
public class LevelInitial {
    //把所有的等級放入到數組中
    //類變量,--》屬於類,在類被加載的時候,創建這個數組
    public static Level[] levelsArr = new Level[6];
    //靜態初始化塊
    //在加載類的時候執行靜態初始化塊,並且只會被執行一次
    static {
        levelsArr[0] = new Level(1, 2, 30, 5, 1);
        levelsArr[1] = new Level(2, 3, 25, 4, 2);
        levelsArr[2] = new Level(3, 4, 22, 3, 5);
        levelsArr[3] = new Level(4, 5, 20, 3, 8);
        levelsArr[4] = new Level(5, 6, 18, 3, 10);
        levelsArr[5] = new Level(6, 7, 15, 3, 15);
    }
}

這裏定義的是玩遊戲的規則,等級分數,升級分數,經過講解後,明白了初始化塊和靜態初始化塊。

package hit;
public class Test {
    public static void main(String[] args){
        //創建玩家,玩遊戲
        Player p = new Player();
        p.play();
    }
}

這裏,這個程序的所有代碼都已經完成了。
總結:在做這個代碼的時候,開始我是沒有思路的,在pdf的幫助下才完成,感覺自己在做稍微代碼量多一點的題,涉及知識點很多的時候,不知道怎麼把自己所學的知識點綜合運用起來,好好的利用,在看了pdf的思路之後,突然想起原來是用這種方法,應該是自己代碼量不夠,所以做分析的時候總是吃力。自己在細節方面還有運用方面還差的很多,以後會注意。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章