OS XおよびiOSの新しい開発言語Swiftが発表されました。今後はSwiftが主流になるだろうからボチボチと勉強を始めました。とりあえず、慣れる事が必要だろうとiBooksで配布されているリファレンスを読み始め、載っているコードを順番に実際に入力して(コピペせずに)進めて来たけど、なかなかはかどりません。
なので、簡単なゲーム「Master Mind」を作ってみる事にしました。Master Mindは任意の桁数(3や4)の0~9までの数字を1回だけ使ったものを当てるというものです。
コンピュータ側が指定した桁数の数字を考え、プレーヤーが「これだ」と入力した物と比較して、同じ数字で同じ位置の場合Hit、同じ数字だけど位置が違う場合はBlowでその個数をヒントとして表示します。
例えば、答えが「1234」の場合、プレーヤーが「0134」と入力した場合、Hit: 2 (3と4), Blow: 1(1)となります。
まず必要になるのは、コンピュータが指定した桁数でランダムな数字を作成する処理。
func createRandomNumber (length: Int) -> String { var seed: String = "0123456789" var number: String = "" for _ in 0..length { var index = Int (arc4random_uniform (10)) % seed.length () number = number + seed.substringAt (index: index) seed = seed.remove (from: index, length: 1) } return number }
0から9までの乱数を発生させて、seed文字列から任意の場所の文字を1つずつ取り出してnumber文字列に足して行く処理をしています。
for文の書き方も最初はvar i: Int = 0;とか書いてたけど、サンプルで見つけた書き方をまねてみました。この場合length未満になるのがちょっとしっくりこない。length以下の方がいいな(^^;
ここでの疑問。StringはObjective-CでいうMutalbleなのか?Stringのリファレンスを調べても、任意の位置の文字を削除する処理が見つかりません。そこで、任意の範囲の文字を削除するための関数remove()と任意の位置の文字を調べる関数substringAt()をStringクラスに拡張する事に。また、文字数を返す関数も無い(countElements(“abc”)を使うらしい)のでlength ()を追加。
extension String { func length () -> Int { return (countElements (self)) } func substring (#from: Int, length: Int) -> String { let intermediate = self.substringFromIndex (from) return intermediate.substringToIndex(length) } func substringAt (#index: Int) -> String { return self.substring(from: index, length: 1) } func remove (#from: Int, length: Int) -> String { let left = self.substringToIndex(from) let right = self.substringFromIndex(from + length) return (left + right) } func removeCharAt (index: Int) -> String { return self.remove (from: index, length: 1) } }
とりあえずここまで。