Newer
Older
Ruby / asobi.rb
#!/usr/bin/env ruby
# -*- coding: utf-8 -*-

def cyuusen(n)
  srand()
  m = rand(n)
  return m
end


def kakunin(x,y)                # 数字絞り込み完成!!
  x=x.chomp
  if /\D+/ =~ x  || x.to_i == 0 && x != "0"                # この人強いw
    return "ng"                 #数字でないやつ 
  else
    x = x.to_i
    if x >= 0 && x <= y
      return "ok"
    elsif x == 10
      puts"10が入力されました"
      return 10
    else
      return "ng"               # 指定範囲外の数
    end
  end
end


  
if false
puts"ゆびすま"                       #アップデートもがんばる
sleep(0.5)                           #いじってるのでどっか飛ぶかも
                                       
puts"                             説明"
puts"数を言って、親指を立てて、"
puts"立てた親指の数と言った数が2回同じだったら勝つやつです。"
puts"人数は自分を入れて、4人までで選べます。"
puts"一人はあなたです。他のプレイヤーは自動で行動します。"
puts"誰か1人が勝った時点でゲームを終了します。"
puts"行動は数字で決定します。行動可能なときに選択肢を提示します。"
puts"なお、行動可能なとき、「10」と入力するとゲームをやめることができます。"
puts"このゲームはenterで始めます。説明を読み終えたらenterを押してください。"
gets
end

jyunban = 0                #変数 システム系
kaisu   = 1
check = 0
n = 0


memberMax = ["Aさん","Bさん","Cさん","あなた"]
namae     = [] #ゲームをプレイするメンバー
# ついに人数選択が #実装!!
                                                 #もっといい方法はないものか?
  while check != "ok" && check != 10 
    print"人数を決めてください(2〜4人):"
    ninzuu = gets
    check = kakunin(ninzuu,4)
    if ninzuu.to_i <= 1
      check = "ng"
      redo
    end
  end
  ninzuu = ninzuu.to_i
  
  (ninzuu -1).times do |n|           # 頼んだインタプリタ(?!)
    namae << memberMax[n]
  end
  namae<<"あなた"
  
if ninzuu >= 2
    
   te_you = 2
   te_a   = 2
   yubi_you = 0
   yubi_a   = 0
end
if ninzuu >= 3

   te_b   = 2
   yubi_b   = 0
end
if ninzuu == 4

   te_c   = 2
   yubi_c   = 0           # 実行されなかったifの変数は存在していてnilになるっぽい
end

yubi = [yubi_a,yubi_b,yubi_c,yubi_you].compact
te   = [te_a, te_b, te_c,te_you].compact         # nil消し
# !をつけると変更がないときnilになる

yubi_max =  te.sum # 来てるよ?来てるよ!?


while true
  printf("          %d周目\n",kaisu)
  sleep  (0.5)
  printf("%sが数を言う番です\n",namae[jyunban])
  puts   "いっせーの!"
  if namae[jyunban] == "あなた"
    while check != "ok" && check != 10                 #あなたの番
      printf("言う数を入力してください(0〜%dまで):",yubi_max)
      iu = gets
      check = kakunin(iu,yubi_max)          #答えになってないと無限ループ
      
    end
    iu = iu.to_i
    if check == 10
      break
    end
  else                         #あなた以外の番(ランダムiu)
    iu = cyuusen(yubi_max +1)
  end
  check = 0
  
  while check != "ok" && check != 10
    printf("出す数を入力してください(0〜%dまで):",te_you)
    yubi_you = gets                   #kakuninが使うため実は文字列
    check =kakunin(yubi_you,te_you)   #入力なしに対応!!
  end
  yubi_you = yubi_you.to_i            #ここで数字になる(言う数〜も同様)
  if check == 10
    break
  end
  printf("%d!\n",iu)
  
  yubi_a = cyuusen(te_a +1) #ひとりじゃない 
  yubi_b = cyuusen(te_b +1) if !yubi_b.nil?
  yubi_c = cyuusen(te_c +1) if !yubi_c.nil?
  yubi   = [yubi_a,yubi_b,yubi_c,yubi_you].compact # 徹底的にnil消し

  puts"    指の数"
  namae.length.times do |n|
    printf("%s:%d  ",namae[n],yubi[n])
    n += 1
  end
  n = 0
 
  kei = yubi.sum
  printf("       合計:%d\n",kei)
  sleep(2)
  if kei == iu                            #誰かが当てたとき
    printf("%sが数を当てました!\n",namae[jyunban])
    yubi_max -= 1
    case namae[jyunban]
    when "Aさん"
      te_a   -= 1
    when "Bさん"
      te_b   -= 1
    when "Cさん"
      te_c   -= 1
    when "あなた"
      te_you -= 1
    end
    sleep(0.5)
    puts"    手の数"
       te = [te_a,te_b,te_c,te_you].compact # nil消し愛してる(?)
    namae.length.times do|n|
      printf("%s:%d  ",namae[n],te[n])
       sleep(1)
    end
    print"\n"
    if te_a == 0 || te_b == 0 || te_c == 0 || te_you == 0   #誰かのteが0
      printf("%sの勝ちです!\n",namae[jyunban])
      sleep(0.5)
      break
    end      
  end
  jyunban += 1
  if jyunban == namae.length    # これのおかげでいない人の順番は来ない
    jyunban =   0
    kaisu   +=  1
  end
  n = 0
  check = 0
end
puts"それではゲームを終了します。また遊ぼうね!"