ファントムブレイブPSPの話(攻略情報有り)その2 アイテム壊してレベル上げ

クリアして追加キャラを育ててるんですが
(ディスガイアのキャラもね♪)
最初はアイテム壊してレベル上げた方がいいかなと思い
持ってるアイテム壊してヒーラーに直してもらって
また壊してを繰り返してたんですけど
コレ意外と効率いいぞ。と気付きましたw

そういうレベル上げの手法もあるとはNETで見た気しますが
案外効率いいです。ヒーラーで回復するのもそんなにお金かかりません
ゲームの展開的に後半気味だから相対的に回復費用下がってるのかもしれませんが
一人のキャラづつレベル上げれるのもいいですね
後、あんまりランダムダンジョンでばかりレベル上げしてても飽きるので
気分を変えたレベル上げです

ファントムブレイブPSPの話(攻略情報有り)その1

自分、先日、ファントムブレイブPSPをクリアしました
ドンドンドンパフパフパフ(死語w)

NETでPSP版には追加キャラが5キャラいるようで
どうやったら仲間になるか不安でググったりもしたんですが
そういう情報はHITしませんでした

でクリアして手紙を読んで新聞も読んで島から外に出て
また島に戻ったかんじで
(いやー記憶が曖昧でもっと条件ゆるいかもしれませんw)
キャナリーが島に来てバミューダ島にヒーロー候補が来るとのこと
外のマップの左側にあります
でそこをクリアしてくと追加キャラが仲間になってくれるかんじです
良さそうな武器も装備しててボトルメールは鍛えていた方がいいです
自分は4キャラ仲間にして5キャラ目がレベル高くて
レベル上げ頑張ってから攻略してくかんじです

プログラム言語作成の順番

よくあるプログラム言語の作成の本って
字句解析→構文解析→中間言語
ってウォーターフォールっぽく進むじゃないですか

僕もそういう本。結構、読んだんですけど
順番が逆じゃないのかな?と思うんですよね
中間言語とかいってそれはなくてもいいと思うんですけど
まああってもいいんですがw
内部表現と記述しましょうか

内部表現の仕様をしっかり把握してないと
構文解析のアウトプットの仕方を構成出来ないし
構文解析の仕組みを把握してないと字句解析出来ないんじゃないかな?
と思うんです

なんでそう思うかというと
簡単めの書籍で
入力を一行単位で入力してるんです
まあ最初の方なんですけど
字句解析も構文解析もすっとばして
いきなり内部表現にアクセスしてる訳ですな
そして割と最初の方でスタックのダンプ関数用意してます
スタックマシンなんで内部表現がスタックの構成割合が多いんですね
スタックをダンプする事が重要なのではなく
内部表現の見える化が重要なんでしょうね

内部表現は割と解決されている。と思うかもしれませんが
僕がちょこちょこ写経/書写してるホワイトスペースという簡単言語は
結構、色々な言語バージョン(CとかRubyとかPythonとか)
で書かれてるバージョンがあるんですけど
それぞれによって内部表現違うんですよね
言語それぞれに解法は一つとも違って
RubyでPython風にも書けるでしょうし、RubyでC風にも書けるっぽいです
逆にCでRuby風とかは辛いっぽそうでしょうけど
字句解析に正規表現使ってたりしますから
まあ、結構、作者の考え方によって
内部表現の表現に仕方って分かれるんじゃないのかな?って思います

書籍も色々あって
こうウォーターフォールじゃなく
アジャイルに発展を繰り返しながら発展していく書籍も結構あるんですけど
それでも考え方は一緒で
字句解析の発展→構文解析の発展→内部処理の発展
と進みます
なんていうか
そっちの方が説明し易いからそう書いているだけで
作者は割と同時進行で考えている気がします
でもそれも
内部処理の変更を把握しないと構文解析の変更を把握出来ないでしょうし
構文解析の変更を把握しないと字句解析の変更を把握出来ないと思うんです
同時進行でやる人も多いかもしれませんが

自分は、yaccとかも駆使してコーディングしたい気もありますが
やっぱいきなりyacc駆使は無理なんかなーみたいな
手で小型構文解析を繰り返して慣れてきてからっぽいっすね

