LoginSignup
3
3

More than 5 years have passed since last update.

CrystalでHit&Blow

Last updated at Posted at 2015-12-10

この記事は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


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

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

3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3