CrystalでHit&Blow

  • 3
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

この記事はCrystal Advent Calendar 2015の10日目の記事です。


どうも、サークルの記事にCrystalについて書いたらpineたんに捕まってしまった者です。
Rubyすらドットインストール見たきりの雑魚ですが、初心者向けの簡単な記事を書かせていただきます。

といっても、
ほとんどRubyのリファレンス見ながら書いたので、ほぼRubyですorz

今回作成したのは、Hit&Blowです。
以下がソースコードになります。

class HitAndBlow

  NUMBERS_LENGTH = 4

  def initialize
    @numbers = (0..9).to_a.sample(NUMBERS_LENGTH)
  end

  # Hitをカウント
  def decide_hit(input)
    hit = 0
    i = 0
    while i < NUMBERS_LENGTH
      if @numbers[i] == input[i].to_i
        hit += 1
      end
      i += 1
    end

    return hit
  end

  # Blowをカウント
  def decide_blow(input)
    blow = 0

    i = 0
    while i < NUMBERS_LENGTH
      j = 0
      while j < NUMBERS_LENGTH
        if i == j
          j += 1
          next
        end
        if @numbers[i] == input[j].to_i
          blow += 1
        end
        j += 1
      end
      i += 1
    end

    return blow
  end

  # 判定
  def decide(input)
    hit = decide_hit(input)
    blow = decide_blow(input)

    if hit == 4
      puts "正解です"
      puts "おめでとうございます"
      exit()
    else
      puts hit.to_s + "Hit! " + blow.to_s + "Blow!"
    end
  end

end

def main()
  loop do
    puts "4桁の整数を入力して下さい"
    puts "※ 途中で終わるときはCtrl+cで"

    input = gets
    input = input.to_s

    # エンター連打してたら戻る
    if input == "\n"
      next
    end

    # 数字かどうか判定
    begin
      input.to_i
    rescue
      puts "数字のみを入力してください"
      next
    end

    # 桁数を判定
    # 改行含むので5文字で判定
    if input.size != 5
      puts "4桁入力して下さい"
      next
    end

    puts "Number"
    $hit_and_blow.decide(input)

  end
end

$hit_and_blow = HitAndBlow.new
main()

見るに耐えないコードだと思いますが、一応動いたのでお許し下さい...。

Rubyとの違い

Rubyと違った部分は、

  • is_a?で数値を判定するときはis_a?(Integer)じゃなくてis_a?(Number) (結局使わなかった...)
  • 文字列の長さを取得するときは.lengthじゃなくて.size

の2点くらいでした。

そもそも、ほとんどRuby触ってないからよくわからないorz


雑ですが以上になります。
ありがとうございました!

明日は白瀬蒼さんのターンです!