復習 - スコアトラッカー
CoddyのLuaジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 69/70。
チャレンジ
簡単ゲームのリーダーボード用に、スコアを記録するシステムを作りましょう!連携して動作する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人目のプレイヤーの名前
- 2人目のプレイヤーのスコア(数値)
- 3人目のプレイヤーの名前
- 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オンラインコンパイラ