忍者ブログ

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

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

ブログ履歴

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ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

シャッフル法則を追加「初めてのプログラミング」11.6練習問題3問目

初めてのプログラミングの11.6練習問題3問目、シャッフル法則の追加を考えてみる。

プレイリスト出力のシャッフル「初めてのプログラミング」11.6練習問題2問目後半戦をベースに考えることにした。

ルール確認
前回の法則に加えて、同じグループ(例えば ../aho/track00.wma だった場合は、ahoグループ)が5連続で続いた場合は、次の出力分は、なるべく同じグループをさけるように選ぶという手段をとった。

ただし、選び方はランダムで選び同じグループだった場合は再抽選。8回連続で同じグループを引き当てた場合は、次に引いたものが何であっても出力することにする。


今回、まだこの本では習っていない、array[-x]の手法と、グローバル変数 $x を手法を使用した。

そのグローバル変数は、

$LIMIT 回連続で続いた場合という部分
$RESHUFFLE_TIME 回まで再抽選するという部分

を調整できるようにするために用いた。これがいい手段なのかは知らん。


ただ問題なのは、当方の wma のファイルは、とある1グループの数が他を圧倒しているので、このシャッフルの妥当性がイマイチわからないという点である。このプログラムでいいのかは不明である。

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



playshuffle1.rb


=begin
方針としては、同じグループが5連続になったら次を変えるという形で $LIMIT = 5
そして、変える候補をランダムで8回選んでダメだったら、その次に選んだ物を加える $RESHUFFLE_TIME = 8
=end

$LIMIT = 5
$RESHUFFLE_TIME = 8

def threewords_match original, shuffler, n, m
while n <= (original.length - 3)
if original[n] == shuffler[m-2] && original[n+1] == shuffler[m-1] && original[n+2] == shuffler[m]
temp = shuffler[m-1]
shuffler[m-1] = shuffler[m]
shuffler[m] = temp
end
n += 1
end
shuffler
end

# 5連続評価の文 $LIMIT
def words_match(final_array, n, loop, group_name)
search = []
search = final_array[n].split '/' # ここで/ごとに切り刻まれて配列へ・
group_name.push search[-2]

if group_name[0] == group_name[loop]
if loop <= ($LIMIT -2)
words_match(final_array, n-1, loop+1, group_name)
else
true
end
else
false
end
end

def preshuffle some_array,final_array,original
music_shuffle some_array,final_array,[],original
end

def music_shuffle unshuffled,final_array,shuffle_next,original
index = final_array.length
seed = unshuffled.length
num = rand(seed)

# ここで5連続のグループであるかどうかの評価 true false でメソッド渡し $LIMIT
if index >= $LIMIT && words_match(final_array, index-1, 0, [])

f_search = []
f_search = final_array[-1].split '/'
m = f_search.length

u_search = []
u_search = unshuffled[num].split '/'
n = u_search.length

# グループが一致したら8回やり直し、8回やっても駄目ならそのまま $RESHUFFLE_TIME
looping = 0
while f_search[-2] == u_search[-2] && looping< $RESHUFFLE_TIME
num = rand(seed)
u_search = unshuffled[num].split '/'
looping += 1
end
end

plus = 0
while plus < seed
if num == plus
final_array.push unshuffled[num]
else
shuffle_next.push unshuffled[plus]
end
plus += 1
end

if index >= 3
final_array = threewords_match(original, final_array, 0, index-1)
end

if shuffle_next != []
preshuffle shuffle_next,final_array,original
end
final_array
end

def plus_escape_n music_count,data
n = 0
while n< music_count
data[n] += "\n"
n += 1
end
data
end

def original_contents_change origin_cont, origindata
if origin_cont <= 1
shuffled = origindata
elsif origin_cont == 2
shuffled = [origindata[1],origindata[0]]
else
shuffled = preshuffle origindata,[],origindata
end
plus_escape_n(origin_cont,shuffled)
end


Dir.chdir 'c:/techno/testbox'
pic_music = Dir['c:/Documents and Settings/Owner/My Documents/My Music/**/*.wma']

music_count = pic_music.length
puts "Finding " + music_count.to_s + " wma files"

shuffled = original_contents_change(music_count, pic_music)

filename = 'playshuffler.m3u'

File.open filename, 'w' do |f|
f.write shuffled
end

puts "プレイリスト作成終了"
PR

この記事にコメントする

NAME
TITLE
MAIL
URL
COMMENT
PASS

この記事へのトラックバック

この記事にトラックバックする:

PR

カテゴリー

最新記事

アーカイブ

プロフィール

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

リンク

ブログ内検索

バーコード

RSS

忍者ブログ │ [PR]