トップページ⇒tech
1002コメント364KB

Ruby 初心者スレッド Part 58 [無断転載禁止]©5ch.io

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2016/03/23(水) 21:16:44.36ID:6HedlyzC
プログラミング言語Rubyについての、初心者向けスレです。質問・要望・雑談などどうぞ。
質問するときは、OSやRubyのバージョン、エラーメッセージを書いたほうがいいお
Ruby on RailsについてはWEBプログラミング板で

前スレ
Ruby 初心者スレッド Part 57
http://peace.2ch.net/test/read.cgi/tech/1426165733/

るりまサーチ (リファレンス検索)
http://rurema.clear-code.com/

Rubyist Magazine - るびま
http://jp.rubyist.net/magazine/

逆引きRuby
http://www.namaraii.com/rubytips/
0577デフォルトの名無しさん2016/07/24(日) 00:37:14.40ID:9mJaMPLw
>>574
確認画面が出たとき、ダブルクォーテーションがあると、文が切れる。
2chのバグだろう。たぶん、エスケープしていない

str = 'ttp://abc/xxx-1.jpg'
str = str.gsub(/-1.jpg/, '.jpg')

puts str

結果、ttp://abc/xxx.jpg

正規表現の先読みを使っても、できる
0578デフォルトの名無しさん2016/07/24(日) 00:56:13.49ID:VgaTJS92
>>576>>577
ご丁寧にありがとうございます。
今やってる作業がanemoneで拾ってきたhref要素を変数に入れてその一部-1を置換しようとしています。
教えていただいた通り、
str= node.css('a').attribute('href').value
str = str.gsub(/-1.jpg/, '.jpg')
puts str
と書き換えたのですが-1は消えませんでしたので、何か別の原因で引っかかってるみたいです。
0579デフォルトの名無しさん2016/07/24(日) 07:06:47.90ID:uCHUDa0e
細かい事だが /-1\.jpg$/ の方が変な誤爆しないですむ

実は-1じゃなくて-l(小文字のL largeサイズ指定)だったというオチが思い浮かんだが…
0580デフォルトの名無しさん2016/07/24(日) 07:36:38.76ID:ix/R/9ty
gsub(/http:\/\/○○\K-1(?=\.jpg)/, '')
0581デフォルトの名無しさん2016/07/24(日) 11:12:26.70ID:wdZTIji9
>>577
切れ"ない"よ
ブラウザのバグだろ
0582デフォルトの名無しさん2016/07/24(日) 14:16:46.18ID:VgaTJS92
574です。
置換する変数を間違っていただけのうっかりミスでした・・・orz
sub,gsubを使って上記の教えていただいた方法で変数の中身を無事置換できました。
ありがとうございますm(_ _)m
0583デフォルトの名無しさん2016/07/26(火) 21:17:51.50ID:uTRCF1br
>>440
> 個人的にはアスタリスク2回でハッシュを受け取る

> とかの方がよっぽど見かけたことないです。
> どなたか使ったことある方いらっしゃいますか?

カメだけど、超使う。
キーワード引数と組み合わせたり。
0584デフォルトの名無しさん2016/07/27(水) 15:07:46.63ID:nl1cCFz0
pythonだとさらによく使う
0585デフォルトの名無しさん2016/07/29(金) 08:11:29.53ID:1qYsbBpR
gtk3 でGUIを作ろうとしてるんだけど
stdinを監視したい

普通ならSTDIN.each_lineとかでSTDINを監視したら良いと思うけど
gtk3とか使うとイベントループさせないといけなくなるので
イベントループするメインルーチンでこれやりたいんだけど
やり方わかんない

標準入力を監視しながらのプログラムの場合どうやってる?
別スレッドにするのが普通なのかね?
0586デフォルトの名無しさん2016/07/29(金) 09:19:20.82ID:AO+a9SAV
>>585
・GUI の main loop で fd を監視
 http://pub.cozmixng.org/~the-rwiki/rw-cgi.rb?cmd=view;name=GUI+%A4%CE+main+loop+%A4%C7+fd+%A4%F2%B4%C6%BB%EB

