Menu
Coddy logo textTech

復習 - スコアトラッカー

CoddyのLuaジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 69/70。

challenge icon

チャレンジ

簡単

ゲームのリーダーボード用に、スコア追跡システムを構築しましょう!協調して動作する2つのclassを作成します。1つは個々のスコアエントリを表し、もう1つは演算子オーバーロードによるソート機能を備えたリーダーボードを managing します。

コードを3つのファイルに分けて整理します。

  • ScoreEntry.lua: 1人のプレイヤーのスコアを表すScoreEntry classを作成します。各エントリにはplayerNamescoreがあります。:getInfo() methodを含め、このmethodは"{playerName}: {score} points"形式の文字列を返します。ここでの重要な機能は__lt metamethodの実装です。ただし、descending order(highest scores first)にするため、1つ目のエントリのスコアが2つ目のスコアよりgreaterな場合に、比較結果がtrueを返すようにしてください。
  • Leaderboard.lua: スコアエントリのコレクションを管理するLeaderboard classを構築します。Leaderboardには次の機能が必要です。
    • :addEntry(entry): ScoreEntryをinternal listに追加する
    • :sort(): table.sortを使用して、entriesをhighestからlowestのスコア順にソートする
    • :display(): 各entryのinfoを1行に1つずつ表示する
  • main.lua: すべてを組み合わせます!LeaderboardをCreateし、受け取ったinputsに基づいてスコアエントリを追加し、leaderboardをソートして、結果をdisplayします。

この設計の洗練された点は、table.sortがScoreEntry objectsを比較するために、あなたの__lt metamethodをautomatically使用することです。entries同士の比較方法を定義すれば、Luaの組み込みソートがcustom objectsでそのまま機能します。

3人のプレイヤーを表す6つのinputsを受け取ります。

  1. first playerの名前
  2. first playerのスコア(数値)
  3. second playerの名前
  4. second playerのスコア(数値)
  5. third playerの名前
  6. third playerのスコア(数値)

main fileでleaderboardをCreateし、3つすべてのentriesを追加し、:sort()をcallしてから、:display()をcallしてソート済みの結果を表示します。

たとえば、inputsがAlice1500Bob2300Charlie1800の場合、outputは次のようになります。

Bob: 2300 points
Charlie: 1800 points
Alice: 1500 points

inputsがZara500Max750Luna600の場合、outputは次のようになります。

Max: 750 points
Luna: 600 points
Zara: 500 points

自分で試してみよう

-- メインファイル: すべてをまとめる
local ScoreEntry = require('ScoreEntry')
local Leaderboard = require('Leaderboard')

-- 3人のプレイヤーの入力を読み取る
local name1 = io.read()
local score1 = tonumber(io.read())
local name2 = io.read()
local score2 = tonumber(io.read())
local name3 = io.read()
local score3 = tonumber(io.read())

-- TODO: 新しい Leaderboard を作成する

-- TODO: 各プレイヤーの ScoreEntry オブジェクトを作成する

-- TODO: 3つのエントリすべてを leaderboard に追加する

-- TODO: leaderboard をソートする

-- TODO: ソートされた結果を表示する

オブジェクト指向プログラミングのすべてのレッスン

自分で練習してみよう: Luaオンラインコンパイラ