質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.51%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Q&A

解決済

3回答

1347閲覧

Ruby で 遊んでみたのですが・・・

King_of_Flies

総合スコア382

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

0グッド

0クリップ

投稿2017/05/12 04:47

編集2017/05/12 05:38

現在独学でRuby学習中のものです。
下記コードを作りました。
分からないことが多々あったので、教えていただきたく思います。

ruby

1#rotation 通常Modeの回転数 2#firstHit 初当たりの回数 3#hit16R 16R当たり回数 4#hit6R 6R当たり回数 5#wonPachinkoBall 出玉数 6 7=begin 8 通常モードの処理。 9 1/319で初当たり当選。 10 出玉が1280発貰える。 11 その後確立変動への抽選処理へ移行する。 12=end 13 14def normalMode(rotation,firstHit,hit16R,hit6R,wonPachinkoBall) 15 loop do 16 17 result = rand(319)+1 18 rotation += 1 19 20 if result > 318 then 21 puts "大当たり" 22 firstHit += 1 23 wonPachinkoBall += 1280 24 vChallenge(rotation,firstHit,hit16R,hit6R,wonPachinkoBall) 25 else 26 puts "はずれ" 27 end 28 end 29end 30 31=begin 32 確立変動への抽選処理 33 5割で確立変動Modeへ突入する。 34 確立変動Modeの抽選に漏れた場合は、通常モードの処理へ移行する。 35 確立変動Modeの抽選に当選した場合は、出玉を520増やし、確立変動モードへ移行する。 36=end 37 38def vChallenge(rotation,firstHit,hit16R,hit6R,wonPachinkoBall) 39 result = rand(10)+1 40 if result > 5 then 41 puts "確変突入" 42 wonPachinkoBall += 520 43 vMode(rotation,firstHit,hit16R,hit6R,wonPachinkoBall) 44 else 45 puts "リベンジモード突入" 46 normalMode(rotation,firstHit,hit16R,hit6R,wonPachinkoBall) 47 end 48end 49 50=begin 51 確立変動モードの処理 52 120回転以内に1/75の抽選に当選すれば、出玉を(1800(70%)/600(30%))で増やし、回転数をリセットする。 53 120回転以内に1/75の抽選に当選しなければゲーム終了。 54 清算処理へ移行する。 55=end 56 57def vMode(rotation,firstHit,hit16R,hit6R,wonPachinkoBall) 58 i = 0 59 while i < 120 do 60 i = i+1 61 result = rand(75)+1 62 if result > 74 then 63 puts "Vistory" 64 i = 1 65 win = rand(100)+1 66 if win > 31 67 wonPachinkoBall += 1800 68 hit16R += 1 69 else 70 wonPachinkoBall += 600 71 hit6R += 1 72 end 73 else 74 puts "はずれ" 75 end 76 end 77 puts "確変終了" 78 clear(rotation,firstHit,hit16R,hit6R,wonPachinkoBall) 79end 80 81 82=begin 83 清算処理 84 通常回転数、初当たり回数、16R取得回数、6R取得回数、出玉、投資を出力する。 85 プログラムを終了する。 86=end 87def clear(rotation,firstHit,hit16R,hit6R,wonPachinkoBall) 88 investment = rotation / 3 89 if investment < 5 then 90 investment = 5 91 end 92 93 print "通常回転数は",rotation,"回\n" 94 print "初当たり回数は",firstHit,"回\n" 95 print "16R取得回数は",hit16R,"回\n" 96 print "6R取得回数は",hit6R,"回\n" 97 print "出玉は",wonPachinkoBall,"発で、換金すると",wonPachinkoBall*4,"円です。" 98 print "投資は",investment,"00円です。" 99 exit(0) 100end 101 102normalMode(0,0,0,0,0)

分からなかったこと。

・Rubyでのmodelの作り方がわからず、引数が多い。
⇒model.hoge = ~ ってやりたい。
⇒hogemethod(model)ってやりたい。

・投資の金額を500区切りの切り上げにしたいがやり方がわからない。
⇒例えば投資金額が1400だったら1500にしたい。
⇒1600だったら2000にしたい。
⇒四捨五入ではないし、切り上げでもない。
⇒しいて言うなら切り上げに区切りの制御を入れた感じ。

