忍者ブログ

マドノマグラの初心者自作ゲーム制作日誌 迷走モード

プログラミング初心者が自作ゲームを作成してみようとする動きを記す。現在迷走中。

ブログ履歴

2010/11/06: HSP3.22の環境を整えてみる
2009/11/09: Rubyで適当版自分用関連記事リンク作成プログラムを作る
2009/06/04: Visual C++(DXライブラリ使用)の環境を整えてみるも休止状態に
2009/03/17: ActionScript勉強の環境を整えるも結局休止状態に
2006/07/15: とりあえず分岐型ゲームを作る グリーンタワーVer1.2 ダウンロード(zip)
2006/07/02: ブログスタート。NScripterで何かを作ろうとする

[PR]

×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

「初めてのプログラミング」10.3練習問題の1問目後半戦、完全なる shuffle とは何ぞや

初めてのプログラミングの10.3練習問題の1問目、完全なる shuffle って何だろうかと考えた。

とりあえず、「初めてのプログラミング」10.3練習問題の1問目前半戦、shuffleメソッドでシャッフルするまでで書いたプログラムに追加する形でやってみることにした。

考え方としては、元の入力配列とshuffle後の配列を比較して、単語と次の単語とさらにその次の単語の並びが同じとなった場合は、シャッフルが不完全であるという解釈を行った。

例としては、「a,b,c,d,e」をシャッフルしたときに、「e,d,a,b,c」となったときは、(a,b,c)の並びが共通してしまうので、シャッフル不完全とするということである。

ただ今回のプログラムでは、シャッフルが不完全だったところでやり直すこともできないし、シャッフルが終わって配列を吐き出してからでないと、シャッフル比較ができないという欠点がある。

これは、ちゃんと方法論を考えないといけないなあ…

初めてのプログラミング
Chris Pine
オライリー・ジャパン
売り上げランキング: 161616
おすすめ度の平均: 3.5
3 Rubyを使ってHello, Worldから
4 丁寧な解説
4 Ruby
PR

「初めてのプログラミング」10.3練習問題の1問目前半戦、shuffleメソッドでシャッフルするまで

初めてのプログラミングの10.3練習問題の1問目のshuffleメソッドを作るまでを考えた。

「初めてのプログラミング」10.2のソート、再帰を使う場合に苦悩するで書いたプログラムをベースにして考える事にした。

配列の要素数を範囲とした乱数を得る

各配列の乱数番目の要素をシャッフル済みの配列に入れ込み、その他を未シャッフル配列に入れ込む

これをループさせる手を使った。ただし、for文や、数字を追加していくイテレータは学んでいないので、while で代用した。

一応、空行と、(a,b,c,d,e)を入力したものでシャッフルをしたら、とりあえず、順番が変わった。

次は、シャッフルができているかどうかのテストするためのプログラムの作成である。

初めてのプログラミング
Chris Pine
オライリー・ジャパン
売り上げランキング: 161616
おすすめ度の平均: 3.5
3 Rubyを使ってHello, Worldから
4 丁寧な解説
4 Ruby

「初めてのプログラミング」10.2のソート、再帰を使う場合に苦悩する

初めてのプログラミングの10.2のソートに関して再帰を使う場合を考えてみた。

考え方は「初めてのプログラミング」10.2のソートに関して再帰を使わない場合を考えると一緒である。

今回、初めてのプログラミングのp96で、ラッパーメソッドの例として、

def sort some_array # このメソッドは recursive_sort をラップします。
recursive_sort some_array,[]
end

def recursive_sort unsorted_array,sorted_array
# ここにあなたの素敵なコードが来ます。
end
が紹介されていたけれども、この条件では、私の頭ではとけなかったので、もう1個の返り値、ソート済み配列を保持するための final_array をつけたした。

とりあえず、空行入力、"a"のみ、("b","a")、("j","b","a")、("j","a","b","a")のパターンでテストして、挙動を確認した。

果たして、元の条件でちゃんと目的を達成できるのかどうか。これもまた今後の課題になりそうだ。

初めてのプログラミング
Chris Pine
オライリー・ジャパン
売り上げランキング: 161616
おすすめ度の平均: 3.5
3 Rubyを使ってHello, Worldから
4 丁寧な解説
4 Ruby

「初めてのプログラミング」10.2のソートに関して再帰を使わない場合を考える

初めてのプログラミングの10.2のソートに関して再帰を使わない場合を考えてみた。

考え方は以下のようにした。

元データを入力
ex)元データ 「c,b,e,a,d」

