面向對象的三大特性已經學習完了,自我感覺不是很好,許多地方的知識點運用的不夠熟練,甚至有一些知識點很是模棱兩可,不知道如何正確的運用,對於這次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的思路之後,突然想起原來是用這種方法,應該是自己代碼量不夠,所以做分析的時候總是吃力。自己在細節方面還有運用方面還差的很多,以後會注意。