復習 - スコアトラッカー
CoddyのLuaジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 69/70。
チャレンジ
簡単ゲームのリーダーボード用に、スコア追跡システムを構築しましょう!協調して動作する2つのclassを作成します。1つは個々のスコアエントリを表し、もう1つは演算子オーバーロードによるソート機能を備えたリーダーボードを managing します。
コードを3つのファイルに分けて整理します。
ScoreEntry.lua: 1人のプレイヤーのスコアを表すScoreEntry classを作成します。各エントリにはplayerNameとscoreがあります。:getInfo()methodを含め、このmethodは"{playerName}: {score} points"形式の文字列を返します。ここでの重要な機能は__ltmetamethodの実装です。ただし、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を受け取ります。
- first playerの名前
- first playerのスコア(数値)
- second playerの名前
- second playerのスコア(数値)
- third playerの名前
- third playerのスコア(数値)
main fileでleaderboardをCreateし、3つすべてのentriesを追加し、:sort()をcallしてから、:display()をcallしてソート済みの結果を表示します。
たとえば、inputsがAlice、1500、Bob、2300、Charlie、1800の場合、outputは次のようになります。
Bob: 2300 points
Charlie: 1800 points
Alice: 1500 pointsinputsがZara、500、Max、750、Luna、600の場合、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オンラインコンパイラ