Menu
CoddyTech

復習 - スコアトラッカー

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

challenge icon

チャレンジ

簡単

ゲームのリーダーボード用に、スコアを記録するシステムを作りましょう!連携して動作する2つのクラスを作成します。1つは個々のスコアエントリーを表し、もう1つは演算子のオーバーロードを利用した並べ替え機能でリーダーボードを管理します。

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

  • ScoreEntry.lua: 1人のプレイヤーのスコアを表すScoreEntryクラスを作成します。各エントリーにはplayerNameとscoreがあります。:getInfo()メソッドを含め、"{playerName}: {score} points"形式の文字列を返すようにします。ここで重要なのは__ltメタメソッドです。a < bは、数値に対する<と同じように、aのスコアがbのスコアより低いときにtrueになるようにします。
  • Leaderboard.lua: スコアエントリーの集合を管理するLeaderboardクラスを作成します。リーダーボードには次の機能が必要です。
    • :addEntry(entry): ScoreEntryを内部リストに追加します
    • :sort(): table.sortを使って、スコアの高い順にエントリーを並べ替えます。table.sortはそのままでは小さいものを先頭にするため、順序を逆にする比較関数を渡します。function(a, b) return b < a endこの比較でも、作成した__ltが使われます。
    • :display(): 各エントリーの情報を1行ずつ表示します
  • main.lua: すべてをまとめます!Leaderboardを作成し、受け取った入力をもとにスコアエントリーを追加してから、リーダーボードを並べ替え、結果を表示します。

2つのエントリーを<で比較すると、作成した__ltメタメソッドが呼び出されるため、table.sortでScoreEntryオブジェクトを並べ替えられます。__ltは「より小さい」という意味のままにし、sortの呼び出しで順序を逆にしてください。もし__ltが「より大きい」という意味なら、プログラム内のどこであっても、2つのエントリーに対する<が逆の意味になってしまいます。

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

  1. 1人目のプレイヤーの名前
  2. 1人目のプレイヤーのスコア(数値)
  3. 2人目のプレイヤーの名前
  4. 2人目のプレイヤーのスコア(数値)
  5. 3人目のプレイヤーの名前
  6. 3人目のプレイヤーのスコア(数値)

メインファイルでは、リーダーボードを作成して3つすべてのエントリーを追加し、:sort()を呼び出してから、:display()を呼び出して並べ替えた結果を表示します。

たとえば、入力がAlice、1500、Bob、2300、Charlie、1800の場合、出力は次のようになります。

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

入力がZara、500、Max、750、Luna、600の場合、出力は次のようになります。

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つのエントリをすべてリーダーボードに追加する

-- TODO: リーダーボードを並べ替える

-- TODO: 並べ替えた結果を表示する

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

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