・Gdk::Input - Ruby-GNOME2 Project Website
 https://ruby-gnome2.osdn.jp/hiki.cgi?Gdk%3A%3AInput

・stdinから一行ずつ読んでそれっぽく表示 on ruby-gnome2
 http://shyouhei.tumblr.com/post/119202369/stdinから一行ずつ読んでそれっぽく表示-on-ruby-gnome2
0587デフォルトの名無しさん2016/07/29(金) 09:45:02.59ID:1qYsbBpR
>>586
ありがとう!!!
gtk2ではその方法で上手くいきました
gtk3を使おうとするとGdk.InputのかわりにGLib::IOChannelを使うようにメッセージがでて
Gdk::Input::READのところでエラーになるんだけど
ちょっと検索かけただけじゃやり方わかりませんでした

御存じなら教えてください
よろしくお願い致します
0588デフォルトの名無しさん2016/07/29(金) 10:54:00.67ID:AO+a9SAV
>>587
GTK3は触っていなかったんだけど、GDKより低レイヤーなGLibで
外部イベントを扱うように変わったのですかね

・GLib::IOChannel - Ruby-GNOME2 Project Website
 https://ruby-gnome2.osdn.jp/hiki.cgi?GLib%3A%3AIOChannel

・ruby-gnome2/iochannel.rb at master · taf2/ruby-gnome2 · GitHub
 https://github.com/taf2/ruby-gnome2/blob/master/glib/sample/iochannel.rb

GTK2はGTK3へ更新されましたが、Glib2は(Glib3へ更新されず)そのままGTK3で使われているので、
そのまま動くのではないかと思われます(手元ではGTK3をインストしてないので動作未確認)
0589デフォルトの名無しさん2016/07/29(金) 10:58:51.55ID:1qYsbBpR
>>588
ありがとう助かったよ
検索上手いね!!
0590デフォルトの名無しさん2016/07/29(金) 15:09:47.59ID:DEZEXrtC
配列の中から偶数の要素だけ配列の中に残したいです。テキストにはselect!を使うとあるのですが、まだ、Rubyを勉強して日が浅いので、今までに勉強したやり方で
表記することにしました。自分の考えとしては、配列の要素のvalueを2で割った剰余が0であるもののみ、配列の中に入れなおすという方法しか思いつきませんでした。
そこで以下のプログラムにしてみたのですが、うまく動きません。どこがおかしいのか指摘していただけるでしょうか。よろしくお願いします。

nums = {a: 1, b: 2, c: 3, d: 4, e: 5}

nums.each do |key, value|

  if value%2 == 0

    nums[:key] = value

  end

p nums
0591デフォルトの名無しさん2016/07/29(金) 15:11:49.29ID:DEZEXrtC
配列じゃなくてハッシュでした
0592デフォルトの名無しさん2016/07/29(金) 15:28:57.91ID:1qYsbBpR
先程Gtk::Inputを使った方で
windowの生成も行なうと
上手く期待の動作しなかった

GLib::IOChannelを使ってSTDINをオープンしてadd_watchをそれに使うと
期待の動作になりました
ありがとう
まだGUIの方は作れてないけど作れそうな感じ
0593デフォルトの名無しさん2016/07/29(金) 15:35:49.37ID:flV7hOuN
>>590
これだと偶数の要素だった場合、その要素を再代入してることになる
新しく別の配列に代入するとかならその書き方で問題ないと思うよ
ちなみに nums.select! { |k, v| v % 2 == 0 } が一番良さそう
0594デフォルトの名無しさん2016/07/29(金) 16:15:45.30ID:WGKZmyFx
もっと別な書き方も紹介して混乱させよう
nums.each_with_object({}){|(k,v),o| o[k] = v if v.even?}
0595デフォルトの名無しさん2016/07/29(金) 16:55:05.51ID:Ogz/SEhr
特に面白いものは書けず
nums.reject{|_,v|v.odd?}
nums.grep(proc{|_,v|v&1==0}).to_h
nums.each{|k,v|v.odd?&&nums.delete(k)}
0596デフォルトの名無しさん2016/07/29(金) 17:11:04.04ID:1UayH1GQ
>>595の1つ目が今回に限っては一番妥当
「numsからodd?なものを取り除く」と読み下そう
思いつかなかった>>593-594もぜひ覚えて帰ってね!
0597デフォルトの名無しさん2016/07/29(金) 19:32:20.85ID:jkc14IDK
nums.each do |key, value|
  if value%2 == 0
    nums[:key] = value
  end

