【Ruby】数字を当てるゲーム(guess number)をrubyで作ってみた

# 初めに
今まで学習した内容をもとに、requireを使って数字を当てるゲームを作ってみました。

※内容に間違いなどがある場合はご指摘をよろしくお願いします。

# 結果物
文字（アルファベット）と記号、数字の数を順番に入力すると入力した合計分の強力なパスワードが生成される。

# 作業手順
①やりたいことをまず文章で書く（アルゴリズム）
②ASCIIを生成
②細かな問題の記述
③文章を元にフローチャートを書く
④プログラムを書く

#大きな流れ
- ロゴを用意する
- 答えを1~100までの数字で用意する
- 難易度を設定する処理（ターンが決まる）
- 答えをチェックする処理
- 残りのターンによる分岐点を用意する

# 細かな作業&ロジック
- ロゴと難易度の設定、答えのチェックはそれぞれ別のファイルに記述・管理する
- 難易度はeasyとhardがあり、難易度に応じて残りのターンが決まる
- 答えが入力した数字と合っていればゲームは終了
- 残りのターンが0の場合、ゲーム終了

# フローチャート
![スクリーンショット 2021-05-04 7.55.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/966135/3b2fba5c-f895-dd72-8ef9-54311245dc02.png)

# ロゴファイルを作成
以下のサイトからゲームに使われるロゴを作成します。ゲーム名は"Guess Number"
ASCII：http://patorjk.com/software/taag/#p=display&f=ANSI%20Shadow&t=GUESS%20NUMBER
生成されたASCIIをコピーしたら、ファイルに貼り付けます。

```ruby
#art_guess_number.rb
LOGO = "
██████╗ ██╗   ██╗███████╗███████╗███████╗    ███╗   ██╗██╗   ██╗███╗   ███╗██████╗ ███████╗██████╗ 
██╔════╝ ██║   ██║██╔════╝██╔════╝██╔════╝    ████╗  ██║██║   ██║████╗ ████║██╔══██╗██╔════╝██╔══██╗
██║  ███╗██║   ██║█████╗  ███████╗███████╗    ██╔██╗ ██║██║   ██║██╔████╔██║██████╔╝█████╗  ██████╔╝
██║   ██║██║   ██║██╔══╝  ╚════██║╚════██║    ██║╚██╗██║██║   ██║██║╚██╔╝██║██╔══██╗██╔══╝  ██╔══██╗
╚██████╔╝╚██████╔╝███████╗███████║███████║    ██║ ╚████║╚██████╔╝██║ ╚═╝ ██║██████╔╝███████╗██║  ██║
 ╚═════╝  ╚═════╝ ╚══════╝╚══════╝╚══════╝    ╚═╝  ╚═══╝ ╚═════╝ ╚═╝     ╚═╝╚═════╝ ╚══════╝╚═╝  ╚═
"
```

# 難易度を決める処理
ゲームの難易度をeasyかhard、どちらかに選択してもらう関数を作ります。

```ruby
#set_difficulty.rb
EASY_LEVEL = 10
HARD_LEVEL = 5

def set_difficulty()
  loop do
    puts "難易度を選んでください。easyかhardをどちらかを入力してください"
    level = gets.chomp
    if level == "easy"
      return EASY_LEVEL
    elsif level == "hard"
      return HARD_LEVEL
    else
      puts "入力が間違っています"
    end
  end
end
```

# 答えをチェックする処理
ユーザーが入力した数字が答えと合っているかどうかを判定する関数を作成します。これも難易度設定と同じく別のファイルで作成します。

```ruby
#check_answer.rb
def check_answer(guess, answer, turns)
  if guess > answer
    puts "#{guess}より低い数字です"
    return turns -1
  elsif guess < answer
    puts "#{guess}より高い数字です"
    return turns -1
  else
    puts "さすがです。答えは#{answer}でした"
  end
end
```

# ゲームの処理（メイン）
上記で作成したロゴと難易度設定、答えチェックをrequireを使って読み込みます。gameという関数を定義したら、ゲームを実行します。最初にロゴ画面が出てきて、ユーザーに難易度を入力してもらい数字を当てていきます。ターン数は難易度によって5回か10回になり、0になったらゲーム終了です。

```ruby
require './art_guess_number'
require './set_difficulty'
require './check_answer'

def game()
  puts LOGO
  puts "私が考えている数字は何でしょう？"
  answer = rand(1..100)             #答えをランダムで生成する
  turns = set_difficulty()          #難易度によるターンの設定
  guess = 0
  
  loop do
    puts "チャンスはあと#{turns}回です。"
    puts "数字を当ててみてください。範囲は1〜100の間です。"
    guess = gets.to_i                        
    turns = check_answer(guess, answer, turns)     #答えのチェック
    if turns == 0
      puts "残念です。あなたの負けです。"
      break
    elsif guess != answer
      puts "違いますね。もう一度チャンスをあげます。"
    else
      break
    end
  end
end

game()
```

# 実行結果
```cl
❯ ruby guess_number.rb

██████╗ ██╗   ██╗███████╗███████╗███████╗    ███╗   ██╗██╗   ██╗███╗   ███╗██████╗ ███████╗██████╗
██╔════╝ ██║   ██║██╔════╝██╔════╝██╔════╝    ████╗  ██║██║   ██║████╗ ████║██╔══██╗██╔════╝██╔══██╗
██║  ███╗██║   ██║█████╗  ███████╗███████╗    ██╔██╗ ██║██║   ██║██╔████╔██║██████╔╝█████╗  ██████╔╝
██║   ██║██║   ██║██╔══╝  ╚════██║╚════██║    ██║╚██╗██║██║   ██║██║╚██╔╝██║██╔══██╗██╔══╝  ██╔══██╗
╚██████╔╝╚██████╔╝███████╗███████║███████║    ██║ ╚████║╚██████╔╝██║ ╚═╝ ██║██████╔╝███████╗██║  ██║
 ╚═════╝  ╚═════╝ ╚══════╝╚══════╝╚══════╝    ╚═╝  ╚═══╝ ╚═════╝ ╚═╝     ╚═╝╚═════╝ ╚══════╝╚═╝  ╚═
私が考えている数字は何でしょう？
難易度を選んでください。easyかhardをどちらかを入力してください
hard
チャンスはあと5回です。
数字を当ててみてください。範囲は1〜100の間です。
4
4より高い数字です
違いますね。もう一度チャンスをあげます。
チャンスはあと4回です。
数字を当ててみてください。範囲は1〜100の間です。
10
10より高い数字です
違いますね。もう一度チャンスをあげます。
チャンスはあと3回です。
数字を当ててみてください。範囲は1〜100の間です。
40
40より低い数字です
違いますね。もう一度チャンスをあげます。
チャンスはあと2回です。
数字を当ててみてください。範囲は1〜100の間です。
30
30より低い数字です
違いますね。もう一度チャンスをあげます。
チャンスはあと1回です。
数字を当ててみてください。範囲は1〜100の間です。
20
20より高い数字です
残念です。あなたの負けです。
```

# 参考記事
https://qiita.com/kokui/items/9386c90ab9e68bad0f88