復習 - スコアトラッカー
CoddyのLuaジャーニー「Object Oriented Programming」セクションの一部 — レッスン 69/70。
チャレンジ
簡単ゲームのリーダーボード用のスコア追跡システムを構築しましょう!個々のスコアエントリを表すクラスと、演算子のオーバーロードによるソート機能を備えたリーダーボードを管理するクラスの2つを作成し、それらを連携させます。
コードは以下の3つのファイルに分けて構成します:
ScoreEntry.lua: 1人のプレイヤーのスコアを表す ScoreEntry クラスを作成します。各エントリはplayerNameとscoreを持ちます。"{playerName}: {score} points"という形式の文字列を返す:getInfo()メソッドを含めてください。ここでの重要な機能は__ltメタメソッドの実装です。ただし、降順(スコアの高い順)にするために、1番目のエントリのスコアが2番目のエントリのスコアよりも「大きい」場合にtrueを返すように比較を実装してください。Leaderboard.lua: スコアエントリのコレクションを管理する Leaderboard クラスを構築します。リーダーボードには以下のものが必要です::addEntry(entry)— 内部リストに ScoreEntry を追加します:sort()—table.sortを使用して、エントリをスコアの高い順から低い順にソートします:display()— 各エントリの情報を1行ずつ表示します
main.lua: すべてをまとめます!Leaderboard を作成し、受け取った入力に基づいてスコアエントリを追加し、リーダーボードをソートして、結果を表示します。
この設計の洗練された点は、table.sort が ScoreEntry オブジェクトを比較するために __lt メタメソッドを自動的に使用することです。エントリ同士の比較方法を定義することで、Lua の組み込みソート機能がカスタムオブジェクトに対してそのまま機能するようになります!
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: 新しいリーダーボードを作成する
-- TODO: 各プレイヤーのScoreEntryオブジェクトを作成する
-- TODO: 3つのエントリすべてをリーダーボードに追加する
-- TODO: リーダーボードをソートする
-- TODO: ソートされた結果を表示する