後、言語処理系作りたくてもやっぱりプログラミングスキルも必要なのかな?と
才能じゃなく(それも重要なんですがw)作業量も必要っぽいっす
いわゆる一万時間の学習的な
自分は一万時間目指して写経/書写頑張って4年くらい経ち
15万行くらいっすw 一時間に100行(150行くらいやれる気もしますがw)
だとすると1500時間っすね。プログラミングそのものとか
書籍読んだ時間とももあるから純粋にそうじゃないけど
才能が無い事を嘆く前に学習量を積めって自分に言ってるごとしでした

vim マクロ スペース

こんにちわ。

自分、プログラムの写経はwinのgvimでやってるんですが
今やってるのがインデント全部スペースw
インデントがスペース8個ぶんでも全部スペース
インデントがスペース16個ぶんでも全部スペースw

gvimのオートインデントはタブ込みでしちゃいます

さすがにめんどくさいのでマクロやってみました
q+なんかでマクロ記録開始です
もっかいqでマクロ記録終了です
qを押すのはノーマルモードで挿入モードじゃないです
モード変更がめんどくさそうでマクロもめんどくさそうですが
スペースを8回とか12回とか押さなきゃなら違ってきます

q+z(マクロ記録開始)$(行の最後へ)a(挿入モードへ)
スペース4回 ESC(挿入モード抜ける)q(マクロ記録終了)

みたいかんじでマクロを記録して@+zでマクロ実行
@+z @+z @+zとかするとスペース12回押してくれます
行の最後じゃなくタブスペースの後ろがいいなら
なんかそんなかんじの移動あったかもw
q+x(マクロ記録開始)で記録して@+xでマクロ実行
みたく記録はzでなくてもxでなくてもいいです

モード関係なくペーストするキーもあったんですが
こっちのが楽そうですね

Ruby 簡単システム その4

# encoding: UTF-8
# 以下はサンプルプログラム
# SCENARIO_TEST_02b_R02.rb
# 追記b:変数の名前をリファクタしました
# :デフォルトキーを設定しました
# 追記c:改行出力の箇所を変更しました
# Ruby動作2.6で確認
 require 'io/console'
 class Sys_Vars
# ボタンが押された時にこれらの変数をselected_nextに代入して
# メインルーチンにジャンプする
 attr_accessor :next_1
   attr_accessor :next_2
   attr_accessor :next_3
   attr_accessor :next_4
   attr_accessor :next_5
   attr_accessor :next_6
   attr_accessor :next_7
   attr_accessor :next_8
# これがtrueになると終了する
 attr_accessor :exit
# ボタンを押して選択される選択肢のID
 attr_accessor :selected_next
   def initialize()
     @next_1 = "a"
     @next_2 = "a"
     @next_3 = "a"
     @next_4 = "a"
     @next_5 = "a"
     @next_6 = "a"
     @next_7 = "a"
     @next_8 = "a"
     @exit = false
     @selected_next = "a"
     @def_push_key = " "
   end
   def set_def_push_key arg
     @def_push_key = arg
   end
   def get_def_push_key arg = nil
     if arg == nil
       return @def_push_key
     end
     return arg
   end
 end
