🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Q&A

2回答

2152閲覧

Rubyでビンゴゲームを作成する課題で困っています。

Mr.Satan

総合スコア4

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

1グッド

1クリップ

投稿2019/12/19 03:23

編集2019/12/19 03:57

前提・実現したいこと

Rubyを使ってビンゴカードゲームを作成したいのですが、初心者ですのでわからない部分が非常にあるので解決したいです。

発生している問題

作成までに3ステップ、以下。

STEP1【ビンゴボールの取り出し】
・ランダムに数字が出る
・一度出た数字は出ない
・出た数字を画面に標示する

STEP2 【カードの作成】
・ランダムにビンゴカードを作成する
・BINGOカード内の数字配置にはルールがある
(B列:115 I列:1630 N列:3145 G列:4660 O列:61~75)
・BINGOカードは2次元配列で表現する
・1つのカード内に同じ数字は出現しない
・真ん中はFREE(穴の開いた状態)
・カードを画面に表示する

STEP3 【ゲームの開始とカードのチェック】
・開始時にカードと数字を初期化(ランダム作成なので前回と同じにならないこと)
・出たボールとカードの状態を表示する
・穴の開いた状態でも元の数字が確認できるようにする
・1度数字を出すたびに現在のリーチ数、ビンゴ数を表示する 表示例↓

ball[46]:47 #ボールを引いて46回目、47が出る
03 28 44 (54)(68)
(01)(23) 42 57 75
(07) 25 FREE(50)(69)
(02)(27)(32)(60)(73)
04 (30) 43 (49)(64)

REACH: 4
BINGO: 1 #この時点でリーチ4、ビンゴは一個


ball[47]:25 #ボールを引いて47回目、以下同様
03 28 44 (54)(68)
(01)(23) 42 57 75
(07)(25)FREE(50)(69)
(02)(27)(32)(60)(73)
04 (30) 43 (49)(64)

REACH: 4
BINGO: 2


試したこと

STEP2の作成

class Bingo
def self.generate_card
title = 'BINGO'.chars
col_size = title.size
range = 15

title_str = title.map { |t| t.rjust(2) } * ' | ' numbers = col_size.times .map { |i| range.times.map { |j| (i * range + j + 1) }.sample(col_size) } .transpose body = numbers.map.with_index do |row, row_index| row.map.with_index { |col, col_index| center = row_index == col_size / 2 && row_index == col_index center ? ' ' : col.to_s.rjust(2) } * ' | ' end [title_str, body].join("\n")

end
end

ステップ2はこのような感じだと思います。。

まったくの初心者でステップ2、カードの作成だけブログなどを参考にできましたが、ステップ1、3がわからないです。また、「ダウンロード内」にてtxtファイル保存までの流れをどなたかお教えくださると助かります!

補足情報(FW/ツールのバージョンなど)

Mac OS Catalina 10.15.2 Ruby 2.5.0

DrqYuto👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Zuishin

2019/12/19 04:09

ちょっと課題が難しすぎるようなので、もっと簡単なものから始めたらどうでしょうか。
Mr.Satan

2019/12/19 04:18

ご回答ありがとうございます! 私にはとても難しいですが、これを人に頼ったり調べたりでいいので、やってきてとの課題です。。汗 実践的プログラミングにいきなり触れてもらうのが目的なのだとか。。
guest

回答2

0

でstep2
提示されたcodeはちょっと不満があります。
Bingo に使われる Card を独立したclassにしたいです。

class Card def initialize ここで作る end def show 表示 end def number_of_bingo end def number_of_reach end def get_number number 出た番号をがあれば穴を開ける method名気に食わない。穴を開ける感じがでるのがうれしい end end

こんな感じ

transpose使うのはアイデアですが、Enumerableにはないです。Arrayにして。
5列は各々 1-15、16-13、、、の範囲と定義して良いのでは。
そこからランダムに5つ選ぶのは step1の応用

でstep3
newしてshow。
番号が出るごとにget_numberしてshow。そしてnumber_of_*を呼ぶ
そんな感じ

投稿2019/12/19 05:58

編集2019/12/19 05:59
winterboum

総合スコア23567

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ではstep1
1 ランダムに数字が出る
2 一度出た数字は出ない
3 出た数字を画面に標示する

3はお任せするとして、1,2の実装には2案

  1. 1-65の配列を用意し、

1-65の範囲の乱数を発生させ、まだ出ていなかったらそれ、出ていたら繰り返す
出た数を配列にマークする

2)1-65の配列を用意し、シャッフルし、順番に出力

2)の方がrubyっぽいですね。
1-65の配列の用意は range を作って to_aが楽でしょう。

という方針であと書けますか?

投稿2019/12/19 05:41

winterboum

総合スコア23567

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問