まずこれはeach doに対してendが無いからエラーになる
そして:keyはkeyではなく:keyというSymbolなのでこれも間違い
nums = {:a=>1, :b=>2, :c=>3, :d=>4, :e=>5, :key=>1}
nums[:b] = 2
p nums #=> {:a=>1, :b=>2, :c=>3, :d=>4, :e=>5, :key=>1}
飽くまで:bに対して2を再び関連付けているだけなので間違い
どうしても上のような書き方がしたいなら

h = Hash.new
nums.each do |key, value|
  if value%2 == 0
    h[key] = value
  end
end

p h #=> {:b=>2, :d=>4} 👀
Rock54: Caution(BBR-MD5:0be15ced7fbdb9fdb4d0ce1929c1b82f)
0598デフォルトの名無しさん2016/07/29(金) 20:01:51.49ID:mtfgcrou
>>597
やはりあなたはリンクしすぎです
ばいばいおさるさん
0599デフォルトの名無しさん2016/07/29(金) 23:54:22.01ID:AO+a9SAV
某テキスト(?)のメソッド Enumerable#select! を使うなら、
>>593 と >>595 の先頭を参考にして;

 nums.select! { |_, val| val.even? }

 https://ideone.com/Z84zqk


もしも同メソッドを使用せずに自前で各要素を列挙するなら:

 nums.each do |key, val|
   nums.delete key unless val.even?
 end

 https://ideone.com/UqpHHq


なお >>597 のように、元の変数 nums の値を(破壊的代入)で更新せず、
結果としての値を求めることを優先するというお題の改変が許されるなら:

 nums.select { |_, val| val.even? }

 https://ideone.com/JlEy6w

このコードを推奨する
0600デフォルトの名無しさん2016/07/30(土) 12:15:20.35ID:Fe6CTZY3
みなさんありがとうございます。細かい説明が助かります。自分は本当に基本的なことからわかっていなくてどこがわからないのかわからない、という
ていたらくでして。たぶん、いやきっと、593さんのようにメソッドをそれぞれ覚えていけばいいのでしょうが、もう結構記憶容量がパンパンで、とりあえず
知っているメソッドで何とかしようと思いました。しかし、みなさんすごいですね。?皆さん全員プロのプログラマなのですか?

もうちょっと勉強してみたいと思います。ありがとうございました。説明がわかりやすかったです。
0601デフォルトの名無しさん2016/07/30(土) 12:49:12.22ID:UN9LAiBT
よく使うメソッドなんて大した数ないから覚えるかその都度マニュアル読めばいいんじゃね
http://docs.ruby-lang.org/ja/2.3.0/class/Hash.html
まあメソッド覚える前に代入とか制御構造とかもっと基礎的なことを最低限理解してからにしろよとは思うが
0602デフォルトの名無しさん2016/08/02(火) 10:24:25.49ID:7rZajpxG
エクセルの列の文字列(AとかZZZとか)が何番目の列なのか計算するにはどうしたら良いでしょうか?
0603デフォルトの名無しさん2016/08/02(火) 10:34:33.19ID:R1uEEgNe
もっとうまい方法があるかもしれんが
# n番目の列
(n+2+624*26**log(25*n/26+1,26).to_i/25).to_s(26).tr('0-9a-p','A-Z')[1..-1]
# 列sの数
s.tr('A-Z','0-9a-p').to_i(26)+(26**s.length-26)/25
0604デフォルトの名無しさん2016/08/02(火) 19:33:06.09ID:G8b1Dkiv
Rubyに最近興味を持った者です
DXRubyを使用しており、Rubyのバージョンは2.0 32bit
OSはwindows7 64bitです