# ここからメインルーチン
 class Main
   def initialize()
     @sv = Sys_Vars.new()
   end
   def run_main
     tmp_ch = "?"
     while 1
       if @sv.exit == true then break end
       case @sv.selected_next
       when "a" then
         @sv.next_1 = "aa"
         @sv.next_2 = "ab"
         @sv.next_3 = "ac"
         @sv.next_4 = "ad"
         @sv.next_5 = "ae"
         @sv.next_6 = "af"
         @sv.next_7 = "ag"
         @sv.next_8 = "ah"
         print("zキーかxキーかcキーかvキーか\n")
         print("aキーかsキーかdキーかfキーを押してください\n")
         print("終了:qキー")
         while 1
           tmp_ch = get_getc()
           if tmp_ch == "z"
             @sv.selected_next = @sv.next_1
             print("\n\n")
             break
           elsif tmp_ch == "x"
             @sv.selected_next = @sv.next_2
             print("\n\n")
             break
           elsif tmp_ch == "c"
             @sv.selected_next = @sv.next_3
             print("\n\n")
             break
           elsif tmp_ch == "v"
             @sv.selected_next = @sv.next_4
             print("\n\n")
             break
           elsif tmp_ch == "a"
             @sv.selected_next = @sv.next_5
             print("\n\n")
             break
           elsif tmp_ch == "s"
             @sv.selected_next = @sv.next_6
             print("\n\n")
             break
           elsif tmp_ch == "d"
             @sv.selected_next = @sv.next_7
             print("\n\n")
             break
           elsif tmp_ch == "f"
             @sv.selected_next = @sv.next_8
             print("\n\n")
             break
           elsif tmp_ch == @sv.get_def_push_key("q")
             @sv.exit = true
             print("\n\n")
             print("QUIT")
             tmp_ch = get_getc()
             break
           end
         end # end of while B
       when "aa" then
         @sv.next_1 = "a"
         print("あなたはzキーを押しましたね\n")
         print("NEXT:spaceキー")
         key_push_next @sv.next_1
       when "ab" then
         @sv.next_1 = "a"
         print("あなたはxキーを押しましたね\n")
         print("NEXT:spaceキー")
         key_push_next @sv.next_1
       when "ac" then
         @sv.next_1 = "a"
         print("あなたはcキーを押しましたね\n")
         print("NEXT:spaceキー")
         key_push_next @sv.next_1
       when "ad" then
         @sv.next_1 = "a"
         print("あなたはvキーを押しましたね\n")
         print("NEXT:spaceキー")
         key_push_next @sv.next_1
       when "ae" then
         @sv.next_1 = "a"
         print("あなたはaキーを押しましたね\n")
         print("NEXT:spaceキー")
         key_push_next @sv.next_1
       when "af" then
         @sv.next_1 = "a"
         print("あなたはsキーを押しましたね\n")
         print("NEXT:spaceキー")
         key_push_next @sv.next_1
       when "ag" then
         @sv.next_1 = "a"
         print("あなたはdキーを押しましたね\n")
         print("NEXT:spaceキー")
         key_push_next @sv.next_1
       when "ah" then
         @sv.next_1 = "a"
         print("あなたはfキーを押しましたね\n")
         print("NEXT:spaceキー")
         key_push_next @sv.next_1
       end # end of case
     end # end of while A
   end # end of method
   def get_getc
     $stdin.raw do |io|
       ch = io.getc
       print ch
       return ch
     end
   end
   def key_push_next p_next
     while 1
       tmp_ch = get_getc()
       if tmp_ch == @sv.get_def_push_key
         @sv.selected_next = p_next
         print("\n\n")
         break
       end
     end # end of while
   end
 end
 m=Main.new()
 m.run_main

Ruby 簡単システム その3

グローバル変数を使いすぎだったのでメンバに変更しました
普通に$を消すとうまいこと動作しなかったんですが
それローカル変数ですねw
classを作ってそのメンバにして委譲したら上手くいきました
メンバなのでGCの対象にもなりそう
追記b:変数の名前をリファクタしました
追記c:デフォルトキーを設定しました
:改行出力の箇所を変更しました

# encoding: UTF-8
# 以下はサンプルプログラム
# SCENARIO_TEST_01c_R02.rb
# 追記b:変数の名前をリファクタしました
# 追記c:デフォルトキーを設定しました
# :改行出力の箇所を変更しました
# Ruby動作2.6で確認
 require 'io/console'
 class Sys_Vars
# ボタンが押された時にこれらの変数をselected_btnextに代入して
# メインルーチンにジャンプする
 attr_accessor :next_1
   attr_accessor :next_2
# これがtrueになると終了する
 attr_accessor :exit
# ボタンを押して選択される選択肢のID
 attr_accessor :selected_next
   def initialize()
     @next_1 = "a"
     @next_2 = "a"
     @exit = false
     @selected_next = "a"
     @def_push_key = "z"
   end
   def set_def_push_key arg
     @def_push_key = arg
   end
   def get_def_push_key arg = nil
     if arg == nil
       return @def_push_key
     end
     return arg
   end
 end
