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

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

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

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

Q&A

解決済

3回答

985閲覧

タートルの座標をrubyで出したい

NASKA--

総合スコア21

Ruby

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

0グッド

0クリップ

投稿2021/10/01 02:58

Rubyでタートルグラフィックスに用いられるタートルクラスを簡単に作成したのですが、タートルクラスを用いて実行するときに、座標を(x,y,a)のようにターミナルに出力する方法がわかりません。
こちらが作成したタートルクラスで

Ruby

1require 'matrix' 2include Math 3class Turtle 4 def initialize(width, height, ob) 5 @width, @height = width, height 6 @pen_po = Vector[0, 0] 7 @pen = ob 8 @dir = Vector[1, 0] 9 end 10 attr_accessor :pen_po, :dir 11 12 def lt(deg) 13 θ = PI * deg / 180 14 @dir = Matrix[[cos(θ), -sin(θ)], [sin(θ), cos(θ)]] * @dir 15 end 16 17 def rt(deg) 18 lt(-deg) 19 end 20 21 def fd(length, draw = true) 22 next_po = @pen_po + @dir * length 23 @pen_po = next_po 24 end 25 26 def bk(length) 27 fd(-length, false) 28 end 29 30 def moveTo(x, y) 31 @pen_po = Vector[x, y] 32 end 33end

こちらが実行しようとしたプログラムです

Ruby

1require_relative 'turtle' 2require 'matrix' 3include Math 4x=300.0 5y=200.0 6d=100.0 7t=Turtle.new(x,y,180) 8t1=Turtle.new(x+d,y+d,0.0) 9t.fd(d) 10t1.fd(d) 11t.lt(90.0) 12t1.lt(90.0) 13d=d/2 14t.fd(d) 15t1.fd(d) 16puts t 17puts t1

これを実行するとターミナルには

#<Turtle:0x00007f9032019c70> #<Turtle:0x00007f9032019b08>

と出てしまいます。これはタートルクラスを編集するのが正しいのでしょうか。それとも座標を出すときにputsを使用しているのが不適切なのでしょうか。

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

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

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

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

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

guest

回答3

0

ベストアンサー

タートルの内部情報を文字列で返すメソッドを追加してみました。
さらに debug(true) とすると、タートルの状態を変化させたときに自動で内部情報を表示するようにもしてみました。

ruby

1require 'matrix' 2include Math 3 4class Turtle 5 def initialize(width, height, ob, name = "_none_") 6 @width, @height = width, height 7 @pen = ob 8 @name = name 9 10 @pen_po = Vector[0, 0] 11 @dir = Vector[1, 0] 12 @angle = 0 13 @debug = false 14 end 15 16 attr_reader :pen_po, :dir, :angle, :pen, :name 17 18 def trace(val) 19 @debug = val 20 end 21 22 def info 23 "#{@name}:\t[#{@pen_po.to_a.to_s}, #{@angle}, #{@pen}]" 24 end 25 26 def lt(deg) 27 @angle = deg 28 θ = PI * deg / 180 29 @dir = Matrix[[cos(θ), -sin(θ)], [sin(θ), cos(θ)]] * @dir 30 puts info if @debug 31 end 32 33 def rt(deg) 34 lt(-deg) 35 end 36 37 def fd(length, draw = true) 38 next_po = @pen_po + @dir * length 39 @pen_po = next_po 40 puts info if @debug 41 end 42 43 def bk(length) 44 fd(-length, false) 45 end 46 47 def moveTo(x, y) 48 @pen_po = Vector[x, y] 49 puts info if @debug 50 end 51end 52 53if __FILE__ == $0 54 x =300.0 55 y =200.0 56 d =100.0 57 58 t = Turtle.new(x, y, 180, "t") 59 t1 = Turtle.new(x + d, y + d, 0.0, "t1") 60 61 t.fd(d) 62 t1.fd(d) 63 t.lt(90.0) 64 t1.lt(90.0) 65 d = d / 2 66 t.fd(d) 67 t1.fd(d) 68 puts t.info 69 puts t1.info 70 71 t.trace(true) 72 t.fd(d) 73 t.trace(false) 74 t.fd(d) 75end

実行例
イメージ説明

投稿2021/10/03 10:47

katoy

総合スコア22324

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

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

0

putsで文字列以外の物を表示しようとすると、そのオブジェクトのto_sメソッドを呼んで文字列化しようとします(※1)。Turtleクラスでto_sメソッドを定義していないので、Objectクラスのto_sメソッドが呼ばれてそういう表示になります。

puts Turtleオブジェクトで、座標が表示されて欲しいなら、to_sメソッドを、表示したい文字列を返すように定義しましょう。

※1:to_aryメソッドが定義されていれば先にそちらが呼ばれますが、今回は関係ないでしょう。そういう意味では、「文字列以外の物を表示しようとすると」は正確には「文字列と配列以外の物を~」です。

投稿2021/10/01 04:27

otn

総合スコア84808

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

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

0

これはタートルクラスを編集するのが正しいのでしょうか。それとも座標を出すときにputsを使用しているのが不適切なのでしょうか。

クラス内と、表示側の両方を編集するのが好ましいと考えます。

具体的には、Turtleクラス内に座標を文字列化するメソッドを作って、putsの際にそれを呼ぶ、という流れです。

投稿2021/10/01 03:01

maisumakun

総合スコア145208

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問