0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【javascript】ロックとキーのシミュレート

Last updated at Posted at 2020-07-09

こちらの記事は以下の書籍を参考に執筆しました

ロックとキーのシステムを構築する。
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

出典:入門JavaScriptプログラミング

lock関数の引数を渡すと、一意にキーが作成されkeyとunlock関数のオブジェクトを返す。
塩用されたキーが正しくない場合は文字列をマスクする処理をしている。

'*'.repeat(secret.length || secret.toString().length)

出典:入門JavaScriptプログラミング

この容量で複数のロックと複数のキーを作成することができる。

#ゲームを作成する

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)

出典:入門JavaScriptプログラミング

ここではmapを使っているがこれは新しい配列を作成している。

###Array.prototype.map()

構文
var new_array = arr.map(function callback(currentValue[, index[, array]]) {
    // 新しい配列の要素を返す
}[, thisArg])

出典:入門JavaScriptプログラミング

####引数
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))
}

出典:入門JavaScriptプログラミング

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?