トラック
/
Gleam
Gleam
/
演習
/
ハイスコアボード
ハイスコアボード

ハイスコアボード

学習演習

はじめに

型エイリアス

型エイリアス

Gleamでは、型エイリアスを使うと、そのまま書くと煩雑になってしまう既存の型に、便利な名前を付けられます。

pub type Headers =
  List(#(String, String))

pub fn html_headers() -> Headers {
  [
    #("content-type", "text/html"),
    #("x-frame-options", "DENY"),
  ]
}

pub typeを付けて書くと、そのエイリアスは定義したモジュールの外でも使えます。pubを省略するとエイリアスはプライベートになり、他のモジュールから参照できません。

Dict

GleamのDictは、キーと値のペアで情報を保存するためのデータ構造です。他の言語では、連想配列、ハッシュ、辞書などと呼ばれることもあります。

Dictのキーと値にはどんな型でも使えますが、アクセスしたり返したりするときの項目の順序は保証されません。

Dictを扱う

Dictは、gleam/dictモジュールの関数を使って作成・操作します。

// Create an empty dict
let dict1 = dict.new()

// Create a dict with some values
let dict2 = dict.from_list([
  #("name", "Gleam"),
  #("colour", "Pink"),
])

// Add a value to a dict
let dict3 = dict.insert(dict2, "website", "https://gleam.run")

// Get a value from a dict
let name = dict.get(dict3, "name")
// -> Ok("Gleam")

説明

この演習では、地元のゲームセンターで一番人気のゲームのハイスコアを管理する仕組みを実装します。

実装する関数は5つあり、そのほとんどはハイスコアを保持するオブジェクトを操作することに関係しています。

1. 新しいハイスコアボードを作成する

ハイスコアボードの役割を果たすdictを返す関数create_score_boardを作成します。 このオブジェクトのキーはプレイヤーの名前、値はそのスコアになります。 テストのために、オブジェクトに最初から1件のエントリーを直接含めておきます。 この最初のエントリーは、プレイヤー名を"The Best Ever"、スコアを1_000_000にします。

create_score_board()
// returns an object with one initial entry

2. スコアボードにプレイヤーを追加する

ハイスコアボードにプレイヤーを追加するには、関数add_playerを定義します。 これは3つの仮引数を受け取ります:

  • 1つ目の仮引数は、既存のスコアボードのdictです。
  • 2つ目の仮引数は、プレイヤーの名前を表す文字列です。
  • 3つ目の仮引数は、スコアを表す整数です。

この関数は、新しいプレイヤーとスコアを追加したdictを返します。

3. スコアボードからプレイヤーを削除する

プレイヤーがゲームセンターのルールに違反した場合は、そのプレイヤーは手作業でハイスコアボードから削除されます。 2つの仮引数を取るremove_playerを定義します:

  • 1つ目の仮引数は、既存のスコアボードのdictです。
  • 2つ目の仮引数は、プレイヤーの名前を表す文字列です。

この関数は、削除されたプレイヤーを除いたdictを返します。

そもそもそのプレイヤーがボードにいなかった場合は、ボードには何も起こらず、そのまま返します。

4. プレイヤーのスコアを増やす

プレイヤーがゲームセンターでもう一度ゲームを終えると、ボードの以前のスコアに一定のポイントが加算されます。 3つの仮引数を取るupdate_scoreを実装します:

  • 1つ目の仮引数は、既存のスコアボードのdictです。
  • 2つ目の仮引数は、スコアを増やしたいプレイヤーの名前です。
  • 3つ目の仮引数は、記録されているハイスコアに加算したいスコアです。

この関数は、更新されたスコアを持つdictを返します。

そもそもそのプレイヤーがボードにいなかった場合は、ボードには何も起こらず、そのまま返します。

5. 月曜日のボーナスポイントを適用する

ゲームセンターでは、月曜日には別のスコアボードを使っています。 その日の終わりに、そのボードに載っている各プレイヤーに100ポイントが追加されます。

スコアボードを受け取る関数apply_monday_bonusを実装します。 この関数は、そのボードに載っている各プレイヤーにボーナスポイントを加えたdictを返します。

GitHubで編集する リンクは新しいウィンドウまたはタブで開きます
Gleam Exercism

ハイスコアボードを始める準備はできましたか?

Exercismに登録すれば、33個のコンセプト122個の演習、そして本物の人間によるメンタリングとともに、Gleamを学んでマスターできます。すべて無料です。