【初心者でもできる】Rubyで簡単なガチャアプリを作ってみた

学習の段階で作成したメモアプリを応用して、よくあるソシャゲのガチャっぽいアプリをRubyで作ってみました。
あくまでもガチャが回せるだけのものなので、表記も使っているものもごくシンプルです。
初心者の方でも作成できるので、参考にしていただければ幸いです。

<h2>仕様</h2>
・単発ガチャ、１０連ガチャを回すことができる。
・レアリティはレア,アンコモン,コモンの３段階。
・レア=１0%,アンコモン=30%,コモン=６0%の確率で引ける。
・R以上とUC以下で引けた時のメッセージが変わる.
・繰り返しガチャが引ける

<h2>使用したメソッドなど</h2>
以下のものです。
・配列
・gets
・puts
・sample
・times文
・if文（if,elsif,else）
・while文
・比較演算子（今回使ったのは○○以上、□□以下、AとBは等しい、の3種類）

<h2>パーツ作り</h2>
では、必要なパーツを作っていきます。
まずはガチャの基礎となる「ガチャを引く」というアクションを確認します。

<h3>ガチャ本体とガチャの中身とガチャを引くアクション</h3>

実際のソシャゲガチャだと「ガチャを引く！」ボタンをタップすれば、キャラクターやカードが手に入りますよね？
まずはそのガチャの箱と、中に入っているキャラクターを用意します。
（これは実際のガチャポンとカプセルで考えた方が想像しやすいかもしれませんね）

ガチャを入れる箱を変数として用意し、その変数の中に入れる配列をガチャのキャラ、もしくは中身入りカプセルと考えます。

```ruby
chara = [1,2,3,4,5,6,7,8,9,10]

```

「chara」がガチャを入れる箱
[1,2,3,4,5,6,7,8,9,10]がキャラ、もしくは中身入りカプセルの配列ですね。
（100まで書くのは長いので10までとしています）

次は、このガチャから中身を引く行為を作成します。

```ruby
chara = [1,2,3,4,5,6,7,8,9,10]
chara.sample
```
「sample」メソッドで1〜10の数字をランダムにピックアップします。
このままでは結果が表示されないので「puts」にて何を引いたか？を表示しましょう。

```ruby
chara = [1,2,3,4,5,6,7,8,9,10]
puts chara.sample
```
この状態で実行すると、1〜10という名前のキャラ、もしくは番号付きカプセルを1個引くことができます。
中身は無限なので、どれも何個でも引けます。
これで「ガチャを入れる箱」「ガチャの中身」と「ガチャを引く」というアクションを用意出来ました。

<h3>「ガチャの中身」の設定</h3>
次はガチャの中身を作ります。
ソシャゲのガチャであれば「SSR」とか「☆4」など、レアリティが設定されていますね？
細かいことを言えば更にキャラクター名や属性、クラスなどがありますが、今回はシンプルに作るのでレアリティのみを設定します。

先ほどの変数と配列で「chara」という名前のガチャボックスに「1〜10」という名前のキャラを入れています。
シンプルに、1が引けたらレア、2か３か４が引けたらアンコモン、それ以外はコモンとします。

まずはガチャを引くアクションを「ガチャを引いた結果」という変数に代入します。

```ruby
chara = [1,2,3,4,5,6,7,8,9,10]
gachakekka = chara.sample
```

「ガチャを引いた結果」変数をif文の中に入れて「この数字のキャラを引いたらどのレアリティだった」というコードにします。
ここでは比較演算子も使用します。

```ruby
chara = [1,2,3,4,5,6,7,8,9,10]
gachakekka = chara.sample

if gachakekka == 1
   puts "レアカードをゲットしました！"
end
```
※ a == b は「aはbと等しい」という意味となります。

このように、「ガチャを引いた結果」の変数である「gachakekka」を条件分岐出来るif文に組み込み「ガチャを引いた結果が何番のキャラだった」という内容を作り、その結果の文字列をputsにて表示します。
では、アンコモンとコモンも同じように作成します。

```ruby
if gachakekka == 1
   puts "レアカードをゲットしました！"

elsif gachakekka >= 2 && gachakekka <= 4
   puts "アンコモンカードをゲットしました！"

elsif gachakekka >= 5 && gachakekka <= 10
   puts "コモンカードをゲットしました"
end
```

※ >= a && <= b　は「a以上　かつ　b以下」という意味となります。

これで、1~10の数字を引いた時にどんなレアリティのカードを引いたか？が分かるようになりました。
では、次に実行するメソッドを作成していきます。

<h3>実行メソッド「gachagacha」を作る</h3>
これを実行できるようにメソッドとてまとめます。「gachagacha」というメソッド名にします。

```ruby
def gachagacha

    chara = [1,2,3,4,5,6,7,8,9,10]
    gachakekka = chara.sample

    if gachakekka == 1
       puts "レアカードをゲットしました！"

    elsif gachakekka >= 2 && gachakekka <= 4
       puts "アンコモンカードをゲットしました！"

    elsif gachakekka >= 5 && gachakekka <= 10
       puts "コモンカードをゲットしました"

    end

end
```

