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

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

ただいまの
回答率

90.48%

  • Ruby

    7919questions

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

Ruby クラスの定義

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 627

Oramun

score 68

Rubyを学習して1ヶ月少しの初心者です。
DXRubyを使って2Dゲーム、「マリオ」的なものを作ってみました。
ここにクラスの定義などを追加していきたいのですが、そもそもクラスとは何なのか。どこをクラスにしたらいいのかなど、まだ理解できていないことがたくさんある状態です。
今はただ実装したいことをだらだら書いていきましたが一段階上のコードへとグレードアップしていきたいです。
ほかに効率的な書き方や実装したらいい事などあれば教えていただけると幸いです。

require "dxruby"

#マップデータ [1Block=32*32] Width17, height15
map = [[1, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
       [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 7],
       [1, 0, 0, 1, 1, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 0, 6],
       [1, 0, 0, 0, 0, 1, 5, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1],
       [1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1],
       [1, 0, 0, 2, 2, 0, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 1],
       [1, 0, 2, 2, 0, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 1, 1],
       [1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1],
       [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1],
       [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1],
       [1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1],
       [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1],
       [1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1],
       [1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1],
       [1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 0, 1, 1, 0, 0, 1],
       [1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 0, 1, 1, 0, 0, 1]]

#配置パーツ
block = []
block[0] = Image.new(32, 32, [50, 200, 255])   #空 背景
block[1] = Image.new(32, 32, [100, 50, 0])      #茶 ブロック
block[2] = Image.new(32, 32, [255, 255, 255]) #白 雲
block[3] = Image.new(32, 32, [0, 0, 0])            #黒 ゴール
block[4] = Image.load("image1.png")
block[5] = Image.load("image2.png")
block[6] = Image.load("image3.png")
block[7] = Image.load("image4.png")
block[8] = Image.load("image5.png")

#キャラ
character = Image.load("c_mario.png")

#初期値設定
x = 32
y = preview = 32
f = 1
item = 0
jump = false

#対応する配列を返す
def collision(x, y, array)
  return array[y/32][x/32]
end


#ループ開始
Window.loop do

  #Y軸移動増分の設定
  y_move = (y - preview) + f

  #すりぬけ回避
  if y_move > 31
     y_move = 31
  end
  preview = y
  y += y_move
  f = 1 #重力設定

  #落下時 座標初期化
  if y >= 480
     x = 32
     y = preview = 0
     item = 0
     map[3][6] = 5 #ブロック再表示
     map[2][6] = 0 #アイテムを消去
  end

  #天井衝突判定
  if collision(x   , y, map) == 1 or 
     collision(x+31, y, map) == 1 then 
     y = y/32*32 + 32
  end
  #床衝突判定
  if collision(x   , y+31, map) == 1 or 
     collision(x+31, y+31, map) == 1 then
     y = y/32*32 
     jump = true  #地面に接地時ジャンプ許可
  else
     jump = false #不許可
  end

  #移動スピード
  if item == 1
    x += Input.x * 5
  else
      x += Input.x * 2
  end

  #壁衝突判定(左側)
  if collision(x   , y   , map) == 1 or
     collision(x   , y+31, map) == 1 then
     x = x/32*32 + 32
  end
  #壁衝突判定(右側)
  if collision(x+31, y   , map) == 1 or 
     collision(x+31, y+31, map) == 1 then
     x = x/32*32
  end
  #アイテム衝突判定
  if collision(x   , y   , map) == 4 or 
     collision(x   , y+31, map) == 4 then
     x = x/32*32 + 32
     map[2][6] = 0
     item = 1
  end
  #ブロック衝突判定
  if collision(x   , y, map) == 5 or 
     collision(x+31, y, map) == 5 then 
     y = y/32*32 + 32
     map[2][6] = 4
     map[3][6] = 1
  end
  if collision(x   , y+31, map) == 5 or 
     collision(x+31, y+31, map) == 5 then
     y = y/32*32
     jump = true
  end

  #Escで終了
  if Input.key_push?(K_ESCAPE)
    break
  end
  #ジャンプ
  if Input.key_push?(K_SPACE) and jump
    f = -15
  end

  #マップの表示
  Window.draw_tile(0,0,map,block,0,0, 17, 15)
  #キャラの表示
  Window.draw(x, y, character)

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

例えば、マリオというキャラクターには、マップのどこにいるか、残り体力はいくつか、といった属性(プロパティ)がありますよね。一方で、マリオに対し、どこに移動しろ、どれだけのダメージを受けろ、といった操作(メソッド)があります。
このように、概念(プロパティの集合)とそれに対する操作・命令をまとめたものを、クラスと呼びます。

質問者さんのコードを見た感じだと、キャラクターをクラスとしてまとめてみるのが、理解に役立つと思います。
難しければ、マニュアルを読みながら、文字列や配列の色々な操作を試してみてください。いずれも実体はクラスオブジェクトなので、「操作」というものがどういうものか分かりやすいと思います。

私はRubyについては専門外なので、ぜひ「Ruby+入門」というキーワードで検索してみてください。多くのページにクラスの書き方が載っていると思います。

もし、何をプロパティとして、何をメソッドとしてまとめたらいいか分からない、ということでしたら、また質問ください。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/08/27 23:33

    ありがとうございます!少し頑張ってみようと思います!

    キャンセル

  • 2015/08/28 01:30

    すいません、度々申し訳ないです。
    やはり少しむずかしいところがありました。
    書き方や何をどうしたらいいかなど教えていただけると幸いです。

    キャンセル

  • 2015/08/28 11:55

    少し考えてはみましたがやはりわからないところがあります...。
    https://teratail.com/questions/15275
    回答いただけると幸いです。

    キャンセル

関連した質問

  • 受付中

    Rubyで配列の数字を足していきたい

    Arrayに累積配列?を作成したいですがよい実装方法を教えてください 例 [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]から [1, 3, 6, 10, 15,

  • 解決済

    rubyの外部ファイル参照について

    CSVの内容を読み込んでスコア等を計算していたのですが、ソースが見づらくなったので、CSV(読み込み、書き込み、一覧表示など)と計算のファイルに分けたいと思っているのですが、どうす

  • 解決済

    【大至急】Ruby クラスの定義

    /**追記、コード編集**/ みなさんの説明はわかりやすく、理解できたところはあります。 メソッドの定義など「こんな感じなのかな」とすこし変更してみました。 ですがやはりまだ動き

  • 解決済

    Ruby コード修正

    今書いているコードを1つ上の段階へとグレードアップするため色々と質問させていただきました。 質問① 質問② ですがやはりうまくいかず苦戦していました。 あまり答えを聞くような形でよ

  • 解決済

    【RubyGTK3】RubyGTK3を使ったプログラムのexe化について

    前提・実現したいこと Rubyでデスクトップマスコット(現時点では透過pngを画面に表示するだけ)の制作を目指しています。 できあがったプログラムをocraでexe化しようとす

  • 解決済

    書いたコードのどこが間違っているのか分かりません

    num = gets.chomp.split("").map(&:to_i) while 1 flag = true (0..num.size-2).each do |i

  • 解決済

    Rubyのソースコードをデスクトップアプリ化したい

    前提・実現したいこと Rubyにてnokogiriを使用してスクレイピングするアプリを作ったとします。 それをターミナルやコマンドプロンプトからの操作ではなく、デスクトップアプ

  • 受付中

    ruby とある問題での回答例。関数やクラス使えそうか?

    失礼します。 とある問題を説いていたら次のようなコードになりました。(問題の内容は拡散禁止されているため個人的な回答内容から読み取ってください。) ちなみに入力される値はこ

同じタグがついた質問を見る

  • Ruby

    7919questions

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