# ここからメインルーチン
 class Main
   def initialize()
     @sv = Sys_Vars.new()
   end
   def run_main
     tmp_ch = "?"
     while 1
       if @sv.exit == true then break end
       case@sv.selected_next
       when "a" then
         @sv.next_1 = "aa"
         @sv.next_2 = "ab"
         print("zキーかxキーを押してください\n")
         print("終了:qキー")
         while 1
           tmp_ch = get_getc()
           if tmp_ch == "z"
             @sv.selected_next = @sv.next_1
             print("\n\n")
             break
           elsif tmp_ch == "x"
             @sv.selected_next = @sv.next_2
             print("\n\n")
             break
           elsif tmp_ch == @sv.get_def_push_key("q")
             @sv.exit = true
             print("\n\n")
             print("QUIT")
             tmp_ch = get_getc()
             break
           end
         end # end of while B
       when "aa" then
         @sv.next_1 = "a"
         print("あなたはzキーを押しましたね\n")
         print("NEXT:zキー")
         while 1
           tmp_ch = get_getc()
           if tmp_ch == @sv.get_def_push_key
             @sv.selected_next = @sv.next_1
             print("\n\n")
             break
           end
         end # end of while C
       when "ab" then
         @sv.next_1 = "a"
         print("あなたはxキーを押しましたね\n")
         print("NEXT:zキー")
         while 1
           tmp_ch = get_getc()
           if tmp_ch == @sv.get_def_push_key
             @sv.selected_next = @sv.next_1
             print("\n\n")
             break
           end
         end # end of while D
       end # end of case
     end # end of while A
   end # end of method
 end # end of class
 def get_getc
   $stdin.raw do |io|
     ch = io.getc
     print ch
     return ch
   end
 end
 m=Main.new()
 m.run_main

Ruby 簡単システム その2

PUSH KEY動作を二つから8個にしました

# encoding: UTF-8
#  以下はサンプルプログラム
# Ruby動作2.6で確認
# ボタンが押された時にこれらの変数をselected_btnextに代入して
# メインルーチンにジャンプする
 $btnext_1 = ""
 $btnext_2 = ""
 $btnext_3 = ""
 $btnext_4 = ""
 $btnext_5 = ""
 $btnext_6 = ""
 $btnext_7 = ""
 $btnext_8 = ""
# ボタンを押して選択される選択肢のID
 $selected_btnext = "a"
# これがtrueになると終了する
 $exit = false
 require 'io/console'
# ここからメインルーチン
 def bt_selected_gomain
   tmp_ch = "?"
   while 1
     if $exit == true then break end
     case $selected_btnext
     when "a" then
       $btnext_1 = "aa"
       $btnext_2 = "ab"
       $btnext_3 = "ac"
       $btnext_4 = "ad"
       $btnext_5 = "ae"
       $btnext_6 = "af"
       $btnext_7 = "ag"
       $btnext_8 = "ah"
       print("zキーかxキーかcキーかvキーか\n")
       print("aキーかsキーかdキーかfキーを押してください\n")
       print("終了:qキー")
       while 1
         tmp_ch = get_getc()
         if tmp_ch == "z"
           $selected_btnext = $btnext_1
           break
         elsif tmp_ch == "x"
           $selected_btnext = $btnext_2
           break
         elsif tmp_ch == "c"
           $selected_btnext = $btnext_3
           break
         elsif tmp_ch == "v"
           $selected_btnext = $btnext_4
           break
         elsif tmp_ch == "a"
           $selected_btnext = $btnext_5
           break
         elsif tmp_ch == "s"
           $selected_btnext = $btnext_6
           break
         elsif tmp_ch == "d"
           $selected_btnext = $btnext_7
           break
         elsif tmp_ch == "f"
           $selected_btnext = $btnext_8
           break
         elsif tmp_ch=="q"
           $exit = true
           print("QUIT")
           tmp_ch = get_getc()
           break
         end
       end # end of while B
     when "aa" then
       $btnext_1 = "a"
       print("あなたはzキーを押しましたね\n")
       print("NEXT:spaceキー")
       space_push_next $btnext_1
     when "ab" then
       $btnext_1 = "a"
       print("あなたはxキーを押しましたね\n")
       print("NEXT:spaceキー")
       space_push_next $btnext_1
     when "ac" then
       $btnext_1 = "a"
       print("あなたはcキーを押しましたね\n")
       print("NEXT:spaceキー")
       space_push_next $btnext_1
     when "ad" then
       $btnext_1 = "a"
       print("あなたはvキーを押しましたね\n")
       print("NEXT:spaceキー")
       space_push_next $btnext_1
     when "ae" then
       $btnext_1 = "a"
       print("あなたはaキーを押しましたね\n")
       print("NEXT:spaceキー")
       space_push_next $btnext_1
     when "af" then
       $btnext_1 = "a"
       print("あなたはsキーを押しましたね\n")
       print("NEXT:spaceキー")
       space_push_next $btnext_1
     when "ag" then
       $btnext_1 = "a"
       print("あなたはdキーを押しましたね\n")
       print("NEXT:spaceキー")
       space_push_next $btnext_1
     when "ah" then
       $btnext_1 = "a"
       print("あなたはfキーを押しましたね\n")
       print("NEXT:spaceキー")
       space_push_next $btnext_1
     end # end of case
   end # end of while A
 end # end of method
 def get_getc
   $stdin.raw do |io|
     ch = io.getc
     print ch
     print "\n\n"
     return ch
   end
 end
 def z_push_next p_next
   while 1
     tmp_ch = get_getc()
     if tmp_ch == "z"
       $selected_btnext = p_next
       break
     end
   end # end of while
 end
 def space_push_next p_next
   while 1
     tmp_ch = get_getc()
     if tmp_ch == " "
       $selected_btnext = p_next
       break
     end
   end # end of while
 end
 bt_selected_gomain

