この記事の練習問題で使用する知識:
基礎文法(レッスン1)、比較演算子と論理演算子、while文による繰り返し処理、メソッドの定義と呼出し、例外処理、配列の基本、mapメソッド
Rubyのゲームコード一覧はこちら
<<前のページ | Ruby記事一覧 |
次のページ>> |
確認問題:トランプをランダムに配ろう
トランプデッキを生成し、それをシャッフルしてカードを配る簡単なゲームを作成してみましょう。このゲームでは以下のような手順で進行します。
- トランプデッキを作成する。
- デッキをシャッフルする。
- シャッフルされたデッキから5枚のカードを配る。
- ゲームを繰り返すか終了するかを選択する。
この問題ではメソッドの定義と呼び出しについて学びます。
与えられた手順に従い、指定された機能を持つコードを完成させてください。
この問題の要件
以下の要件に従ってコードを完成させてください。
generate_deck
メソッドを定義し、以下の内容を持つトランプデッキを生成してください。- マークは「♠, ♥, ♦, ♣」の4種類。
- 数字は 2 から 10 までと、絵札(’J’, ‘Q’, ‘K’, ‘A’)を含む。
- 例:
♠2, ♥J
のような形式。
shuffle_deck
メソッドを定義し、トランプデッキをランダムに並び替えてください。deal_cards
メソッドを定義し、シャッフルされたデッキから上位5枚を取り出して返してください。start_game
メソッドを定義し、以下を実行してください。generate_deck
を呼び出してデッキを生成する。deal_cards
を呼び出して5枚のカードを取得する。- 配られたカードを画面に表示する。
- ユーザーが「終了」と入力するまでゲームを続けられるようにループを実装してください。
ただし、以下のような実行結果となること。
----- ↓出力される結果の例↓ -----
あなたに配られたカード: ♠A, ♥3, ♦J, ♣5, ♥K ゲームを続けますか?(続けるにはエンターキーを押してください。終了するには「終了」と入力してください。) (エンターキーを押す) あなたに配られたカード: ♣7, ♥9, ♦2, ♠Q, ♠6 ゲームを続けますか?(続けるにはエンターキーを押してください。終了するには「終了」と入力してください。) 終了 ゲームを終了します。
この問題を解くヒント
1からコードを組み立てることが難しい場合は、以下のヒントを開いて参考にしましょう。
正解のコードは上から順に以下のような構成となっています。
1:generate_deck
メソッドを定義し、トランプデッキを生成
□ マークを格納する配列suits
を定義
□ 数字と絵札を格納する配列values
を定義
□ product
メソッドを使用してマークと数字の組み合わせを生成
□ map
メソッドを使用して各組み合わせを文字列形式に変換し、配列で返す
2:shuffle_deck
メソッドを定義し、デッキをシャッフル
□ shuffle
メソッドを呼び出してデッキをランダムに並び替える
3:deal_cards
メソッドを定義し、カードを配る
□ shuffle_deck
メソッドを呼び出してデッキをシャッフル
□ take
メソッドを使用して上位5枚を配列として返す
4:start_game
メソッドを定義し、ゲームを開始
□ generate_deck
メソッドを呼び出してデッキを生成
□ deal_cards
メソッドを呼び出して5枚のカードを取得
□ 取得したカードをputs
メソッドで画面に表示
5:変数continue_game
を空文字列で初期化
6:while
ループを定義し、continue_game
が”終了”でない限り繰り返す
□ start_game
メソッドを呼び出してゲームを開始
□ 「ゲームを続けますか?」のメッセージをputs
メソッドで表示
□ gets.chomp
を使用してユーザー入力をcontinue_game
に代入
7:「ゲームを終了します。」をputs
メソッドで表示
以下のコードをコピーし、コメントに従ってコードを完成させて下さい。
# トランプデッキを生成するメソッド def generate_deck =begin 【穴埋め問題1】 ここでトランプデッキを生成し、配列として返すコードを書いてください。 =end end # デッキをシャッフルするメソッド def shuffle_deck(deck) =begin 【穴埋め問題2】 ここで引数として渡されたデッキをランダムに並び替えるコードを書いてください。 =end end # カードを配るメソッド def deal_cards(deck) =begin 【穴埋め問題3】 ここでシャッフルされたデッキから上位5枚を取り出し、配列として返すコードを書いてください。 =end end # ゲームを開始するメソッド def start_game =begin 【穴埋め問題4】 ここで以下を実施してください: 1. `generate_deck` メソッドを呼び出してデッキを生成する。 2. `deal_cards` メソッドを呼び出してカードを取得する。 3. 配られたカードを画面に表示する。 =end end # ゲームループ continue_game = "" while continue_game != "終了" =begin 【穴埋め問題5】 ここでゲームを開始するコードを書いてください。また、ループの最後でユーザーの入力を取得し、それを変数`continue_game`に代入してください。 =end end puts "ゲームを終了します。"
この問題の穴埋めコードは以上です。
このヒントを見てもまだ回答を導き出すのが難しいと感じる場合は、先に正解のコードと解説を見て内容を理解するようにしましょう。
トランプをランダムに配るコードと解説
この問題の一つの正解例とそのコードの解説を以下に示します。
正解コードの例
例えば以下のようなプログラムが考えられます。
# トランプデッキを生成するメソッド def generate_deck suits = ['♠', '♥', '♦', '♣'] values = (2..10).to_a + ['J', 'Q', 'K', 'A'] suits.product(values).map { |suit, value| "#{suit}#{value}" } end # デッキをシャッフルするメソッド def shuffle_deck(deck) deck.shuffle end # カードを配るメソッド def deal_cards(deck) shuffle_deck(deck).take(5) end # ゲームを開始するメソッド def start_game deck = generate_deck cards = deal_cards(deck) puts "あなたに配られたカード: #{cards.join(', ')}" end # ゲームループ continue_game = "" while continue_game != "終了" start_game puts "ゲームを続けますか?(続けるにはエンターキーを押してください。終了するには「終了」と入力してください。)" continue_game = gets.chomp end puts "ゲームを終了します。"
正解コードの解説
今回のRubyコードではトランプデッキを生成してシャッフルし、ランダムにカードを配るシンプルなゲームを実装しました。
このコードをブロックごとに分解し、詳しく解説していきます。
トランプデッキを生成するメソッド
def generate_deck suits = ['♠', '♥', '♦', '♣'] values = (2..10).to_a + ['J', 'Q', 'K', 'A'] suits.product(values).map { |suit, value| "#{suit}#{value}" } end
def generate_deck
ここではトランプデッキを作るメソッドを定義しています。メソッドはRubyでコードを再利用するための便利な機能です。suits
トランプのマーク(♠, ♥, ♦, ♣)を配列として定義しています。values
数字のカードと絵札(J, Q, K, A)を配列として定義しています。product
2つの配列からすべての組み合わせを生成します。例えば「♠2」「♠3」などのカードを作ります。map
各組み合わせを文字列形式に変換して、最終的なデッキを配列として返します。
デッキをシャッフルするメソッド
def shuffle_deck(deck) deck.shuffle end
def shuffle_deck
デッキをランダムに並び替えるメソッドです。shuffle
Rubyの組み込みメソッドで、配列の要素をランダムに並び替えます。
カードを配るメソッド
def deal_cards(deck) shuffle_deck(deck).take(5) end
shuffle_deck(deck)
デッキをシャッフルするメソッドを呼び出します。take(5)
配列の先頭から5枚のカードを取り出し、新しい配列として返します。
ゲームを開始するメソッド
def start_game deck = generate_deck cards = deal_cards(deck) puts "あなたに配られたカード: #{cards.join(', ')}" end
deck = generate_deck
トランプデッキを生成します。deal_cards(deck)
デッキから5枚のカードを配ります。puts
配られたカードを画面に表示します。join(', ')
を使って配列をカンマ区切りの文字列に変換しています。
ゲームループ
continue_game = "" while continue_game != "終了" start_game puts "ゲームを続けますか?(続けるにはエンターキーを押してください。終了するには「終了」と入力してください。)" continue_game = gets.chomp end puts "ゲームを終了します。"
while continue_game != "終了"
ユーザーが「終了」と入力するまでゲームを繰り返します。gets.chomp
ユーザーからの入力を受け取り、余分な改行を削除します。puts
ゲーム終了時にメッセージを表示します。
Rubyのゲームコード一覧はこちら
<<前のページ |
Ruby記事一覧 |
次のページ>> |
この記事への質問・コメント
この記事を作成するにあたりAIを活用しています。
問題ないことは確認していますが、もし間違いや表現の違和感などありましたら、ご指摘頂けると大変助かります。