ちなみに処理的には動くはずなので、
動かしてみて、いくら勝てたか教えてくれ。(笑

【追記/編集しました。】

ruby

1#rotation 総回転数 2#firstHit 初当たりの回数 3#hit16R 16R当たり回数 4#hit6R 6R当たり回数 5#wonPachinkoBall 出玉数 6 7=begin 8 通常モードの処理。 9 1/319で初当たり当選。 10 出玉が1280発貰える。 11 その後確立変動への抽選処理へ移行する。 12=end 13 14def normalMode(rotation,firstHit,hit16R,hit6R,wonPachinkoBall) 15 loop do 16 17 result = rand(99)+1 18 rotation += 1 19 20 if result > 98 then 21 puts "大当たり" 22 firstHit += 1 23 wonPachinkoBall += 320 24 vChallenge(rotation,firstHit,hit16R,hit6R,wonPachinkoBall) 25 else 26 puts "はずれ" 27 end 28 end 29end 30 31=begin 32 確立変動への抽選処理 33 5割で確立変動Modeへ突入する。 34 確立変動Modeの抽選に漏れた場合は、通常モードの処理へ移行する。 35 確立変動Modeの抽選に当選した場合は、出玉を520増やし、確立変動モードへ移行する。 36=end 37 38def vChallenge(rotation,firstHit,hit16R,hit6R,wonPachinkoBall) 39 result = rand(10)+1 40 if result > 5 then 41 puts "確変突入" 42 wonPachinkoBall += 260 43 vMode(rotation,firstHit,hit16R,hit6R,wonPachinkoBall) 44 else 45 puts "リベンジモード突入" 46 normalMode(rotation,firstHit,hit16R,hit6R,wonPachinkoBall) 47 end 48end 49 50=begin 51 確立変動モードの処理 52 100回転以内に1/80の抽選に当選すれば、出玉を(1200(50%)/400(50%))で増やし、回転数をリセットする。 53 100回転以内に1/80の抽選に当選しなければゲーム終了。 54 清算処理へ移行する。 55=end 56 57def vMode(rotation,firstHit,hit16R,hit6R,wonPachinkoBall) 58 i = 0 59 while i < 100 do 60 i = i+1 61 result = rand(80)+1 62 rotation += 1 63 if result > 79 then 64 puts "Vistory" 65 i = 1 66 win = rand(100)+1 67 if win > 49 68 wonPachinkoBall += 1200 69 hit16R += 1 70 else 71 wonPachinkoBall += 400 72 hit6R += 1 73 end 74 else 75 puts "はずれ" 76 end 77 end 78 puts "確変終了" 79 clear(rotation,firstHit,hit16R,hit6R,wonPachinkoBall) 80end 81 82 83=begin 84 清算処理 85 総回転数、初当たり回数、16R取得回数、6R取得回数、出玉、投資を出力する。 86 プログラムを終了する。 87=end 88def clear(rotation,firstHit,hit16R,hit6R,wonPachinkoBall) 89 investment = rotation / 3 90 if investment < 5 then 91 investment = 5 92 end 93 investment /= 5.0 94 investment = (investment).ceil 95 investment *= 5 96 kankin = (wonPachinkoBall * 4)/500.0 97 kankin = kankin.floor 98 kankin *= 500 99 100 print "通常回転数は",rotation,"回\n" 101 print "初当たり回数は",firstHit,"回\n" 102 print "16R取得回数は",hit16R,"回\n" 103 print "6R取得回数は",hit6R,"回\n" 104 print "出玉は",wonPachinkoBall,"発で、換金すると",kankin,"円です。" 105 print "投資は",investment,"00円です。" 106 exit(0) 107end 108 109normalMode(0,0,0,0,0)

クラス適応はまだですが。
とりあえず500単位に出来ました。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

coco_bauer

2017/05/12 04:50

「クソ多い」というような汚い言葉は使わないようにしてください。 笑い事ではないです。
guest

回答3

0

クラスとするのであれば、これは「台」を表すクラスを作り、それに対して玉を打って、出玉を返してもらう、という感じになりますかね。

ちなみに、大当たり確率が 1/318 であるならば、1回の玉打ちで大当たり判定を 1/318 にしては、実はいけません。きちんと計算するとわかりますが、318回回しても一回も大当たりしない確率が36.73% あります。※つまり3人に1人は大当たりしていない
それどこか1000回回してさえ、およそ4%の人は大当たりしません。

投資の切り上げですが、こう考えると道筋は見えるかと思います。

ある数 X より大きい、N の倍数を求めるには、
XをNで割った商(実数値)を求め、
その値より大きい最小の整数 Y をとり、
N × Y を計算すればよい。

例:1400 を 500 単位で切り上げるには、
1400 ÷ 500 = 2.8
2.8 より大きい最小の整数 = 3
よって求める結果は 3 × 500 = 1500

※ X が負数だった場合を考慮していないのですが、今回の用途であれば問題ありません

投稿2017/05/12 04:58

編集2017/05/12 05:14
tacsheaven

総合スコア13703

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

King_of_Flies

2017/05/12 05:14

ちょっとやってみて、 上記の(inventement/500).ceilでinventment=700だった場合 期待値1.4ですが、1が出ます。
tacsheaven

2017/05/12 05:18

inventment も 500 も、どちらも「整数(Integer)」だからです。整数÷整数の結果は整数になる(切り捨て)ので、そういう動きになります。どちらかをFloat にしてやって、Float での演算結果をとらねばなりません。
King_of_Flies

2017/05/12 05:40

【追記/編集】に書き換えたソースを記載しました。 処理結果が望んだものになったのでうれしいです。 ありがとうございます。
King_of_Flies

2017/05/12 06:16

クラス・・・というより、 c#でいうところの public class HogeModel { public int rotation {get;set;} public int firstHit {get;set;} public int hit16R {get;set;} public int hit6R {get;set;} public int wonPachinkoBall {get;set;} } って感じでプロパティを一つにまとめる方法がRubyにあるのか知りたいんですよね。 そうすれば、 def vModeで仮に付くるのであれば HogeModel hm = new HogeModel(); def vMode (hm)  i = 0  while i < 100 do   result = rand(80)   hm.rotation += 1 略  end end って感じの記述が出来ると良いのですが。
King_of_Flies

2017/05/12 06:56

分かりにくいというか、分からなかった・・・。 class propaty @foo = 0 @bar = 0 @hoge = 0 end def hogeMethod p = propaty.new p.foo = 2 hogeMethod2(p) end def hogeMethod2(p) p.bar = 10 print "p.bar" print "p.foo" print "p.hoge" end 1020 こうなるんか・・・?
guest

0

ベストアンサー

質問文にあるコードを同じ動作を保っているかは不安がありますが、
ともかく、クラスを作って書いみました。

ruby

1class Machine 2 def initialize 3 @play_count = 0 # 総回転数 4 @first_hit = 0 # 初当たりの回数 5 @hit16r = 0 # 16R当たり回数 6 @hit6r = 0 # 6R当たり回数 7 @won_ball = 0 # 出玉数 8 end 9 10 # ゲームをする 11 def play 12 normal_mode 13 end 14 15 # 清算処理 16 # 総回転数、初当たり回数、16R取得回数、6R取得回数、出玉、投資を出力する。 17 def show_result 18 investment = @play_count / 3 19 investment = 5 if investment < 5 20 21 investment /= 5.0 22 investment = investment.ceil 23 investment *= 5 24 kankin = (@won_ball * 4) / 500.0 25 kankin = kankin.floor 26 kankin *= 500 27 28 puts "通常回転数は#{@play_count}回" 29 puts "初当たり回数は#{@first_hit}回" 30 puts "16R取得回数は#{@hit16r}回" 31 puts "6R取得回数は#{@hit6r}回" 32 puts "出玉は#{@won_ball}発で、換金すると#{kankin}円です。" 33 puts "投資は#{investment}00円です。" 34 end 35 36 private 37 38 # 通常モードの処理。 39 # 1/319で初当たり当選。 40 # 出玉が1280発貰える。 41 # その後確立変動への抽選処理へ移行する。 42 def normal_mode 43 loop do 44 @play_count += 1 45 46 result = rand(319) + 1 47 break if result > 318 48 puts 'はずれ' 49 end 50 51 puts '大当たり' 52 @first_hit += 1 53 @won_ball += 1280 54 v_challenge 55 end 56 57 # 確立変動への抽選処理 58 # 5割で確立変動Modeへ突入する。 59 # 確立変動Modeの抽選に漏れた場合は、通常モードの処理へ移行する。 60 # 確立変動Modeの抽選に当選した場合は、出玉を520増やし、確立変動モードへ移行する。 61 def v_challenge 62 result = rand(10) + 1 63 if result > 5 64 puts '確変突入' 65 @won_ball += 260 66 v_mode 67 else 68 puts 'リベンジモード突入' 69 normal_mode 70 end 71 end 72 73 # 確立変動モードの処理 74 # 100回転以内に1/80の抽選に当選すれば、出玉を(1200(50%)/400(50%))で増やし、回転数をリセットする。 75 # 100回転以内に1/80の抽選に当選しなければゲーム終了。 76 # 清算処理へ移行する。 77 def v_mode 78 i = 0 79 while i < 100 80 i += 1 81 result = rand(80) + 1 82 @play_count += 1 83 if result > 79 84 puts 'Vistory' 85 i = 1 86 win = rand(100) + 1 87 if win > 49 88 @won_ball += 1200 89 @hit16r += 1 90 else 91 @won_ball += 400 92 @hit6r += 1 93 end 94 else 95 puts 'はずれ' 96 end 97 end 98 puts '確変終了' 99 end 100end 101 102machine = Machine.new 103machine.play 104machine.show_result

実行例

イメージ説明

投稿2017/05/13 23:13

katoy

総合スコア22322

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

「プロパティがいくつかあって、全てアクセサでアクセスできればいい」という場合、Structというクラスを使うと便利です(るりま)。

ruby

1SomeClass = Struct.new(:foo, :bar, :baz) 2 3s = SomeClass.new 4 5# sには「foo」「bar」「baz」「foo=」「bar=」「baz=」のようなメソッドができている

投稿2017/05/12 05:33

maisumakun

総合スコア145062

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

King_of_Flies

2017/05/12 06:06

今回の場合だと SomeClass = Struct.new(:normalMode,:vChallenge,:vMode) s = SomeClass.new s(rotation,firstHit,hit16R,hit6R,wonPachinkoBall) ということでしょうか?
maisumakun

2017/05/12 06:14

sはオブジェクトですので、s()の形で呼び出すことはできません。 メソッドを生やしたい場合、「Struct.new do」でクラス定義を開いて、そこにメソッドを作りましょう。
King_of_Flies

2017/05/12 06:22

s.rotation(引数)って感じになるのですか? textでやると自動補完機能が無いのでどういうオブジェクト持ってるのか確認しにくいな・・・。 とりあえず、Structについて調べてみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.51%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問