未ソート配列1に元データをコピー
ex)未ソート配列1「c,b,e,a,d」

未ソート配列1で文字を1個ずつ比較:小さいのは保存文字行き、大きいのは文字置き場配列2に入れ込み
ex)   未ソート配列1「c,b,e,a,d」、保存文字 b、文字置き場配列2「c」
 ↓
 中略:未ソート配列1「c,b,e,a,d」、保存文字 a、文字置き場配列2「c,e,b,d」

保存文字をソート済み配列へ入れ込み、文字置き場配列2を未ソート配列1に移しかえる。移しかえた後、文字置き場配列2を一旦破棄する
ex)ソート済み配列「a」、未ソート配列1 「c,e,b,d」、文字置き場配列2「 」

この比較入れ込み作業を繰り返し、未ソート配列1がからになるまで行う。
ex)ソート済み配列「a,b,c,d,e」、未ソート配列1 「 」

そしてソート済み配列を、元データの.sortメソッドとを比較。


最初に作った sortofsword0.rb を実行。
"jiji","baka","aho"を順に入力してのテストを行ってみたものの、while ループの2週目で動かなくなる。Ctrl+Cで止めてみると each 部分でストップしてしまっていたことがわかった。

次に、文字置き場配列2であるところの、unsorted2 = [] を置く部分を while 内部にした sortofsword1.rb を実行してみると最後までいった。

とりあえず、空行入力、"aho"のみ、("baka","aho")、("jiji","baka","aho")、("jiji","aho","baka","aho")のパターンでテストしてみたけれど、どれもうまくソートできていた。

最初に想定した考え方からすると、unsorted2 = [] の置き位置が間違っていたというのはわかるけれど、何故、sortofsword0.rb において、each 部分でストップしたのかがイマイチわからない。

unsorted2 の配列のデータが増えていって、結果、未ソート配列もでかくなって、暴走するというのならまだわかるんだけど。なんで、2周目eachでストップなんだろうか。そこがわからん。今後の課題だろう。

初めてのプログラミング
Chris Pine
オライリー・ジャパン
売り上げランキング: 161616
おすすめ度の平均: 3.5
3 Rubyを使ってHello, Worldから
4 丁寧な解説
4 Ruby

「初めてのプログラミング」練習問題9.4の1問目の失敗の考察

初めてのプログラミングの練習問題9.4の1問目において、何故失敗が起こったのかを考察。

「初めてのプログラミング」練習問題9.4の1問目を解いてみた で、while 部分で起きたことを考えてみる。

askquestion0.rb で書いた文は、

def ask question
while
puts question
reply = gets.chomp.downcase

if reply == 'yes'
return true
elsif reply == 'no'
return false
else
puts '"yes"か"no"で答えてね'
end
end
end

だった。

この場合、ループの条件文が puts question の値ということになるようである。

puts question 自体は実行されるものの、この値自体は、初めてのプログラミングp82によると、nil となるため、while ループから脱出する。

よって、「初めてのプログラミング」練習問題9.4の1問目を解いてみた で書かれる表示になったようだ。

ちなみに、askquestion2.rb にて、while の直後に do をつけたプログラムを実行して見たところ、syntax error を返してきた。予期しないところに do があるぞと騒いでいる。

つまり、while の後には、自分が思っている条件文をつけないとダメよ♪ そうじゃないと、次の行を条件文として解釈しちゃうからね!ということなのだろう。

初めてのプログラミング
Chris Pine
オライリー・ジャパン
売り上げランキング: 161616
おすすめ度の平均: 3.5
3 Rubyを使ってHello, Worldから
4 丁寧な解説
4 Ruby

「初めてのプログラミング」練習問題9.4の2問目、再び

初めてのプログラミングの練習問題9.4の2問目を再び考えてみた。

「初めてのプログラミング」練習問題9.4の3問目を解いてみたで書いた文を流用すれば、古いローマ数字版もちゃんと作れると思ったので、やってみた。

4 と 9 が付く数字の時の例外処理をなくせばなんとかなるので、そこらへんを中心に微調整して実行。うまくいった。

初めてのプログラミング
Chris Pine
オライリー・ジャパン
売り上げランキング: 161616
おすすめ度の平均: 3.5
3 Rubyを使ってHello, Worldから
4 丁寧な解説
4 Ruby

「初めてのプログラミング」練習問題9.4の3問目を考えてみる

初めてのプログラミングの練習問題9.4の3問目を考えてみた。