練習問題。素数かcheck

練習問題です

# encoding: UTF-8
 print("素数かcheck\nPlease input NUM(int)\n")
 ch=gets
 _4check=100
 def prime?(num)
   _4check=num
   c=2
   while 1
     if c*c > _4check
       return 1
     end
     if ((_4check%c)==0)&&(_4check!=c)
       return 0
     end
     if c==2
       c+=1
     else
       c+=2
     end
   end
 end
 num=31
 result=prime? num
 if result==1
   print("#{num}は素数です\n")
 else
   print("#{num}は素数ではありません\n")
 end
 num=35
 result=prime? num
 if result==1
   print("#{num}は素数です\n")
 else
   print("#{num}は素数ではありません\n")
 end
 num=101
 result=prime? num
 if result==1
   print("#{num}は素数です\n")
 else
   print("#{num}は素数ではありません\n")
 end
 num=102
 result=prime? num
 if result==1
   print("#{num}は素数です\n")
 else
   print("#{num}は素数ではありません\n")
 end
 ch=gets

コインみたいな乱数

問題じゃないんですけど、なんか書きました

# encoding: UTF-8
 def rnd_coin
   r = Random.rand(2)
   if r==1
     r_s="表"
   elsif r==0
     r_s="裏"
   else
     r_s="nil"
   end
   return r_s
 end
 print ("coin rnd sample\n")
 ch=gets

コインを10回振ってその合計

# encoding: UTF-8
def rnd_coin_10
 sum=0
   for i in 1 .. 10
     r = Random.rand(2)
     if r==1
       r_s="表"
     elsif r==0
       r_s="裏"
     else
       r_s="nil"
     end
     sum+=r
     print ("#{i}:#{r_s}\n")
   end
   return sum
 end
 print ("coin rnd sample\n")
 ch=gets
 tmp_sum = rnd_coin_10
 print ("sum:#{tmp_sum}\n")
 ch=gets

練習問題。サイコロみたいなrnd

乱数でサイコロみたいな処理のメソッドを
記述しなさいみたいな問題でした

# encoding: UTF-8
 def dice
   r = Random.rand(6)
   r+=1
   return r
 end
 print ("rnd sample\n")
 ch=gets
 for i in 1 .. 8
   tmp_r = dice
   print ("#{i}:#{tmp_r}\n")
 end
 ch=gets

サイコロを10回振って合計を計算しなさいみたいな問題でした

# encoding: UTF-8
 def dice10
   sum=0
   for i in 1 .. 10
     r = Random.rand(6)
     r+=1
     sum+=r
     print ("#{i}:#{r}\n")
   end
   return sum
 end
 print ("rnd sample\n")
 ch=gets
 tmp_sum = dice10
 print ("sum:#{tmp_sum}\n")
 ch=gets