「恋するプログラム」のMac向け読み替え その2

前回に続き、Macユーザーが恋するプログラムを勉強する上で、読み替えや説明が必要だったことをメモして行く。

  • CHAPTER 6-1
    サンプル(KOISURU_PROGRAM/sample/emotion)は、GUI絡みの変更のため、Macでは関係ない。

  • CHAPTER 6-3
    サンプル(KOISURU_PROGRAM/sample/emotion2)に以下の変更を行った。

    1. GUIで使われるbmpsフォルダ、noby.rbおよびnobycanvas.rbは破棄する。
    2. dicsフォルダにある2つの辞書をテキストエディタで開き、文字コードをUTF-8に、改行コードをLFに変換する。
    3. dictionary.rbは改行コードを変換する。
    4. responder.rbは文字コードと改行コードを変換する。
    5. unmo.rbは改行コードを変換、さらに以下の変更を行う。

      unmo.rb 1〜2行目

                          require 'responder'
                          require 'dictionary'
                      

                          require_relative 'responder'
                          require_relative 'dictionary'
                      

      に書き換える。

    6. 前回のCHAPTER 3-2での読み替えで作成したproto.rbをコピーしておく。
  • CHAPTER 6-4
    サンプル(KOISURU_PROGRAM/sample/emotion2)を動かすのは上記変更だが、番外編としてコードの理解に手間取ったことをメモしておく。

    1. dictionary.rb PatternItemクラス

      SEPARATORの正規表現の意味 – 後方参照
                                  SEPARATOR = /^((-?\d+)##)?(.*)$/      # (2)
      
                                  # SEPARATORの正規表現の意味
                                  #
                                  # 「^」は、行頭にマッチ
                                  # 「-?」は、-(マイナス)が1回あるか、ないケース
                                  # 「\d+」は、10進数が1回以上
                                  # 「-?」と「\d+」を組み合わせて正負の10進数が1回以上を意味する
                                  # (-?\d+)で、それをキャプチャ($2)すると同時に、この()でグループ化
                                  # ((-?\d+)##)で、「正負の10進数##」をキャプチャ($1)すると同時に、この()でグループ化
                                  # その次の「?」で、((-?\d+)##)が1回あるか、ないケース
                                  # (.*)は任意の一文字「.」の0回以上の繰り返し「*」をキャプチャ($3)すると同時に、
                                  # この()でグループ化
                                  # 「$」は行末にマッチ
                                  # 最終的に行頭が「±a」で始まり、行末が「任意の文字列」で終わる「±a##任意の文字列」
                                  # を意味し、「±a」「±a##」「任意の文字列」をキャプチャする。
                                  #
                                  # $& =「±a##任意の文字列」*マッチした文字列
                                  # $1 =「±a##」*マッチした部分文字列1
                                  # $2 =「±a」*マッチした部分文字列2
                                  # $3 = 「任意の文字列」*マッチした部分文字列3
                                  #
                                  # $付きの文字で取得したもの=あとで利用するもの=後方参照
                              
    2. dictionary.rb PatternItemクラス initializeメソッド

      initializeメソッドの意味
                                  # パターンは入力、フレーズは応答
                                  def initialize(pattern, phrases)
      
                                      # SEPARATORでpatternをマッチング
                                      SEPARATOR =~ pattern
      
                                      # @modifyと@patternに$2を整数化したものと$3を代入(後方参照)
                                      @modify, @pattern = $2.to_i, $3
      
                                      # 応答の処理。
                                      @phrases = []
      
                                      # 「|」で区切られた応答候補をバラし
                                      phrases.split('|').each do |phrase|
      
                                          # SEPARATORでphraseをマッチング
                                          SEPARATOR =~ phrase
      
                                          # 必要機嫌値と応答のハッシュに格納
                                          @phrases.push({'need'=>$2.to_i, 'phrase'=>$3})
                                      end
                                  end
                              
    3. dictionary.rb PatternItemクラス suitable?メソッド

      suitable?メソッドの意味
                                  def suitable?(need, mood)             # (8)
                                      return true if need == 0
                                      if need > 0
      
                                          # 戻り値はmoodがneedより大きいかを判定した結果の真偽値
                                          return mood > need
                                      else
      
                                          # 戻り値はmoodがneedより小さいかを判定した結果の真偽値
                                          return mood < need
                                      end
                                  end
                              

今回は短いが、話の区切りの都合上ここまでとする。その3に続く。

この投稿へのコメント

コメントはありません。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

この投稿へのトラックバック

トラックバックはありません。

トラックバック URL