「初めてのプログラミング」練習問題9.4の2問目を解いてみたで表示された古いローマ数字に対して、正規表現を使って変換という手もあるのだろうが、ここでは正規表現は習っていない状況なので別の手を考えることにする。

特殊な処理をしないといけなくなるのは、4:IV 9:IX 40:XL 90:XC CD:400 CM:900 という4 と 9 が付く数字の時のアホになる…もといややこしくなるようだ。

ところで、
2948 / 1000 => 2 で MM
2948 % 1000 => 948
948 / 100 => 9 で CM
948 % 100 => 48
48 / 10 => 4 で XL
48 % 10 => 8
8 / 1 => 8 VIII
8 % 1 => 0

という風に、10進数における各値の数値から、新しいローマ数字を追加する方法がよいと判断した。

1000の位を構成する文字は今回の範囲では M:1000 のみ
100の位を構成する文字は M:1000 D:500 C:100
10の位を構成する文字は C:100 L:50 X:10
1の位を構成する文字は X:10 V:5 I:1

ということで、各位と文字を配列にし、.eachで読み込むようにしてみた。

実行するとうまくいったので、これでいいのだろう。

初めてのプログラミング
Chris Pine
オライリー・ジャパン
売り上げランキング: 161616
おすすめ度の平均: 3.5
3 Rubyを使ってHello, Worldから
4 丁寧な解説
4 Ruby

「初めてのプログラミング」練習問題9.4の2問目をとりあえず考えてみる

初めてのプログラミングの練習問題9.4の2問目をとりあえず考えてみた

例えば、
2389 / 1000 => 2
2389 % 1000 => 389

このとき M * 2 で MM が表示できる
そして、389は次に 500 で割ったときの商が D の追加数
以下、繰り返しで 1で割ったときの I の数までやっていけばいいと考えた。
この部分は繰り返すになるのでメソッド定義を行った。

そして、各ローマ数字と文字との対応関係を配列に入れて、配列.each を利用して入れ込み作戦を行ってみた。

初めてのプログラミング
Chris Pine
オライリー・ジャパン
売り上げランキング: 161616
おすすめ度の平均: 3.5
3 Rubyを使ってHello, Worldから
4 丁寧な解説
4 Ruby

「初めてのプログラミング」練習問題9.4の1問目を解いてみた

初めてのプログラミングの練習問題9.4の1問目を解いてみる。

p85に載っているものをちょっといじるくらいのもの。

askquestion0.rb では、def ask 内のwhile 部分の while の次の条件部分を書かなかった状態。

この状態で実行すると、文字列がずらっと表示されただけで、nil を返して終わってしまった。

どうやら、puts question 部分は実行されているものの、その後の reply = gets.chomp.downcase がスルーされてしまっている模様。なんでこういうことが起こったのかはまだよくわからない。要研究。

20080906追記:
この挙動の理由を考察した。
「初めてのプログラミング」練習問題9.4の1問目の失敗の考察
にてどうぞ。
追記終わり

そして、askquestion1.rb にて、while の条件を true にして実行。内部に return があるので、無限ループにはならず、無事動いた。

※追記部分のプログラム部分をpreタグで囲むことで、字下げが表示できるようになった。

初めてのプログラミング
Chris Pine
オライリー・ジャパン
売り上げランキング: 161616
おすすめ度の平均: 3.5
3 Rubyを使ってHello, Worldから
4 丁寧な解説
4 Ruby

「初めてのプログラミング」練習問題8.3の2問目を解いてみた

初めてのプログラミングの練習問題8.3の2問目を解いてみる。

「初めてのプログラミング」練習問題6.2の2問目を解くの改訂版といったところか。

配列を使った後、.eachを使用するという考え方でいいと思うけれど、果たしてこれでいいのかわからん。

一応、実行したらちゃんと表示されたんだけどね。


※追記部分の作成文は字下げがされていませんが、実際作成したものは、ちゃんと字下げされています。

初めてのプログラミング
Chris Pine
オライリー・ジャパン
売り上げランキング: 161616
おすすめ度の平均: 3.5
3 Rubyを使ってHello, Worldから
4 丁寧な解説
4 Ruby

PR

カテゴリー

最新記事

アーカイブ

プロフィール

HN:
マドノマグラ
性別:
非公開
職業:
趣味:
駄文書き
自己紹介:
ゲームを作ろうとしているうちに、言語学習に飽きていく。典型的なダメな人パターンに陥るアホな人

リンク

ブログ内検索

バーコード

RSS

忍者ブログ │ [PR]