カレントディレクトリにあるフォルダを開き、中にあるtxt形式のファイルを取得し
その一行目に書かれていたことにたいしてifを使うにはどうすればいいでしょうか?
0605デフォルトの名無しさん2016/08/02(火) 19:49:44.99ID:GrXRtLCP
>>604
いっぺんに全部やろうとするからわからなくなる
↓のように問題を分割して、ひとつずつ調べていけばいいよ

・カレントディレクトリにあるフォルダを開き
・中にあるtxt形式のファイルを取得し
・その一行目に書かれていたこと
・にたいしてifを使う
0606デフォルトの名無しさん2016/08/02(火) 20:07:22.42ID:R1uEEgNe
str = open("フォルダ名/ファイル名.txt").readline # txtファイルの一行目

if (strの条件式)
 # やりたいこと
end
0607デフォルトの名無しさん2016/08/02(火) 21:15:40.05ID:G8b1Dkiv
>>606
では、二行目を単体で読み込む方法はどうするんでしょうか?

あと一行目と二行目を両方読み込む場合はどうするんでしょうか?
0608デフォルトの名無しさん2016/08/02(火) 21:20:03.60ID:bMxB9+Te
>>604
カレントディレクトリ中にある全てのtxt形式のファイルを開く場合
Dir.glob('./*.txt') do |fn|
File.open(fn, 'r:utf-8') do |f|
line = f.readline
if /条件/ =~ line
end
end
end
0609デフォルトの名無しさん2016/08/02(火) 22:04:55.90ID:R1uEEgNe
>>607
foo = open("フォルダ名/ファイル名.txt").
line1 = foo.readline # 一行目
line2 = foo.readline # 二行目

大した量じゃないんだからマニュアルを読もう
http://docs.ruby-lang.org/ja/2.3.0/class/IO.html
0610デフォルトの名無しさん2016/08/03(水) 00:10:59.84ID:qya5GR80
vipでプログラムの話題で盛り上がってるぞ
http://vipper.2ch.net/test/read.cgi/news4vip/1470062380/

これはrubyのステマするチャンス
0611デフォルトの名無しさん2016/08/03(水) 00:39:14.55ID:3mARGs2B
>>602
効率は良くないけど、EXCELで使う程度の数かつ、何十万回も計算を繰り返したりしないなら。

s=“A”; 0.upto(n){s.succ!}; p s

s=“ZZ”; p (“A”..s).to_s.size
0612デフォルトの名無しさん2016/08/03(水) 02:00:46.62ID:W0lh95XI
>>602
inject厨が書いてみた:
 https://ideone.com/PSRQnw
0613デフォルトの名無しさん2016/08/03(水) 13:48:51.38ID:zdWIlhYU
>>602
rubyだと“Z”.nextで”AA”になるから、”A”をスタートとして”ZZZ”までnextをループさせた回数=列の番号になるよ
0614デフォルトの名無しさん2016/08/03(水) 15:07:33.08ID:mbys/AN5
A -> 1
Z -> 26
の 26進数なんだよ
だから
ZZZ -> 26*26*25 + 26*25 + 25 + 1
と瞬時に判る
0615デフォルトの名無しさん2016/08/03(水) 15:10:29.88ID:mbys/AN5
ごめん間違った
桁の0に相当するものがないから
実際の値は違う
もうちょっと工夫が要るけど
考え方は 26進数
0616デフォルトの名無しさん2016/08/03(水) 15:17:25.06ID:B5cRJMaS
sを列の文字列とする
A-Zを A=0, Z=25 の26進数とみなして
s + B..B(Bがsの桁数個) - B が列の番号
だから>>603の下の式のようになる

これの逆変換が求めるものだけど素直にやると桁の左にあるAがなくなってしまうので
一旦 BA..A(Aはsの桁数個)を足しておいて最後にBを削れば良い
それが>>603の上の式
0617デフォルトの名無しさん2016/08/03(水) 15:26:35.51ID:mbys/AN5
logを使うのは筋が悪い希ガス
0618デフォルトの名無しさん2016/08/03(水) 15:31:21.63ID:B5cRJMaS
じゃあFixnum#bit_lengthでも使おう
0619デフォルトの名無しさん2016/08/03(水) 15:43:49.69ID:B5cRJMaS
つまりこういうことね
(n + 2 + 24*26**((25*n + 26).bit_length/4.7).to_i/25).to_s(26).tr('0-9a-p', 'A-Z')[1..-1]
0620デフォルトの名無しさん2016/08/03(水) 15:51:40.29ID:kO+977FM
xl = WIN32OLE.new('Excel.Application')
bk = xl.Workbooks.Add
ws = bk.Worksheets(1)
ws.Cells(1,1).Formula='=column($ZZZ$1)'
puts ws.Cells(1,1).Value
bk.Close
xl.Quit
0621デフォルトの名無しさん2016/08/03(水) 16:03:32.72ID:W0lh95XI
>>612を一般的な手続き型プログラミングへ書き直してみた:
 https://ideone.com/gO9N9x

