2015-08-17 23 views
1

(Stack Overflow沒有「提示符」標籤,所以我使用了警報,因爲我猜測它足夠類似於吸引正確的回答者。)用數組元素填充提示並將它們編號爲

你好, 我目前正在爲大學的作業製作基於JavaScript的遊戲。我通常在解決問題方面表現不錯,但一直都被這個問題困擾。

爲了解釋,我有一個數組,它命名了玩家可以選擇的可能的裝甲插槽。以任何順序,這些可以被挑選出來,並且每當選擇被推送到第二個數組時,該數組處理已經被挑選的(以什麼順序)並且該項目從原始數組拼接。有一段時間循環直到全部3個被選中。

var armourSlotToPick = ["Head", "Chest", "Legs"],  
    armourSlotPicked = [], 
    armourLoop = 1, 
    indexArmour = 0; 

function numInArray() { 
    indexArmour++; 
    return (indexArmour + ". " + armourSlotToPick[indexArmour - 1] + "\n"); 
} 


function armour() { 
    while (armourLoop < 4) { 
     var armourPick = prompt("Pick an armour slot to generate an item for:\n" + armourSlotToPick.forEach(numInArray)); 
     if (armourPick == 1) { 
      armourSlotPicked.push(armourSlotToPick[0]); 
      armourSlotToPick.splice(0,1); 
     } else if (armourPick == 2) { 
      armourSlotPicked.push(armourSlotToPick[1]); 
      armourSlotToPick.splice(1,1); 
     } else if (armourPick == 3) { 
      armourSlotPicked.push(armourSlotToPick[2]); 
      armourSlotToPick.splice(2,1); 
     } else { 
      alert("Invalid choice, you suck"); 
      break; 
     } 
     armourLoop++; 
    } 
} 

我知道它可能不會做到numInArray()中的整個返回提示,但它顯示了一些工作。