メソッドを作ったところで、実行してみましょう。

```ruby
def gachagacha

    chara = [1,2,3,4,5,6,7,8,9,10]
    gachakekka = chara.sample

    if gachakekka == 1
       puts "レアカードをゲットしました！"

    elsif gachakekka >= 2 && gachakekka <= 4
       puts "アンコモンカードをゲットしました！"

    elsif gachakekka >= 5 && gachakekka <= 10
       puts "コモンカードをゲットしました"

    end

end

gachagacha
```

これで
「レアカードをゲットしました！」
「アンコモンカードをゲットしました！」
「コモンカードをゲットしました」
の、どれかが表示されればOKです。

もしエラーが出るのであれば「全角スペースが入ってないか」「スペルミスがないか」「変数の入れ忘れがないか」など、チェックしてみてください。
また、「puts　〜ゲットしました」の文章は一例なので、何のカードをゲットしたか分かるように好きなように書いてみて下さい！

ガチャの基本的要素はこれで作成することが出来ました。
しかし、10連ガチャの機能がまだ作れていないので次はそれを実装します。

<h3>10連ガチャ機能を作る</h3>
こちらはシンプルです。
単純に、先ほど作成した「gachagacha」メソッドを10回繰り返すだけです。

```ruby
10.times do
   gachagacha
end
```
timesメソッドを使えば、作成したgachagachaメソッドを指定の回数分繰り返すことが出来ます。
ただしこのままだと単発ガチャか10連ガチャか、どちらを回すか選べません。
最初に単発か10連かをプレイヤーに選択させてあげる必要がありますね。
まずは単発と10連を選択できるコードを作ります。
識別する方法は「10」と打つか「1」と打つかでどちらかが出来るようにします。

```ruby
mode = gets.chomp

if mode == "10"
    10.times do
        gachagacha
    end

elsif mode == "1"
    gachagacha

end
```

ここでもif文を使って「10と打った場合は10連ガチャ」「1と打った場合は単発ガチャ」と、分けます。
「gets」メソッドにて打ち込んでいるので、「数値」ではなく「文字列」となっています。
なので、""（ダブルクォーテーション）で囲むのを忘れないようにして下さい。
ただ、このままでは打ち損じした場合に何が起きたかわかりにくいので、そうした時に「エラー」と出るようにします。

```ruby
while true
    mode = gets.chomp

    if mode == "10"
        10.times do
            gachagacha
        end

    elsif mode == "1"
        gachagacha

    else puts "エラーです。もう一度打ち直してください。"
    end
end
```
getsメソッドを使って「mode」という変数に「10」か「1」を打ち込んだ場合は10連か単発ガチャを回すモード。
間違えてそれ以外を打ち込んだ場合はエラーとなり、最初からやり直す形としました。
また、while trueを追記することにより、ctrl + cを押さない限り無限ループするようにしています。

putsの後の文章は一例です。エラーと分かれば何でも良いので、ご自身でも文章を考えてみて下さい！

<h3>全体構成</h3>
では、最終形を作ります。
ガチャを回す導入文章も一緒に入れます。


```ruby
def gachagacha

    chara = [1,2,3,4,5,6,7,8,9,10]
    gachakekka = chara.sample

    if gachakekka == 1
       puts "レアカードをゲットしました！"

    elsif gachakekka >= 2 && gachakekka <= 4
       puts "アンコモンカードをゲットしました！"

    elsif gachakekka >= 5 && gachakekka <= 10
       puts "コモンカードをゲットしました"

    end

end

puts "運試しガチャマシンへようこそ！"

while true
    puts "10連ガチャを引きますか？単発ガチャを引きますか？"
    puts "10連であれば「10」単発であれば「1」と入力して下さい。"
    mode = gets.chomp

    if mode == "10"
        10.times do
            gachagacha
        end

    elsif mode == "1"
        gachagacha

    else puts "エラーです。もう一度打ち直してください。"
    end
end
```
gachagachaメソッドを先に作り、下に実行するためのif文を組み立てます。
putsで「運試しガチャマシンへようこそ！」と記載し、ガチャアプリが始まることを示します。これは1回だけ表示されれば良いのでwhile分にはいれません。
10連ガチャか単発ガチャかは常に選択する必要があるので、while文の中に入れてループ表示させます。

実行結果は下画像のようになります。
<img width="403" alt="スクリーンショット 2020-04-09 21.49.28.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/616072/cce08aab-c1c9-1e18-c07a-14ad7ed0baaa.png">

「1」「10」「それ以外」どの場合も正常に動作していますね。
これにて完成です！
最後に使ったメソッドのおさらいをしておきます。

<h2>使ったメソッド</h2>
・gets→ターミナル上で直接文字列を打ち込む
・puts→文章表示
・sample→配列の中からランダムでピックする
・times文→指定したことを回数分繰り返す（5.times doなら5回）
・if文（if,elsif,else）→条件に合致した場合、その内容を実行する。
・while文→指定した範囲のコードを繰り返す。

良ければ試してみて下さい！
ありがとうございました。