これならPerlやPythonのような普通の手続き型言語を知っていれば
容易く読めるし、普通のプログラマが引き継いでも問題無く
保守できるのではないかと思われ
0622デフォルトの名無しさん2016/08/03(水) 16:46:12.54ID:/NIG+3Tl
n.to_s(26).tr('0-9a-p','@A-Y').sub(/(.)@/){$1.tr('A-Z','@-Y')+'Z'}.sub('@','')

もうちょい短くできそうでできない
0623デフォルトの名無しさん2016/08/03(水) 16:53:46.46ID:/NIG+3Tl
n.to_s(26).tr('0-9a-p','@A-Y').sub(/(.)@/){$1.tr('A-Z','@-Y')+'Z'}.sub('@','')

もうちょい短くできそうでできない
0624デフォルトの名無しさん2016/08/03(水) 16:56:15.69ID:/NIG+3Tl
連投すまんこ
あと'@A-Y'じゃなくて'@-Y'やな。動くけど
0625デフォルトの名無しさん2016/08/03(水) 17:02:40.83ID:B5cRJMaS
まだ行けるのかな
n.to_s(26).tr('0-9a-p',r='@-Y').sub(/(.)@/){$1.tr('A-Z',r)+'Z'}.delete('@') # 75 B
(n+2+24*26**Math.log(25*n+26,26).to_i/25).to_s(26).tr('0-9a-p','A-Z')[1..-1] # 77 B
0626デフォルトの名無しさん2016/08/03(水) 17:17:54.18ID:/NIG+3Tl
ごめんn=26*26とかの時におかしくなるわ
0627デフォルトの名無しさん2016/08/03(水) 18:04:32.66ID:/NIG+3Tl
p n.to_s(26).tr('0-9a-p',r='@-Y').tap{|s|s.chars{s.sub!(/(.)@/){$1.tr('A-Z',r)+'Z'}}}.delete('@')
#97B

rubyらしさを捨ててtap使わなければ4B減る
0628デフォルトの名無しさん2016/08/03(水) 18:06:33.96ID:mbys/AN5
logなんて使うから可笑しくなる
0629デフォルトの名無しさん2016/08/03(水) 18:09:55.37ID:B5cRJMaS
>>628
Math.logを使うのはいつでも正しいよ
>>626が言ってるのは>>623のこと
bit_lengthを使う方も10**20000くらいまでは正しい
0630デフォルトの名無しさん2016/08/03(水) 18:17:06.18ID:B5cRJMaS
「いつでも」は言いすぎだった
logも9.603431447*10**18989までは正しく動作するよ
0631デフォルトの名無しさん2016/08/03(水) 18:25:45.78ID:mbys/AN5
いつでも正しいコードを書けよ
0632デフォルトの名無しさん2016/08/03(水) 18:28:03.24ID:l8cxGlGj
諄い
0633デフォルトの名無しさん2016/08/03(水) 18:34:18.83ID:mbys/AN5
ついでに言ってやろう
余計な制限のあるコードにはコメントが必須