現在的問題:我得到了它的工作,以便數組中的每個項目都被編號(var armourSlotToPick = [「1. Head」,「2. Chest」,「3. Legs」),但儘可能如果玩家選擇了2,那麼下一次它會顯示「1. Head(new line)3. Legs」,當玩家選擇3時,會出現問題,因爲他們真的打算選擇2。在提示中可以對數組中的項目進行編號?

我可能在想這個,但我已經忍受了幾個小時了。

我可以提前感謝您的任何見解,您可能有,

丹尼爾。


編輯:解決。

以下是最終結果,與Jonathan Brooks編輯答案略有不同。

var armourSlotToPick = [null, "Head", "Chest", "Legs"] 
var armourSlotPicked = [null]; 
var armourLoop = 1; 

function armour() { 
    while (armourLoop < 4) { 
     var message = "Pick an armour slot to generate an item for:\n"; 
     for (var i = 0; i < armourSlotToPick.length; i++) { 
      if (armourSlotToPick[i] !== null) { 
       message += "" + i + ". " + armourSlotToPick[i] + "\n"; 
      }    
     } 
     var armourPick = prompt(message); 
     if (armourPick > armourSlotToPick.length-1 || armourPick < 1) { 
      alert("Invalid choice, you suck"); 
     } else { 
      var insert = armourSlotToPick.splice(armourPick, 1); 
      armourSlotPicked.push(insert); 
     } 
     armourLoop++; 
    } 
    armourSlotPicked.splice(0,1); 
} 

armour(); 
alert(armourSlotPicked.join("\n")); 

我感謝所有那些爲這次討論和最終的結果作出了貢獻,我希望這是一個未來的問題的人可能有類似的一個很好的例子。

回答

1

看看我的fiddle,我想我有一個工作解決方案。你真正想使用的是帶有你自己索引的Object Literals(從1開始) - 如果是我,我會創建自己的方式來迭代這個自定義索引,方法是在Object的原型中添加一個方法,但我離題了。

你使用while循環過於複雜的代碼,而大宗的if語句是不必要的;相反,你需要的是輸入一些基本的驗證,然後你可以相信任何通過輸入這個驗證。這在這裏展示:

if (armourPick > armourSlotToPick.length || armourPick < 1) { 
    alert("Invalid choice, you suck"); 
} 
else { 
    armourSlotPicked.push(armourSlotToPick[armourPick-1]) 
    alert (armourSlotPicked[armourSlotPicked.length-1].value); 
} 

仔細閱讀我的代碼,並且您應該更好地瞭解如何處理某些問題。

編輯:

按照您的要求,我想我有一個適合您需求的解決方案。基本上所有你需要做的有數組「啓動」 1的指數是一個null價值,填補了零個元素,像這樣:

var armourSlotToPick = [null, "Head", "Chest", "Legs"] 
var armourSlotPicked = [null]; 

你只需要記住藉此null對象成例如:

if (armourSlotToPick[i] !== null) { 
    message += "" + i + "\n"; 
} 

指數會自動更新。有關更多詳細信息,請參閱此updated fiddle

+0

謝謝你,是的,我明白如何處理這些問題,我只有1個問題, '鑰匙'仍然硬編碼爲'價值',就像我三次這樣做時一樣,每次玩家選擇下一個裝甲槽時,2將永遠是胸部,3將永遠是腿部。我希望在第一次選擇後動態改變,剩餘2現在是關鍵字1,而關鍵字2不是,比如說,關鍵字2和關鍵字3(用於胸部和腿部)。我猜這是可能的。 –

+0

@DanielJochem查看我的編輯 –

+0

謝謝@JonathanBrooks,我已經結束了使用您編輯的答案,因爲我確實想保留Henrik建議我不這樣做的提示窗口。感謝您對我的耐心。 –

1

使用結構/對象作爲數組中的內容而不僅僅是值。

的基本概念:

armourSlotPicked.push({ "key": 1, "value":armourSlotToPick[1]}) 
alert("value: " + armourSlotPicked[0].value) 
alert("key: " + armourSlotPicked[0].key) 

編輯:應對意見可以採取一些空間。

恕我直言,一個提示是完全錯誤的工具,因爲大多數瀏覽器會要求用戶權限以防止多個彈出窗口,並且由於promt只能返回1條信息,所以每個彈出窗口只能請求1件。相反,你應該使用一個div元素,每個信息的複選框。

這就是說,它可以很容易地在promt中使用。 提示符只是一個內置函數,它將字符串作爲參數(在彈出窗口中顯示爲文本),並返回一個字符串與用戶輸入。

這對你來說有什麼妙處: array.foreach():forEach()方法爲每個數組元素執行一次提供的函數。

在你的情況下,它意味着它調用一個函數,它爲數組中的每個元素返回一個字符串,並連接字符串。

在過去

你會這樣寫:

var messageText= "Pick an armour slot to generate an item for:\n" 
for(var i = 1; i < armourSlotToPick.length; i++){ 
    messageText += i + ". " + armourSlotToPick[i- 1] + "\n"; 
} 
var armourPick = prompt(messageText); 

但在這個現代化的時代,你定義打印功能,並用它來生成循環:

function numInArray() { 
    indexArmour++; 
    return (indexArmour + ". " + armourSlotToPick[indexArmour - 1] + "\n"); 
} 

//more code before we get to where the function is used.... 

indexArmour = 0; 
var messageText = "Pick an armour slot to generate an item for:\n" + armourSlotToPick.forEach(numInArray); 
var armourPick = prompt(messageText); 

或一行代碼如下: indexArmour = 0; //你忘記了這一點 - 否則列表只會完成一次? var armourPick = prompt(「選擇一個裝甲槽以生成一個物品:\ n」+ armourSlotToPick.forEach(numInArray));

它產生相同的輸出,因爲它做同樣的事情,它只是寫得非常不同!

如果數組保存「對象文本」,而不是簡單地值,我建議,老式的代碼看起來是這樣的:

function contains(a, value) { 
    try{ 
     for (var i = 0; i < a.length; i++) { 
      if (a[i].value == value) { 
       return true; 
      } 
     } 
    } 
    catch(err) { 
     // do nothing 
    }; 
    return false; 
} 

後來..

for(var j = 0; j < 4; j++){ 
    for(var i = 0; i < Math.min(armourSlotToPick.length); i++){ 
     if(contains(armourSlotPicked, armourSlotToPick[i- 1])) 

繼續; 「+ i +」\ n「 messageText + = armourSlotToPick [i-1] +」\ n「; }

var armourPick = prompt(messageText); 
    if (armourPick > 0 && armourPick < armourSlotToPick.length) { 
     armourSlotPicked.push({"key":j, "value":armourSlotToPick[armourPick]); 
    } 
    ... 
} 
//now we have an array that holds information about when what was picked.. 

或東西沿着這些線路..這是bt.w沒有經過充分測試,這只是爲了說明

+0

沒錯。對象文字是一個更好的方法來解決這個問題 –

+0

所以這可以很容易地在提示中使用呢?這將如何發生? –

+0

@Henrik,我非常感謝你在這個答案中的努力,你已經指出了我對這種情況的一些懈怠的方法,並且我會接受你建議通過我的大學課程幫助我提高的指標。正如我對喬納森所說的那樣,我確實想保留提示框,我只需要每次返回1條信息,它還顯示了我在大學的導師,我可以分離出元素並遍歷它們,直到所有元素都被佔。你的答案對未來人們可能會遇到的問題是有益的,我承認,這是一個更好的方法。 –

0

你想要使用數組索引編號的項目。由於您的數字是基於一個數字的,並且該索引是從零開始的,所以在輸出和解釋響應時,您需要在兩者之間進行轉換。

這種方法還可以讓你消除if-else語句中除兩個以外的所有情況。

相關問題