こちらの記事は以下の書籍を参考に執筆しました
ロックとキーのシステムを構築する。
lock関数では鍵をかけて保管するデータが有る。
戻り地はロック解除のための一意のキー(key)。
unlock関数は正しいキーを使ってロックを解除する。
したがってAPIは{key,unlock}=lock(secret)
となる。
function lock(secret) {
const key = Symbol('key')
return {
key,unlock(keyUserd) {
if (keyUserd == key) {
return secret;
} else {
return '*'.repeat(secret.length || secret.toString().length)
}
}
}
}
const {key,unlock}=lovk(42)
console.log('key')//**
console.log(42)//**
console.log(key)//42
lock関数の引数を渡すと、一意にキーが作成されkeyとunlock関数のオブジェクトを返す。
塩用されたキーが正しくない場合は文字列をマスクする処理をしている。
'*'.repeat(secret.length || secret.toString().length)
この容量で複数のロックと複数のキーを作成することができる。
#ゲームを作成する
function choose(message, options, secondAttempt) {
//プロンプトに表示する複数選択オプションを作成
//各インデックスに1を足すことでオプションが0でなく1から始まるようにする
const opts = options.map(function(option, index) {
return `Type ${index+1} for: ${option}`;
})
//ユーザがプロンプトで入力した番号を取得
//先の足した1を引く
const resp = Number(prompt(`${message}\n\n${opts.join('\n')}`)) - 1
if (options[resp]) {
//プロンプトから適切なレスポンスが返された場合はそれを返す。
return resp;
} else if (!secondAttempt) {
//有効なタイじゃなかったらもう一回オプションを表示
return choose(`Last try\n${message}`, options, true)
} else {
//2回目もだめならエラー
throw Error('No selection')
}
}
const message='最高のスーパーヒーローは誰か'
const options=['スーパーマン','アイアンマン','バットマン','キャプテンアメリカ'];
const hero=choose(message,options)
ここではmapを使っているがこれは新しい配列を作成している。
###Array.prototype.map()
構文
var new_array = arr.map(function callback(currentValue[, index[, array]]) {
// 新しい配列の要素を返す
}[, thisArg])
####引数
callback
新しい配列の要素を生成するためのコールバック関数は3つの引数を取る。
callbackの引数 | 説明 |
---|---|
currentValue | 現在処理中の要素の値 |
index(optional) | 現在処理中の要素の配列内におけるインデックス |
array(optional) | mapが実行されている配列 |
thisArg(optional)
callbacを実行するときにthisとして使う値
####返り値
新しい配列
initでまとめるとこうなる
function lock(secret) {
const key = Symbol('key')
return {
key,
unlock(keyUserd) {
if (keyUserd == key) {
return secret;
} else {
return '*'.repeat(secret.length || secret.toString().length)
}
}
}
}
function choose(message, options, secondAttempt) {
//プロンプトに表示する複数選択オプションを作成
//各インデックスに1を足すことでオプションが0でなく1から始まるようにする
const opts = options.map(function(option, index) {
return `Type ${index+1} for: ${option}`;
})
//ユーザがプロンプトで入力した番号を取得
//先の足した1を引く
const resp = Number(prompt(`${message}\n\n${opts.join('\n')}`)) - 1
if (options[resp]) {
//プロンプトから適切なレスポンスが返された場合はそれを返す。
return resp;
} else if (!secondAttempt) {
//有効なタイじゃなかったらもう一回オプションを表示
return choose(`Last try\n${message}`, options, true)
} else {
//2回目もだめならエラー
throw Error('No selection')
}
}
function init(){
const {key:key1,unlock:door1}=lock('A new car')
const {key:key2,unlock:door2}=lock('A trip to Hawaii')
const {key:key3,unlock:door3}=lock('$100 Doloars')
const keys=[key1,key2,key3]
const doors=[door1,door2,door3]
const key=keys[Math.floor(Math.random()*3)]
const message=`you have been given a \u{1F511} plese choose a door.`
const options=doors.map(function(door,index){
return `Door #${index+1}: ${door()}`
})
const door=doors[choose(message,options)]
alert(door(key))
}