#logも9.603431447*10**18989までは正しい
+46Bだな
0634デフォルトの名無しさん2016/08/03(水) 18:39:46.41ID:B5cRJMaS
>>633
なんかキレてんの? システムに依存しない、アホみたいにでかい数値に対してすらいつでも正しいコードなんて存在するわけないだろ
0635デフォルトの名無しさん2016/08/03(水) 19:05:26.45ID:mbys/AN5
いや
切れてないよ
0636デフォルトの名無しさん2016/08/03(水) 19:14:20.38ID:B5cRJMaS
そうか、なんかすまんかった
いい加減黙ります ゴルフスレとかあったら面白いかもね
0637デフォルトの名無しさん2016/08/03(水) 23:34:22.20ID:W0lh95XI
String#ord を使うと更に短くなった(ついでにエラー検査も削除):
・関数型 :(旧) >>612 --> (新) https://ideone.com/OQLdlR
・手続き型:(旧) >>621 --> (新) https://ideone.com/Ja6tP9

String#succ の存在も初めて知ったし、勉強になったわ
0638デフォルトの名無しさん2016/08/04(木) 01:32:56.67ID:feZwYdLF
p s.chars.reverse.map.with_index{|c,i|(c.tr('A-Z','0-9a-p').to_i(26)+1)*(26**i)}.inject(:+)

Enumerator#with_indexはもっと流行っていいと思うんだ
使ってもそんなに短くはならないんだけどさ
0639sage2016/08/04(木) 01:37:51.37ID:2HyRwUYq
def cel_No( str )
str.strip.upcase.unpack('C*').inject(0){|result, item| result * 26 + item - 0100 }
end

def cel_str( n )
str = ""
while n > 0
n, r = (n - 1).divmod( 26 )
str << (r + 0101).chr
end
str
end
0640デフォルトの名無しさん2016/08/04(木) 14:01:54.35ID:2HyRwUYq
>>639
最後は
str.reverse
でした。
0641デフォルトの名無しさん2016/08/04(木) 23:00:36.83ID:c9zwl1qO
SQLの使用に関して質問です。
どのようにすれば、回避できるでしょうか?
■症状:インサートした日本語文字が文字化けする。


title =
0642デフォルトの名無しさん2016/08/04(木) 23:04:28.59ID:c9zwl1qO
うまく書き込めなかったので、もう一度

SQLの使用に関して質問です。
どのようにすれば、回避できるでしょうか?
■症状:インサートした日本語文字が文字化けする。
title="あいうえお123"
DB = Mysql.new('host','name','pass','test01')
sql = "UPDATE `test01`.`table01` SET `title` = '#{title}'WHERE `table01`.`id` = '4';"
DB.query(sql)
0643デフォルトの名無しさん2016/08/04(木) 23:36:28.77ID:QKnNcils
とりあえずSQLインジェクション丸出しの書き方はやめよう
0644デフォルトの名無しさん2016/08/05(金) 06:51:27.16ID:tltzsolz
[nil, *'A'..'Z', *'AA'..'ZZ', *'AAA'..'ZZZ'].find_index('ZZZ')
ひどいけどこれで十分
0645デフォルトの名無しさん2016/08/05(金) 07:12:44.43ID:x8TUq60L
Ruby, DBなど、すべてのアプリの文字コードを、UTF-8 に統一すれば?
0646デフォルトの名無しさん2016/08/05(金) 13:38:20.94ID:LJe/qM3f
その辺はrubyよりpythonの方が堅牢
perlは論外
0647デフォルトの名無しさん2016/08/05(金) 15:48:28.22ID:UhWsfPtN
横槍失礼します
>>604 です
唐突に質問なのですが
そもそもDXRubyでユーザーに文字を入力させ、それを扱うにはどうすれば良いのでしょうか
0648デフォルトの名無しさん2016/08/05(金) 15:49:58.62ID:UhWsfPtN
>>647
連投すみません
RPGの名前入力のようなものです

あと、一旦画面を消すのはどのようにするのでしょうか?
タイトルから本編へとかそういう感じです

結構しらべたのですが.....
0649デフォルトの名無しさん2016/08/05(金) 16:21:49.83ID:teNswV+z
DirectXプログラミングかWindowsプログラミングの経験はある?
このへんの基礎知識がないとAPI探せないし何渡していいのかもわからないよ
0650デフォルトの名無しさん2016/08/05(金) 18:50:19.50ID:UhWsfPtN
>>649
正直ありません
Rubyが一番最初にやりました
VBSやBASICはやったことがありますが.....

DXRubyを入れて調べながらやっているところです
0651デフォルトの名無しさん2016/08/06(土) 01:12:59.09ID:8Rl0Ybxy
DXRubyは知らないけど、そういう基本的な関数は、

チュートリアルでもやれば、わかるのでは?
0652デフォルトの名無しさん2016/08/06(土) 04:20:54.79ID:w5zQ+Fii
DXRubyのドキュメント読めばいんじゃねーの
0653デフォルトの名無しさん2016/08/06(土) 05:53:35.02ID:2mFu6MHm
>>644
https://support.office.com/ja-jp/article/Excel-の仕様と制限-ca36e2dc-1f09-4620-b726-67c00b05040f
0654デフォルトの名無しさん2016/08/06(土) 07:35:29.07ID:aQkr0mnl
>>651
チュートリアルには、文字の描画、キーの判定は書いてありますが
全てのキー入力の監視はどうやってやるのかなと.....
0655uy ◆e6.oHu1j.o 2016/08/06(土) 07:40:48.99ID:TO2ybUlL
>>648
DXRubyにそういうのをやってくれる関数はないよ
ていうか名前をアルファベットに限定するなら、そこまで長いコードにならないから
ユーザー入力部分を自分で書いてみれば良い

DXRubyは綺麗に小さくまとまっている良いライブラリではあるものの
このくらいはさっと書けないと、機能は結構少ないライブラリだから今後も苦労する事になるでしょう
0656uy ◆e6.oHu1j.o 2016/08/06(土) 07:45:28.31ID:TO2ybUlL
>>654
こんな感じで取得できる

Window.loop do
x = Input.keys
next if x.empty?
p x
end
0657uy ◆e6.oHu1j.o 2016/08/06(土) 07:51:12.27ID:TO2ybUlL
>>649
いや、DXRuby扱うのにそういう知識は全然いらない
そもそもゲームのライブラリってのは
DirectXやOpenGLの勉強をすっ飛ばして使えるようにライブラリ作者が上手くまとめてくれているもの
0658デフォルトの名無しさん2016/08/06(土) 08:14:46.43ID:aQkr0mnl
>>656
ありがとうございます!
keysで取得できるんですね!
ありがとうございます!
0659デフォルトの名無しさん2016/08/06(土) 08:28:12.52ID:aQkr0mnl
>>656
アルファベット限定でいいのでRPGの名前入力をしたいんですが
ユーザーが文字入力したのをnameという変数に記録し
それを画面に表示っていうのはできますでしょうか?

何度も質問本当にすみません
0660デフォルトの名無しさん2016/08/06(土) 09:21:45.32ID:xpLjq4a+
>>657
大抵C++のソース眺めるはめになるんだけどね
0661uy ◆e6.oHu1j.o 2016/08/06(土) 10:26:06.77ID:TO2ybUlL
>>659
ちょっと半端な出来だけど暇だったから書いた
https://ideone.com/r48pB5

文字を打ってエンター押したら
case , when の1のほういくから、そこで文字が青色になるサンプルコード


あと使ってるdxrubyのAPIのInput.set_repeatはこれね
http://mirichi.github.io/dxruby-doc/api/Input_23set_repeat.html
0662uy ◆e6.oHu1j.o 2016/08/06(土) 10:55:37.26ID:TO2ybUlL
あとは、>>648ここでいってるタイトルから本編とか
その辺りのコードは、ゲームでいうと「シーン管理」という

簡単な方法としては
phaseって変数に値を入れて
https://ideone.com/jJPN3k
こんな風に書くのが初歩的なやり方かな
工夫していくと、この辺も奥が深いロジックになるから、
自分なりにクラス化(シーン管理クラス)とか考えてみると良い

ついでに俺に遜った敬語いらんから
2chで身を低くしても得るもの無いぞ
0663デフォルトの名無しさん2016/08/06(土) 14:50:23.69ID:aQkr0mnl
>>662
ありがとうございます!
whenが9なのはなにか意味があるんでしょうか?
0664uy ◆e6.oHu1j.o 2016/08/06(土) 18:32:46.50ID:TO2ybUlL
>>663
たいして意味はない
0665デフォルトの名無しさん2016/08/06(土) 19:22:34.03ID:P6FYCdC3
シーン数はほとんど増えず1桁に収まるという前提で
最大値っぽい値にしてる ってとこだろう
0666uy ◆e6.oHu1j.o 2016/08/06(土) 20:43:13.60ID:TO2ybUlL
>>665
そんなところ

だけど、別にそこまで真似る必要ないからね
自分のコードの癖に突っ込むという、鋭い突っ込み
0667デフォルトの名無しさん2016/08/06(土) 23:11:34.04ID:aQkr0mnl
すみません再び質問です
例えば
test1.rbとtest2.rbいう2つのプログラムファイルがあるとして
test1.rbにはtest2.rbの内容をを実行させるというのはどうやってやるのでしょうか?
自分で、クラスを定義するのでしょうか?

test2.rbの内容はWindow.draw_fontを使いたいです
0668デフォルトの名無しさん2016/08/06(土) 23:38:13.30ID:FykwWLua
>>667
Kernel#system
0669uy ◆e6.oHu1j.o 2016/08/07(日) 02:19:16.41ID:ARnnbWqn
>>667
test2.rbにクラス定義して
test1.rbで
require"./test2.rb"

やれば良いんじゃね


>>668
test1.rb側でウィンドウ生成してるって前提あるだろうからそれ無理
0670デフォルトの名無しさん2016/08/07(日) 07:23:31.37ID:bL6v3Ot9
>>669
test2.rbの一行目にClass test2
と、書いて
test1.rbにrequireで読み込みます
そこから例えばAキーが押されたらtest2.rbを実行って
どうやるんでしょうか....
0671uy ◆e6.oHu1j.o 2016/08/07(日) 08:44:57.55ID:PWyfS198
>>670
その辺がまだわかんない段階なら無理にファイルわけしなくていいと思うぞ
rubyで普通にコード書けば小さめのゲームなんて1ファイルで書ききれるから

test1.rb
https://ideone.com/XyyEb2

test2.rb
https://ideone.com/cAxzVK
一応サンプルとしてはこうなるけど、
0672デフォルトの名無しさん2016/08/07(日) 08:49:56.24ID:bL6v3Ot9
>>671
本当に有難うございます
自分でも、もう少しリファレンスとか見てみます!
0673uy ◆e6.oHu1j.o 2016/08/07(日) 08:58:26.20ID:PWyfS198
>>672
暇なだけだからいいよ
ついでにいっとくと、dxrubyにはSpriteクラスってのがあって
このクラスで描画・移動・当たり判定が全部出来る
rubyの基礎を抑えたら>>671こういうコードじゃなくて

http://mirichi.github.io/dxruby-doc/tutorial/sprite.html
↑ここのサンプルみたいな感じで書いていったほうが良い
速度が10倍以上は違ってくるからね

俺不定期でしかこのスレ見ないけど、まぁがんばって
0674デフォルトの名無しさん2016/08/07(日) 17:34:52.83ID:bL6v3Ot9
>>673
速度についてですが
例えばifとcaseで同じ処理するとcaseのほうが早いと思うのですが

同じことをするプログラムでも、コードが短いほうが早いとかありますか?
0675デフォルトの名無しさん2016/08/07(日) 17:58:57.41ID:T8DF/r+j
>>674
そんなのあったとしても微差。考えるだけ無駄
それよりアルゴリズムのお勉強した方が早い
0676デフォルトの名無しさん2016/08/07(日) 18:05:45.89ID:gluNCp1x
>>674
まずは「Rubyはクソ遅い言語である」という事実を受け入れよう。
じゃあなんでそんなに遅い言語が使われているのかというと、
(1)多くのアプリケーションのボトルネックは言語ではなくDBアクセスやネットワークなどの外部要因だから
(2)速度が重要でないケースは結構多いから
ゲームの例で説明すると、
描画はRubyから直接手を出せないので(1)、更新処理は次の更新までに間に合いさえすればいいので(2)に該当するね
もちろん高度なゲームになると(1)や(2)の前提は成り立たなくなるけど、そのときは残念ながらRubyを捨てる時だ。
■ このスレッドは過去ログ倉庫に格納されています